diff --git a/xCAT-server/lib/xcat/plugins/AAsn.pm b/xCAT-server/lib/xcat/plugins/AAsn.pm index fa2cbe906..44216a0ad 100755 --- a/xCAT-server/lib/xcat/plugins/AAsn.pm +++ b/xCAT-server/lib/xcat/plugins/AAsn.pm @@ -1260,8 +1260,9 @@ sub setup_TFTP my $plugins_dir = $::XCATROOT . '/lib/perl/xCAT_plugin'; foreach my $modname (keys %netmethods) { - $cmdref->{node} = $netmethods{$modname}; - $doreq->($cmdref, \&xCAT::Client::handle_response); + my $reqcopy = {%$cmdref}; + $reqcopy->{node} = $netmethods{$modname}; + $doreq->($reqcopy, \&xCAT::Client::handle_response); } } diff --git a/xCAT-server/lib/xcat/plugins/grub2.pm b/xCAT-server/lib/xcat/plugins/grub2.pm index b6692d07f..12048e0d1 100644 --- a/xCAT-server/lib/xcat/plugins/grub2.pm +++ b/xCAT-server/lib/xcat/plugins/grub2.pm @@ -442,6 +442,11 @@ sub preprocess_request { return; } + # inittime flag in request will only be set in AAsn.pm (it is only used when xcatd starting on service node) + # There is special requirement to not run in parallel on one SN to avoid DB CPU 100% when all service nodes booting in the same time. + my $inittime = 0; + if (exists($req->{inittime})) { $inittime = $req->{inittime}->[0]; } + if (!$inittime) { $inittime = 0; } #Assume shared tftp directory for boring people, but for cool people, help sync up tftpdirectory contents when #if they specify no sharedtftp in site table @@ -468,16 +473,16 @@ sub preprocess_request { } $req->{'_disparatetftp'} = [1]; - if ($req->{inittime}->[0]) { - return [$req]; - } if (@CN > 0) { # if compute nodes only, then broadcast to servic enodes + # 1, Non-hierarchy, run on locally with parallel my @sn = xCAT::ServiceNodeUtils->getSNList(); unless ( @sn > 0 ) { - return xCAT::Scope->get_parallel_scope($req) + return if (xCAT::Utils->isServiceNode()); # in case the wrong configuration + return xCAT::Scope->get_parallel_scope($req); } + # To check site table to see if disjoint mode my $mynodeonly = 0; my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps"); my $t_entry = $entries[0]; @@ -487,11 +492,29 @@ sub preprocess_request { $req->{'_disjointmode'} = [$mynodeonly]; xCAT::MsgUtils->trace(0, "d", "grub2: disjointdhcps=$mynodeonly"); - if ($mynodeonly == 0 || $ALLFLAG) { # broadcast to all service nodes + # 2, Non-disjoint mode, broadcast to all service nodes, + # but for SN init time (AAsn.pm), only run locally without parallel. + if ($mynodeonly == 0 || $ALLFLAG) { + if ($inittime) { + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } return xCAT::Scope->get_broadcast_scope_with_parallel($req, \@sn); } + # 3, Disjoint mode, run on local for owned CNs only and + # dispatch to parent SNs of the requesting nodes and `dhcpserver` which serving dynamic range in `networks` table. + # but for SN init time (AAsn.pm), only run locally without parallel. my $sn_hash = xCAT::ServiceNodeUtils->getSNformattedhash(\@CN, "xcat", "MN"); + if ($inittime) { + foreach my $sn ( keys %$sn_hash ) { + unless (xCAT::NetworkUtils->thishostisnot($sn)) { + $req->{node} = $sn_hash->{$sn}; + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } + } + } my @dhcpsvrs = (); my $ntab = xCAT::Table->new('networks'); if ($ntab) { @@ -502,6 +525,9 @@ sub preprocess_request { } return xCAT::Scope->get_broadcast_disjoint_scope_with_parallel($req, $sn_hash, \@dhcpsvrs); } + } elsif ($inittime) { + # Shared TFTP, no need to run on service node booting (AAsn.pm) + return; } # Do not dispatch to service nodes if non-sharedtftp or the node range contains only SNs. return xCAT::Scope->get_parallel_scope($req); @@ -598,8 +624,14 @@ sub process_request { @nodes = keys %preparednodes; } - my $str_node = join(" ", @nodes); - xCAT::MsgUtils->trace($verbose_on_off, "d", "grub2: nodes are $str_node") if ($str_node); + my $str_node = ''; + my $total = $#nodes; + if ($total > 20) { + $str_node = join(" ", @nodes[0..19]) . " ..."; + } else { + $str_node = join(" ", @nodes); + } + xCAT::MsgUtils->trace($verbose_on_off, "d", "grub2: [total=$total] nodes are $str_node"); # Return directly if no nodes in the same network, need to report error on console if its managed nodes are not handled. unless (@nodes) { diff --git a/xCAT-server/lib/xcat/plugins/onie.pm b/xCAT-server/lib/xcat/plugins/onie.pm index 817c4d8eb..65e49c6f8 100644 --- a/xCAT-server/lib/xcat/plugins/onie.pm +++ b/xCAT-server/lib/xcat/plugins/onie.pm @@ -277,7 +277,9 @@ sub nodeset { $provmethod = $nodehash->{$switch}->[0]->{provmethod}; } if ($::VERBOSE) { - xCAT::MsgUtils->message("I", { data => ["$switch has provmethod=$provmethod"] }, $callback); + if (!defined($::DISABLENODESETWARNING)) { # set by AAsn.pm + xCAT::MsgUtils->message("I", { data => [ "$switch has provmethod=$provmethod" ] }, $callback); + } } #get pkgdir from osimage @@ -286,7 +288,9 @@ sub nodeset { my $imagetab = $linuximagetab->getAttribs({ imagename => $provmethod },'pkgdir'); my $osimghash = $osimagetab->getAttribs({ imagename => $provmethod },'osvers','osarch'); unless($imagetab and $osimghash){ - xCAT::MsgUtils->message("E", { error => ["cannot find osimage \"$provmethod\" for $switch, please make sure the osimage specified in command line or node.provmethod exists!"], errorcode => ["1"] }, $callback); + if (!defined($::DISABLENODESETWARNING)) { # set by AAsn.pm + xCAT::MsgUtils->message("E", { error => ["cannot find osimage \"$provmethod\" for $switch, please make sure the osimage specified in command line or node.provmethod exists!"], errorcode => ["1"] }, $callback); + } next; } diff --git a/xCAT-server/lib/xcat/plugins/petitboot.pm b/xCAT-server/lib/xcat/plugins/petitboot.pm index d9af33974..83b8f948d 100644 --- a/xCAT-server/lib/xcat/plugins/petitboot.pm +++ b/xCAT-server/lib/xcat/plugins/petitboot.pm @@ -318,11 +318,18 @@ sub preprocess_request { return; } + # inittime flag in request will only be set in AAsn.pm (it is only used when xcatd starting on service node) + # There is special requirement to not run in parallel on one SN to avoid DB CPU 100% when all service nodes booting in the same time. + my $inittime = 0; + if (exists($req->{inittime})) { $inittime = $req->{inittime}->[0]; } + if (!$inittime) { $inittime = 0; } + #Assume shared tftp directory for boring people, but for cool people, help sync up tftpdirectory contents when #if they specify no sharedtftp in site table my @entries = xCAT::TableUtils->get_site_attribute("sharedtftp"); my $t_entry = $entries[0]; xCAT::MsgUtils->trace($verbose_on_off, "d", "petitboot: sharedtftp = $t_entry"); + if (defined($t_entry) and ($t_entry == 0 or $t_entry =~ /no/i)) { # check for computenodes and servicenodes from the noderange, if so error out @@ -341,16 +348,16 @@ sub preprocess_request { } $req->{'_disparatetftp'} = [1]; - if ($req->{inittime}->[0]) { - return [$req]; - } if (@CN > 0) { # if compute nodes only, then broadcast to servic enodes + # 1, Non-hierarchy, run on locally with parallel my @sn = xCAT::ServiceNodeUtils->getSNList(); unless ( @sn > 0 ) { - return xCAT::Scope->get_parallel_scope($req) + return if (xCAT::Utils->isServiceNode()); # in case the wrong configuration + return xCAT::Scope->get_parallel_scope($req); } + # To check site table to see if disjoint mode my $mynodeonly = 0; my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps"); my $t_entry = $entries[0]; @@ -360,11 +367,30 @@ sub preprocess_request { $req->{'_disjointmode'} = [$mynodeonly]; xCAT::MsgUtils->trace(0, "d", "petitboot: disjointdhcps=$mynodeonly"); - if ($mynodeonly == 0 || $ALLFLAG) { # broadcast to all service nodes + # 2, Non-disjoint mode, broadcast to all service nodes, + # but for SN init time (AAsn.pm), only run locally without parallel. + if ($mynodeonly == 0 || $ALLFLAG) { + if ($inittime) { + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } return xCAT::Scope->get_broadcast_scope_with_parallel($req, \@sn); } + # 3, Disjoint mode, run on local for owned CNs only and + # dispatch to parent SNs of the requesting nodes and `dhcpserver` which serving dynamic range in `networks` table. + # but for SN init time (AAsn.pm), only run locally without parallel. my $sn_hash = xCAT::ServiceNodeUtils->getSNformattedhash(\@CN, "xcat", "MN"); + if ($inittime) { + foreach my $sn ( keys %$sn_hash ) { + unless (xCAT::NetworkUtils->thishostisnot($sn)) { + $req->{node} = $sn_hash->{$sn}; + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } + } + } + my @dhcpsvrs = (); my $ntab = xCAT::Table->new('networks'); if ($ntab) { @@ -375,6 +401,9 @@ sub preprocess_request { } return xCAT::Scope->get_broadcast_disjoint_scope_with_parallel($req, $sn_hash, \@dhcpsvrs); } + } elsif ($inittime) { + # Shared TFTP, no need to run on service node booting (AAsn.pm) + return; } # Do not dispatch to service nodes if non-sharedtftp or the node range contains only SNs. return xCAT::Scope->get_parallel_scope($req); @@ -450,7 +479,9 @@ sub process_request { my $errormsg = $ipret->{'error'}; my $nodeip = $ipret->{'ip'}; if ($errormsg) {# Add the node to failure set - xCAT::MsgUtils->trace(0, "E", "petitboot: Defined IP address of $_ is $nodeip. $errormsg"); + if (!defined($::DISABLENODESETWARNING)) { # set by AAsn.pm + xCAT::MsgUtils->trace(0, "E", "petitboot: Defined IP address of $_ is $nodeip. $errormsg"); + } unless ($nodeip) { $failurenodes{$_} = 1; } @@ -468,7 +499,9 @@ sub process_request { if (xCAT::NetworkUtils->nodeonmynet($preparednodes{$_})) { push @nodes, $_; } else { - xCAT::MsgUtils->trace(0, "W", "petitboot: configuration file was not created for [$_] because the node is not on the same network as this server"); + if (!defined($::DISABLENODESETWARNING)) { # set by AAsn.pm + xCAT::MsgUtils->trace(0, "W", "petitboot: configuration file was not created for [$_] because the node is not on the same network as this server"); + } delete $preparednodes{$_}; } } @@ -476,8 +509,14 @@ sub process_request { @nodes = keys %preparednodes; } - my $str_node = join(" ", @nodes); - xCAT::MsgUtils->trace($verbose_on_off, "d", "petitboot: nodes are $str_node") if ($str_node); + my $str_node = ''; + my $total = $#nodes; + if ($total > 20) { + $str_node = join(" ", @nodes[0..19]) . " ..."; + } else { + $str_node = join(" ", @nodes); + } + xCAT::MsgUtils->trace($verbose_on_off, "d", "petitboot: [total=$total] nodes are $str_node"); # Return directly if no nodes in the same network, need to report error on console if its managed nodes are not handled. unless (@nodes) { @@ -552,7 +591,7 @@ sub process_request { \&pass_along); if ($errored) { xCAT::MsgUtils->trace($verbose_on_off, "d", "petitboot: Failed in processing setdestiny."); - return if ($errored > 1); + return if ($errored > 1); # errored = 1 means to go with error, errored = 2 means to stop } } diff --git a/xCAT-server/lib/xcat/plugins/xnba.pm b/xCAT-server/lib/xcat/plugins/xnba.pm index b77366ec0..cdca59850 100644 --- a/xCAT-server/lib/xcat/plugins/xnba.pm +++ b/xCAT-server/lib/xcat/plugins/xnba.pm @@ -447,6 +447,12 @@ sub preprocess_request { return; } + # inittime flag in request will only be set in AAsn.pm (it is only used when xcatd starting on service node) + # There is special requirement to not run in parallel on one SN to avoid DB CPU 100% when all service nodes booting in the same time. + my $inittime = 0; + if (exists($req->{inittime})) { $inittime = $req->{inittime}->[0]; } + if (!$inittime) { $inittime = 0; } + #Assume shared tftp directory for boring people, but for cool people, help sync up tftpdirectory contents when #they specify no sharedtftp in site table my @entries = xCAT::TableUtils->get_site_attribute("sharedtftp"); @@ -470,16 +476,16 @@ sub preprocess_request { } $req->{'_disparatetftp'} = [1]; - if ($req->{inittime}->[0]) { - return [$req]; - } if (@CN > 0) { # if compute nodes broadcast to all servicenodes + # 1, Non-hierarchy, run on locally with parallel my @sn = xCAT::ServiceNodeUtils->getSNList(); unless ( @sn > 0 ) { - return xCAT::Scope->get_parallel_scope($req) + return if (xCAT::Utils->isServiceNode()); # in case the wrong configuration + return xCAT::Scope->get_parallel_scope($req); } + # To check site table to see if disjoint mode my $mynodeonly = 0; my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps"); my $t_entry = $entries[0]; @@ -489,11 +495,30 @@ sub preprocess_request { $req->{'_disjointmode'} = [$mynodeonly]; xCAT::MsgUtils->trace(0, "d", "xnba: disjointdhcps=$mynodeonly"); - if ($mynodeonly == 0 || $ALLFLAG) { # broadcast to all service nodes + # 2, Non-disjoint mode, broadcast to all service nodes, + # but for SN init time (AAsn.pm), only run locally without parallel. + if ($mynodeonly == 0 || $ALLFLAG) { + # broadcast to all service nodes, but for SN init time (AAsn.pm), only run locally. + if ($inittime) { + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } return xCAT::Scope->get_broadcast_scope_with_parallel($req, \@sn); } + # 3, Disjoint mode, run on local for owned CNs only and + # dispatch to parent SNs of the requesting nodes and `dhcpserver` which serving dynamic range in `networks` table. + # but for SN init time (AAsn.pm), only run locally without parallel. my $sn_hash = xCAT::ServiceNodeUtils->getSNformattedhash(\@CN, "xcat", "MN"); + if ($inittime) { + foreach my $sn ( keys %$sn_hash ) { + unless (xCAT::NetworkUtils->thishostisnot($sn)) { + $req->{node} = $sn_hash->{$sn}; + $req->{_xcatpreprocessed}->[0] = 1; + return [$req]; + } + } + } my @dhcpsvrs = (); my $ntab = xCAT::Table->new('networks'); if ($ntab) { @@ -504,6 +529,9 @@ sub preprocess_request { } return xCAT::Scope->get_broadcast_disjoint_scope_with_parallel($req, $sn_hash, \@dhcpsvrs); } + } elsif ($inittime) { + # Shared TFTP, no need to run on service node booting (AAsn.pm) + return; } # Do not dispatch to service nodes if non-sharedtftp or the node range contains only SNs. return xCAT::Scope->get_parallel_scope($req); @@ -599,8 +627,14 @@ sub process_request { @nodes = keys %preparednodes; } - my $str_node = join(" ", @nodes); - xCAT::MsgUtils->trace(0, "d", "xnba: nodes are $str_node") if ($str_node); + my $str_node = ''; + my $total = $#nodes; + if ($total > 20) { + $str_node = join(" ", @nodes[0..19]) . " ..."; + } else { + $str_node = join(" ", @nodes); + } + xCAT::MsgUtils->trace($verbose_on_off, "d", "xnba: [total=$total] nodes are $str_node"); # Return directly if no nodes in the same network, need to report error on console if its managed nodes are not handled. unless (@nodes) {