akosut      97/08/25 17:00:57

  Modified:    src      CHANGES
               src/main http_config.c http_main.c
  Log:
  Update sig_term to shutdown gracefully when a SIGTERM is received.
  
  Reviewed by: Dean Gaudet, Randy Terbush
  
  Revision  Changes    Path
  1.421     +4 -0      apachen/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/CHANGES,v
  retrieving revision 1.420
  retrieving revision 1.421
  diff -u -u -r1.420 -r1.421
  --- CHANGES   1997/08/25 16:02:21     1.420
  +++ CHANGES   1997/08/26 00:00:50     1.421
  @@ -1,5 +1,9 @@
   Changes with Apache 1.3a2
   
  +  *) Apache now gracefully shuts down when it receives a SIGTERM, instead
  +     of forcibly killing off all its processes and exiting without
  +     cleaning up. [Alexei Kosut]
  +
     *) API: A new field in the request_rec, r->mtime, has been added to
        avoid gratuitous parsing of date strings.  It is intended to hold
        the last-modified date of the resource (if applicable).  An
  
  
  
  1.76      +0 -1      apachen/src/main/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_config.c,v
  retrieving revision 1.75
  retrieving revision 1.76
  diff -u -u -r1.75 -r1.76
  --- http_config.c     1997/08/25 02:26:57     1.75
  +++ http_config.c     1997/08/26 00:00:54     1.76
  @@ -1293,7 +1293,6 @@
           if (m->child_exit)
            (*m->child_exit) (s, p);
   
  -    exit(0);
   }
   
   /********************************************************************
  
  
  
  1.210     +48 -18    apachen/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_main.c,v
  retrieving revision 1.209
  retrieving revision 1.210
  diff -u -u -r1.209 -r1.210
  --- http_main.c       1997/08/24 18:41:29     1.209
  +++ http_main.c       1997/08/26 00:00:55     1.210
  @@ -746,6 +746,8 @@
       if (alarms_blocked == 0) {
        if (exit_after_unblock) {
            child_exit_modules(pconf, server_conf);
  +         destroy_pool(pconf);
  +         exit(0);
        }
        if (alarm_pending) {
            alarm_pending = 0;
  @@ -1591,7 +1593,7 @@
       return -1;
   }
   
  -static void reclaim_child_processes (void)
  +static void reclaim_child_processes (int start_tries)
   {
   #ifndef MULTITHREAD
       int i, status;
  @@ -1602,7 +1604,7 @@
   
        if (pid != my_pid && pid != 0) { 
            int waitret = 0,
  -             tries = 1;
  +             tries = start_tries;
   
            while (waitret == 0 && tries <= 4) {
                long int waittime = 4096; /* in usecs */
  @@ -1745,17 +1747,6 @@
   }
   
   
  -void sig_term(int sig) {
  -    log_error("httpd: caught SIGTERM, shutting down", server_conf);
  -    cleanup_scoreboard();
  -    accept_mutex_cleanup();
  -#ifdef SIGKILL
  -    ap_killpg (pgrp, SIGKILL);
  -#endif /* SIGKILL */
  -    close(sd);
  -    exit(1);
  -}
  -
   void bus_error(int sig) {
       char emsg[256];
   
  @@ -1790,6 +1781,8 @@
        exit_after_unblock = 1;
       } else {
        child_exit_modules(pconf, server_conf);
  +     destroy_pool(pconf);
  +     exit(0);
       }
   }
   
  @@ -1805,10 +1798,15 @@
   }
   
   /* volatile just in case */
  +static int volatile shutdown_pending;
   static int volatile restart_pending;
   static int volatile is_graceful;
   static int volatile generation;
   
  +static void sig_term(int sig) {
  +    shutdown_pending = 1;
  +}
  +
   static void restart (int sig)
   {
   #ifdef WIN32
  @@ -2642,13 +2640,18 @@
        clear_pool (ptrans);
        
        sync_scoreboard_image();
  -     if (scoreboard_image->global.exit_generation >= generation)
  +     if (scoreboard_image->global.exit_generation >= generation) {
            child_exit_modules(pconf, server_conf);
  +         destroy_pool(pconf);
  +         exit(0);
  +     }
        
        if ((max_requests_per_child > 0
                && ++requests_this_child >= max_requests_per_child))
        {
            child_exit_modules(pconf, server_conf);
  +         destroy_pool(pconf);
  +         exit(0);
        }
   
        (void)update_child_status(my_child_num, SERVER_READY, 
(request_rec*)NULL);
  @@ -2692,6 +2695,8 @@
                if (deferred_die) {
                    /* we didn't get a socket, and we were told to die */
                    child_exit_modules(pconf, server_conf);
  +                 destroy_pool(pconf);
  +                 exit(0);
                }
            }
   
  @@ -2714,13 +2719,18 @@
            if (deferred_die) {
                /* ok maybe not, see ya later */
                child_exit_modules(pconf, server_conf);
  +             destroy_pool(pconf);
  +             exit(0);
            }
            /* or maybe we missed a signal, you never know on systems
             * without reliable signals
             */
            sync_scoreboard_image();
  -         if (scoreboard_image->global.exit_generation >= generation)
  +         if (scoreboard_image->global.exit_generation >= generation) {
                child_exit_modules(pconf, server_conf);
  +             destroy_pool(pconf);
  +             exit(0);
  +         }
           }
   
           SAFE_ACCEPT(accept_mutex_off()); /* unlock after "accept" */
  @@ -2805,6 +2815,8 @@
               if (scoreboard_image->global.exit_generation >= generation) {
                   bclose(conn_io);
                child_exit_modules(pconf, server_conf);
  +             destroy_pool(pconf);
  +             exit(0);
               }
   
            /* In case we get a graceful restart while we're blocked
  @@ -3129,9 +3141,9 @@
        log_printf (server_conf, "Server built: %s", SERVER_BUILT);
        log_error ("Server configured -- resuming normal operations",
                   server_conf);
  -     restart_pending = 0;
  +     restart_pending = shutdown_pending = 0;
   
  -     while (!restart_pending) {
  +     while (!restart_pending && !shutdown_pending) {
            int child_slot;
            int pid = wait_or_timeout ();
   
  @@ -3182,6 +3194,24 @@
            perform_idle_server_maintenance();
        }
   
  +     if (shutdown_pending) {
  +         /* Time to gracefully shut down:
  +          * Kill child processes, tell them to call child_exit, etc...
  +          */
  +         if (ap_killpg (pgrp, SIGTERM) < 0) {
  +             log_unixerr ("killpg SIGTERM", NULL, NULL, server_conf);
  +         }
  +         reclaim_child_processes(2); /* Start with SIGTERM */
  +         log_error("httpd: caught SIGTERM, shutting down", server_conf);
  +
  +         /* Clear the pool - including any registered cleanups */
  +         destroy_pool(pconf);
  +         cleanup_scoreboard();
  +         accept_mutex_cleanup();
  +         
  +         exit(0);
  +     }
  +
        /* we've been told to restart */
        signal (SIGHUP, SIG_IGN);
        signal (SIGUSR1, SIG_IGN);
  @@ -3225,7 +3255,7 @@
            if (ap_killpg (pgrp, SIGHUP) < 0) {
                log_unixerr ("killpg SIGHUP", NULL, NULL, server_conf);
            }
  -         reclaim_child_processes(); /* Not when just starting up */
  +         reclaim_child_processes(1); /* Not when just starting up */
            log_error ("SIGHUP received.  Attempting to restart", server_conf);
        }
        ++generation;
  
  
  

Reply via email to