--- loncom/loncnew 2003/07/03 02:10:18 1.14 +++ loncom/loncnew 2003/07/29 02:33:05 1.16 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # lonc maintains the connections to remote computers # -# $Id: loncnew,v 1.14 2003/07/03 02:10:18 foxr Exp $ +# $Id: loncnew,v 1.16 2003/07/29 02:33:05 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,7 +27,7 @@ # http://www.lon-capa.org/ # # -# new lonc handles n requestors spread out bver m connections to londs. +# new lonc handles n request out bver m connections to londs. # This module is based on the Event class. # Development iterations: # - Setup basic event loop. (done) @@ -46,6 +46,15 @@ # Change log: # $Log: loncnew,v $ +# 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. +# +# Revision 1.15 2003/07/15 02:07:05 foxr +# Added code for lonc/lond transaction timeouts. Who knows if it works right. +# The intent is for a timeout to fail any transaction in progress and kill +# off the sockt that timed out. +# # Revision 1.14 2003/07/03 02:10:18 foxr # Get all of the signals to work correctly. # @@ -120,6 +129,7 @@ my $MaxConnectionCount = 10; # Will get my $ClientConnection = 0; # Uniquifier for client events. my $DebugLevel = 0; +my $NextDebugLevel= 10; # So Sigint can toggle this. my $IdleTimeout= 3600; # Wait an hour before pruning connections. # @@ -256,7 +266,7 @@ sub Debug { my $level = shift; my $message = shift; if ($level <= $DebugLevel) { - print $message." host = ".$RemoteHost."\n"; + Log("INFO", "-Debug- $message host = $RemotHost"); } } @@ -286,6 +296,21 @@ sub ShowStatus { =pod +=head 2 SocketTimeout + + Called when an action on the socket times out. The socket is + destroyed and any active transaction is failed. + + +=cut +sub SocketTimeout { + my $Socket = shift; + + KillSocket($Socket); +} + +=pod + =head2 Tick Invoked each timer tick. @@ -310,7 +335,13 @@ sub Tick { } else { $IdleSeconds = 0; # Reset idle count if not idle. } - + # + # For each inflight transaction, tick down its timeout counter. + # + foreach $item (keys %ActiveTransactions) { + my $Socket = $ActiveTransactions{$item}->getServer(); + $Socket->Tick(); + } # 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. # @@ -448,6 +479,12 @@ sub ClientWritable { } else { # Partial string sent. $Watcher->data(substr($Data, $result)); + if($result == 0) { # client hung up on us!! + Log("INFO", "lonc pipe client hung up on us!"); + $Watcher->cancel; + $Socket->shutdown(2); + $Socket->close(); + } } } else { # Error of some sort... @@ -1336,6 +1373,22 @@ sub SignalledToDeath { exit 0; } + +=head2 ToggleDebug + +This sub toggles trace debugging on and off. + +=cut + +sub ToggleDebug { + my $Current = $DebugLevel; + $DebugLevel = $NextDebugLevel; + $NextDebugLevel = $Current; + + Log("SUCCESS", "New debugging level for $RemoteHost now $DebugLevel"); + +} + =head2 ChildProcess This sub implements a child process for a single lonc daemon. @@ -1348,12 +1401,6 @@ sub ChildProcess { # # 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, @@ -1364,6 +1411,9 @@ sub ChildProcess { Event->signal(signal => "USR1", cb => \&ChildStatus, data => "USR1"); + Event->signal(signal => "INT", + cb => \&ToggleDebug, + data => "INT"); SetupTimer();