From: Bill Erickson Date: Fri, 28 Oct 2011 15:33:24 +0000 (-0400) Subject: Add SIGPIPE retry handling to child data sysread X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=a7be31f137ccf6e2f4522c9a4c690a23b5636db8;p=working%2FOpenSRF.git Add SIGPIPE retry handling to child data sysread Similar to the SIGPIPE retry logic wrapped around the parent process' syswrite call (for sending data to a child process), protect the child's sysread call (as it reads data from the parent). In pre-2.0, the sysread step was handled by Net::Server, but now we need to protect it ourselves. Signed-off-by: Bill Erickson Signed-off-by: Galen Charlton --- diff --git a/src/perl/lib/OpenSRF/Server.pm b/src/perl/lib/OpenSRF/Server.pm index 28980d3..9e7ffa8 100644 --- a/src/perl/lib/OpenSRF/Server.pm +++ b/src/perl/lib/OpenSRF/Server.pm @@ -589,10 +589,20 @@ sub wait_for_request { while(1) { # Start out blocking, when data is available, read it all + my $sig_pipe = 0; + local $SIG{'PIPE'} = sub { $sig_pipe = 1 }; + my $buf = ''; my $n = sysread($self->{pipe_to_parent}, $buf, $read_size); unless(defined $n) { + + if ($sig_pipe) { + $logger->info("server: $self got SIGPIPE reading data from parent, retrying..."); + usleep(50000); # 50 msec + next; + } + $logger->error("server: error reading data pipe: $!") unless EAGAIN == $!; last; }