From 13ee6733e706b76f50f23e7c9e8fae30e5b2c602 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 2 May 2017 11:19:54 -0400 Subject: [PATCH] Fix FPC reseat behavior on multiple nodes --- xCAT-server/lib/perl/xCAT/IPMI.pm | 8 ++++++++ xCAT-server/lib/xcat/plugins/ipmi.pm | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/IPMI.pm b/xCAT-server/lib/perl/xCAT/IPMI.pm index 54d33289a..bd0b480c6 100644 --- a/xCAT-server/lib/perl/xCAT/IPMI.pm +++ b/xCAT-server/lib/perl/xCAT/IPMI.pm @@ -471,6 +471,11 @@ sub checksum { sub subcmd { my $self = shift; my %args = @_; + while ($self->{incommand}) { + $self->waitforrsp(); + } + $self->{incommand} = 1; + $self->{expectedcmd} = $args{command}; $self->{expectednetfn} = $args{netfn} + 1; if ($self->{onlogon_args}->{xcatdebugmode}) { @@ -573,6 +578,7 @@ sub timedout { $self->{timeout} = $initialtimeout + (0.5 * rand()); my $rsp = {}; $rsp->{error} = "timeout"; + $self->{incommand} = 0; $self->{ipmicallback}->($rsp, $self->{ipmicallback_args}); $self->{nowait} = 0; return; @@ -833,6 +839,7 @@ sub init { #if we should incur 7 bumps, clear the taboo list and continue on, hoping for best (pessimistically assuming the spec means seq number or that someone could at least interpret it that way) #I'll implement this later... $self->{'logged'} = 0; + $self->{'incommand'} = 0; } sub relog { @@ -1008,6 +1015,7 @@ sub parse_ipmi_payload { $rsp->{code} = shift @payload; $rsp->{data} = \@payload; $self->{timeout} = $initialtimeout + (0.5 * rand()); + $self->{incommand} = 0; $self->{ipmicallback}->($rsp, $self->{ipmicallback_args}); return 0; } diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index 00302d365..9bbecab53 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -2301,6 +2301,8 @@ sub fpc_firmxfer_watch { } } +my %fpcsessions; + sub reseat_node { my $sessdata = shift; if (1) { # TODO: FPC path checked for @@ -2321,8 +2323,19 @@ sub reseat_node { my $nodeuser = $authdata->{$fpc}->{username}; my $nodepass = $authdata->{$fpc}->{password}; $sessdata->{slotnumber} = $mpent->{id}; - $sessdata->{fpcipmisession} = xCAT::IPMI->new(bmc => $mpent->{mpa}, userid => $nodeuser, password => $nodepass); - $sessdata->{fpcipmisession}->login(callback => \&fpc_node_reseat, callback_args => $sessdata); + if (exists $fpcsessions{$mpent->{mpa}}) { + $sessdata->{fpcipmisession} = $fpcsessions{$mpent->{mpa}}; + until ($sessdata->{fpcipmisession}->{logged}) { + $sessdata->{fpcipmisession}->waitforrsp(); + } + $sessdata->{fpcipmisession}->subcmd(netfn => 0x32, command => 0xa4, + data => [ $sessdata->{slotnumber}, 2 ], + callback => \&fpc_node_reseat_complete, callback_args => $sessdata); + } else { + $sessdata->{fpcipmisession} = xCAT::IPMI->new(bmc => $mpent->{mpa}, userid => $nodeuser, password => $nodepass); + $fpcsessions{$mpent->{mpa}} = $sessdata->{fpcipmisession}; + $sessdata->{fpcipmisession}->login(callback => \&fpc_node_reseat, callback_args => $sessdata); + } } }