Commit 23ed395f authored by Stefan Fritsch's avatar Stefan Fritsch
Browse files

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
parent 007eed5b
Loading
Loading
Loading
Loading
+5 −0
Changes for CHANGES: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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]
+2 −1
Changes for docs/manual/mod/mod_ldap.xml: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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>

+10 −7
Changes for modules/ldap/util_ldap.c: 10 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -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,
+2 −0
Changes for modules/ldap/util_ldap_cache.c: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -420,6 +420,7 @@ 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_bytes > 0) {
        if (st->cache_file) {
            /* Remove any existing shm segment with this name. */
            apr_shm_remove(st->cache_file, st->pool);
@@ -442,6 +443,7 @@ apr_status_t util_ldap_cache_init(apr_pool_t *pool, util_ldap_state_t *st)
        if (result != APR_SUCCESS) {
            return result;
        }
    }

#endif

+13 −2
Changes for modules/ldap/util_ldap_cache_mgr.c: 13 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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;
    }