]> granicus.if.org Git - apache/commitdiff
Merge r1818040 from trunk:
authorYann Ylavic <ylavic@apache.org>
Wed, 10 Jan 2018 22:05:23 +0000 (22:05 +0000)
committerYann Ylavic <ylavic@apache.org>
Wed, 10 Jan 2018 22:05:23 +0000 (22:05 +0000)
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
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

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 f1fe3cc8a005589bf069421657f9b227c40521b4..32d84b7b83c6585cc02525804ad024fd068a0ded 100644 (file)
--- 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 <hendrik.harms gmail.com>]
+
   *) 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]
index 52acafb06a1b793e98bd93ef200d4e801d280b0b..9df71134cf7d6117bd2b9b5bc47d1b7c1c31d0a0 100644 (file)
@@ -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;
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 4a0cc9767b47909d1dfd70fcfb1e503919efc367..c551a226d8293356bfbb362c04bc2de4f4f39475 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