2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-21 19:22:05 +00:00

Do not update bootparams table when running nodeset

With the nytprof tool, the buttleneck is the time to update the bootparams
table.To optimize the performance on large scale nodes, this patch tranfer
the bootparams hash through variable reference.

posible impact: getdestiny can not get the information about bootparams.

partial-issue: #2024
This commit is contained in:
chenglch 2016-12-23 13:45:20 +08:00
parent f50d14e483
commit 97f9d4da8f
9 changed files with 69 additions and 122 deletions

View File

@ -172,6 +172,7 @@ sub mknetboot
if ($req->{command}->[0] =~ 'mkstatelite') {
$statelite = "true";
}
my $bootparams = ${$req->{bootparams}};
my $globaltftpdir = "/tftpboot";
my $nodes = @{ $req->{node} };
my @args = @{ $req->{arg} } if (exists($req->{arg}));
@ -232,7 +233,6 @@ sub mknetboot
my %donetftp = ();
my %oents = %{ $ostab->getNodesAttribs(\@nodes, [qw(os arch profile provmethod)]) };
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $mactab = xCAT::Table->new('mac');
@ -249,8 +249,6 @@ sub mknetboot
$stateHash = $statetab->getNodesAttribs(\@nodes, ['statemnt']);
}
#my $addkcmdhash =
# $bptab->getNodesAttribs(\@nodes, ['addkcmdline']);
# Warning message for nodeset <noderange> install/netboot/statelite
foreach my $knode (keys %oents)
@ -950,15 +948,9 @@ sub mknetboot
$kcmdline .= " MNTOPTS=$mntoptions";
}
}
$bptab->setNodeAttribs(
$node,
{
kernel => $kernstr,
initrd => $initrdstr,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $kernstr;
$bootparams->{$node}->[0]->{initrd} = $initrdstr;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
}
@ -971,6 +963,7 @@ sub mkinstall
my @nodes = @{ $request->{node} };
my $noupdateinitrd = $request->{'noupdateinitrd'};
my $ignorekernelchk = $request->{'ignorekernelchk'};
my $bootparams = ${$request->{bootparams}};
#my $sitetab = xCAT::Table->new('site');
my $linuximagetab;
@ -1023,7 +1016,6 @@ sub mkinstall
my $ostab = xCAT::Table->new('nodetype');
my %donetftp;
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $mactab = xCAT::Table->new('mac');
my %osents = %{ $ostab->getNodesAttribs(\@nodes, [ 'profile', 'os', 'arch', 'provmethod' ]) };
@ -1033,8 +1025,6 @@ sub mkinstall
[ 'serialport', 'serialspeed', 'serialflow' ]) };
my %macents = %{ $mactab->getNodesAttribs(\@nodes, ['mac']) };
#my $addkcmdhash =
# $bptab->getNodesAttribs(\@nodes, ['addkcmdline']);
require xCAT::Template;
# Warning message for nodeset <noderange> install/netboot/statelite
@ -1668,14 +1658,9 @@ sub mkinstall
xCAT::MsgUtils->trace($verbose_on_off, "d", "anaconda->mkinstall: kcmdline=$kcmdline kernal=$k initrd=$i");
$bptab->setNodeAttribs(
$node,
{
kernel => $k,
initrd => $i,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $k;
$bootparams->{$node}->[0]->{initrd} = $i;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
else
{
@ -1701,6 +1686,7 @@ sub mksysclone
my $callback = shift;
my $doreq = shift;
my @nodes = @{ $request->{node} };
my $bootparams = ${$request->{bootparams}};
my $linuximagetab;
my $osimagetab;
my %img_hash = ();
@ -1727,7 +1713,6 @@ sub mksysclone
my $ostab = xCAT::Table->new('nodetype');
my %donetftp;
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $mactab = xCAT::Table->new('mac');
@ -2064,15 +2049,9 @@ sub mksysclone
$k = "xcat/$kernpath";
$i = "xcat/$initrdpath";
$bptab->setNodeAttribs(
$node,
{
kernel => $k,
initrd => $i,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $k;
$bootparams->{$node}->[0]->{initrd} = $i;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
else
{

View File

@ -445,6 +445,7 @@ sub mkinstall {
my $callback = shift;
my $doreq = shift;
my @nodes = @{ $request->{node} };
my $bootparams = ${$request->{bootparams}};
my $sitetab = xCAT::Table->new('site');
my $linuximagetab;
my $osimagetab;
@ -490,7 +491,6 @@ sub mkinstall {
my $ostab = xCAT::Table->new('nodetype');
my %donetftp;
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $mactab = xCAT::Table->new('mac');
my %osents = %{ $ostab->getNodesAttribs(\@nodes, [ 'profile', 'os', 'arch', 'provmethod' ]) };
@ -502,8 +502,6 @@ sub mkinstall {
[ 'serialport', 'serialspeed', 'serialflow' ]) };
my %macents = %{ $mactab->getNodesAttribs(\@nodes, ['mac']) };
#my $addkcmdhash =
# $bptab->getNodesAttribs(\@nodes, ['addkcmdline']);
require xCAT::Template;
# Warning message for nodeset <noderange> install/netboot/statelite
@ -923,10 +921,9 @@ sub mkinstall {
}
xCAT::MsgUtils->trace($verbose_on_off, "d", "debian->mkinstall: kcmdline=$kcmdline kernal=$rtftppath/vmlinuz initrd=$rtftppath/initrd.img");
$bptab->setNodeAttribs($node, { kernel => "$rtftppath/vmlinuz",
initrd => "$rtftppath/initrd.img",
kcmdline => $kcmdline });
$bootparams->{$node}->[0]->{kernel} = "$rtftppath/vmlinuz";
$bootparams->{$node}->[0]->{initrd} = "$rtftppath/initrd.img";
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
else {
$callback->({ error => ["Install image not found in $installroot/$os/$arch"],
@ -945,6 +942,7 @@ sub mknetboot
if ($req->{command}->[0] =~ 'mkstatelite') {
$statelite = "true";
}
my $bootparams = ${$request->{bootparams}};
my $tftpdir = "/tftpboot";
my $nodes = @{ $req->{node} };
my @args = @{ $req->{arg} };
@ -991,7 +989,6 @@ sub mknetboot
my %donetftp = ();
my %oents = %{ $ostab->getNodesAttribs(\@nodes, [qw(os arch profile provmethod)]) };
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $mactab = xCAT::Table->new('mac');
@ -1008,9 +1005,6 @@ sub mknetboot
$stateHash = $statetab->getNodesAttribs(\@nodes, ['statemnt']);
}
#my $addkcmdhash =
# $bptab->getNodesAttribs(\@nodes, ['addkcmdline']);
# Warning message for nodeset <noderange> install/netboot/statelite
foreach my $knode (keys %oents)
{
my $ent = $oents{$knode}->[0];
@ -1589,15 +1583,9 @@ sub mknetboot
$kcmdline .= " MNTOPTS=$mntoptions";
}
}
$bptab->setNodeAttribs(
$node,
{
kernel => "$kernstr",
initrd => "$initrdstr",
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $kernstr;
$bootparams->{$node}->[0]->{initrd} = $initrdstr;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
#my $rc = xCAT::TableUtils->create_postscripts_tar();

View File

@ -26,7 +26,6 @@ my $errored = 0;
#DESTINY SCOPED GLOBALS
my $chaintab;
my $iscsitab;
my $bptab;
my $typetab;
my $restab;
@ -94,6 +93,7 @@ sub setdestiny {
my $noupdate = shift;
$chaintab = xCAT::Table->new('chain', -create => 1);
my @nodes = @{ $req->{node} };
my $bphash = $req->{bootparams};
@ARGV = @{ $req->{arg} };
my $noupdateinitrd;
@ -157,7 +157,6 @@ sub setdestiny {
unless ($iscsitab) {
$callback->({ error => "Unable to open iscsi table to get iscsiboot parameters", errorcode => [1] });
}
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $nodetype = xCAT::Table->new('nodetype');
my $ntents = $nodetype->getNodesAttribs($req->{node}, [qw(os arch profile)]);
my $ients = $iscsitab->getNodesAttribs($req->{node}, [qw(kernel kcmdline initrd)]);
@ -168,11 +167,9 @@ sub setdestiny {
unless ($ntent and $ntent->{arch} =~ /x86/ and -f ("$tftpdir/undionly.kpxe" or -f "$tftpdir/xcat/xnba.kpxe")) { $callback->({ error => "$_: No iscsi boot data available", errorcode => [1] }); } #If x86 node and undionly.kpxe exists, presume they know what they are doing
next;
}
my $hash;
$hash->{kernel} = $ient->{kernel};
if ($ient->{initrd}) { $hash->{initrd} = $ient->{initrd} }
if ($ient->{kcmdline}) { $hash->{kcmdline} = $ient->{kcmdline} }
$bptab->setNodeAttribs($_, $hash);
$bphash->{kernel} = $ient->{kernel};
if ($ient->{initrd}) { $bphash->{initrd} = $ient->{initrd} }
if ($ient->{kcmdline}) { $bphash->{kcmdline} = $ient->{kcmdline} }
}
} elsif ($state =~ /^install[=\$]/ or $state eq 'install' or $state =~ /^netboot[=\$]/ or $state eq 'netboot' or $state eq "image" or $state eq "winshell" or $state =~ /^osimage/ or $state =~ /^statelite/) {
my %state_hash;
@ -389,7 +386,8 @@ sub setdestiny {
$subreq->({ command => ["mk$tempstate"],
node => $samestatenodes,
noupdateinitrd => $noupdateinitrd,
ignorekernelchk => $ignorekernelchk, }, \&relay_response);
ignorekernelchk => $ignorekernelchk,
bootparams => \$bphash}, \&relay_response);
if ($errored) {
my @myself = xCAT::NetworkUtils->determinehostname();
my $myname = $myself[ (scalar @myself) - 1 ];
@ -746,7 +744,7 @@ sub getdestiny {
my $chaintab = xCAT::Table->new('chain');
my $chainents = $chaintab->getNodesAttribs(\@nodes, [qw(currstate chain)]);
my $nrents = $restab->getNodesAttribs(\@nodes, [qw(tftpserver xcatmaster)]);
$bptab = xCAT::Table->new('bootparams', -create => 1);
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $bpents = $bptab->getNodesAttribs(\@nodes, [qw(kernel initrd kcmdline xcatmaster)]);
#my $sitetab= xCAT::Table->new('site');

View File

@ -571,17 +571,18 @@ sub process_request {
if (exists($request->{inittime})) { $inittime = $request->{inittime}->[0]; }
if (!$inittime) { $inittime = 0; }
$errored = 0;
my %bphash;
unless ($args[0] eq 'stat') { # or $args[0] eq 'enact') {
xCAT::MsgUtils->trace($verbose_on_off, "d", "grub2: issue setdestiny request");
$sub_req->({ command => ['setdestiny'],
node => \@nodes,
inittime => [$inittime],
arg => \@args }, \&pass_along);
arg => \@args,
bootparams => \%bphash
}, \&pass_along);
}
if ($errored) { return; }
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $bphash = $bptab->getNodesAttribs(\@nodes, [ 'kernel', 'initrd', 'kcmdline', 'addkcmdline' ]);
my $chaintab = xCAT::Table->new('chain', -create => 1);
my $chainhash = $chaintab->getNodesAttribs(\@nodes, ['currstate']);
my $noderestab = xCAT::Table->new('noderes', -create => 1);
@ -618,7 +619,7 @@ sub process_request {
$linuximghash = $linuximgtab->getAttribs({ imagename => $osimgname }, 'boottarget', 'addkcmdline');
}
($rc, $errstr) = setstate($_, $bphash, $chainhash, $machash, $tftpdir, $nrhash, $linuximghash);
($rc, $errstr) = setstate($_, \%bphash, $chainhash, $machash, $tftpdir, $nrhash, $linuximghash);
if ($rc) {
$response{node}->[0]->{errorcode}->[0] = $rc;
$response{node}->[0]->{errorc}->[0] = $errstr;

View File

@ -460,12 +460,15 @@ sub process_request {
if (exists($request->{inittime})) { $inittime = $request->{inittime}->[0]; }
if (!$inittime) { $inittime = 0; }
$errored = 0;
my %bphash;
unless ($args[0] eq 'stat') { # or $args[0] eq 'enact') {
xCAT::MsgUtils->trace($verbose_on_off, "d", "petitboot: issue setdestiny request");
$sub_req->({ command => ['setdestiny'],
node => \@nodes,
inittime => [$inittime],
arg => \@args }, \&pass_along);
arg => \@args,
bootparams => \%bphash},
\&pass_along);
}
if ($errored) { return; }
@ -476,8 +479,6 @@ sub process_request {
arg => ['default'] });
xCAT::MsgUtils->message("S", "xCAT: petitboot netboot: clear node(s): @nodes boot device setting.");
}
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $bphash = $bptab->getNodesAttribs(\@nodes, [ 'kernel', 'initrd', 'kcmdline', 'addkcmdline' ]);
my $chaintab = xCAT::Table->new('chain', -create => 1);
my $chainhash = $chaintab->getNodesAttribs(\@nodes, ['currstate']);
my $noderestab = xCAT::Table->new('noderes', -create => 1);
@ -510,7 +511,7 @@ sub process_request {
my $linuximghash = $linuximghash = $linuximgtab->getAttribs({ imagename => $osimgname }, 'boottarget', 'addkcmdline');
($rc, $errstr) = setstate($_, $bphash, $chainhash, $machash, $tftpdir, $nodereshash, $linuximghash);
($rc, $errstr) = setstate($_, \%bphash, $chainhash, $machash, $tftpdir, $nodereshash, $linuximghash);
if ($rc) {
$response{node}->[0]->{errorcode}->[0] = $rc;
$response{node}->[0]->{errorc}->[0] = $errstr;

View File

@ -497,6 +497,7 @@ sub process_request {
$errored = 0;
my %bphash;
my $inittime = 0;
if (exists($::PXE_request->{inittime})) { $inittime = $::PXE_request->{inittime}->[0]; }
if (!$inittime) { $inittime = 0; }
@ -505,19 +506,19 @@ sub process_request {
$sub_req->({ command => ['setdestiny'],
node => \@nodes,
inittime => [$inittime],
arg => \@args }, \&pass_along);
arg => \@args,
bootparams => \%bphash
}, \&pass_along);
}
if ($errored) { return; }
#Time to actually configure the nodes, first extract database data with the scalable calls
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $chaintab = xCAT::Table->new('chain');
my $mactab = xCAT::Table->new('mac'); #to get all the hostnames
my $typetab = xCAT::Table->new('nodetype');
my $restab = xCAT::Table->new('noderes');
my $linuximgtab = xCAT::Table->new('linuximage', -create => 1);
my %nrhash = %{ $restab->getNodesAttribs(\@nodes, [qw(tftpdir)]) };
my %bphash = %{ $bptab->getNodesAttribs(\@nodes, [qw(kernel initrd kcmdline addkcmdline)]) };
my %chainhash = %{ $chaintab->getNodesAttribs(\@nodes, [qw(currstate)]) };
my %machash = %{ $mactab->getNodesAttribs(\@nodes, [qw(mac)]) };
my %nthash = %{ $typetab->getNodesAttribs(\@nodes, [qw(os provmethod)]) };

View File

@ -54,6 +54,7 @@ sub mknetboot
if ($req->{command}->[0] =~ 'mkstatelite') {
$statelite = "true";
}
my $bootparams = ${$req->{bootparams}};
my $globaltftpdir = "/tftpboot";
my $nodes = @{ $req->{node} };
@ -445,7 +446,6 @@ sub mknetboot
}
# TODO: move the table operations out of the foreach loop
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $sent =
$hmtab->getNodeAttribs($node,
@ -720,13 +720,9 @@ sub mknetboot
$kcmdline .= "MNTOPTS=\'$mntoptions\'";
}
}
$bptab->setNodeAttribs(
$node,
{
kernel => "$rtftppath/kernel",
initrd => $initrdstr,
kcmdline => $kcmdline
});
$bootparams->{$node}->[0]->{kernel} = "$rtftppath/kernel";
$bootparams->{$node}->[0]->{initrd} = $initrdstr;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
}
@ -770,6 +766,7 @@ sub mkinstall
my $noupdateinitrd = $request->{'noupdateinitrd'};
my $ignorekernelchk = $request->{'ignorekernelchk'};
my $bootparams = ${$request->{bootparams}};
my @nodes = @{ $request->{node} };
my $node;
my $ostab = xCAT::Table->new('nodetype');
@ -799,7 +796,6 @@ sub mkinstall
my $installroot;
$installroot = "/install";
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my $resents =
$restab->getNodesAttribs(
@ -1365,14 +1361,9 @@ sub mkinstall
$kernelpath = "$rtftppath/linux";
$initrdpath = "$rtftppath/initrd";
xCAT::MsgUtils->trace($verbose_on_off, "d", "sles->mkinstall: kcmdline=$kcmdline kernal=$kernelpath initrd=$initrdpath");
$bptab->setNodeAttribs(
$node,
{
kernel => $kernelpath,
initrd => $initrdpath,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $kernelpath;
$bootparams->{$node}->[0]->{initrd} = $initrdpath;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
elsif ($arch eq "ppc64")
{
@ -1384,14 +1375,9 @@ sub mkinstall
$kernelpath = "$rtftppath/linux64";
$initrdpath = "$rtftppath/initrd64";
xCAT::MsgUtils->trace($verbose_on_off, "d", "sles->mkinstall: kcmdline=$kcmdline kernal=$kernelpath initrd=$initrdpath");
$bptab->setNodeAttribs(
$node,
{
kernel => $kernelpath,
initrd => $initrdpath,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $kernelpath;
$bootparams->{$node}->[0]->{initrd} = $initrdpath;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
elsif (-r "$tftppath/inst64") {
@ -1399,14 +1385,9 @@ sub mkinstall
#suseboot/inst64 can not be run on Power8 BE
$kernelpath = "$rtftppath/inst64";
xCAT::MsgUtils->trace($verbose_on_off, "d", "sles->mkinstall: kcmdline=$kcmdline kernal=$kernelpath initrd=");
$bptab->setNodeAttribs(
$node,
{
kernel => $kernelpath,
initrd => "",
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = $kernelpath;
$bootparams->{$node}->[0]->{initrd} = "";
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
}
}
@ -1436,6 +1417,7 @@ sub mksysclone
my $callback = shift;
my $doreq = shift;
my @nodes = @{ $request->{node} };
my $bootparams = ${$request->{bootparams}};
my $osimagetab;
my %img_hash = ();
@ -1460,7 +1442,6 @@ sub mksysclone
my $node;
my $ostab = xCAT::Table->new('nodetype');
my $restab = xCAT::Table->new('noderes');
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $hmtab = xCAT::Table->new('nodehm');
my %osents = %{ $ostab->getNodesAttribs(\@nodes, [ 'os', 'arch', 'provmethod' ]) };
my %rents =
@ -1645,14 +1626,9 @@ sub mksysclone
if (-r "$tftpdir/xcat/genesis.fs.$arch.lzma") {
$i = "xcat/genesis.fs.$arch.lzma";
}
$bptab->setNodeAttribs(
$node,
{
kernel => "xcat/genesis.kernel.$arch",
initrd => $i,
kcmdline => $kcmdline
}
);
$bootparams->{$node}->[0]->{kernel} = "xcat/genesis.kernel.$arch";
$bootparams->{$node}->[0]->{initrd} = $i;
$bootparams->{$node}->[0]->{kcmdline} = $kcmdline;
}
else
{

View File

@ -402,6 +402,7 @@ sub process_request {
$errored = 0;
my %bphash;
my $inittime = 0;
if (exists($::VSMPPXE_request->{inittime})) { $inittime = $::VSMPPXE_request->{inittime}->[0]; }
if (!$inittime) { $inittime = 0; }
@ -409,15 +410,15 @@ sub process_request {
$sub_req->({ command => ['setdestiny'],
node => \@nodes,
inittime => [$inittime],
arg => [ $args[0] ] }, \&pass_along);
arg => [ $args[0] ],
bootparams => \%bphash
}, \&pass_along);
}
if ($errored) { return; }
#Time to actually configure the nodes, first extract database data with the scalable calls
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $chaintab = xCAT::Table->new('chain');
my $mactab = xCAT::Table->new('mac'); #to get all the hostnames
my %bphash = %{ $bptab->getNodesAttribs(\@nodes, [qw(kernel initrd kcmdline addkcmdline)]) };
my %chainhash = %{ $chaintab->getNodesAttribs(\@nodes, [qw(currstate)]) };
my %machash = %{ $mactab->getNodesAttribs(\@nodes, [qw(mac)]) };
foreach (@nodes) {

View File

@ -108,7 +108,7 @@ sub setstate {
my $linuximghashref = shift;
if (ref $linuximghashref) { %linuximghash = %{$linuximghashref}; }
my $imgaddkcmdline = ($linuximghash{'boottarget'}) ? undef : $linuximghash{'addkcmdline'};
my $kern = $bphash{$node}->[0]; #$bptab->getNodeAttribs($node,['kernel','initrd','kcmdline']);
my $kern = $bphash{$node}->[0];
unless ($::XNBA_addkcmdlinehandled->{$node}) { #Tag to let us know the plugin had a special syntax implemented for addkcmdline
if ($kern->{addkcmdline} or ($imgaddkcmdline)) {
@ -520,22 +520,24 @@ sub process_request {
if (exists($::XNBA_request->{inittime})) { $inittime = $::XNBA_request->{inittime}->[0]; }
if (!$inittime) { $inittime = 0; }
$errored = 0;
my %bphash;
unless ($args[0] eq 'stat') { # or $args[0] eq 'enact') {
xCAT::MsgUtils->trace($verbose_on_off, "d", "xnba: issue setdestiny request");
$sub_req->({ command => ['setdestiny'],
node => \@nodes,
inittime => [$inittime],
arg => \@args }, \&pass_along);
arg => \@args ,
bootparams => \%bphash},
\&pass_along);
}
if ($errored) { return; }
#Time to actually configure the nodes, first extract database data with the scalable calls
my $bptab = xCAT::Table->new('bootparams', -create => 1);
my $chaintab = xCAT::Table->new('chain');
my $noderestab = xCAT::Table->new('noderes'); #in order to detect per-node tftp directories
my $mactab = xCAT::Table->new('mac'); #to get all the hostnames
my %nrhash = %{ $noderestab->getNodesAttribs(\@nodes, [qw(tftpdir)]) };
my %bphash = %{ $bptab->getNodesAttribs(\@nodes, [qw(kernel initrd kcmdline addkcmdline)]) };
my %chainhash = %{ $chaintab->getNodesAttribs(\@nodes, [qw(currstate)]) };
my %iscsihash;
my $iscsitab = xCAT::Table->new('iscsi');