--- loncom/lond 2007/10/06 04:32:23 1.384 +++ loncom/lond 2007/10/08 17:40:56 1.385 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.384 2007/10/06 04:32:23 raeburn Exp $ +# $Id: lond,v 1.385 2007/10/08 17:40:56 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,7 +33,6 @@ use strict; use lib '/home/httpd/lib/perl/'; use LONCAPA; use LONCAPA::Configuration; -use Apache::lonnet; use IO::Socket; use IO::File; @@ -60,7 +59,7 @@ my $DEBUG = 0; # Non zero to ena my $status=''; my $lastlog=''; -my $VERSION='$Revision: 1.384 $'; #' stupid emacs +my $VERSION='$Revision: 1.385 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -75,6 +74,8 @@ my $keymode; my $cipher; # Cipher key negotiated with client my $tmpsnum = 0; # Id of tmpputs. +my $max_children = 1; # warn when exceeding this +my $max_children_enforcing = 0; # # Connection type is: @@ -5180,6 +5181,12 @@ $server = IO::Socket::INET->new(LocalPor my %children = (); # keys are current child process IDs +sub flip_max_children_enforcing { + $max_children_enforcing = !$max_children_enforcing; + &logthis("Flipped child maximum enforcement to (". + $max_children_enforcing.")"); +} + sub REAPER { # takes care of dead children $SIG{CHLD} = \&REAPER; &status("Handling child death"); @@ -5489,6 +5496,7 @@ $SIG{INT} = $SIG{TERM} = \&HUNTSMAN; $SIG{HUP} = \&HUPSMAN; $SIG{USR1} = \&checkchildren; $SIG{USR2} = \&UpdateHosts; +$SIG{SEGV} = \&flip_max_children_enforcing; # Read the host hashes: &Apache::lonnet::load_hosts_tab(); @@ -5504,7 +5512,17 @@ while (1) { &status('Starting accept'); $client = $server->accept() or next; &status('Accepted '.$client.' off to spawn'); - make_new_child($client); + my $child_count = scalar(keys(%children)); + if ($child_count > $max_children) { + &logthis("Warning too many children (".$child_count.")"); + } +# if ($child_count > $max_children && $max_children_enforcing) { +# &logthis(" Not creating new child "); +# $client->close(); +# } else { + &make_new_child($client); +# } + &logthis("Concurrent children at ($child_count)"); &status('Finished spawning'); } @@ -5707,10 +5725,18 @@ sub make_new_child { # ------------------------------------------------------------ Process requests my $keep_going = 1; my $user_input; + my $max_size = (split("\n",`ps -o vsz $$`))[-1]; while(($user_input = get_request) && $keep_going) { alarm(120); Debug("Main: Got $user_input\n"); $keep_going = &process_request($user_input); + if (!$max_children_enforcing) { + my $new_size = (split("\n",`ps -o vsz $$`))[-1]; + if ($new_size > $max_size) { + &logthis("size increase of ".($new_size-$max_size)." ($new_size) while processing (".length($user_input).")\n".substr($user_input,0,80)); + $max_size = $new_size; + } + } alarm(0); &status('Listening to '.$clientname." ($keymode)"); } @@ -6391,7 +6417,7 @@ sub sethost { eq &Apache::lonnet::get_host_ip($hostid)) { $currenthostid =$hostid; $currentdomainid=&Apache::lonnet::host_domain($hostid); - &logthis("Setting hostid to $hostid, and domain to $currentdomainid"); + #&logthis("Setting hostid to $hostid, and domain to $currentdomainid"); } else { &logthis("Requested host id $hostid not an alias of ". $perlvar{'lonHostID'}." refusing connection");