DB_LOCK lock, *lockp;
EntryInfo *elru, *elnext = NULL;
int count, islocked, eimax;
+ int efree = 0, eifree = 0, eicount;
/* Wait for the mutex; we're the only one trying to purge. */
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_lru_mutex );
else
eimax = bdb->bi_cache.c_eimax;
- if ( bdb->bi_cache.c_cursize <= bdb->bi_cache.c_maxsize &&
- bdb->bi_cache.c_leaves <= eimax ) {
+ if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize )
+ efree = bdb->bi_cache.c_minfree;
+ if ( bdb->bi_cache.c_leaves > eimax )
+ eifree = bdb->bi_cache.c_minfree * 10;
+
+ if ( !efree && !eifree ) {
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_lru_mutex );
bdb->bi_cache.c_purging = 0;
return;
}
count = 0;
+ eicount = 0;
/* Look for an unused entry to remove */
for ( elru = bdb->bi_cache.c_lruhead; elru; elru = elnext ) {
/* Free entry for this node if it's present */
if ( elru->bei_e ) {
- if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize &&
- count < bdb->bi_cache.c_minfree ) {
+ if ( count < efree ) {
elru->bei_e->e_private = NULL;
#ifdef SLAP_ZONE_ALLOC
bdb_entry_return( bdb, elru->bei_e, elru->bei_zseq );
if ( elru->bei_kids ) {
/* Drop from list, we ignore it... */
LRU_DEL( &bdb->bi_cache, elru );
- } else if ( bdb->bi_cache.c_leaves > eimax ) {
+ } else if ( eicount < eifree ) {
/* Too many leaf nodes, free this one */
bdb_cache_delete_internal( &bdb->bi_cache, elru, 0 );
bdb_cache_delete_cleanup( &bdb->bi_cache, elru );
islocked = 0;
+ eicount++;
} /* Leave on list until we need to free it */
}
if ( islocked )
bdb_cache_entryinfo_unlock( elru );
- if (( bdb->bi_cache.c_cursize <= bdb->bi_cache.c_maxsize ||
- (unsigned) count >= bdb->bi_cache.c_minfree ) && bdb->bi_cache.c_leaves <= eimax ) {
+ if ( count >= efree && eicount >= eifree ) {
if ( count ) {
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
bdb->bi_cache.c_cursize -= count;