[LON-CAPA-cvs] cvs: loncom / lonManage
foxr
lon-capa-cvs@mail.lon-capa.org
Tue, 04 Nov 2003 11:23:37 -0000
foxr Tue Nov 4 06:23:37 2003 EDT
Modified files:
/loncom lonManage
Log:
- Really debug use of foreign config files.
- Set debug level on LondConnection for now to assist in debugging efforts.
- Debug the connection negotiation logic.
Index: loncom/lonManage
diff -u loncom/lonManage:1.22 loncom/lonManage:1.23
--- loncom/lonManage:1.22 Mon Nov 3 05:48:18 2003
+++ loncom/lonManage Tue Nov 4 06:23:37 2003
@@ -3,9 +3,9 @@
#
# lonManage supports remote management of nodes in a LonCAPA cluster.
#
-# $Id: lonManage,v 1.22 2003/11/03 10:48:18 foxr Exp $
+# $Id: lonManage,v 1.23 2003/11/04 11:23:37 foxr Exp $
#
-# $Id: lonManage,v 1.22 2003/11/03 10:48:18 foxr Exp $
+# $Id: lonManage,v 1.23 2003/11/04 11:23:37 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -63,8 +63,8 @@
use strict; # Because it's good practice.
use English; # Cause I like meaningful names.
use Getopt::Long;
-use IO::Socket::UNIX; # To communicate with lonc.
use LondConnection;
+use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP POLLOUT);
# File scoped variables:
@@ -73,8 +73,16 @@
my $MyHost=""; # Host name to use as me.
my $ForeignHostTab=""; # Name of foreign hosts table.
+
+my $DefaultServerPort = 5663; # Default server port if standalone.
my $ServerPort; # Port used to connect to lond.
+my $TransitionTimeout = 5; # Poll timeout in seconds.
+
+
+LondConnection::SetDebug(10);
+
+
#
# prints out utility's command usage info.
#
@@ -112,17 +120,80 @@
}
+#
+# Make a direct connection to the lond in 'host'. The port is
+# gotten from the global variable: ServerPort.
+# Returns:
+# The connection or undef if one could not be formed.
+#
sub MakeLondConnection {
my $host = shift;
my $Connection = LondConnection->new($host, $ServerPort);
return return $Connection;
}
-
+#
+# This function runs through the section of the connection
+# state machine that has to do with negotiating the startup
+# sequence with lond. The general strategy is to loop
+# until the connection state becomes idle or disconnected.
+# Disconnected indicates an error or rejection of the
+# connection at some point in the negotiation.
+# idle indicates a connection ready for a request.
+# The main loop consults the object to determine if it
+# wants to be writeable or readable, waits for that
+# condition on the socket (with timeout) and then issues
+# the appropriate LondConnection call. Note that
+# LondConnection is capable of doing everything necessary
+# to get to the initial idle state.
+#
+#
+# Parameters:
+# connection - A connection that has been created with
+# the remote lond. This connection should
+# be in the Connected state ready to send
+# the init sequence.
+#
sub NegotiateStartup {
my $connection = shift;
+ my $returnstatus = "ok"; # Optimistic!!.
- return "ok";
+ my $state = $connection->GetState;
+ if($state ne "Connected") {
+ print "Error: Initial lond connection state: $state should be Connected\n";
+ return "error";
+ }
+ my $Socket = $connection->GetSocket; # This is a IO:Socket::INET object.
+
+ # Ready now to enter the main loop:
+ #
+ my $error = 0;
+ while (($connection->GetState ne "Idle") && (!$error)) {
+ #
+ # Wait for the socket to get into the appropriate state:
+ #
+ my $wantread = $connection->WantReadable;
+ my $poll = new IO::Poll;
+ $poll->mask($Socket => $wantread ? POLLIN : POLLOUT);
+ $poll->poll($TransitionTimeout);
+ my $done = $poll->handles();
+ if(scalar($done) == 0) { # Timeout!!!
+ print "Error: Timeout in state : $state negotiating connection\n";
+ $returnstatus = "error";
+ $error = 1;
+ } else {
+ my $status;
+ $status = $wantread ? $connection->Readable : $connection->Writable;
+ if ($status != 0) {
+ print "Error: I/O failed in state : $state negotiating connection\n";
+ $returnstatus = "error";
+ $error = 1;
+ }
+ }
+ }
+
+
+ return $returnstatus;
}
sub PerformTransaction {
my $connection = shift;
@@ -149,9 +220,10 @@
return "Connect Failed";
}
my $reply = NegotiateStartup($connection);
- if($reply != "ok") {
+ if($reply ne "ok") {
return "connection negotiation failed";
}
+ print "Connection negotiated\n";
my $reply = PerformTransaction($connection, $cmd);
return $reply;
@@ -279,11 +351,13 @@
$MyHost = $perlvar{lonHostID}; # Set hostname from vars.
$ServerPort = $perlvar{londPort};
} else {
- my $hoststab = LondConnection::read_hosts($ForeignHostTab);
- %hostshash = %{$hoststab};
- $ServerPort = 5663;
- }
-
+
+ LondConnection::ReadForeignConfig($MyHost, $ForeignHostTab);
+ my $hoststab = LondConnection::read_hosts($ForeignHostTab); # we need to know too.
+ %hostshash = %{$hoststab};
+ $ServerPort = $DefaultServerPort;
+ }
+
}
#
# Determine if the target host is valid.