[LON-CAPA-cvs] cvs: loncom / loncnew
foxr
lon-capa-cvs@mail.lon-capa.org
Tue, 29 Apr 2003 03:24:52 -0000
foxr Mon Apr 28 23:24:52 2003 EDT
Modified files:
/loncom loncnew
Log:
- Add a bit more error checking on write fails.
- Write pid file.
- If a tick goes by and there's work to do but no connections attempt
to start connections to process the work (can happen on initial
connection fail.. this retries once per second).
Index: loncom/loncnew
diff -u loncom/loncnew:1.4 loncom/loncnew:1.5
--- loncom/loncnew:1.4 Thu Apr 24 06:56:55 2003
+++ loncom/loncnew Mon Apr 28 23:24:51 2003
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# lonc maintains the connections to remote computers
#
-# $Id: loncnew,v 1.4 2003/04/24 10:56:55 foxr Exp $
+# $Id: loncnew,v 1.5 2003/04/29 03:24:51 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -155,15 +155,28 @@
=pod
+=head2 ShowStatus
+
+ Place some text as our pid status.
+
+=cut
+sub ShowStatus {
+ my $status = shift;
+ $0 = "lonc: ".$status;
+}
+
+=pod
+
=head2 Tick
Invoked each timer tick.
=cut
+
sub Tick {
my $client;
- $0 = 'lonc: '.GetServerHost()." Connection count: ".$ConnectionCount;
+ ShowStatus(GetServerHost()." Connection count: ".$ConnectionCount);
Debug(6, "Tick");
Debug(6, " Current connection count: ".$ConnectionCount);
foreach $client (keys %ActiveClients) {
@@ -182,6 +195,21 @@
} else {
$IdleSeconds = 0; # Reset idle count if not idle.
}
+
+ # Do we have work in the queue, but no connections to service them?
+ # If so, try to make some new connections to get things going again.
+ #
+
+ my $Requests = $WorkQueue->Count();
+ if (($ConnectionCount == 0) && ($Requests > 0)) {
+ my $Connections = ($Requests <= $MaxConnectionCount) ?
+ $Requests : $MaxConnectionCount;
+ Debug(1,"Work but no connections, starting ".$Connections." of them");
+ for ($i =0; $i < $Connections; $i++) {
+ MakeLondConnection();
+ }
+
+ }
}
=pod
@@ -654,10 +682,7 @@
if ($Socket->Writable() != 0) {
# The write resulted in an error.
# We'll treat this as if the socket got disconnected:
- if(exists($ActiveTransactions{$Socket})) {
- Debug(3, "Lond connection lost, failing transactions");
- FailTransaction($ActiveTransactions{$Socket});
- }
+
$Watcher->cancel();
KillSocket($Socket, 1);
return;
@@ -679,7 +704,10 @@
# we're waiting for the state to change
if($Socket->Writable() != 0) {
- # Write of the next chunk resulted in an error.
+
+ $Watcher->cancel();
+ KillSocket($Socket, 1);
+ return;
}
} elsif ($State eq "ChallengeReplied") {
@@ -697,8 +725,12 @@
if($Socket->Writable() != 0) {
# Write resulted in an error.
- }
+ $Watcher->cancel();
+ KillSocket($Socket, 1);
+ return;
+
+ }
} elsif ($State eq "ReceivingKey") {
# Now we need to wait for the key
# to come back from the peer:
@@ -711,8 +743,15 @@
# peer... write the next chunk:
if($Socket->Writable() != 0) {
- # Write resulted in an error.
+ if(exists($ActiveTransactions{$Socket})) {
+ Debug(3, "Lond connection lost, failing transactions");
+ FailTransaction($ActiveTransactions{$Socket});
+ }
+ $Watcher->cancel();
+ KillSocket($Socket, 1);
+ return;
+
}
} elsif ($State eq "ReceivingReply") {
@@ -753,31 +792,30 @@
&GetServerPort());
if($Connection == undef) { # Needs to be more robust later.
- die "Failed to make a connection!!".$!."\n";
+ Debug(0,"Failed to make a connection with lond.");
+ } else {
+ # The connection needs to have writability
+ # monitored in order to send the init sequence
+ # that starts the whole authentication/key
+ # exchange underway.
+ #
+ my $Socket = $Connection->GetSocket();
+ if($Socket == undef) {
+ die "did not get a socket from the connection";
+ } else {
+ &Debug(9,"MakeLondConnection got socket: ".$Socket);
+ }
- }
- # The connection needs to have writability
- # monitored in order to send the init sequence
- # that starts the whole authentication/key
- # exchange underway.
- #
- my $Socket = $Connection->GetSocket();
- if($Socket == undef) {
- die "did not get a socket from the connection";
- } else {
- &Debug(9,"MakeLondConnection got socket: ".$Socket);
+
+ $event = Event->io(fd => $Socket,
+ poll => 'w',
+ cb => \&LondWritable,
+ data => ($Connection, undef),
+ desc => 'Connection to lond server');
+ $ActiveConnections{$Connection} = $event;
+
+ $ConnectionCount++;
}
-
-
- $event = Event->io(fd => $Socket,
- poll => 'w',
- cb => \&LondWritable,
- data => ($Connection, undef),
- desc => 'Connection to lond server');
- $ActiveConnections{$Connection} = $event;
-
- $ConnectionCount++;
-
}
@@ -1043,7 +1081,11 @@
# Setup the initial server connection:
&MakeLondConnection();
-
+
+ if($ConnectionCount == 0) {
+ Debug(1,"Could not make initial connection..\n");
+ Debug(1,"Will retry when there's work to do\n");
+ }
Debug(9,"Entering event loop");
my $ret = Event::loop(); # Start the main event loop.
@@ -1062,6 +1104,7 @@
if($pid) { # Parent
$ChildHash{$pid} = $RemoteHost;
} else { # child.
+ ShowStatus("Connected to ".$RemoteHost);
ChildProcess;
}
@@ -1076,6 +1119,20 @@
# Each exit gets logged and the child gets restarted.
#
+#
+# Fork and start in new session so hang-up isn't going to
+# happen without intent.
+#
+
+
+ShowStatus("Parent writing pid file:");
+$execdir = $perlvar{'lonDaemons'};
+open (PIDSAVE, ">$execdir/logs/lonc.pid");
+print PIDSAVE "$$\n";
+close(PIDSAVE);
+
+ShowStatus("Forking node servers");
+
my $HostIterator = LondConnection::GetHostIterator;
while (! $HostIterator->end()) {
@@ -1085,6 +1142,8 @@
}
# Maintain the population:
+
+ShowStatus("Parent keeping the flock");
while(1) {
$deadchild = wait();