--- loncom/loncnew 2003/07/03 02:10:18 1.14 +++ loncom/loncnew 2003/07/15 02:07:05 1.15 @@ -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.15 2003/07/15 02:07: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,11 @@ # Change log: # $Log: loncnew,v $ +# 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. # @@ -286,6 +291,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 +330,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 +474,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...