From 2c3c10d617488b4b76fea1e7780ce220e1b94be5 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount <quanah@openldap.org> Date: Wed, 4 Nov 2009 16:47:44 +0000 Subject: [PATCH] ITS#6360 --- CHANGES | 3 ++- servers/slapd/back-bdb/cache.c | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 543ff3a519..edbfcfcc3e 100644 --- a/CHANGES +++ b/CHANGES @@ -12,7 +12,8 @@ OpenLDAP 2.4.20 Engineering Fixed slapd debug handling of LDAP_DEBUG_ANY (ITS#6324) Fixed slapd termination for one level DNs (ITS#6338) Fixed slapd unused parameter (ITS#6356) - Fixed slapd-bdb cache corruption (ITS#6341) + Fixed slapd-bdb/hdb cache corruption (ITS#6341) + Fixed slapd-bdb/hdb entry cache (ITS#6360) Fixed slapd-ldap leak (ITS#6326) Fixed slapd-relay bind segfault (ITS#6337) Fixed slapo-memberof operational attr updates (ITS#6329) diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c index fab4b1e09e..4e5636f73b 100644 --- a/servers/slapd/back-bdb/cache.c +++ b/servers/slapd/back-bdb/cache.c @@ -972,6 +972,9 @@ load1: */ if ( (*eip)->bei_state & CACHE_ENTRY_NOT_CACHED ) { (*eip)->bei_state &= ~CACHE_ENTRY_NOT_CACHED; + ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex ); + ++bdb->bi_cache.c_cursize; + ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex ); } flag &= ~ID_NOCACHE; } @@ -1069,20 +1072,17 @@ load1: if ( rc == 0 ) { int purge = 0; - if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize || - ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax )) { + if (( load && !( flag & ID_NOCACHE )) || bdb->bi_cache.c_eimax ) { ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex ); - if ( !bdb->bi_cache.c_purging ) { - if ( load && !( flag & ID_NOCACHE )) { - bdb->bi_cache.c_cursize++; - if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) { - purge = 1; - bdb->bi_cache.c_purging = 1; - } - } else if ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) { + if ( load && !( flag & ID_NOCACHE )) { + bdb->bi_cache.c_cursize++; + if ( !bdb->bi_cache.c_purging && bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) { purge = 1; bdb->bi_cache.c_purging = 1; } + } else if ( !bdb->bi_cache.c_purging && bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) { + purge = 1; + bdb->bi_cache.c_purging = 1; } ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex ); } -- GitLab