Diff for /loncom/lonsql between versions 1.51 and 1.55

version 1.51, 2002/08/06 13:48:47 version 1.55, 2003/02/03 13:43:38
Line 41  Note that a lonsql.pid file contains the Line 41  Note that a lonsql.pid file contains the
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
 lonsql is many things to many people.  To me, it is a source file in need  lonsql is 
 of documentation.  
   
 =head1 Internals  =head1 Internals
   
Line 116  my $MAX_CLIENTS_PER_CHILD  = 5;   # numb Line 115  my $MAX_CLIENTS_PER_CHILD  = 5;   # numb
 my %children               = ();  # keys are current child process IDs  my %children               = ();  # keys are current child process IDs
 my $children               = 0;   # current number of children  my $children               = 0;   # current number of children
                                                                 
 ########################################################  
 ########################################################  
   
 =pod  
   
 =item Functions required for forking  
   
 =over 4  
   
 =item REAPER  
   
 REAPER takes care of dead children.  
   
 =item HUNTSMAN  
   
 Signal handler for SIGINT.  
   
 =item HUPSMAN  
   
 Signal handler for SIGHUP  
   
 =item DISCONNECT  
   
 Disconnects from database.  
   
 =back  
   
 =cut  
   
 ########################################################  
 ########################################################  
 sub REAPER {                   # takes care of dead children  
     $SIG{CHLD} = \&REAPER;  
     my $pid = wait;  
     $children --;  
     &logthis("Child $pid died");  
     delete $children{$pid};  
 }  
   
 sub HUNTSMAN {                      # signal handler for SIGINT  
     local($SIG{CHLD}) = 'IGNORE';   # we're going to kill our children  
     kill 'INT' => keys %children;  
     my $execdir=$perlvar{'lonDaemons'};  
     unlink("$execdir/logs/lonsql.pid");  
     &logthis("<font color=red>CRITICAL: Shutting down</font>");  
     $unixsock = "mysqlsock";  
     my $port="$perlvar{'lonSockDir'}/$unixsock";  
     unlink($port);  
     exit;                           # clean up with dignity  
 }  
   
 sub HUPSMAN {                      # signal handler for SIGHUP  
     local($SIG{CHLD}) = 'IGNORE';  # we're going to kill our children  
     kill 'INT' => keys %children;  
     close($server);                # free up socket  
     &logthis("<font color=red>CRITICAL: Restarting</font>");  
     my $execdir=$perlvar{'lonDaemons'};  
     $unixsock = "mysqlsock";  
     my $port="$perlvar{'lonSockDir'}/$unixsock";  
     unlink($port);  
     exec("$execdir/lonsql");         # here we go again  
 }  
   
 sub DISCONNECT {  
     $dbh->disconnect or   
     &logthis("<font color=blue>WARNING: Couldn't disconnect from database ".  
              " $DBI::errstr : $@</font>");  
     exit;  
 }  
   
 ###################################################################  ###################################################################
 ###################################################################  ###################################################################
   
Line 222  my $run =0;              # running count Line 151  my $run =0;              # running count
 #  #
 # Read loncapa_apache.conf and loncapa.conf  # Read loncapa_apache.conf and loncapa.conf
 #  #
 my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf',  my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
                                                  'loncapa.conf');  
 my %perlvar=%{$perlvarref};  my %perlvar=%{$perlvarref};
 #  #
 # Make sure that database can be accessed  # Make sure that database can be accessed
Line 241  unless ($dbh = DBI->connect("DBI:mysql:l Line 169  unless ($dbh = DBI->connect("DBI:mysql:l
 } else {  } else {
     $dbh->disconnect;      $dbh->disconnect;
 }  }
   
 #  #
 # Check if other instance running  # Check if other instance running
 #  #
Line 251  if (-e $pidfile) { Line 180  if (-e $pidfile) {
    chomp($pide);     chomp($pide);
    if (kill 0 => $pide) { die "already running"; }     if (kill 0 => $pide) { die "already running"; }
 }  }
   
 #  #
 # Read hosts file  # Read hosts file
 #  #
Line 268  while (my $configline=<CONFIG>) { Line 198  while (my $configline=<CONFIG>) {
 close(CONFIG);  close(CONFIG);
 #  #
 $PREFORK=int($PREFORK/4);  $PREFORK=int($PREFORK/4);
   
 #  #
 # Create a socket to talk to lond  # Create a socket to talk to lond
 #  #
Line 280  unless ($server=IO::Socket::UNIX->new(Lo Line 211  unless ($server=IO::Socket::UNIX->new(Lo
                                       Listen => 10)) {                                        Listen => 10)) {
     print "in socket error:$@\n";      print "in socket error:$@\n";
 }  }
 ########################################################  
 ########################################################  
 #  #
 # Fork once and dissociate  # Fork once and dissociate
   #
 my $fpid=fork;  my $fpid=fork;
 exit if $fpid;  exit if $fpid;
 die "Couldn't fork: $!" unless defined ($fpid);  die "Couldn't fork: $!" unless defined ($fpid);
 POSIX::setsid() or die "Can't start new session: $!";  POSIX::setsid() or die "Can't start new session: $!";
   
 #  #
 # Write our PID on disk  # Write our PID on disk
 my $execdir=$perlvar{'lonDaemons'};  my $execdir=$perlvar{'lonDaemons'};
Line 295  open (PIDSAVE,">$execdir/logs/lonsql.pid Line 227  open (PIDSAVE,">$execdir/logs/lonsql.pid
 print PIDSAVE "$$\n";  print PIDSAVE "$$\n";
 close(PIDSAVE);  close(PIDSAVE);
 &logthis("<font color=red>CRITICAL: ---------- Starting ----------</font>");  &logthis("<font color=red>CRITICAL: ---------- Starting ----------</font>");
   
 #  #
 # Ignore signals generated during initial startup  # Ignore signals generated during initial startup
 $SIG{HUP}=$SIG{USR1}='IGNORE';  $SIG{HUP}=$SIG{USR1}='IGNORE';
Line 303  $SIG{HUP}=$SIG{USR1}='IGNORE'; Line 236  $SIG{HUP}=$SIG{USR1}='IGNORE';
 for (1 .. $PREFORK) {  for (1 .. $PREFORK) {
     make_new_child();      make_new_child();
 }  }
   
 #  #
 # Install signal handlers.  # Install signal handlers.
 $SIG{CHLD} = \&REAPER;  $SIG{CHLD} = \&REAPER;
 $SIG{INT}  = $SIG{TERM} = \&HUNTSMAN;  $SIG{INT}  = $SIG{TERM} = \&HUNTSMAN;
 $SIG{HUP}  = \&HUPSMAN;  $SIG{HUP}  = \&HUPSMAN;
   
 #  #
 # And maintain the population.  # And maintain the population.
 while (1) {  while (1) {
Line 586  Writes $message to the logfile. Line 521  Writes $message to the logfile.
 sub logthis {  sub logthis {
     my $message=shift;      my $message=shift;
     my $execdir=$perlvar{'lonDaemons'};      my $execdir=$perlvar{'lonDaemons'};
     my $fh=IO::File->new(">>$execdir/logs/lonsqlfinal.log");      my $fh=IO::File->new(">>$execdir/logs/lonsql.log");
     my $now=time;      my $now=time;
     my $local=localtime($now);      my $local=localtime($now);
     print $fh "$local ($$): $message\n";      print $fh "$local ($$): $message\n";
Line 874  sub userlog { Line 809  sub userlog {
     return join('&',sort(@results));      return join('&',sort(@results));
 }  }
   
   ########################################################
   ########################################################
   
   =pod
   
   =item Functions required for forking
   
   =over 4
   
   =item REAPER
   
   REAPER takes care of dead children.
   
   =item HUNTSMAN
   
   Signal handler for SIGINT.
   
   =item HUPSMAN
   
   Signal handler for SIGHUP
   
   =item DISCONNECT
   
   Disconnects from database.
   
   =back
   
   =cut
   
   ########################################################
   ########################################################
   sub REAPER {                   # takes care of dead children
       $SIG{CHLD} = \&REAPER;
       my $pid = wait;
       $children --;
       &logthis("Child $pid died");
       delete $children{$pid};
   }
   
   sub HUNTSMAN {                      # signal handler for SIGINT
       local($SIG{CHLD}) = 'IGNORE';   # we're going to kill our children
       kill 'INT' => keys %children;
       my $execdir=$perlvar{'lonDaemons'};
       unlink("$execdir/logs/lonsql.pid");
       &logthis("<font color=red>CRITICAL: Shutting down</font>");
       $unixsock = "mysqlsock";
       my $port="$perlvar{'lonSockDir'}/$unixsock";
       unlink($port);
       exit;                           # clean up with dignity
   }
   
   sub HUPSMAN {                      # signal handler for SIGHUP
       local($SIG{CHLD}) = 'IGNORE';  # we're going to kill our children
       kill 'INT' => keys %children;
       close($server);                # free up socket
       &logthis("<font color=red>CRITICAL: Restarting</font>");
       my $execdir=$perlvar{'lonDaemons'};
       $unixsock = "mysqlsock";
       my $port="$perlvar{'lonSockDir'}/$unixsock";
       unlink($port);
       exec("$execdir/lonsql");         # here we go again
   }
   
   sub DISCONNECT {
       $dbh->disconnect or 
       &logthis("<font color=blue>WARNING: Couldn't disconnect from database ".
                " $DBI::errstr : $@</font>");
       exit;
   }
   
   
   
   

Removed from v.1.51  
changed lines
  Added in v.1.55


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>