]> granicus.if.org Git - apache/commitdiff
Use ap_state_query() to fix many modules that were not correctly initializing
authorStefan Fritsch <sf@apache.org>
Sat, 12 Feb 2011 21:23:56 +0000 (21:23 +0000)
committerStefan Fritsch <sf@apache.org>
Sat, 12 Feb 2011 21:23:56 +0000 (21:23 +0000)
if they were not active during server startup but got enabled later during a
graceful restart (in which case they need to do all work during a single
config run).

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1070153 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
CHANGES
modules/aaa/mod_auth_digest.c
modules/cluster/mod_heartmonitor.c
modules/core/mod_watchdog.c
modules/examples/mod_example_ipc.c
modules/generators/mod_cgid.c
modules/ldap/util_ldap.c
modules/mappers/mod_rewrite.c
modules/proxy/balancers/mod_lbmethod_heartbeat.c
modules/proxy/mod_proxy_balancer.c
modules/session/mod_session_crypto.c
modules/slotmem/mod_slotmem_shm.c
modules/ssl/ssl_scache.c

diff --git a/CHANGES b/CHANGES
index 23a1547ba568a129fc007ea1d6c5c6187cf4f162..2c9fb190565b39ff9dfdea40b493c01774eddc30 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
 
 Changes with Apache 2.3.11
 
+  *) modules: Fix many modules that were not correctly initializing if they
+     were not active during server startup but got enabled later during a
+     graceful restart. [Stefan Fritsch]
+
   *) core: Create new ap_state_query function that allows modules to determine
      if the current configuration run is the initial one at server startup,
      and if the server is started for testing/config dumping only.
index e88eba50b15c17c01cd88ab89a3a76b3b9df9083..b137059c00bc850a1ef0bdf6bf9ca8ea3aa67938 100644 (file)
@@ -382,18 +382,12 @@ static int pre_init(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
 static int initialize_module(apr_pool_t *p, apr_pool_t *plog,
                              apr_pool_t *ptemp, server_rec *s)
 {
-    void *data;
-    const char *userdata_key = "auth_digest_init";
-
     /* initialize_module() will be called twice, and if it's a DSO
      * then all static data from the first call will be lost. Only
      * set up our static data on the second call. */
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                               apr_pool_cleanup_null, s->process->pool);
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return OK;
-    }
+
     if (initialize_secret(s) != APR_SUCCESS) {
         return !OK;
     }
index 07bada1431d6ecd575eb3f9dde39bfbcce0a3b30..4c80e2d75c12864a97ab14e86bf67b24bf2b6383 100644 (file)
@@ -665,8 +665,6 @@ static int hm_post_config(apr_pool_t *p, apr_pool_t *plog,
                           apr_pool_t *ptemp, server_rec *s)
 {
     apr_status_t rv;
-    const char *userdata_key = "mod_heartmonitor_init";
-    void *data;
     hm_ctx_t *ctx = ap_get_module_config(s->module_config,
                                          &heartmonitor_module);
     APR_OPTIONAL_FN_TYPE(ap_watchdog_get_instance) *hm_watchdog_get_instance;
@@ -681,11 +679,8 @@ static int hm_post_config(apr_pool_t *p, apr_pool_t *plog,
     }
 
     /* Create the slotmem */
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        /* first call do nothing */
-        apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool);
-    } else {
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_CONFIG) {
+        /* this is the real thing */
         if (maxworkers) {
             storage = ap_lookup_provider(AP_SLOTMEM_PROVIDER_GROUP, "shared", "0");
             if (!storage) {
index 551d49aa0d5d6ddb66bae9db906c1a2da1c6af0c..7bc8a350ade04a173ab82fda2e5051c9948aab89 100644 (file)
@@ -20,6 +20,7 @@
 #include "mod_watchdog.h"
 #include "ap_provider.h"
 #include "ap_mpm.h"
+#include "http_core.h"
 #include "util_mutex.h"
 
 #define AP_WATCHODG_PGROUP    "watchdog"
@@ -444,11 +445,12 @@ static int wd_post_config_hook(apr_pool_t *pconf, apr_pool_t *plog,
         if (!(wd_server_conf = apr_pcalloc(pproc, sizeof(wd_server_conf_t))))
             return APR_ENOMEM;
         apr_pool_create(&wd_server_conf->pool, pproc);
-        wd_server_conf->s = s;
-        apr_pool_userdata_set(wd_server_conf, pk, apr_pool_cleanup_null, pproc);
+    }
+
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         /* First time config phase -- skip. */
         return OK;
-    }
+
 #if defined(WIN32)
     {
         const char *ppid = getenv("AP_PARENT_PID");
index ef39cd7b61bc809ccea5a2eb3ef35284e84a5a3f..483881b580fb04015c3b15cb7db9f73dbcd1e2c7 100644 (file)
@@ -50,6 +50,7 @@
 
 #include "httpd.h"
 #include "http_config.h"
+#include "http_core.h"
 #include "http_log.h"
 #include "http_protocol.h"
 #include "util_mutex.h"
@@ -117,35 +118,19 @@ static int exipc_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
 static int exipc_post_config(apr_pool_t *pconf, apr_pool_t *plog, 
                              apr_pool_t *ptemp, server_rec *s)
 {
-    void *data; /* These two help ensure that we only init once. */
-    const char *userdata_key;
     apr_status_t rs;
     exipc_data *base;
     const char *tempdir; 
 
 
     /* 
-     * The following checks if this routine has been called before. 
-     * This is necessary because the parent process gets initialized
-     * a couple of times as the server starts up, and we don't want 
-     * to create any more mutexes and shared memory segments than
-     * we're actually going to use. 
-     * 
-     * The key needs to be unique for the entire web server, so put
-     * the module name in it.
+     * Do nothing if we are not creating the final configuration.
+     * The parent process gets initialized a couple of times as the
+     * server starts up, and we don't want to create any more mutexes
+     * and shared memory segments than we're actually going to use. 
      */ 
-    userdata_key = "example_ipc_init_module";
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        /* 
-         * If no data was found for our key, this must be the first
-         * time the module is initialized. Put some data under that
-         * key and return.
-         */
-        apr_pool_userdata_set((const void *) 1, userdata_key, 
-                              apr_pool_cleanup_null, s->process->pool);
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return OK;
-    } /* Kilroy was here */
 
     /* 
      * The shared memory allocation routines take a file name.
index 8f8419885333a4112afe7865410c9345ac25ee8a..810a49b3ff55f5e88915138d56fb37c2d9f763bd 100644 (file)
@@ -891,7 +891,6 @@ static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
                      server_rec *main_server)
 {
     apr_proc_t *procnew = NULL;
-    int first_time = 0;
     const char *userdata_key = "cgid_init";
     module **m;
     int ret = OK;
@@ -902,7 +901,6 @@ static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
 
     apr_pool_userdata_get(&data, userdata_key, main_server->process->pool);
     if (!data) {
-        first_time = 1;
         procnew = apr_pcalloc(main_server->process->pool, sizeof(*procnew));
         procnew->pid = -1;
         procnew->err = procnew->in = procnew->out = NULL;
@@ -913,7 +911,7 @@ static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
         procnew = data;
     }
 
-    if (!first_time) {
+    if (ap_state_query(AP_SQ_MAIN_STATE) != AP_SQ_MS_CREATE_PRE_CONFIG) {
         char *tmp_sockname;
         total_modules = 0;
         for (m = ap_preloaded_modules; *m != NULL; m++)
index 6f485b5a00039d458ba4a27eece6a974c44f87f8..9c1511088020b047eaf6d27e948c6cf8479c71e0 100644 (file)
@@ -2703,18 +2703,13 @@ static int util_ldap_post_config(apr_pool_t *p, apr_pool_t *plog,
                             ap_get_module_config(s->module_config,
                                                  &ldap_module);
 
-    void *data;
-    const char *userdata_key = "util_ldap_init";
     apr_ldap_err_t *result_err = NULL;
     int rc;
 
     /* util_ldap_post_config() will be called twice. Don't bother
      * going through all of the initialization on the first call
      * because it will just be thrown away.*/
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                               apr_pool_cleanup_null, s->process->pool);
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
 
 #if APR_HAS_SHARED_MEMORY
         /* If the cache file already exists then delete it.  Otherwise we are
index 73f0a882f272d8e28d5459bdd360aefaf597c46c..55fc459d9a1b9eac64240db285246ee52d17ed42 100644 (file)
@@ -4309,16 +4309,6 @@ static int post_config(apr_pool_t *p,
                        server_rec *s)
 {
     apr_status_t rv;
-    void *data;
-    int first_time = 0;
-    const char *userdata_key = "rewrite_init_module";
-
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        first_time = 1;
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                              apr_pool_cleanup_null, s->process->pool);
-    }
 
     /* check if proxy module is available */
     proxy_available = (ap_find_linked_module("mod_proxy.c") != NULL);
@@ -4331,12 +4321,11 @@ static int post_config(apr_pool_t *p,
     apr_pool_cleanup_register(p, (void *)s, rewritelock_remove,
                               apr_pool_cleanup_null);
 
-    /* step through the servers and
-     * - open each rewriting logfile
-     * - open the RewriteMap prg:xxx programs
+    /* if we are not doing the initial config, step through the servers and
+     * open the RewriteMap prg:xxx programs,
      */
-    for (; s; s = s->next) {
-        if (!first_time) {
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_CONFIG) {
+        for (; s; s = s->next) {
             if (run_rewritemap_programs(s, p) != APR_SUCCESS) {
                 return HTTP_INTERNAL_SERVER_ERROR;
             }
index 63304e83f4e7957b75457961dfe571e628a631f2..0987415ac60f043518c6dbf12f406c354fe96708 100644 (file)
@@ -387,19 +387,15 @@ static const proxy_balancer_method heartbeat =
 static int lb_hb_init(apr_pool_t *p, apr_pool_t *plog,
                           apr_pool_t *ptemp, server_rec *s)
 {
-    const char *userdata_key = "mod_lbmethod_heartbeat_init";
-    void *data;
     apr_size_t size;
     unsigned int num;
     lb_hb_ctx_t *ctx = ap_get_module_config(s->module_config,
                                             &lbmethod_heartbeat_module);
     
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        /* first call do nothing */
-        apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool);
+    /* do nothing on first call */
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return OK;
-    }
+
     storage = ap_lookup_provider(AP_SLOTMEM_PROVIDER_GROUP, "shared", "0");
     if (!storage) {
         ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, s, "ap_lookup_provider %s failed", AP_SLOTMEM_PROVIDER_GROUP);
index 4b65c6657f452f1521c805669f84ea5ec3e14bae..2d67ec248d16c9b407520cad9d697caba525b982 100644 (file)
@@ -690,21 +690,15 @@ static int balancer_post_config(apr_pool_t *pconf, apr_pool_t *plog,
                          apr_pool_t *ptemp, server_rec *s)
 {
     apr_status_t rv;
-    void *data;
     void *sconf = s->module_config;
     proxy_server_conf *conf = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
-    const char *userdata_key = "mod_proxy_balancer_init";
     ap_slotmem_instance_t *new = NULL;
     apr_time_t tstamp;
 
-    /* balancer_post_config() will be called twice during startup.  So, only
+    /* balancer_post_config() will be called twice during startup.  So, don't
      * set up the static data the 1st time through. */
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                               apr_pool_cleanup_null, s->process->pool);
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return OK;
-    }
 
     /*
      * Get slotmem setups
index 5832d842d3f52d17ec720701b1da026ab28fd388..4583fbf0576fdc0519371be0dfac271e5ff57b20 100644 (file)
@@ -20,6 +20,7 @@
 #include "apr_lib.h"
 #include "apr_strings.h"
 #include "http_log.h"
+#include "http_core.h"
 
 #if APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION < 4
 
@@ -41,7 +42,6 @@
 
 #define LOG_PREFIX "mod_session_crypto: "
 #define DRIVER_KEY "session_crypto_driver"
-#define INIT_KEY "session_crypto_init"
 
 module AP_MODULE_DECLARE_DATA session_crypto_module;
 
@@ -390,7 +390,6 @@ AP_DECLARE(int) ap_session_crypto_decode(request_rec * r, session_rec * z)
 AP_DECLARE(int) ap_session_crypto_init(apr_pool_t *p, apr_pool_t *plog,
         apr_pool_t *ptemp, server_rec *s)
 {
-    void *data;
     const apr_crypto_driver_t *driver = NULL;
 
     session_crypto_conf *conf = ap_get_module_config(s->module_config,
@@ -399,12 +398,8 @@ AP_DECLARE(int) ap_session_crypto_init(apr_pool_t *p, apr_pool_t *plog,
     /* session_crypto_init() will be called twice. Don't bother
      * going through all of the initialization on the first call
      * because it will just be thrown away.*/
-    apr_pool_userdata_get(&data, INIT_KEY, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, INIT_KEY,
-                apr_pool_cleanup_null, s->process->pool);
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return OK;
-    }
 
     if (conf->library) {
 
index 23fdf82020aeaaa3a01cdab36099e1667e94bd4f..c696a9623779ce6c9e1e312116bd2988d3724507 100644 (file)
@@ -639,20 +639,7 @@ static void slotmem_shm_initialize_cleanup(apr_pool_t *p)
 static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
                        server_rec *s)
 {
-    void *data;
-    const char *userdata_key = "slotmem_shm_post_config";
-
     slotmem_shm_initialize_cleanup(p);
-
-    /* keep this around for possible future usage */
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                               apr_pool_cleanup_null, s->process->pool);
-        /* Do Stuff */
-        return OK;
-    }
-
     return OK;
 }
 
index 104151e295c3de6d1f8ed22ef28d0f473b68a1ef..d454c1f0418a788cf7076b661381a98620bc415c 100644 (file)
@@ -41,8 +41,6 @@ void ssl_scache_init(server_rec *s, apr_pool_t *p)
 {
     SSLModConfigRec *mc = myModConfig(s);
     apr_status_t rv;
-    void *data;
-    const char *userdata_key = "ssl_scache_init";
     struct ap_socache_hints hints;
     
     /* The very first invocation of this function will be the
@@ -50,12 +48,8 @@ void ssl_scache_init(server_rec *s, apr_pool_t *p)
      * this first (and only the first) time through, since the pool
      * will be immediately cleared anyway.  For every subsequent
      * invocation, initialize the configured cache. */
-    apr_pool_userdata_get(&data, userdata_key, s->process->pool);
-    if (!data) {
-        apr_pool_userdata_set((const void *)1, userdata_key,
-                              apr_pool_cleanup_null, s->process->pool);
+    if (!ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
         return;
-    }
 
 #ifdef HAVE_OCSP_STAPLING
     if (mc->stapling_cache) {