From 0fb441b820ab51a49226171eaa047fa30402ccf8 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Tue, 15 May 2018 18:12:35 +0800 Subject: [PATCH] fix issue for using waitpid for openbmc perl (#5208) --- xCAT-server/lib/xcat/plugins/openbmc.pm | 42 +++++++++++++++---------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index d33fa192e..e6cdb8533 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -953,8 +953,8 @@ sub process_request { while (1) { last if ($child_num == 0 and !@nodes_login); - my $cpid; - while (($cpid = waitpid(-1, WNOHANG)) > 0) { + my $cpid = waitpid(-1, WNOHANG); + if ($cpid > 0) { if ($login_pid_node{$cpid}) { $child_num--; my $node = $login_pid_node{$cpid}; @@ -964,7 +964,12 @@ sub process_request { } delete $login_pid_node{$cpid}; } + } elsif ($cpid == 0) { + select(undef, undef, undef, 0.01); + } elsif ($cpid < 0 and !@nodes_login) { + last; } + if (@nodes_login) { if ($child_num < $max_child_num) { my $node = shift @nodes_login; @@ -1073,23 +1078,26 @@ rmdir \"/tmp/\$userid\" \n"; while (my ($response, $handle_id) = $async->wait_for_next_response) { deal_with_response($handle_id, $response); } - while ((my $cpid = waitpid(-1, WNOHANG)) > 0) { - if ($child_node_map{$cpid}) { - my $node = $child_node_map{$cpid}; - my $rc = $? >> 8; - if ($rc != 0) { - $wait_node_num--; - } else { - if ($status_info{ $node_info{$node}{cur_status} }->{process}) { - $status_info{ $node_info{$node}{cur_status} }->{process}->($node, undef); - } else { - xCAT::SvrUtils::sendmsg([1,"Internal error, check the process handler for current status " - .$node_info{$node}{cur_status}."."], $callback, $node); - $wait_node_num--; - } + if (%child_node_map) { + while ((my $cpid = waitpid(-1, WNOHANG)) > 0) { + if ($child_node_map{$cpid}) { + my $node = $child_node_map{$cpid}; + my $rc = $? >> 8; + if ($rc != 0) { + $wait_node_num--; + } else { + if ($status_info{ $node_info{$node}{cur_status} }->{process}) { + $status_info{ $node_info{$node}{cur_status} }->{process}->($node, undef); + } else { + xCAT::SvrUtils::sendmsg([1,"Internal error, check the process handler for current status " + .$node_info{$node}{cur_status}."."], $callback, $node); + $wait_node_num--; + } + + } + delete $child_node_map{$cpid}; } - delete $child_node_map{$cpid}; } } my @del;