mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
ITS#5860 more ID_NOCACHE fallout
This commit is contained in:
parent
05fbd96356
commit
417d105c29
@ -662,7 +662,16 @@ bdb_cache_lru_purge( struct bdb_info *bdb )
|
|||||||
/* Wait for the mutex; we're the only one trying to purge. */
|
/* Wait for the mutex; we're the only one trying to purge. */
|
||||||
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_lru_mutex );
|
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_lru_mutex );
|
||||||
|
|
||||||
if ( bdb->bi_cache.c_cursize <= bdb->bi_cache.c_maxsize ) {
|
/* maximum number of EntryInfo leaves to cache. In slapcat
|
||||||
|
* we always free all leaf nodes.
|
||||||
|
*/
|
||||||
|
if ( slapMode & SLAP_TOOL_READONLY )
|
||||||
|
eimax = 0;
|
||||||
|
else
|
||||||
|
eimax = bdb->bi_cache.c_eimax;
|
||||||
|
|
||||||
|
if ( bdb->bi_cache.c_cursize <= bdb->bi_cache.c_maxsize &&
|
||||||
|
bdb->bi_cache.c_leaves <= eimax ) {
|
||||||
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_lru_mutex );
|
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_lru_mutex );
|
||||||
bdb->bi_cache.c_purging = 0;
|
bdb->bi_cache.c_purging = 0;
|
||||||
return;
|
return;
|
||||||
@ -676,14 +685,6 @@ bdb_cache_lru_purge( struct bdb_info *bdb )
|
|||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
/* maximum number of EntryInfo leaves to cache. In slapcat
|
|
||||||
* we always free all leaf nodes.
|
|
||||||
*/
|
|
||||||
if ( slapMode & SLAP_TOOL_READONLY )
|
|
||||||
eimax = 0;
|
|
||||||
else
|
|
||||||
eimax = bdb->bi_cache.c_eimax;
|
|
||||||
|
|
||||||
/* Look for an unused entry to remove */
|
/* Look for an unused entry to remove */
|
||||||
for ( elru = bdb->bi_cache.c_lruhead; elru; elru = elnext ) {
|
for ( elru = bdb->bi_cache.c_lruhead; elru; elru = elnext ) {
|
||||||
elnext = elru->bei_lrunext;
|
elnext = elru->bei_lrunext;
|
||||||
@ -718,7 +719,7 @@ bdb_cache_lru_purge( struct bdb_info *bdb )
|
|||||||
bdb->bi_cache.c_txn, elru, 1, 1, lockp ) == 0 ) {
|
bdb->bi_cache.c_txn, elru, 1, 1, lockp ) == 0 ) {
|
||||||
|
|
||||||
/* Free entry for this node if it's present */
|
/* Free entry for this node if it's present */
|
||||||
if ( elru->bei_e ) {
|
if ( elru->bei_e && bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) {
|
||||||
elru->bei_e->e_private = NULL;
|
elru->bei_e->e_private = NULL;
|
||||||
#ifdef SLAP_ZONE_ALLOC
|
#ifdef SLAP_ZONE_ALLOC
|
||||||
bdb_entry_return( bdb, elru->bei_e, elru->bei_zseq );
|
bdb_entry_return( bdb, elru->bei_e, elru->bei_zseq );
|
||||||
@ -747,7 +748,7 @@ bdb_cache_lru_purge( struct bdb_info *bdb )
|
|||||||
if ( islocked )
|
if ( islocked )
|
||||||
bdb_cache_entryinfo_unlock( elru );
|
bdb_cache_entryinfo_unlock( elru );
|
||||||
|
|
||||||
if ( (unsigned) count >= bdb->bi_cache.c_minfree ) {
|
if ( (unsigned) count >= bdb->bi_cache.c_minfree && bdb->bi_cache.c_leaves <= eimax ) {
|
||||||
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
|
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
|
||||||
bdb->bi_cache.c_cursize -= count;
|
bdb->bi_cache.c_cursize -= count;
|
||||||
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
|
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
|
||||||
@ -986,16 +987,19 @@ load1:
|
|||||||
int purge = 0;
|
int purge = 0;
|
||||||
|
|
||||||
if ( load ) {
|
if ( load ) {
|
||||||
|
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
|
||||||
if ( !( flag & ID_NOCACHE )) {
|
if ( !( flag & ID_NOCACHE )) {
|
||||||
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_count_mutex );
|
|
||||||
bdb->bi_cache.c_cursize++;
|
bdb->bi_cache.c_cursize++;
|
||||||
if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize &&
|
if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize &&
|
||||||
!bdb->bi_cache.c_purging ) {
|
!bdb->bi_cache.c_purging ) {
|
||||||
purge = 1;
|
purge = 1;
|
||||||
bdb->bi_cache.c_purging = 1;
|
bdb->bi_cache.c_purging = 1;
|
||||||
}
|
}
|
||||||
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
|
} else if ( bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax && !bdb->bi_cache.c_purging ) {
|
||||||
|
purge = 1;
|
||||||
|
bdb->bi_cache.c_purging = 1;
|
||||||
}
|
}
|
||||||
|
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
|
||||||
}
|
}
|
||||||
if ( purge )
|
if ( purge )
|
||||||
bdb_cache_lru_purge( bdb );
|
bdb_cache_lru_purge( bdb );
|
||||||
|
Loading…
Reference in New Issue
Block a user