Diff for /loncom/loncnew between versions 1.13 and 1.14

version 1.13, 2003/07/02 01:31:55 version 1.14, 2003/07/03 02:10:18
Line 46 Line 46
   
 # Change log:  # Change log:
 #    $Log$  #    $Log$
   #    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  #    Revision 1.13  2003/07/02 01:31:55  foxr
 #    Added kill -HUP logic (restart).  #    Added kill -HUP logic (restart).
 #  #
Line 93  use LONCAPA::HashIterator; Line 96  use LONCAPA::HashIterator;
 #  #
 #   Disable all signals we might receive from outside for now.  #   Disable all signals we might receive from outside for now.
 #  #
 $SIG{QUIT}  = IGNORE;  #$SIG{QUIT}  = IGNORE;
 $SIG{HUP}   = IGNORE;  #$SIG{HUP}   = IGNORE;
 $SIG{USR1}  = IGNORE;  #$SIG{USR1}  = IGNORE;
 $SIG{INT}   = IGNORE;  #$SIG{INT}   = IGNORE;
 $SIG{CHLD}  = IGNORE;  #$SIG{CHLD}  = IGNORE;
 $SIG{__DIE__}  = IGNORE;  #$SIG{__DIE__}  = IGNORE;
   
   
 # Read the httpd configuration file to get perl variables  # Read the httpd configuration file to get perl variables
Line 132  my $WorkQueue       = Queue->new(); # Qu Line 135  my $WorkQueue       = Queue->new(); # Qu
 my $ConnectionCount = 0;  my $ConnectionCount = 0;
 my $IdleSeconds     = 0; # Number of seconds idle.  my $IdleSeconds     = 0; # Number of seconds idle.
 my $Status          = ""; # Current status string.  my $Status          = ""; # Current status string.
   my $RecentLogEntry  = "";
 my $ConnectionRetries=5; # Number of connection retries allowed.  my $ConnectionRetries=5; # Number of connection retries allowed.
 my $ConnectionRetriesLeft=5; # Number of connection retries remaining.  my $ConnectionRetriesLeft=5; # Number of connection retries remaining.
   
Line 208  sub Log { Line 212  sub Log {
     my $execdir = $perlvar{'lonDaemons'};      my $execdir = $perlvar{'lonDaemons'};
     my $fh      = IO::File->new(">>$execdir/logs/lonc.log");      my $fh      = IO::File->new(">>$execdir/logs/lonc.log");
     my $msg = sprintf($finalformat, $message);      my $msg = sprintf($finalformat, $message);
       $RecentLogEntry = $msg;
     print $fh $msg;      print $fh $msg;
           
           
Line 1288  sub SetupLoncListener { Line 1293  sub SetupLoncListener {
       fd     => $socket);        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  =pod
   
 =head2 SignalledToDeath  =head2 SignalledToDeath
Line 1298  Called in response to a signal that caus Line 1322  Called in response to a signal that caus
   
   
 sub SignalledToDeath {  sub SignalledToDeath {
     Debug(2,"Signalled to death!");      my $event  = shift;
       my $watcher= $event->w;
   
       Debug(2,"Signalled to death! via ".$watcher->data);
     my ($signal) = @_;      my ($signal) = @_;
     chomp($signal);      chomp($signal);
     Log("CRITICAL", "Abnormal exit.  Child $$ for $RemoteHost "      Log("CRITICAL", "Abnormal exit.  Child $$ for $RemoteHost "
Line 1318  This sub implements a child process for Line 1345  This sub implements a child process for
 sub ChildProcess {  sub ChildProcess {
   
   
     # For now turn off signals.      #
           #  Signals must be handled by the Event framework...
     $SIG{QUIT}  = \&SignalledToDeath;  #
     $SIG{HUP}   = IGNORE;  #    $SIG{QUIT}  = \&SignalledToDeath;
     $SIG{USR1}  = IGNORE;  #    $SIG{HUP}   = \&ChildStatus;
     $SIG{INT}   = DEFAULT;  #    $SIG{USR1}  = IGNORE;
     $SIG{CHLD}  = IGNORE;  #    $SIG{INT}   = DEFAULT;
     $SIG{__DIE__}  = \&SignalledToDeath;  #    $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();      SetupTimer();
           
Line 1337  sub ChildProcess { Line 1375  sub ChildProcess {
   
 # Setup the initial server connection:  # Setup the initial server connection:
           
      # &MakeLondConnection(); // let first work requirest do it.       # &MakeLondConnection(); // let first work requirest do it.
   
   
     Debug(9,"Entering event loop");      Debug(9,"Entering event loop");
Line 1430  ShowStatus("Parent keeping the flock"); Line 1468  ShowStatus("Parent keeping the flock");
 #   Set up parent signals:  #   Set up parent signals:
 #  #
   
 $SIG{INT}  = \&KillThemAll;  $SIG{INT}  = \&Terminate;
 $SIG{TERM} = \&KillThemAll;   $SIG{TERM} = \&Terminate; 
 $SIG{HUP}  = \&Restart;  $SIG{HUP}  = \&Restart;
   $SIG{USR1} = \&CheckKids; 
   
 while(1) {  while(1) {
     $deadchild = wait();      $deadchild = wait();
Line 1446  while(1) { Line 1485  while(1) {
     }      }
 }  }
   
   
   
   =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  =pod
   
 =head1 Restart  =head1 Restart
Line 1482  sub KillThemAll { Line 1549  sub KillThemAll {
  ShowStatus("Killing lonc for $serving pid = $pid");   ShowStatus("Killing lonc for $serving pid = $pid");
  Log("CRITICAL", "Killing lonc for $serving pid = $pid");   Log("CRITICAL", "Killing lonc for $serving pid = $pid");
  kill('INT', $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.");      Log("CRITICAL", "Killing the master process.");
     exit  
 }  }
   
 =pod  =pod
   
   =head1 Terminate
    
   Terminate the system.
   
   =cut
   
   sub Terminate {
       KillThemAll;
       exit;
   
   }
   =pod
   
 =head1 Theory  =head1 Theory
   
 The event class is used to build this as a single process with an  The event class is used to build this as a single process with an

Removed from v.1.13  
changed lines
  Added in v.1.14


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>