2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-13 01:40:26 +00:00

Make disjoint mode working when service node up (inittime=1) (#5553)

* Make disjoint mode working when service node up (inittime=1), and in the time not run in parallel to avoid access DB too much

* For shared tftp, nothing need to be done in AAsn
This commit is contained in:
Bin Xu
2018-09-11 09:22:08 +08:00
committed by GitHub
parent 83a8245a03
commit 863c36c83f
5 changed files with 138 additions and 28 deletions

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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;
}

View File

@ -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
}
}

View File

@ -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) {