From 8cfa0ae50935176a1574e8f233c8d4d88442c0ad Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 16 Feb 2012 17:31:29 -0500 Subject: [PATCH] Refresh child file handles on status read If a child process dies while the parent is attempting to read status information from the child, the pipe connecting the two will be cleaned up. The parent mustn't attempt to read from the dead pipe or it will result in a bad file descriptor error, culminating in a high-cpu infinite loop on the parent (Listener) process. Signed-off-by: Bill Erickson Signed-off-by: Thomas Berezansky Signed-off-by: Jason Stephenson --- src/perl/lib/OpenSRF/Server.pm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/perl/lib/OpenSRF/Server.pm b/src/perl/lib/OpenSRF/Server.pm index 6cab1dd..8034a1a 100644 --- a/src/perl/lib/OpenSRF/Server.pm +++ b/src/perl/lib/OpenSRF/Server.pm @@ -270,9 +270,6 @@ sub check_status { return unless @{$self->{active_list}}; - my $read_set = IO::Select->new; - $read_set->add($_->{pipe_to_child}) for @{$self->{active_list}}; - my @pids; while (1) { @@ -280,6 +277,10 @@ sub check_status { # if can_read or sysread is interrupted while bloking, go back and # wait again until we have at least 1 free child + # refresh the read_set handles in case we lost a child in the previous iteration + my $read_set = IO::Select->new; + $read_set->add($_->{pipe_to_child}) for @{$self->{active_list}}; + if(my @handles = $read_set->can_read(($block) ? undef : 0)) { my $pid = ''; for my $pipe (@handles) { -- 2.43.2