[LON-CAPA-cvs] cvs: loncom / LondConnection.pm LondTransaction.pm loncnew

foxr lon-capa-cvs@mail.lon-capa.org
Wed, 11 Jun 2003 02:04:35 -0000


This is a MIME encoded message

--foxr1055297075
Content-Type: text/plain

foxr		Tue Jun 10 22:04:35 2003 EDT

  Modified files:              
    /loncom	loncnew LondConnection.pm LondTransaction.pm 
  Log:
  Support delayed transactions... this is done uniformly by encapsulating
  transactions in an object ... a LondTransaction that is implemented by 
  LondTransaction.pm
  
  
--foxr1055297075
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20030610220435.txt"

Index: loncom/loncnew
diff -u loncom/loncnew:1.7 loncom/loncnew:1.8
--- loncom/loncnew:1.7	Mon Jun  2 21:59:39 2003
+++ loncom/loncnew	Tue Jun 10 22:04:35 2003
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # lonc maintains the connections to remote computers
 #
-# $Id: loncnew,v 1.7 2003/06/03 01:59:39 foxr Exp $
+# $Id: loncnew,v 1.8 2003/06/11 02:04:35 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -39,13 +39,17 @@
 #    - Add logging/status monitoring.
 #    - Add Signal handling - HUP restarts. USR1 status report.
 #    - Add Configuration file I/O                       (done).
-#    - Add Pending request processing on startup.
 #    - Add management/status request interface.
-#    - Add deferred request capability.
+#    - Add deferred request capability.                  (done)
 #
 
 # Change log:
 #    $Log: loncnew,v $
+#    Revision 1.8  2003/06/11 02:04:35  foxr
+#    Support delayed transactions... this is done uniformly by encapsulating
+#    transactions in an object ... a LondTransaction that is implemented by
+#    LondTransaction.pm
+#
 #    Revision 1.7  2003/06/03 01:59:39  foxr
 #    complete coding to support deferred transactions.
 #
@@ -96,7 +100,7 @@
 my $MaxConnectionCount = 5;	# Will get from config later.
 my $ClientConnection = 0;	# Uniquifier for client events.
 
-my $DebugLevel = 5;
+my $DebugLevel = 2;
 my $IdleTimeout= 3600;		# Wait an hour before pruning connections.
 
 #
@@ -277,6 +281,7 @@
     unless($reqdata eq undef)  {
 	Debug(9, "Queue gave request data: ".$reqdata->getRequest());
 	&StartRequest($Socket,  $reqdata);
+
     } else {
 	
     #  There's no work waiting, so push the server to idle list.
@@ -399,6 +404,9 @@
 	my $data   = $Socket->GetReply(); # Data to send.
 	StartClientReply($Transaction, $data);
     } else {			# Delete deferred transaction file.
+	&Debug(4, "Deferred transaction complete: ".$Transaction->getFile().
+	       " request: ".$Transaction->getRequest().
+	       " answer: ".$Socket->GetReply());
 	unlink $Transaction->getFile();
     }
 }
@@ -588,15 +596,17 @@
 =cut
 
 sub LondReadable {
+
     my $Event      = shift;
     my $Watcher    = $Event->w;
     my $Socket     = $Watcher->data;
     my $client     = undef;
 
+    &Debug(6,"LondReadable called state = ".$State);
+
 
     my $State = $Socket->GetState(); # All action depends on the state.
 
-    &Debug(6,"LondReadable called state = ".$State);
     SocketDump(6, $Socket);
 
     if($Socket->Readable() != 0) {
@@ -624,8 +634,8 @@
 	# in the connection takes care of setting that up.  Just
 	# need to transition to writable:
 
-	$Watcher->poll("w");
 	$Watcher->cb(\&LondWritable);
+	$Watcher->poll("w");
 
     } elsif ($State eq "ChallengeReplied") {
 
@@ -634,20 +644,20 @@
 	#  The ok was received.  Now we need to request the key
 	#  That requires us to be writable:
 
-	$Watcher->poll("w");
 	$Watcher->cb(\&LondWritable);
+	$Watcher->poll("w");
 
     } elsif ($State eq "ReceivingKey") {
 
     } elsif ($State eq "Idle") {
 	# If necessary, complete a transaction and then go into the
 	# idle queue.
+	$Watcher->cancel();
 	if(exists($ActiveTransactions{$Socket})) {
 	    Debug(8,"Completing transaction!!");
 	    CompleteTransaction($Socket, 
 				$ActiveTransactions{$Socket});
 	}
-	$Watcher->cancel();
 	ServerToIdle($Socket);	# Next work unit or idle.
 	
     } elsif ($State eq "SendingRequest") {
@@ -731,15 +741,15 @@
 sub LondWritable {
     my $Event   = shift;
     my $Watcher = $Event->w;
-    my @data    = $Watcher->data;
-    Debug(6,"LondWritable State = ".$State." data has ".@data." elts.\n");
+    my $Socket  = $Watcher->data;
+    my $State   = $Socket->GetState();
 
-    my $Socket  = $data;	# I know there's at least a socket.
+    Debug(6,"LondWritable State = ".$State."\n");
 
+ 
     #  Figure out what to do depending on the state of the socket:
     
 
-    my $State   = $Socket->GetState();
 
 
     SocketDump(6,$Socket);
@@ -762,8 +772,8 @@
 	# Now that init was sent, we switch 
 	# to watching for readability:
 
-	$Watcher->poll("r");
 	$Watcher->cb(\&LondReadable);
+	$Watcher->poll("r");
 
     } elsif ($State eq "ChallengeReceived") {
 	# We received the challenge, now we 
@@ -781,8 +791,8 @@
 	# The echo was sent back, so we switch
 	# to watching readability.
 
-	$Watcher->poll("r");
 	$Watcher->cb(\&LondReadable);
+	$Watcher->poll("r");
 
     } elsif ($State eq "RequestingKey")     {
 	# At this time we're requesting the key.
@@ -802,8 +812,8 @@
 	# Now we need to wait for the key
 	# to come back from the peer:
 
-	$Watcher->poll("r");
 	$Watcher->cb(\&LondReadable);
+	$Watcher->poll("r");
 
     } elsif ($State eq "SendingRequest")    {
 	# At this time we are sending a request to the
@@ -825,8 +835,8 @@
 	# The send has completed.  Wait for the
 	# data to come in for a reply.
 	Debug(8,"Writable sent request/receiving reply");
-	$Watcher->poll("r");
 	$Watcher->cb(\&LondReadable);
+	$Watcher->poll("r");
 
     } else {
 	#  Control only passes here on an error: 
@@ -842,17 +852,25 @@
     
 =cut
 sub QueueDelayed {
+    Debug(3,"QueueDelayed called");
+
     my $path = "$perlvar{'lonSockDir'}/delayed";
+
+    Debug(4, "Delayed path: ".$path);
     opendir(DIRHANDLE, $path);
+    
     @alldelayed = grep /\.$RemoteHost$/, readdir DIRHANDLE;
+    Debug(4, "Got ".$alldelayed." delayed files");
     closedir(DIRHANDLE);
     my $dfname;
-    my $reqfile
-    foreach $reqfile (sort @alldelayed) {
-	$reqfile = $path/$reqfile;
+    my $reqfile;
+    foreach $dfname (sort  @alldelayed) {
+	$reqfile = "$path/$dfname";
+	Debug(4, "queueing ".$reqfile);
 	my $Handle = IO::File->new($reqfile);
 	my $cmd    = <$Handle>;
-	chomp($cmd);
+	chomp $cmd;		# There may or may not be a newline...
+	$cmd = $cmd."\ny";	# now for sure there's exactly one newline.
 	my $Transaction = LondTransaction->new($cmd);
 	$Transaction->SetDeferred($reqfile);
 	QueueTransaction($Transaction);
@@ -898,11 +916,12 @@
 	$event = Event->io(fd       => $Socket,
 			   poll     => 'w',
 			   cb       => \&LondWritable,
-			   data     => \$Connection,
+			   data     => $Connection,
 			   desc => 'Connection to lond server');
 	$ActiveConnections{$Connection} = $event;
 	
 	$ConnectionCount++;
+	Debug(4, "Connection count = ".$ConnectionCount);
 	if($ConnectionCount == 1) { # First Connection:
 	    QueueDelayed;
 	}
@@ -947,7 +966,7 @@
     $ActiveTransactions{$Lond} = $Request;
 
     $Lond->InitiateTransaction($Request->getRequest());
-    $event = Event->io(fd      => $Lond->GetSocket(),
+    $event = Event->io(fd      => $Socket,
 		       poll    => "w",
 		       cb      => \&LondWritable,
 		       data    => $Lond,
@@ -1034,7 +1053,7 @@
     $watcher->data($data);
     if($data =~ /(.*\n)/) {	# Request entirely read.
 	Debug(8, "Complete transaction received: ".$data);
-	my $Transaction = new LondTransaction->new($data);
+	my $Transaction = LondTransaction->new($data);
 	$Transaction->SetClient($socket);
 	QueueTransaction($Transaction);
 	$watcher->cancel();	# Done looking for input data.
@@ -1220,11 +1239,7 @@
 
 
 
-ShowStatus("Parent writing pid file:");
-$execdir = $perlvar{'lonDaemons'};
-open (PIDSAVE, ">$execdir/logs/lonc.pid");
-print PIDSAVE "$$\n";
-close(PIDSAVE);
+
 
 ShowStatus("Forming new session");
 my $childpid = fork;
@@ -1232,6 +1247,15 @@
     sleep 4;			# Give child a chacne to break to
     exit 0;			# a new sesion.
 }
+#
+#   Write my pid into the pid file so I can be located
+#
+
+ShowStatus("Parent writing pid file:");
+$execdir = $perlvar{'lonDaemons'};
+open (PIDSAVE, ">$execdir/logs/lonc.pid");
+print PIDSAVE "$$\n";
+close(PIDSAVE);
 
 if (POSIX::setsid() < 0) {
     print "Could not create new session\n";
Index: loncom/LondConnection.pm
diff -u loncom/LondConnection.pm:1.3 loncom/LondConnection.pm:1.4
--- loncom/LondConnection.pm:1.3	Fri Apr 18 02:07:27 2003
+++ loncom/LondConnection.pm	Tue Jun 10 22:04:35 2003
@@ -1,7 +1,7 @@
 #   This module defines and implements a class that represents
 #   a connection to a lond daemon.
 #
-# $Id: LondConnection.pm,v 1.3 2003/04/18 06:07:27 albertel Exp $
+# $Id: LondConnection.pm,v 1.4 2003/06/11 02:04:35 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -430,7 +430,9 @@
     my $self   = shift;
     my $data   = shift;
 
+    Debug(1, "initiating transaction: ".$data);
     if($self->{State} ne "Idle") {
+	Debug(0," .. but not idle here\n");
 	return -1;		# Error indicator.
     }
     # if the transaction is to be encrypted encrypt the data:
Index: loncom/LondTransaction.pm
diff -u loncom/LondTransaction.pm:1.4 loncom/LondTransaction.pm:1.5
--- loncom/LondTransaction.pm:1.4	Wed May 14 22:21:45 2003
+++ loncom/LondTransaction.pm	Tue Jun 10 22:04:35 2003
@@ -1,7 +1,7 @@
 #   This module defines and implements a class that represents
 #   a connection to a lond daemon.
 #
-# $Id: LondTransaction.pm,v 1.4 2003/05/15 02:21:45 foxr Exp $
+# $Id: LondTransaction.pm,v 1.5 2003/06/11 02:04:35 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -100,6 +100,7 @@
 		  active      => 0,
 		  deferred    => 0};
     bless($self, $class);
+    return $self;
 }
 =pod
 
@@ -177,7 +178,7 @@
     my $File   = shift;
 
     $self->{deferred}      = 1;
-    $self->{DeferrredFile} = $File;
+    $self->{DeferredFile} = $File;
 }
 
 =pod
@@ -298,3 +299,4 @@
 }
 
 
+1;

--foxr1055297075--