1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

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
This commit is contained in:
Stefan Fritsch
2011-04-25 20:00:43 +00:00
parent bf07c1867c
commit 46dc6e060b
5 changed files with 49 additions and 27 deletions

View File

@@ -2,6 +2,11 @@
Changes with Apache 2.3.12 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, *) Add new ap_reserve_module_slots/ap_reserve_module_slots_directive API,
necessary if a module (like mod_perl) registers additional modules late necessary if a module (like mod_perl) registers additional modules late
in the startup phase. [Stefan Fritsch] in the startup phase. [Stefan Fritsch]

View File

@@ -423,7 +423,8 @@ by other LDAP modules</description>
<usage> <usage>
<p>Specifies the number of bytes to allocate for the shared <p>Specifies the number of bytes to allocate for the shared
memory cache. The default is 500kb. If set to 0, shared memory 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> </usage>
</directivesynopsis> </directivesynopsis>

View 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 (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
#if APR_HAS_SHARED_MEMORY #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 we are using shared memory caching and the cache file already
if (st->cache_file) { * 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", char *lck_file = apr_pstrcat(ptemp, st->cache_file, ".lck",
NULL); NULL);
apr_file_remove(lck_file, ptemp); 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 #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 #endif
result = util_ldap_cache_init(p, st); result = util_ldap_cache_init(p, st);
if (result != APR_SUCCESS) { if (result != APR_SUCCESS) {
@@ -2865,7 +2868,7 @@ static const command_rec util_ldap_cmds[] = {
AP_INIT_TAKE1("LDAPSharedCacheSize", util_ldap_set_cache_bytes, AP_INIT_TAKE1("LDAPSharedCacheSize", util_ldap_set_cache_bytes,
NULL, RSRC_CONF, NULL, RSRC_CONF,
"Set the size of the shared memory cache (in bytes). Use " "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, AP_INIT_TAKE1("LDAPSharedCacheFile", util_ldap_set_cache_file,
NULL, RSRC_CONF, NULL, RSRC_CONF,

View 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_status_t result;
apr_size_t size; apr_size_t size;
if (st->cache_file) { if (st->cache_bytes > 0) {
/* Remove any existing shm segment with this name. */ if (st->cache_file) {
apr_shm_remove(st->cache_file, st->pool); /* 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); result = apr_shm_create(&st->cache_shm, size, st->cache_file, st->pool);
if (result != APR_SUCCESS) { if (result != APR_SUCCESS) {
return result; return result;
} }
/* Determine the usable size of the shm segment. */ /* Determine the usable size of the shm segment. */
size = apr_shm_size_get(st->cache_shm); size = apr_shm_size_get(st->cache_shm);
/* This will create a rmm "handler" to get into the shared memory area */ /* This will create a rmm "handler" to get into the shared memory area */
result = apr_rmm_init(&st->cache_rmm, NULL, result = apr_rmm_init(&st->cache_rmm, NULL,
apr_shm_baseaddr_get(st->cache_shm), size, apr_shm_baseaddr_get(st->cache_shm), size,
st->pool); st->pool);
if (result != APR_SUCCESS) { if (result != APR_SUCCESS) {
return result; return result;
}
} }
#endif #endif

View File

@@ -331,16 +331,19 @@ util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st,
{ {
util_ald_cache_t *cache; util_ald_cache_t *cache;
unsigned long i; unsigned long i;
#if APR_HAS_SHARED_MEMORY
apr_rmm_off_t block;
#endif
if (cache_size <= 0) if (cache_size <= 0)
return NULL; return NULL;
#if APR_HAS_SHARED_MEMORY #if APR_HAS_SHARED_MEMORY
if (!st->cache_rmm) { if (!st->cache_rmm) {
return NULL; cache = (util_ald_cache_t *)calloc(sizeof(util_ald_cache_t), 1);
} }
else { 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; cache = block ? (util_ald_cache_t *)apr_rmm_addr_get(st->cache_rmm, block) : NULL;
} }
#else #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 *)); cache->nodes = (util_cache_node_t **)util_ald_alloc(cache, cache->size * sizeof(util_cache_node_t *));
if (!cache->nodes) { if (!cache->nodes) {
util_ald_free(cache, cache); 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; return NULL;
} }