[LON-CAPA-cvs] cvs: loncom / loncnew
foxr
lon-capa-cvs@mail.lon-capa.org
Thu, 03 Jul 2003 02:10:19 -0000
foxr Wed Jul 2 22:10:19 2003 EDT
Modified files:
/loncom loncnew
Log:
Get all of the signals to work correctly.
Index: loncom/loncnew
diff -u loncom/loncnew:1.13 loncom/loncnew:1.14
--- loncom/loncnew:1.13 Tue Jul 1 21:31:55 2003
+++ loncom/loncnew Wed Jul 2 22:10:18 2003
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# lonc maintains the connections to remote computers
#
-# $Id: loncnew,v 1.13 2003/07/02 01:31:55 foxr Exp $
+# $Id: loncnew,v 1.14 2003/07/03 02:10:18 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -46,6 +46,9 @@
# Change log:
# $Log: loncnew,v $
+# Revision 1.14 2003/07/03 02:10:18 foxr
+# Get all of the signals to work correctly.
+#
# Revision 1.13 2003/07/02 01:31:55 foxr
# Added kill -HUP logic (restart).
#
@@ -93,12 +96,12 @@
#
# Disable all signals we might receive from outside for now.
#
-$SIG{QUIT} = IGNORE;
-$SIG{HUP} = IGNORE;
-$SIG{USR1} = IGNORE;
-$SIG{INT} = IGNORE;
-$SIG{CHLD} = IGNORE;
-$SIG{__DIE__} = IGNORE;
+#$SIG{QUIT} = IGNORE;
+#$SIG{HUP} = IGNORE;
+#$SIG{USR1} = IGNORE;
+#$SIG{INT} = IGNORE;
+#$SIG{CHLD} = IGNORE;
+#$SIG{__DIE__} = IGNORE;
# Read the httpd configuration file to get perl variables
@@ -132,6 +135,7 @@
my $ConnectionCount = 0;
my $IdleSeconds = 0; # Number of seconds idle.
my $Status = ""; # Current status string.
+my $RecentLogEntry = "";
my $ConnectionRetries=5; # Number of connection retries allowed.
my $ConnectionRetriesLeft=5; # Number of connection retries remaining.
@@ -208,6 +212,7 @@
my $execdir = $perlvar{'lonDaemons'};
my $fh = IO::File->new(">>$execdir/logs/lonc.log");
my $msg = sprintf($finalformat, $message);
+ $RecentLogEntry = $msg;
print $fh $msg;
@@ -1288,6 +1293,25 @@
fd => $socket);
}
+=pod
+
+=head2 ChildStatus
+
+Child USR1 signal handler to report the most recent status
+into the status file.
+
+=cut
+sub ChildStatus {
+ my $event = shift;
+ my $watcher = $event->w;
+
+ Debug(2, "Reporting child status because : ".$watcher->data);
+ my $docdir = $perlvar{'lonDocRoot'};
+ my $fh = IO::File->new(">>$docdir/lon-status/loncstatus.txt");
+ print $fh $$."\t".$RemoteHost."\t".$Status."\t".
+ $RecentLogEntry."\n";
+}
+
=pod
=head2 SignalledToDeath
@@ -1298,7 +1322,10 @@
sub SignalledToDeath {
- Debug(2,"Signalled to death!");
+ my $event = shift;
+ my $watcher= $event->w;
+
+ Debug(2,"Signalled to death! via ".$watcher->data);
my ($signal) = @_;
chomp($signal);
Log("CRITICAL", "Abnormal exit. Child $$ for $RemoteHost "
@@ -1318,14 +1345,25 @@
sub ChildProcess {
- # For now turn off signals.
-
- $SIG{QUIT} = \&SignalledToDeath;
- $SIG{HUP} = IGNORE;
- $SIG{USR1} = IGNORE;
- $SIG{INT} = DEFAULT;
- $SIG{CHLD} = IGNORE;
- $SIG{__DIE__} = \&SignalledToDeath;
+ #
+ # Signals must be handled by the Event framework...
+#
+# $SIG{QUIT} = \&SignalledToDeath;
+# $SIG{HUP} = \&ChildStatus;
+# $SIG{USR1} = IGNORE;
+# $SIG{INT} = DEFAULT;
+# $SIG{CHLD} = IGNORE;
+# $SIG{__DIE__} = \&SignalledToDeath;
+
+ Event->signal(signal => "QUIT",
+ cb => \&SignalledToDeath,
+ data => "QUIT");
+ Event->signal(signal => "HUP",
+ cb => \&ChildStatus,
+ data => "HUP");
+ Event->signal(signal => "USR1",
+ cb => \&ChildStatus,
+ data => "USR1");
SetupTimer();
@@ -1337,7 +1375,7 @@
# Setup the initial server connection:
- # &MakeLondConnection(); // let first work requirest do it.
+ # &MakeLondConnection(); // let first work requirest do
Debug(9,"Entering event loop");
@@ -1430,9 +1468,10 @@
# Set up parent signals:
#
-$SIG{INT} = \&KillThemAll;
-$SIG{TERM} = \&KillThemAll;
+$SIG{INT} = \&Terminate;
+$SIG{TERM} = \&Terminate;
$SIG{HUP} = \&Restart;
+$SIG{USR1} = \&CheckKids;
while(1) {
$deadchild = wait();
@@ -1446,6 +1485,34 @@
}
}
+
+
+=pod
+
+=head1 CheckKids
+
+ Since kids do not die as easily in this implementation
+as the previous one, there is no need to restart the
+dead ones (all dead kids get restarted when they die!!)
+The only thing this function does is to pass USR1 to the
+kids so that they report their status.
+
+=cut
+
+sub CheckKids {
+ Debug(2, "Checking status of children");
+ my $docdir = $perlvar{'lonDocRoot'};
+ my $fh = IO::File->new(">$docdir/lon-status/loncstatus.txt");
+ my $now=time;
+ my $local=localtime($now);
+ print $fh "LONC status $local - parent $$ \n\n";
+ foreach $pid (keys %ChildHash) {
+ Debug(2, "Sending USR1 -> $pid");
+ kill 'USR1' => $pid; # Tell Child to report status.
+ sleep 1; # Wait so file doesn't intermix.
+ }
+}
+
=pod
=head1 Restart
@@ -1482,11 +1549,27 @@
ShowStatus("Killing lonc for $serving pid = $pid");
Log("CRITICAL", "Killing lonc for $serving pid = $pid");
kill('INT', $pid);
+ delete($ChildeHash{$pid});
}
+ my $execdir = $perlvar{'lonDaemons'};
+ unlink("$execdir/logs/lonc.pid");
+ ShowStatus("Killing the master process");
Log("CRITICAL", "Killing the master process.");
- exit
}
+=pod
+
+=head1 Terminate
+
+Terminate the system.
+
+=cut
+
+sub Terminate {
+ KillThemAll;
+ exit;
+
+}
=pod
=head1 Theory