From: <jbj...@us...> - 2012-05-02 19:58:04
|
Revision: 12482 http://xcat.svn.sourceforge.net/xcat/?rev=12482&view=rev Author: jbjohnso Date: 2012-05-02 19:57:58 +0000 (Wed, 02 May 2012) Log Message: ----------- Have xCAT instances more reliably relay abort commands and cleanly exit on ctrl-c by client Modified Paths: -------------- xcat-core/trunk/xCAT-server/sbin/xcatd Modified: xcat-core/trunk/xCAT-server/sbin/xcatd =================================================================== --- xcat-core/trunk/xCAT-server/sbin/xcatd 2012-05-02 19:57:49 UTC (rev 12481) +++ xcat-core/trunk/xCAT-server/sbin/xcatd 2012-05-02 19:57:58 UTC (rev 12482) @@ -158,7 +158,9 @@ $sitetab->close; my $progname; +my $pipeexpected; $SIG{PIPE} = sub { + if ($pipeexpected) { return; } confess "SIGPIPE $$progname encountered a broken pipe (probably Ctrl-C by client)"; }; $progname = \$0; @@ -1354,7 +1356,11 @@ sub relay_dispatch { my $fds = shift; my $dispatch_cb = shift; - my @ready_ins = $fds->can_read(1); + my @ready_ins; + eval { + @ready_ins = $fds->can_read(1); + }; + if ($@) { undef $@; return 0; } foreach my $rin (@ready_ins) { my $data; if ($data = <$rin>) { @@ -1403,6 +1409,13 @@ $dispatch_children=0; $SIG{CHLD} = \&dispatch_reaper; #sub {my $cpid; while (($cpid =waitpid(-1, WNOHANG)) > 0) { if ($dispatched_children{$cpid}) { delete $dispatched_children{$cpid}; $dispatch_children--; } } }; + $SIG{TERM} = $SIG{INT} = sub { + foreach (keys %dispatched_children) { + kill 2, $_; + } + }; + + my $onlyone=0; if (defined $reqs and (scalar(@{$reqs}) == 1)) { $onlyone=1; @@ -1576,6 +1589,7 @@ } unless ($resp) { return; } $resp = freeze($resp); + $pipeexpected=1; #$resp = XMLout($resp,KeyAttr=>[], NoAttr=>1,RootName=>'xcatresponse'); #sanitize the response, to avoid being killed by non-printable bytes #$resp =~ tr/\011-\177/?/c; @@ -1905,6 +1919,7 @@ } $clientintr=XMLin($clientintr, SuppressEmpty=>undef,ForceArray=>1 ); if ($clientintr->{abortcommand}->[0]) { + $pipeexpected=1; print "Aborting..."; foreach (keys %plugin_children) { print "Sending INT to $_\n"; @@ -1916,7 +1931,7 @@ close($cin); } xCAT::MsgUtils->message("S", "Client abort requested"); - die; + exit(0); } } yield; #Give other processes, including children, explicit control, to avoid uselessly aggressive looping This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |