]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
PR61891: looping over mostly full LDAP cache
authorEric Covener <covener@apache.org>
Wed, 13 Dec 2017 16:55:48 +0000 (16:55 +0000)
committerEric Covener <covener@apache.org>
Wed, 13 Dec 2017 16:55:48 +0000 (16:55 +0000)
  *) 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

CHANGES
modules/ldap/util_ldap.c
modules/ldap/util_ldap_cache.c
modules/ldap/util_ldap_cache.h
modules/ldap/util_ldap_cache_mgr.c

diff --git a/CHANGES b/CHANGES
index d6f28cf0b93998fc21ae3b6c4b69d7461d32c1de..ff1302b21171b7e58fddac8cb7e4c09eeb0cb8b4 100644 (file)
--- 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 <hendrik.harms gmail.com>]
+
   *) 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,
index c63cac9277d691895df3fed68e3d783738bf4b7d..2023a786ba3c0cb1330571adc80eebb6352cfda3 100644 (file)
@@ -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;
index d8c1ed9b5bf217c9d557d3af1f93784ca4c0d939..7698ffe1ef61ef4067e7f64bcc00508a47ec753b 100644 (file)
@@ -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,
index 8cfae324b8c8de028f8348777e927b7b6d4464ff..3a98454ab7255a418a423bd894c86a9c5dad2311 100644 (file)
@@ -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 *),
index 6e1e7f4a9183242929a6df34003b42106b8ad6cc..989054549f39c5ad307117ff8dce2bc5b83342b1 100644 (file)
@@ -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