You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2012/04/10 04:48:49 UTC

svn commit: r1311559 - in /httpd/mod_fcgid/trunk: CHANGES-FCGID docs/manual/mod/mod_fcgid.xml modules/fcgid/fcgid_conf.c modules/fcgid/fcgid_conf.h modules/fcgid/fcgid_pm_win.c modules/fcgid/fcgid_proc_win.c modules/fcgid/mod_fcgid.c

Author: wrowe
Date: Tue Apr 10 02:48:48 2012
New Revision: 1311559

URL: http://svn.apache.org/viewvc?rev=1311559&view=rev
Log:
Revert r1236319 CHANGES change.  I'd tested, not committed this.  Missing docs.

Modified:
    httpd/mod_fcgid/trunk/CHANGES-FCGID
    httpd/mod_fcgid/trunk/docs/manual/mod/mod_fcgid.xml
    httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.c
    httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.h
    httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_win.c
    httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proc_win.c
    httpd/mod_fcgid/trunk/modules/fcgid/mod_fcgid.c

Modified: httpd/mod_fcgid/trunk/CHANGES-FCGID
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/CHANGES-FCGID?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/CHANGES-FCGID [utf8] (original)
+++ httpd/mod_fcgid/trunk/CHANGES-FCGID [utf8] Tue Apr 10 02:48:48 2012
@@ -1,11 +1,6 @@
                                                          -*- coding: utf-8 -*-
 Changes with mod_fcgid 2.3.7
 
-  *) Introduce FcgidWin32PreventOrphans directive on Windows to use OS
-     Job Control Objects to terminate all running fcgi's when the worker
-     process has been abruptly terminated. PR: 51078
-     [Thangaraj AntonyCrouse <thangaraj gmail.com>]
-
   *) Periodically clean out the brigades which are pulling in the request 
      body for handoff to the fcgid child. PR: 51749
      [Dominic Benson <dominic.benson thirdlight.com>]

Modified: httpd/mod_fcgid/trunk/docs/manual/mod/mod_fcgid.xml
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/docs/manual/mod/mod_fcgid.xml?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/docs/manual/mod/mod_fcgid.xml (original)
+++ httpd/mod_fcgid/trunk/docs/manual/mod/mod_fcgid.xml Tue Apr 10 02:48:48 2012
@@ -1124,6 +1124,21 @@
   </directivesynopsis>
 
   <directivesynopsis>
+    <name>FcgidWin32PreventOrphans</name>
+    <description>Terminate fcgi workers when httpd is abruptly terminated</description>
+    <syntax>FcgidWin32PreventOrphans</syntax>
+    <default>[disabled]</default>
+    <contextlist><context>server config</context></contextlist>
+    <usage>
+      <p>Uses Job Control Objects on Windows, only, to enforce shutdown of all
+      fcgi processes created by the httpd worker when the httpd worker has been
+      terminated. Processes terminated in this way do not have the opportunity
+      to clean up gracefully, complete pending disk writes or similar transactions,
+      therefore this behavior is experimental and disabled, by default.</p>
+    </usage>
+  </directivesynopsis>
+
+  <directivesynopsis>
     <name>FcgidWrapper</name>
     <description>The CGI wrapper setting</description>
     <syntax>FcgidWrapper <em>command</em> [ <em>suffix</em> ] [ virtual ]</syntax>

Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.c?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.c Tue Apr 10 02:48:48 2012
@@ -749,6 +749,55 @@ const char *set_access_authoritative(cmd
     return NULL;
 }
 
+
+#ifdef WIN32
+/* FcgidWin32PreventOrphans
+ *
+ *        When Apache process gets recycled or shutdown abruptly, CGI processes 
+ *        spawned by mod_fcgid will get orphaned. Orphaning happens mostly when
+ *        Apache worker threads take more than 30 seconds to exit gracefully.
+ *    
+ */    
+const char *set_win32_prevent_process_orphans(cmd_parms *cmd, void *dummy, char *arg)
+{
+    server_rec *s = cmd->server;
+    fcgid_server_conf *config = ap_get_module_config(s->module_config, &fcgid_module);
+    
+    if (config != NULL && config->hJobObjectForAutoCleanup == NULL){
+
+        /* Create Win32 job object to prevent CGI process oprhaning
+         */
+        JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 };
+        config->hJobObjectForAutoCleanup = CreateJobObject(NULL, NULL);
+
+        if (config->hJobObjectForAutoCleanup == NULL){
+                ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+                             "mod_fcgid: Error enabling CGI process orphan prevention: %d " 
+                             "unable to create job object.", apr_get_os_error());
+                return NULL;
+        }
+
+        /* Set job info so that all spawned CGI processes are associated with mod_fcgid
+         */        
+        job_info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
+        if(SetInformationJobObject(config->hJobObjectForAutoCleanup, 
+                                   JobObjectExtendedLimitInformation, &job_info, sizeof(job_info)) == 0){
+                ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+                             "mod_fcgid: Error enabling CGI process orphan prevention: %d "
+                             "unable set job object information.", apr_get_os_error());
+                CloseHandle(config->hJobObjectForAutoCleanup);
+                config->hJobObjectForAutoCleanup = NULL;
+                return NULL;        
+        }
+
+        ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL,
+            "mod_fcgid: Enabled CGI process orphan prevention flag.");    
+    }
+
+    return NULL;
+}
+#endif /*WIN32*/
+
 fcgid_cmd_conf *get_access_info(request_rec * r, int *authoritative)
 {
     fcgid_dir_conf *config =

Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.h
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.h?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.h (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_conf.h Tue Apr 10 02:48:48 2012
@@ -71,6 +71,10 @@ typedef struct {
     int termination_score;
     int time_score;
     int zombie_scan_interval;
+#ifdef WIN32
+    /* FcgidWin32PreventOrphans - Win32 CGI processes automatic cleanup */    
+    HANDLE hJobObjectForAutoCleanup;
+#endif /*WIN32*/
     /* global or vhost
      * scalar values have corresponding _set field to aid merging
      */

Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_win.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_win.c?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_win.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_pm_win.c Tue Apr 10 02:48:48 2012
@@ -264,6 +264,8 @@ int procmgr_must_exit()
 apr_status_t procmgr_stop_procmgr(void *server)
 {
     apr_status_t status;
+    fcgid_server_conf *conf =
+            ap_get_module_config(((server_rec*)server)->module_config, &fcgid_module);
 
     /* Tell the world to die */
     g_must_exit = 1;
@@ -281,6 +283,11 @@ apr_status_t procmgr_stop_procmgr(void *
         }
     }
 
+    /* Cleanup the Job object if present */
+    if (conf != NULL && conf->hJobObjectForAutoCleanup != NULL) {
+            CloseHandle(conf->hJobObjectForAutoCleanup);        
+    }
+    
     if (g_wakeup_thread)
         return apr_thread_join(&status, g_wakeup_thread);
 

Modified: httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proc_win.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proc_win.c?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proc_win.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/fcgid_proc_win.c Tue Apr 10 02:48:48 2012
@@ -177,7 +177,26 @@ apr_status_t proc_spawn_process(const ch
     if (rv != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_ERR, rv, procinfo->main_server,
                      "mod_fcgid: can't run %s", wargv[0]);
+		return rv;
     }
+    /* LTAC - FcgidWin32PreventOrphans feature*/
+    do{
+        fcgid_server_conf *sconf = ap_get_module_config(procinfo->main_server->
+                                                    module_config, &fcgid_module);      
+        if (sconf == NULL){
+            ap_log_error(APLOG_MARK, APLOG_ERR, rv, procinfo->main_server,
+                         "mod_fcgid: fcgi server configuration info unavailable");
+            break;            
+        }
+        /* Is FcgidWin32PreventOrphans enabled? */
+        if(sconf->hJobObjectForAutoCleanup != NULL){
+            /* Associate cgi process to current process */
+            if(AssignProcessToJobObject(sconf->hJobObjectForAutoCleanup, procnode->proc_id.hproc) == 0){
+                ap_log_error(APLOG_MARK, APLOG_ERR, 0, procinfo->main_server,
+                    "mod_fcgid: unable to assign child process to job object %d", apr_get_os_error());                    
+            }
+        }
+    }while(0);
 
     return rv;
 }

Modified: httpd/mod_fcgid/trunk/modules/fcgid/mod_fcgid.c
URL: http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/modules/fcgid/mod_fcgid.c?rev=1311559&r1=1311558&r2=1311559&view=diff
==============================================================================
--- httpd/mod_fcgid/trunk/modules/fcgid/mod_fcgid.c (original)
+++ httpd/mod_fcgid/trunk/modules/fcgid/mod_fcgid.c Tue Apr 10 02:48:48 2012
@@ -802,6 +802,12 @@ fcgid_init(apr_pool_t * config_pool, apr
     return APR_SUCCESS;
 }
 
+#ifdef WIN32
+const char *set_win32_prevent_process_orphans(cmd_parms *cmd, void *dummy, 
+                                              char *arg);
+#endif /*WIN32*/
+
+
 static const command_rec fcgid_cmds[] = {
     AP_INIT_TAKE1("FcgidAccessChecker", set_access_info, NULL,
                   ACCESS_CONF | OR_FILEINFO,
@@ -895,7 +901,18 @@ static const command_rec fcgid_cmds[] = 
     AP_INIT_TAKE1("FcgidZombieScanInterval", set_zombie_scan_interval, NULL,
                   RSRC_CONF,
                   "scan interval for zombie process"),
-
+#ifdef WIN32
+    /* Apache when run as windows service during shutdown/restart of service process (master/parent) will terminate child httpd
+     * process within 30 seconds (refer \server\mpm\winnt\mpm_winnt.c:master_main()  int timeout = 30000; ~line#1142), therefore
+     * if Apache worker threads are too busy to react to Master's graceful exit signal within 30 seconds - mod_fcgid cleanup 
+     * routines will not get invoked (refer \server\mpm\winnt\child.c: child_main() apr_pool_destroy(pchild); ~line#2275) thereby
+     * orphaning all mod_fcgid spwaned CGI processes. 
+     * Therefore we utilize Win32 JobObjects to clean up child processes automatically so that CGI processes are gauranteed to 
+     * get killed during abnormal mod_fcgid termination.
+     */
+    AP_INIT_NO_ARGS("FcgidWin32PreventOrphans", set_win32_prevent_process_orphans, NULL, RSRC_CONF,
+                    "CGI process orphaning will be prevented during Apache child recycling or abrupt shutdowns"),
+#endif /*WIN32*/
     /* The following directives are all deprecated in favor
      * of a consistent use of the Fcgid prefix.
      * Add all new command above this line.