--- loncom/loncnew 2007/03/28 00:14:15 1.79 +++ loncom/loncnew 2007/03/28 00:23:46 1.80 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # lonc maintains the connections to remote computers # -# $Id: loncnew,v 1.79 2007/03/28 00:14:15 albertel Exp $ +# $Id: loncnew,v 1.80 2007/03/28 00:23:46 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -74,8 +74,6 @@ my %perlvar = %{$perlvarref}; # parent and shared variables. my %ChildHash; # by pid -> host. -my %HostToPid; # By host -> pid. -my %HostHash; # by loncapaname -> IP. my %listening_to; # Socket->host table for who the parent # is listening to. my %parent_dispatchers; # host-> listener watcher events. @@ -114,7 +112,6 @@ my $LondConnecting = 0; # True wh -my $DieWhenIdle = 1; # When true children die when trimmed -> 0. my $hosts_tab = 0; # True if we are using a static hosts.tab my $I_am_child = 0; # True if this is the child process. @@ -309,12 +306,13 @@ sub SocketTimeout { } } + # # This function should be called by the child in all cases where it must -# exit. If the child process is running with the DieWhenIdle turned on -# it must create a lock file for the AF_UNIX socket in order to prevent -# connection requests from lonnet in the time between process exit -# and the parent picking up the listen again. +# exit. The child process must create a lock file for the AF_UNIX socket +# in order to prevent connection requests from lonnet in the time between +# process exit and the parent picking up the listen again. +# # Parameters: # exit_code - Exit status value, however see the next parameter. # message - If this optional parameter is supplied, the exit @@ -325,26 +323,22 @@ sub child_exit { # Regardless of how we exit, we may need to do the lock thing: - if($DieWhenIdle) { - # - # Create a lock file since there will be a time window - # between our exit and the parent's picking up the listen - # during which no listens will be done on the - # lonnet client socket. - # - my $lock_file = &GetLoncSocketPath().".lock"; - open(LOCK,">$lock_file"); - print LOCK "Contents not important"; - close(LOCK); - if ($hosts_tab) { - unlink(&GetLoncSocketPath()); - } - exit(0); + # + # Create a lock file since there will be a time window + # between our exit and the parent's picking up the listen + # during which no listens will be done on the + # lonnet client socket. + # + my $lock_file = &GetLoncSocketPath().".lock"; + open(LOCK,">$lock_file"); + print LOCK "Contents not important"; + close(LOCK); + if ($hosts_tab) { + unlink(&GetLoncSocketPath()); } - # Now figure out how we exit: - if($message) { - die $message; + if ($message) { + die($message); } else { exit($exit_code); } @@ -378,7 +372,7 @@ sub Tick { KillSocket($Socket); $IdleSeconds = 0; # Otherwise all connections get trimmed to fast. UpdateStatus(); - if(($ConnectionCount == 0) && $DieWhenIdle) { + if(($ConnectionCount == 0)) { &child_exit(0); } @@ -1413,7 +1407,7 @@ sub ClientRequest { # Accept a connection request for a client (lonc child) and # start up an event watcher to keep an eye on input from that # Event. This can be called both from NewClient and from -# ChildProcess if we are started in DieWhenIdle mode. +# ChildProcess. # Parameters: # $socket - The listener socket. # Returns: @@ -1665,7 +1659,7 @@ Optional parameter: =cut sub ChildProcess { - # If we are in DieWhenIdle mode, we've inherited all the + # We've inherited all the # events of our parent and those have to be cancelled or else # all holy bloody chaos will result.. trust me, I already made # >that< mistake. @@ -1741,12 +1735,9 @@ sub ChildProcess { # &MakeLondConnection(); // let first work request do it. - # If We are in diwhenidle, need to accept the connection since the - # event may not fire. + # need to accept the connection since the event may not fire. - if ($DieWhenIdle) { - &accept_client($socket); - } + &accept_client($socket); Debug(9,"Entering event loop"); my $ret = Event::loop(); # Start the main event loop. @@ -1768,7 +1759,6 @@ sub CreateChild { if($pid) { # Parent $RemoteHost = "Parent"; $ChildHash{$pid} = $host; - $HostToPid{$host}= $pid; sigprocmask(SIG_UNBLOCK, $sigset); } else { # child. @@ -1983,7 +1973,6 @@ sub server_died { if($host) { # It's for real... &Debug(9, "Caught sigchild for $host"); delete($ChildHash{$pid}); - delete($HostToPid{$host}); if ($hosts_tab) { &parent_listen($host); } else { @@ -2045,24 +2034,12 @@ ShowStatus("Forking node servers"); Log("CRITICAL", "--------------- Starting children ---------------"); LondConnection::ReadConfig; # Read standard config files. -my $HostIterator = LondConnection::GetHostIterator; -if ($DieWhenIdle) { - $RemoteHost = "[parent]"; - if ($hosts_tab) { - &listen_on_all_unix_sockets(); - } else { - &listen_on_common_socket(); - } +$RemoteHost = "[parent]"; +if ($hosts_tab) { + &listen_on_all_unix_sockets(); } else { - - while (! $HostIterator->end()) { - - my $hostentryref = $HostIterator->get(); - CreateChild($hostentryref->[0]); - $HostHash{$hostentryref->[0]} = $hostentryref->[4]; - $HostIterator->next(); - } + &listen_on_common_socket(); } $RemoteHost = "Parent Server"; @@ -2072,78 +2049,44 @@ $RemoteHost = "Parent Server"; ShowStatus("Parent keeping the flock"); -if ($DieWhenIdle) { - # We need to setup a SIGChild event to handle the exit (natural or otherwise) - # of the children. - - Event->signal(cb => \&server_died, - desc => "Child exit handler", - signal => "CHLD"); - - - # Set up all the other signals we set up. We'll vector them off to the - # same subs as we would for DieWhenIdle false and, if necessary, conditionalize - # the code there. - - $parent_handlers{INT} = Event->signal(cb => \&Terminate, - desc => "Parent INT handler", - signal => "INT"); - $parent_handlers{TERM} = Event->signal(cb => \&Terminate, - desc => "Parent TERM handler", - signal => "TERM"); - if ($hosts_tab) { - $parent_handlers{HUP} = Event->signal(cb => \&Restart, - desc => "Parent HUP handler.", - signal => "HUP"); - } else { - $parent_handlers{HUP} = Event->signal(cb => \&KillThemAll, - desc => "Parent HUP handler.", - signal => "HUP"); - } - $parent_handlers{USR1} = Event->signal(cb => \&CheckKids, - desc => "Parent USR1 handler", - signal => "USR1"); - $parent_handlers{USR2} = Event->signal(cb => \&UpdateKids, - desc => "Parent USR2 handler.", - signal => "USR2"); - - # Start procdesing events. - - $Event::DebugLevel = $DebugLevel; - Debug(9, "Parent entering event loop"); - my $ret = Event::loop(); - die "Main Event loop exited: $ret"; - +# We need to setup a SIGChild event to handle the exit (natural or otherwise) +# of the children. +Event->signal(cb => \&server_died, + desc => "Child exit handler", + signal => "CHLD"); + + +# Set up all the other signals we set up. + +$parent_handlers{INT} = Event->signal(cb => \&Terminate, + desc => "Parent INT handler", + signal => "INT"); +$parent_handlers{TERM} = Event->signal(cb => \&Terminate, + desc => "Parent TERM handler", + signal => "TERM"); +if ($hosts_tab) { + $parent_handlers{HUP} = Event->signal(cb => \&Restart, + desc => "Parent HUP handler.", + signal => "HUP"); } else { - # - # Set up parent signals: - # - - $SIG{INT} = \&Terminate; - $SIG{TERM} = \&Terminate; - if ($hosts_tab) { - $SIG{HUP} = \&Restart; - } else { - $SIG{HUP} = \&KillThemAll; - } - $SIG{USR1} = \&CheckKids; - $SIG{USR2} = \&UpdateKids; # LonManage update request. - - while(1) { - my $deadchild = wait(); - if(exists $ChildHash{$deadchild}) { # need to restart. - my $deadhost = $ChildHash{$deadchild}; - delete($HostToPid{$deadhost}); - delete($ChildHash{$deadchild}); - Log("WARNING","Lost child pid= ".$deadchild. - "Connected to host ".$deadhost); - Log("INFO", "Restarting child procesing ".$deadhost); - CreateChild($deadhost); - } - } -} - + $parent_handlers{HUP} = Event->signal(cb => \&KillThemAll, + desc => "Parent HUP handler.", + signal => "HUP"); +} +$parent_handlers{USR1} = Event->signal(cb => \&CheckKids, + desc => "Parent USR1 handler", + signal => "USR1"); +$parent_handlers{USR2} = Event->signal(cb => \&UpdateKids, + desc => "Parent USR2 handler.", + signal => "USR2"); + +# Start procdesing events. + +$Event::DebugLevel = $DebugLevel; +Debug(9, "Parent entering event loop"); +my $ret = Event::loop(); +die "Main Event loop exited: $ret"; =pod