From: Yann Ylavic Date: Wed, 10 Jan 2018 22:05:23 +0000 (+0000) Subject: Merge r1818040 from trunk: X-Git-Tag: 2.4.30~169 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ebc961934a262cc6fd306b056a73746d02c4f5c;p=apache Merge r1818040 from trunk: PR61891: looping over mostly full LDAP cache *) mod_ldap: Fix a case where a full LDAP cache would continually fail to purge old entries and log AH01323. PR61891. Submitted By: Hendrik Harms Committed By: covener Reviewed By: covener, jim, ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1820800 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index f1fe3cc8a0..32d84b7b83 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.4.30 + *) mod_ldap: Fix a case where a full LDAP cache would continually fail to + purge old entries and log AH01323. PR61891. + [Hendrik Harms ] + *) mpm_event: close connections not reported as handled by any module to avoid losing track of them and leaking scoreboard entries. PR 61551. [Yann Ylavic] diff --git a/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c index 52acafb06a..9df71134cf 100644 --- a/modules/ldap/util_ldap.c +++ b/modules/ldap/util_ldap.c @@ -2244,7 +2244,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.", @@ -2815,9 +2815,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 4a0cc9767b..c551a226d8 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