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]
<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>
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);
}
#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) {
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,
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
{
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
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;
}