From: Stefan Fritsch Date: Mon, 25 Apr 2011 20:00:43 +0000 (+0000) Subject: mod_ldap: Make LDAPSharedCacheSize 0 create a non-shared-memory cache per X-Git-Tag: 2.3.12~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46dc6e060bddc57dda3669d557af3e8d7cd1d07e;p=thirdparty%2Fapache%2Fhttpd.git 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 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1096577 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 794d52509d0..0a32d4b2d52 100644 --- 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] diff --git a/docs/manual/mod/mod_ldap.xml b/docs/manual/mod/mod_ldap.xml index c55c4371405..c725d22a937 100644 --- a/docs/manual/mod/mod_ldap.xml +++ b/docs/manual/mod/mod_ldap.xml @@ -423,7 +423,8 @@ by other LDAP modules

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.

+ caching will not be used and every HTTPD process will create its + own cache.

diff --git a/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c index 591d04800f9..d774f383cb2 100644 --- a/modules/ldap/util_ldap.c +++ b/modules/ldap/util_ldap.c @@ -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, diff --git a/modules/ldap/util_ldap_cache.c b/modules/ldap/util_ldap_cache.c index 2217b20b7f1..87642e114a7 100644 --- a/modules/ldap/util_ldap_cache.c +++ b/modules/ldap/util_ldap_cache.c @@ -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 diff --git a/modules/ldap/util_ldap_cache_mgr.c b/modules/ldap/util_ldap_cache_mgr.c index adefcdcfd79..2f1d844bbaf 100644 --- a/modules/ldap/util_ldap_cache_mgr.c +++ b/modules/ldap/util_ldap_cache_mgr.c @@ -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; }