diff options
author | Eric Covener <covener@apache.org> | 2017-12-13 16:55:48 +0000 |
---|---|---|
committer | Eric Covener <covener@apache.org> | 2017-12-13 16:55:48 +0000 |
commit | fb9686170c7f093cc74ecdcd6bafe92b15dd35f0 (patch) | |
tree | 22884c600090206980d9eaf079740a0204446dde /modules/ldap | |
parent | c88a8745d62c882433bdf43c6aae8c0f903f7cb1 (diff) | |
download | httpd-fb9686170c7f093cc74ecdcd6bafe92b15dd35f0.tar.gz |
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 <hendrik.harms gmail.com>
Committed By: covener
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1818040 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/ldap')
-rw-r--r-- | modules/ldap/util_ldap.c | 6 | ||||
-rw-r--r-- | modules/ldap/util_ldap_cache.c | 3 | ||||
-rw-r--r-- | modules/ldap/util_ldap_cache.h | 2 | ||||
-rw-r--r-- | modules/ldap/util_ldap_cache_mgr.c | 27 |
4 files changed, 31 insertions, 7 deletions
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 "<td nowrap>%ld</td>" "<td nowrap>%ld</td>" "<td nowrap>%ld</td>" + "<td nowrap>%ld</td>" "<td nowrap>%s</td>" "</tr>", 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) "<td bgcolor='#ffffff'><font size='-1' face='Arial,Helvetica' color='#000000'><b>%ld</b></font></td>" "</tr>\n" "<tr>\n" + "<td bgcolor='#000000'><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>TTL (sec):</b></font></td>" + "<td bgcolor='#ffffff'><font size='-1' face='Arial,Helvetica' color='#000000'><b>%ld</b></font></td>" + "</tr>\n" + "<tr>\n" "<td bgcolor='#000000'><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Full Mark:</b></font></td>" "<td bgcolor='#ffffff'><font size='-1' face='Arial,Helvetica' color='#000000'><b>%ld</b></font></td>" "</tr>\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) "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Size</b></font></td>" "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Max Entries</b></font></td>" "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b># Entries</b></font></td>" + "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>TTL (sec)</b></font></td>" "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Full Mark</b></font></td>" "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Full Mark Time</b></font></td>" "</tr>\n", r |