perf improvement getnodetype for array processing and documentation

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@10999 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2011-11-14 19:34:06 +00:00
parent c07c237d4e
commit 48913f09c3

View File

@ -10,17 +10,16 @@
#####################################################
package xCAT::DBobjUtils;
use xCAT::NodeRange;
use xCAT::Schema;
use xCAT::Table;
use xCAT::Utils;
use xCAT::MsgUtils;
use xCAT::NetworkUtils;
require xCAT::NodeRange;
require xCAT::Schema;
require xCAT::Table;
require xCAT::Utils;
require xCAT::MsgUtils;
require xCAT::NetworkUtils;
use strict;
# IPv6 not yet implemented - need Socket6
use Socket;
my @tabletype = qw(ppc zvm);
#----------------------------------------------------------------------------
@ -2105,6 +2104,7 @@ sub getchildren
}
$::RUNCMD_RC = 0;
my $port = shift;
my @tabletype = qw(ppc zvm);
my @children = ();
my @children_port = ();
if (!%PPCHASH) {
@ -2165,7 +2165,7 @@ sub getchildren
{
return undef;
}
for my $n (@children)
foreach my $n (@children)
{
my $nside = $sides->{$n}->[0];
if ($nside->{side} =~ /$port/)
@ -2179,23 +2179,19 @@ sub getchildren
}
}
}
#-------------------------------------------------------------------------------
=head3 getnodetype
returns nodetype,
first requery ppc table, if not exist, requery nodetypetable
if the input is a array it will return a refrence,
if the input is a simple node,it will return its type value
if the value in the talbe is null, it will be undef but not ''
Query ppc table, if no type found query nodetype table
Arguments:
none
An array of nodenames or 1 nodename
Returns:
type of node
Globals:
%::GLOBLE_NODE_TYPE
%NODETYPEHASH
Error:
none
$::RUNCMD_RC = 1;
Errors written to syslog
Example:
$type = getnodetype($node);
$typerefer = getnodetype(\@nodes);
@ -2204,6 +2200,7 @@ sub getchildren
=cut
#-------------------------------------------------------------------------------
my %NODETYPEHASH;
sub getnodetype
{
my $nodes = shift;
@ -2212,60 +2209,64 @@ sub getnodetype
$nodes = shift;
}
my $rsp;
my @tabletype = qw(ppc zvm);
$::RUNCMD_RC = 0;
my $nodetypetab = xCAT::Table->new( 'nodetype' );
if ( !$nodetypetab )
{
$rsp->{data}->[0] = "Could not open the nodetype table.";
xCAT::MsgUtils->message("E", $rsp, $::callback);
unless ($nodetypetab) { # cannot open the table return with error
xCAT::MsgUtils->
message('S', "getnodetype:Unable to open nodetype table.\n");
$::RUNCMD_RC = 1;
return undef;
}
my @types = ();
my $typep;
my $type;
my %typehash;
if ( $nodes =~ /^ARRAY/) {
my @nodetypes = $nodetypetab->getAllAttribs('node','nodetype');
for my $tn( @nodetypes ) {
$typehash{ $tn->{'node'} } = $tn->{'nodetype'};
}
for my $nn (@$nodes) {
$type = $typehash{$nn};
if ($type) {
my $flag = 0;
my @tablename;
for my $tt ( split /,/, $type ) {
if ( grep(/$tt/, @tabletype)) {
@tablename = grep(/$tt/, @tabletype);
$flag = 1;
next;
}
if (!%NODETYPEHASH) {
my @nodetypes = $nodetypetab->getAllAttribs('node','nodetype');
foreach my $tn (@nodetypes) {
$NODETYPEHASH{ $tn->{'node'} } = $tn->{'nodetype'};
}
}
foreach my $nn (@$nodes) {
$type = $NODETYPEHASH{$nn};
if ($type) {
my $flag = 0;
my @tablename;
foreach my $tt (split /,/, $type) {
if (grep(/$tt/, @tabletype)) {
@tablename = grep(/$tt/, @tabletype);
$flag = 1;
next;
}
}
unless ($flag) { # find type in nodetype table
push (@types, $type);
} else { # use table (ppc or zvm) from attribute
my $tablehandler = xCAT::Table->new( $tablename[0] );
unless ($tablehandler) { # cannot open
xCAT::MsgUtils->
message('S', "getnodetype:Unable to open $tablename[0] table.\n");
$::RUNCMD_RC = 1;
return undef;
}
unless ($flag) { # find type in nodetype table
push (@types, $type);
# read the table
$typep = $tablehandler->getNodeAttribs($nn, ["nodetype"]);
if ($typep and $typep->{nodetype}) {
$type = $typep->{nodetype};
push (@types, $type);
} else {
my $tablehandler = xCAT::Table->new( $tablename[0] );
if ( !$tablehandler ) {
$rsp->{data}->[0] = "Could not open the $tablename[0] table.";
xCAT::MsgUtils->message("E", $rsp, $::callback);
push (@types, undef);
next;
}
$typep = $tablehandler->getNodeAttribs($nn, ["nodetype"]); # find type in ppc table
if ($typep and $typep->{nodetype}) {
$type = $typep->{nodetype};
push (@types, $type);
} else {
push (@types, undef);
}
}
} else {
push (@types, undef);
}
push (@types, undef);
}
} # end of processing PPC
} else {
push (@types, undef);
}
}
return \@types;
} else {
} else { # for one node
$typep = $nodetypetab->getNodeAttribs($nodes, ["nodetype"]);
if ( $typep and $typep->{nodetype} ) {
$type = $typep->{nodetype};
@ -2283,9 +2284,9 @@ sub getnodetype
} else { # find type in ppc table
my $tablehandler = xCAT::Table->new( $tablename[0] );
if ( !$tablehandler ) {
$rsp->{data}->[0] = "Could not open the $tablename[0] table.";
xCAT::MsgUtils->message("E", $rsp, $::callback);
return undef;
xCAT::MsgUtils->message('S', "getnodetype:Unable to open $tablename[0] table.\n");
$::RUNCMD_RC = 1;
return undef;
}
$typep = $tablehandler->getNodeAttribs($nodes, ["nodetype"]);
if ( $typep and $typep->{nodetype} ) {