diff --git a/CHANGES b/CHANGES index d6f28cf0b9..ff1302b211 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) mod_ldap: Fix a case where a full LDAP cache would continually fail to + purge old entries and log AH01323. PR61891. + [Hendrik Harms ] + *) mod_md: name change in configuration directives. The old names are still working in this version, so you can safely upgrade. They will give warnings in the log and will disappear in the immediate future. ManagedDomain is now MDomain, diff --git a/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c index c63cac9277..2023a786ba 100644 --- a/modules/ldap/util_ldap.c +++ b/modules/ldap/util_ldap.c @@ -2245,7 +2245,7 @@ static const char *util_ldap_set_opcache_ttl(cmd_parms *cmd, void *dummy, return err; } - st->compare_cache_ttl = atol(ttl) * 1000000; + st->compare_cache_ttl = atol(ttl) * APR_USEC_PER_SEC; ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01301) "ldap cache: Setting operation cache TTL to %ld microseconds.", @@ -2816,9 +2816,9 @@ static void *util_ldap_create_config(apr_pool_t *p, server_rec *s) #endif st->cache_bytes = 500000; - st->search_cache_ttl = 600000000; + st->search_cache_ttl = 600 * APR_USEC_PER_SEC; /* 10 minutes */ st->search_cache_size = 1024; - st->compare_cache_ttl = 600000000; + st->compare_cache_ttl = 600 * APR_USEC_PER_SEC; /* 10 minutes */ st->compare_cache_size = 1024; st->connections = NULL; st->ssl_supported = 0; diff --git a/modules/ldap/util_ldap_cache.c b/modules/ldap/util_ldap_cache.c index d8c1ed9b5b..7698ffe1ef 100644 --- a/modules/ldap/util_ldap_cache.c +++ b/modules/ldap/util_ldap_cache.c @@ -114,6 +114,7 @@ void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n "%ld" "%ld" "%ld" + "%ld" "%s" "", node->url, @@ -121,6 +122,7 @@ void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n cache_node->size, cache_node->maxentries, cache_node->numentries, + cache_node->ttl / APR_USEC_PER_SEC, cache_node->fullmark, date_str); } @@ -452,6 +454,7 @@ apr_status_t util_ldap_cache_init(apr_pool_t *pool, util_ldap_state_t *st) st->util_ldap_cache = util_ald_create_cache(st, st->search_cache_size, + st->search_cache_ttl, util_ldap_url_node_hash, util_ldap_url_node_compare, util_ldap_url_node_copy, diff --git a/modules/ldap/util_ldap_cache.h b/modules/ldap/util_ldap_cache.h index 8cfae324b8..3a98454ab7 100644 --- a/modules/ldap/util_ldap_cache.h +++ b/modules/ldap/util_ldap_cache.h @@ -46,6 +46,7 @@ struct util_ald_cache { unsigned long numentries; /* Current number of cache entries */ unsigned long fullmark; /* Used to keep track of when cache becomes 3/4 full */ apr_time_t marktime; /* Time that the cache became 3/4 full */ + unsigned long ttl; /* Time to live for items in cache */ unsigned long (*hash)(void *); /* Func to hash the payload */ int (*compare)(void *, void *); /* Func to compare two payloads */ void * (*copy)(util_ald_cache_t *cache, void *); /* Func to alloc mem and copy payload to new mem */ @@ -188,6 +189,7 @@ void util_ald_cache_purge(util_ald_cache_t *cache); util_url_node_t *util_ald_create_caches(util_ldap_state_t *s, const char *url); util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st, long cache_size, + long cache_ttl, unsigned long (*hashfunc)(void *), int (*comparefunc)(void *, void *), void * (*copyfunc)(util_ald_cache_t *cache, void *), diff --git a/modules/ldap/util_ldap_cache_mgr.c b/modules/ldap/util_ldap_cache_mgr.c index 6e1e7f4a91..989054549f 100644 --- a/modules/ldap/util_ldap_cache_mgr.c +++ b/modules/ldap/util_ldap_cache_mgr.c @@ -233,15 +233,22 @@ void util_ald_cache_purge(util_ald_cache_t *cache) { unsigned long i; util_cache_node_t *p, *q, **pp; - apr_time_t t; + apr_time_t now; if (!cache) return; - cache->last_purge = apr_time_now(); + now = cache->last_purge = apr_time_now(); cache->npurged = 0; cache->numpurges++; + /* If the marktime is farther back than TTL from now, + move the marktime forward to include additional expired entries. + */ + if (now - cache->ttl > cache->marktime) { + cache->marktime = now - cache->ttl; + } + for (i=0; i < cache->size; ++i) { pp = cache->nodes + i; p = *pp; @@ -261,9 +268,9 @@ void util_ald_cache_purge(util_ald_cache_t *cache) } } - t = apr_time_now(); + now = apr_time_now(); cache->avg_purgetime = - ((t - cache->last_purge) + (cache->avg_purgetime * (cache->numpurges-1))) / + ((now - cache->last_purge) + (cache->avg_purgetime * (cache->numpurges-1))) / cache->numpurges; } @@ -281,6 +288,7 @@ util_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url) /* create the three caches */ search_cache = util_ald_create_cache(st, st->search_cache_size, + st->search_cache_ttl, util_ldap_search_node_hash, util_ldap_search_node_compare, util_ldap_search_node_copy, @@ -288,6 +296,7 @@ util_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url) util_ldap_search_node_display); compare_cache = util_ald_create_cache(st, st->compare_cache_size, + st->compare_cache_ttl, util_ldap_compare_node_hash, util_ldap_compare_node_compare, util_ldap_compare_node_copy, @@ -295,6 +304,7 @@ util_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url) util_ldap_compare_node_display); dn_compare_cache = util_ald_create_cache(st, st->compare_cache_size, + st->compare_cache_ttl, util_ldap_dn_compare_node_hash, util_ldap_dn_compare_node_compare, util_ldap_dn_compare_node_copy, @@ -323,6 +333,7 @@ util_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url) util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st, long cache_size, + long cache_ttl, unsigned long (*hashfunc)(void *), int (*comparefunc)(void *, void *), void * (*copyfunc)(util_ald_cache_t *cache, void *), @@ -381,8 +392,10 @@ util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st, cache->free = freefunc; cache->display = displayfunc; + cache->fullmark = cache->maxentries / 4 * 3; cache->marktime = 0; + cache->ttl = cache_ttl; cache->avg_purgetime = 0.0; cache->numpurges = 0; cache->last_purge = 0; @@ -727,6 +740,10 @@ char *util_ald_cache_display(request_rec *r, util_ldap_state_t *st) "%ld" "\n" "\n" + "TTL (sec):" + "%ld" + "\n" + "\n" "Full Mark:" "%ld" "\n" @@ -738,6 +755,7 @@ char *util_ald_cache_display(request_rec *r, util_ldap_state_t *st) util_ldap_cache->size, util_ldap_cache->maxentries, util_ldap_cache->numentries, + util_ldap_cache->ttl / APR_USEC_PER_SEC, util_ldap_cache->fullmark, date_str); @@ -748,6 +766,7 @@ char *util_ald_cache_display(request_rec *r, util_ldap_state_t *st) "Size" "Max Entries" "# Entries" + "TTL (sec)" "Full Mark" "Full Mark Time" "\n", r