--- loncom/loncnew 2003/07/29 02:33:05 1.16 +++ loncom/loncnew 2003/08/03 00:44:31 1.17 @@ -2,13 +2,12 @@ # The LearningOnline Network with CAPA # lonc maintains the connections to remote computers # -# $Id: loncnew,v 1.16 2003/07/29 02:33:05 foxr Exp $ +# $Id: loncnew,v 1.17 2003/08/03 00:44:31 foxr Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). -# -# LON-CAPA is free software; you can redistribute it and/or modify +## LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. @@ -46,6 +45,14 @@ # Change log: # $Log: loncnew,v $ +# Revision 1.17 2003/08/03 00:44:31 foxr +# 1. Correct handling of connection failure: Assume it means the host is +# unreachable and fail all of the queued transactions. Note that the +# inflight transactions should fail on their own time due either to timeout +# or send/receive failures. +# 2. Correct handling of logs for forced death signals. Pull the signal +# from the event watcher. +# # Revision 1.16 2003/07/29 02:33:05 foxr # Add SIGINT processing to child processes to toggle annoying trace mode # on/off.. will try to use this to isolate the compute boud process issue. @@ -602,6 +609,7 @@ Parameters: sub FailTransaction { my $transaction = shift; + Log("WARNING", "Failing transaction ".$transaction->getRequest()); Debug(1, "Failing transaction: ".$transaction->getRequest()); if (!$transaction->isDeferred()) { # If the transaction is deferred we'll get to it. my $client = $transaction->getClient(); @@ -664,6 +672,7 @@ nonzero if we are allowed to create a ne sub KillSocket { my $Socket = shift; + Log("WARNING", "Shutting down a socket"); $Socket->Shutdown(); # If the socket came from the active connection set, @@ -760,14 +769,16 @@ sub LondReadable { SocketDump(6, $Socket); my $status = $Socket->Readable(); + &Debug(2, "Socket->Readable returned: $status"); if($status != 0) { # bad return from socket read. Currently this means that # The socket has become disconnected. We fail the transaction. + Log("WARNING", + "Lond connection lost."); if(exists($ActiveTransactions{$Socket})) { - Debug(3,"Lond connection lost failing transaction"); FailTransaction($ActiveTransactions{$Socket}); } $Watcher->cancel(); @@ -1172,7 +1183,9 @@ sub QueueTransaction { $WorkQueue->enqueue($requestData); if($ConnectionCount < $MaxConnectionCount) { Debug(4,"Starting additional lond connection"); - MakeLondConnection(); + if(MakeLondConnection() == 0) { + EmptyQueue(); # Fail transactions, can't make connection. + } } } else { # Can start the request: Debug(8,"Can start..."); @@ -1363,13 +1376,12 @@ sub SignalledToDeath { my $watcher= $event->w; Debug(2,"Signalled to death! via ".$watcher->data); - my ($signal) = @_; + my ($signal) = $watcher->data; chomp($signal); Log("CRITICAL", "Abnormal exit. Child $$ for $RemoteHost " ."died through "."\"$signal\""); LogPerm("F:lonc: $$ on $RemoteHost signalled to death: " ."\"$signal\""); - die("Signal abnormal end"); exit 0; } @@ -1445,6 +1457,7 @@ sub CreateChild { Log("CRITICAL", "Forking server for ".$host); $pid = fork; if($pid) { # Parent + $RemoteHost = "Parent"; $ChildHash{$pid} = $RemoteHost; sigprocmask(SIG_UNBLOCK, $sigset); @@ -1492,6 +1505,8 @@ open (PIDSAVE, ">$execdir/logs/lonc.pid" print PIDSAVE "$$\n"; close(PIDSAVE); + + if (POSIX::setsid() < 0) { print "Could not create new session\n"; exit -1; @@ -1586,7 +1601,7 @@ sub Restart { =head1 KillThemAll Signal handler that kills all children by sending them a -SIGINT. Responds to sigint and sigterm. +SIGHUP. Responds to sigint and sigterm. =cut @@ -1598,13 +1613,12 @@ sub KillThemAll { Debug(2, "Killing lonc for $serving pid = $pid"); ShowStatus("Killing lonc for $serving pid = $pid"); Log("CRITICAL", "Killing lonc for $serving pid = $pid"); - kill('INT', $pid); - delete($ChildeHash{$pid}); + kill 'QUIT' => $pid; + delete($ChildHash{$pid}); } my $execdir = $perlvar{'lonDaemons'}; unlink("$execdir/logs/lonc.pid"); - ShowStatus("Killing the master process"); - Log("CRITICAL", "Killing the master process."); + } =pod @@ -1617,7 +1631,8 @@ Terminate the system. sub Terminate { KillThemAll; - exit; + Log("CRITICAL","Master process exiting"); + exit 0; } =pod