Andy Kurth created VCL-815:
------------------------------

             Summary: Problems with update_cluster in OS.pm
                 Key: VCL-815
                 URL: https://issues.apache.org/jira/browse/VCL-815
             Project: VCL
          Issue Type: Bug
          Components: vcld (backend)
            Reporter: Andy Kurth
            Assignee: Andy Kurth
             Fix For: 2.4


*Problem 1:*
Due to OS.pm::update_cluster, the processing of the reserved state for each 
computer is taking an extremely long time.  A fairly large cluster of 80 
computers is taking over 20 minutes to complete, not including the time it 
spends waiting for the user to click Connect and to actually connect to the 
computer.  This is longer than it took to actually load the bare-metal 
computers via xCAT.

*Problem 2:*
Every reservation that belongs to a cluster request first creates its own 
cluster_info file in /tmp.  The file that each creates is identical.  Every 
reservation then proceeds to copy the file it created to every other computer 
in the cluster request via SCP.  So, for an 80 node cluster, cluster_info files 
are needlessly copied back and forth 6,400 times.

*Problem 3:*
Each node does not copy the cluster_info file it created in /tmp to the proper 
location on itself.  Instead, it sends it to itself via SCP.  There's really no 
need for this because the file will end up in the proper location when the 
other 79 nodes SCP it over.

*Problem 4:*
The subroutine is using the following to determine where to send the file to 
via SCP:
{noformat}
my $node_name = $request_data->{reservation}{$resid}{computer}{SHORTNAME};
{noformat}

If you're not familiar with the backend code, the remote computer's short 
hostname is being used.  For example, if the FQDN is vm9.example.com, the code 
is trying to send the file to "vm9".  This will only work if "vm9" resolves to 
an address the management node can get to.  This will not work for distributed 
management nodes residing in different locations.  Furthermore, with the move 
away from relying on /etc/hosts, whenever a hostname is passed to 
run_scp_command, the computer's private IP address will be used.  Examine the 
determine_remote_connection_target for more information.  If absolutely 
necessary to SCP files back and forth, the public IP address must be used.

*Problem 5:*
The update_cluster subroutine is attempting to open the firewall on each 
computer for incoming traffic from the other computers in the cluster.  This is 
good, but the way it is implemented is very slow an inefficient.  It is also 
not reliable due to the way the enable_firewall_port subroutines are handling 
things.  Errors are being generated because the command being generated is too 
large:

{noformat}
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| ---- 
WARNING ----
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| 2015-02-04 
16:28:26|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828|failed
 to enable firewall port on blade1f5-5, protocol: tcp, port: any, scope: 
<omitted>, exit status: 1, command:
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| iptables -D 
INPUT 9 && iptables -D INPUT 8 && iptables -D INPUT 7 && iptables -D INPUT 6 && 
iptables -D INPUT 5 && iptables -D INPUT 4 && iptables -D INPUT 3 && iptables 
-D INPUT 2 && iptables -D INPUT 10 && iptables -D INPUT 1 && /sbin/iptables -v 
-I INPUT 1 -p tcp -j ACCEPT -s 10.25.0.241 -m state --state 
NEW,RELATED,ESTABLISHED && 
...much more omitted...
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| output:
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| iptables: 
Index of deletion too big.
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| ( 0) 
Linux.pm, enable_firewall_port (line: 3828)
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| (-1) OS.pm, 
update_cluster (line: 3909)
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| (-2) 
reserved.pm, process (line: 157)
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| (-3) vcld, 
make_new_child (line: 587)
|10435|2626116|2726142|reserved|Linux.pm:enable_firewall_port|3828| (-4) vcld, 
main (line: 348)
{noformat}

*Problem 6:*
The subroutine is calling $self->data->get_request_data() and then accessing 
the hash data directly.  Example:
{noformat}
$request_data->{reservation}{$rid}{computer}{IPaddress}
{noformat}

The past few years have been spent trying to get rid of code which directly 
accesses the hash constructed by get_request_info.  There are functions built 
into DataStructure.pm which may be accessed via  $self->data to retrieve this 
information, including information about other reservations in the cluster.  
The get_request_data function should only be used when absolutely necessary -- 
such as from DataStructure.pm or if the entire hash is needed to create another 
module object.

*Problem 7:*
The reserved.pm::process subroutine calculates the exact time it should timeout 
a reservation due to no initial connection by taking the time the user clicked 
connect and adding the initialconnecttimeout variable value to it.  The 
update_cluster subroutine gets run in the meantime.  As it is currently 
written, it can take longer than the entire initialconnecttimeout value.  When 
control is passed back to reserved.pm::process, the code realizes the initial 
connection expire time is in the past so connection checking isn't being done 
at all.

*Problem 8:*
The code includes the following:
{noformat}
if ($image_OS_type =~ /linux/i) {
   ...
}
elsif ($image_OS_type =~ /windows/i) {
   ...
}
{noformat}


The backend is architected so that these if/else statements should be avoided 
whenever possible.  Sure, an if/else such as this is quick and easy but the 
more elegant way to handle it would be to add a commonly named subroutine to 
the Linux and Windows modules that handles the specifics of this statement.  
Again, work has been done over the past few years to rework code such as this.  
I see no reason to keep adding it back.

Problem 9:
"$image_OS_type" - There are over 9,000 variables defined in the backend code.  
Variables intended to act as constants for an entire module are all uppercase.  
Nearly all other variables are entirely lowercase, except for a few in some 
very old code.  I see no reason to mix case.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to