--- loncom/loncron 2006/01/28 10:03:05 1.63.2.1 +++ loncom/loncron 2006/11/01 21:08:06 1.69 @@ -2,7 +2,7 @@ # Housekeeping program, started by cron, loncontrol and loncron.pl # -# $Id: loncron,v 1.63.2.1 2006/01/28 10:03:05 albertel Exp $ +# $Id: loncron,v 1.69 2006/11/01 21:08:06 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -45,13 +45,13 @@ my $statusdir="/home/httpd/html/lon-stat # -------------------------------------------------- Non-critical communication sub reply { - my ($cmd,$server)=@_; - my $peerfile="$perlvar{'lonSockDir'}/$server"; + my ($cmd,$server,$hostname)=@_; + my $peerfile="$perlvar{'lonSockDir'}/".$hostname->{$server}; my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", Type => SOCK_STREAM, Timeout => 10) or return "con_lost"; - print $client "$cmd\n"; + print $client "sethost:$server:$cmd\n"; my $answer=<$client>; chomp($answer); if (!$answer) { $answer="con_lost"; } @@ -486,7 +486,7 @@ sub test_connections { foreach my $tryserver (sort(keys(%{$hostname}))) { print("."); my $result; - my $answer=reply("ping",$tryserver); + my $answer=&reply("ping",$tryserver,$hostname); if ($answer eq "$tryserver:$perlvar{'lonHostID'}") { $result="ok"; $good++; @@ -511,7 +511,7 @@ sub test_connections { # ------------------------------------------------------------ Delayed messages sub check_delayed_msg { - my ($fh)=@_; + my ($fh,$hostname)=@_; &log($fh,'

Delayed Messages

'); print "checking buffers\n"; @@ -536,13 +536,22 @@ sub check_delayed_msg { if ($unsend) { $simplestatus{'unsend'}=$unsend; } &log($fh,"

Outgoing Buffer

\n
");
-
+# list directory with delayed messages and remember offline servers
+    my %servers=();
     open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
-    while (my $line=) { 
+    while (my $line=) {
+        my ($server)=($line=~/\.(\w+)$/);
+        if ($server) { $servers{$server}=1; }
 	&log($fh,&encode_entities($line,'<>&"'));
     }
     &log($fh,"
\n"); close (DFH); +# pong to all servers that have delayed messages +# this will trigger a reverse connection, which should flush the buffers + foreach my $tryserver (keys %servers) { + my $answer=&reply("pong",$tryserver,$hostname); + &log($fh,"Pong to $tryserver: $answer
"); + } } sub finish_logging { @@ -707,9 +716,7 @@ sub main () { } my $args='new'; if ($oldlonc) { $args = ''; } - if ( &checkon_daemon($fh,'lonc',40000,'USR1',$args) eq 'running') { - &checkon_daemon($fh,'lonc',40000,'USR2',$args); - } + &checkon_daemon($fh,'lonc',40000,'USR1',$args); &checkon_daemon($fh,'lonhttpd',40000); &checkon_daemon($fh,'lonmemcached',40000); } @@ -723,7 +730,7 @@ sub main () { &test_connections($fh,\%hostname); } if (!$justcheckdaemons && !$justcheckconnections && !$justreload) { - &check_delayed_msg($fh); + &check_delayed_msg($fh,\%hostname); &finish_logging($fh); &log_simplestatus();