[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--