httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeff Trawick <traw...@attglobal.net>
Subject Re: [PATCH] rough fix for cgid hanging around after MPM bails
Date Fri, 16 Nov 2001 14:06:50 GMT
With this newer patch, the behavior w.r.t. pid file cleanup and
SIGTERM messages should be consistent between prefork and worker.
Neither pid file cleanup nor the SIGTERM message is issued.

I expect that other MPMs which call ap_process_child_status (beos,
perchild, threaded) would be modified in the same way as worker.

Index: server/mpm_common.c
===================================================================
RCS file: /cvs/apache/httpd-2.0/server/mpm_common.c,v
retrieving revision 1.70
diff -u -r1.70 mpm_common.c
--- mpm_common.c	2001/10/23 17:30:07	1.70
+++ mpm_common.c	2001/11/16 13:45:38
@@ -225,21 +225,24 @@
 #endif /* AP_MPM_WANT_WAIT_OR_TIMEOUT */
 
 #ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS
-void ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status)
+int ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status)
 {
     int signum = status;
     const char *sigdesc = apr_signal_get_description(signum);
 
     /* Child died... if it died due to a fatal error,
-        * we should simply bail out.
-        */
+     * we should simply bail out.  The caller needs to
+     * check for bad rc from us and exit, running any
+     * appropriate cleanups.
+     */
     if ((APR_PROC_CHECK_EXIT(why)) &&
         (status == APEXIT_CHILDFATAL)) {
         ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, 0, ap_server_conf,
-                        "Child %ld returned a Fatal error..." APR_EOL_STR
-                        "Apache is exiting!",
-                        (long)pid->pid);
-        exit(APEXIT_CHILDFATAL);
+                     "Child %" APR_OS_PROC_T_FMT
+                     " returned a Fatal error..." APR_EOL_STR
+                     "Apache is exiting!",
+                     pid->pid);
+        return APEXIT_CHILDFATAL;
     }
 
     if (APR_PROC_CHECK_SIGNALED(why)) {
Index: server/mpm/prefork/prefork.c
===================================================================
RCS file: /cvs/apache/httpd-2.0/server/mpm/prefork/prefork.c,v
retrieving revision 1.211
diff -u -r1.211 prefork.c
--- prefork.c	2001/11/11 05:17:51	1.211
+++ prefork.c	2001/11/16 13:45:38
@@ -1126,7 +1126,10 @@
 	 * extra child
 	 */
 	if (pid.pid != -1) {
-	    ap_process_child_status(&pid, exitwhy, status);
+            if (ap_process_child_status(&pid, exitwhy, status) == APEXIT_CHILDFATAL)
{
+                return 1;
+            }
+
 	    /* non-fatal death... note that it's gone in the scoreboard. */
 	    ap_sync_scoreboard_image();
 	    child_slot = find_child_by_pid(&pid);
Index: server/mpm/worker/worker.c
===================================================================
RCS file: /cvs/apache/httpd-2.0/server/mpm/worker/worker.c,v
retrieving revision 1.34
diff -u -r1.34 worker.c
--- worker.c	2001/11/12 17:50:59	1.34
+++ worker.c	2001/11/16 13:45:38
@@ -302,6 +302,7 @@
 static int volatile restart_pending;
 static int volatile is_graceful;
 ap_generation_t volatile ap_my_generation;
+static volatile int child_fatal;
 
 /*
  * ap_start_shutdown() and ap_start_restart(), below, are a first stab at
@@ -1195,7 +1197,11 @@
         ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
         
         if (pid.pid != -1) {
-            ap_process_child_status(&pid, exitwhy, status);
+            if (ap_process_child_status(&pid, exitwhy, status) == APEXIT_CHILDFATAL)
{
+                shutdown_pending = 1;
+                child_fatal = 1;
+                return;
+            }
             /* non-fatal death... note that it's gone in the scoreboard. */
             child_slot = find_child_by_pid(&pid);
             if (child_slot >= 0) {
@@ -1359,9 +1365,9 @@
             ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGTERM");
         }
         ap_reclaim_child_processes(1);		/* Start with SIGTERM */
-    
-        /* cleanup pid file on normal shutdown */
-        {
+
+        if (!child_fatal) {
+            /* cleanup pid file on normal shutdown */
             const char *pidfile = NULL;
             pidfile = ap_server_root_relative (pconf, ap_pid_fname);
             if ( pidfile != NULL && unlink(pidfile) == 0)
@@ -1369,11 +1375,10 @@
             		 ap_server_conf,
             		 "removed PID file %s (pid=%ld)",
             		 pidfile, (long)getpid());
-        }
-    
-        ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
-            "caught SIGTERM, shutting down");
     
+            ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0,
+                         ap_server_conf, "caught SIGTERM, shutting down");
+        }
 	return 1;
     }
 

-- 
Jeff Trawick | trawick@attglobal.net | PGP public key at web site:
       http://www.geocities.com/SiliconValley/Park/9289/
             Born in Roswell... married an alien...

Mime
View raw message