Commit 01a4e02e authored by Yann Ylavic's avatar Yann Ylavic
Browse files

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 <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
parent 3ccc676a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
                                                         -*- 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]
+3 −3
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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 *),
+23 −4
Original line number Diff line number Diff line
@@ -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