]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_ldap: Make LDAPSharedCacheSize 0 create a non-shared-memory cache per
authorStefan Fritsch <sf@apache.org>
Mon, 25 Apr 2011 20:00:43 +0000 (20:00 +0000)
committerStefan Fritsch <sf@apache.org>
Mon, 25 Apr 2011 20:00:43 +0000 (20:00 +0000)
process as opposed to disabling caching completely. This allows to use
the non-shared-memory cache as a workaround for the shared memory cache
not being available during graceful restarts

PR: 48958

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

CHANGES
docs/manual/mod/mod_ldap.xml
modules/ldap/util_ldap.c
modules/ldap/util_ldap_cache.c
modules/ldap/util_ldap_cache_mgr.c

diff --git a/CHANGES b/CHANGES
index 794d52509d0b508e8eaa383771be9b131b2262d6..0a32d4b2d527f7f91affdc2c36102519387d4906 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,11 @@
 
 Changes with Apache 2.3.12
 
+  *) mod_ldap: Make LDAPSharedCacheSize 0 create a non-shared-memory cache per
+     process as opposed to disabling caching completely. This allows to use
+     the non-shared-memory cache as a workaround for the shared memory cache
+     not being available during graceful restarts. PR 48958. [Stefan Fritsch]
+
   *) Add new ap_reserve_module_slots/ap_reserve_module_slots_directive API,
      necessary if a module (like mod_perl) registers additional modules late
      in the startup phase. [Stefan Fritsch]
index c55c4371405d985d0b060c4e7eb4925a80354f07..c725d22a9371567c620d8ab6a7b2c839d7ec1df9 100644 (file)
@@ -423,7 +423,8 @@ by other LDAP modules</description>
 <usage>
     <p>Specifies the number of bytes to allocate for the shared
     memory cache. The default is 500kb. If set to 0, shared memory
-    caching will not be used.</p>
+    caching will not be used and every HTTPD process will create its
+    own cache.</p>
 </usage>
 </directivesynopsis>
 
index 591d04800f909e2c68097db90016ba9b851fe2cf..d774f383cb2ff319fcf2a8d51cfc08f3f96eb48d 100644 (file)
@@ -2728,9 +2728,12 @@ static int util_ldap_post_config(apr_pool_t *p, apr_pool_t *plog,
     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
-         * going to run into problems creating the shared memory. */
-        if (st->cache_file) {
+        /*
+         * If we are using shared memory caching and the cache file already
+         * exists then delete it.  Otherwise we are going to run into problems
+         * creating the shared memory.
+         */
+        if (st->cache_file && st->cache_bytes > 0) {
             char *lck_file = apr_pstrcat(ptemp, st->cache_file, ".lck",
                                          NULL);
             apr_file_remove(lck_file, ptemp);
@@ -2740,10 +2743,10 @@ static int util_ldap_post_config(apr_pool_t *p, apr_pool_t *plog,
     }
 
 #if APR_HAS_SHARED_MEMORY
-    /* initializing cache if shared memory size is not zero and we already
-     * don't have shm address
+    /*
+     * initializing cache if we don't already have a shm address
      */
-    if (!st->cache_shm && st->cache_bytes > 0) {
+    if (!st->cache_shm) {
 #endif
         result = util_ldap_cache_init(p, st);
         if (result != APR_SUCCESS) {
@@ -2865,7 +2868,7 @@ static const command_rec util_ldap_cmds[] = {
     AP_INIT_TAKE1("LDAPSharedCacheSize", util_ldap_set_cache_bytes,
                   NULL, RSRC_CONF,
                   "Set the size of the shared memory cache (in bytes). Use "
-                  "0 to disable the shared memory cache. (default: 100000)"),
+                  "0 to disable the shared memory cache. (default: 500000)"),
 
     AP_INIT_TAKE1("LDAPSharedCacheFile", util_ldap_set_cache_file,
                   NULL, RSRC_CONF,
index 2217b20b7f10ea2882d63b38c7340d2a0aa2db70..87642e114a70dfa42523be755ef943401579293f 100644 (file)
@@ -420,27 +420,29 @@ apr_status_t util_ldap_cache_init(apr_pool_t *pool, util_ldap_state_t *st)
     apr_status_t result;
     apr_size_t size;
 
-    if (st->cache_file) {
-        /* Remove any existing shm segment with this name. */
-        apr_shm_remove(st->cache_file, st->pool);
-    }
+    if (st->cache_bytes > 0) {
+        if (st->cache_file) {
+            /* Remove any existing shm segment with this name. */
+            apr_shm_remove(st->cache_file, st->pool);
+        }
 
-    size = APR_ALIGN_DEFAULT(st->cache_bytes);
+        size = APR_ALIGN_DEFAULT(st->cache_bytes);
 
-    result = apr_shm_create(&st->cache_shm, size, st->cache_file, st->pool);
-    if (result != APR_SUCCESS) {
-        return result;
-    }
+        result = apr_shm_create(&st->cache_shm, size, st->cache_file, st->pool);
+        if (result != APR_SUCCESS) {
+            return result;
+        }
 
-    /* Determine the usable size of the shm segment. */
-    size = apr_shm_size_get(st->cache_shm);
+        /* Determine the usable size of the shm segment. */
+        size = apr_shm_size_get(st->cache_shm);
 
-    /* This will create a rmm "handler" to get into the shared memory area */
-    result = apr_rmm_init(&st->cache_rmm, NULL,
-                          apr_shm_baseaddr_get(st->cache_shm), size,
-                          st->pool);
-    if (result != APR_SUCCESS) {
-        return result;
+        /* This will create a rmm "handler" to get into the shared memory area */
+        result = apr_rmm_init(&st->cache_rmm, NULL,
+                              apr_shm_baseaddr_get(st->cache_shm), size,
+                              st->pool);
+        if (result != APR_SUCCESS) {
+            return result;
+        }
     }
 
 #endif
index adefcdcfd79e3440c6f46bce97f591e52a62ffd9..2f1d844bbafa7bc4e6d6248b6ac574b2d3e77b18 100644 (file)
@@ -331,16 +331,19 @@ util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st,
 {
     util_ald_cache_t *cache;
     unsigned long i;
+#if APR_HAS_SHARED_MEMORY
+    apr_rmm_off_t block;
+#endif
 
     if (cache_size <= 0)
         return NULL;
 
 #if APR_HAS_SHARED_MEMORY
     if (!st->cache_rmm) {
-        return NULL;
+        cache = (util_ald_cache_t *)calloc(sizeof(util_ald_cache_t), 1);
     }
     else {
-        apr_rmm_off_t block = apr_rmm_calloc(st->cache_rmm, sizeof(util_ald_cache_t));
+        block = apr_rmm_calloc(st->cache_rmm, sizeof(util_ald_cache_t));
         cache = block ? (util_ald_cache_t *)apr_rmm_addr_get(st->cache_rmm, block) : NULL;
     }
 #else
@@ -363,6 +366,14 @@ util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st,
     cache->nodes = (util_cache_node_t **)util_ald_alloc(cache, cache->size * sizeof(util_cache_node_t *));
     if (!cache->nodes) {
         util_ald_free(cache, cache);
+#if APR_HAS_SHARED_MEMORY
+        if (!st->cache_rmm)
+            free(cache);
+        else
+            apr_rmm_free(st->cache_rmm, block);
+#else
+        free(cache);
+#endif
         return NULL;
     }