[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