fix for bug 3458183: mkdef performance improvement, do not grep array, do not access nodegroup table in foreach node loop
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@11271 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
588d79236d
commit
4e60d179cf
@ -1074,6 +1074,16 @@ sub defmk
|
||||
}
|
||||
}
|
||||
|
||||
# Build up a hash for the array in objTypeLists
|
||||
# for performance consideration, grep the array is not effective
|
||||
my %objTypeListsHash;
|
||||
foreach my $objk (keys %objTypeLists)
|
||||
{
|
||||
foreach my $obj (@{$objTypeLists{$objk}}) {
|
||||
$objTypeListsHash{$objk}{$obj} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
OBJ: foreach my $obj (keys %::FINALATTRS)
|
||||
{
|
||||
|
||||
@ -1115,7 +1125,7 @@ sub defmk
|
||||
}
|
||||
|
||||
# if object already exists
|
||||
if (grep(/^$obj$/, @{$objTypeLists{$type}}))
|
||||
if (defined($objTypeListsHash{$type}{$obj}) && ($objTypeListsHash{$type}{$obj} == 1))
|
||||
{
|
||||
if ($::opt_f)
|
||||
{
|
||||
@ -1357,76 +1367,10 @@ sub defmk
|
||||
$error = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
#
|
||||
# Need special handling for node objects that have the
|
||||
# groups attr set - may need to create group defs
|
||||
#
|
||||
if (($type eq "node") && $::FINALATTRS{$obj}{groups})
|
||||
{
|
||||
|
||||
# get the list of groups in the "groups" attr
|
||||
my @grouplist;
|
||||
@grouplist = split(/,/, $::FINALATTRS{$obj}{groups});
|
||||
|
||||
# get the list of all defined group objects
|
||||
|
||||
# getObjectsOfType("group") only returns static groups,
|
||||
# generally speaking, the nodegroup table should includes all the static and dynamic groups,
|
||||
# but it is possible that the static groups are not in nodegroup table,
|
||||
# so we have to get the static and dynamic groups separately.
|
||||
my @definedgroups = xCAT::DBobjUtils->getObjectsOfType("group"); #static groups
|
||||
my $grptab = xCAT::Table->new('nodegroup');
|
||||
my @grplist = @{$grptab->getAllEntries()}; #dynamic groups and static groups in nodegroup table
|
||||
|
||||
my %GroupHash;
|
||||
foreach my $g (@grouplist)
|
||||
{
|
||||
my $indynamicgrp = 0;
|
||||
#check the dynamic node groups
|
||||
foreach my $grpdef_ref (@grplist)
|
||||
{
|
||||
my %grpdef = %$grpdef_ref;
|
||||
if (($grpdef{'groupname'} eq $g) && ($grpdef{'grouptype'} eq 'dynamic'))
|
||||
{
|
||||
$indynamicgrp = 1;
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] = "nodegroup $g is a dynamic node group, should not add a node into a dynamic node group statically.";
|
||||
xCAT::MsgUtils->message("I", $rsp, $::callback);
|
||||
last;
|
||||
}
|
||||
}
|
||||
if (!$indynamicgrp)
|
||||
{
|
||||
if (!grep(/^$g$/, @definedgroups))
|
||||
{
|
||||
# define it
|
||||
$GroupHash{$g}{objtype} = "group";
|
||||
$GroupHash{$g}{grouptype} = "static";
|
||||
$GroupHash{$g}{members} = "static";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (defined(%GroupHash))
|
||||
{
|
||||
if ($::verbose)
|
||||
{
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] = "Write GroupHash: %GroupHash to xCAT database";
|
||||
xCAT::MsgUtils->message("I", $rsp, $::callback);
|
||||
}
|
||||
if (xCAT::DBobjUtils->setobjdefs(\%GroupHash) != 0)
|
||||
{
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] =
|
||||
"Could not write data to the xCAT database.";
|
||||
|
||||
# xCAT::MsgUtils->message("E", $rsp, $::callback);
|
||||
$error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
} # end - if type = node
|
||||
# Removed the code to handle the nodegroup table with mkdef -t node groups=xxx
|
||||
# Only dynamic groups should be in nodegroup table
|
||||
# Do not try to add static group into the nodegroup table
|
||||
# performance!!!!
|
||||
|
||||
} # end of each obj
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user