EntryInfo *c_lruhead; /* lru - add accessed entries here */
EntryInfo *c_lrutail; /* lru - rem lru entries from here */
EntryInfo c_dntree;
- unsigned c_maxsize;
- int c_cursize;
- unsigned c_minfree;
- unsigned c_eimax;
- int c_eiused; /* EntryInfo's in use */
- int c_leaves; /* EntryInfo leaf nodes */
+ ID c_maxsize;
+ ID c_cursize;
+ ID c_minfree;
+ ID c_eimax;
+ ID c_eiused; /* EntryInfo's in use */
+ ID c_leaves; /* EntryInfo leaf nodes */
int c_purging;
DB_TXN *c_txn; /* used by lru cleaner */
ldap_pvt_thread_rdwr_t c_rwlock;
ID bi_lastid;
ldap_pvt_thread_mutex_t bi_lastid_mutex;
- unsigned bi_idl_cache_max_size;
- int bi_idl_cache_size;
+ ID bi_idl_cache_max_size;
+ ID bi_idl_cache_size;
Avlnode *bi_idl_tree;
bdb_idl_cache_entry_t *bi_idl_lru_head;
bdb_idl_cache_entry_t *bi_idl_lru_tail;
{
DB_LOCK lock, *lockp;
EntryInfo *elru, *elnext = NULL;
- int count, islocked, eimax;
- int efree = 0, eifree = 0, eicount, ecount;
+ int islocked;
+ ID eicount, ecount;
+ ID count, efree, eifree = 0;
#ifdef LDAP_DEBUG
int iter;
#endif
/* Wait for the mutex; we're the only one trying to purge. */
ldap_pvt_thread_mutex_lock( &bdb->bi_cache.c_lru_mutex );
+ if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ) {
+ efree = bdb->bi_cache.c_cursize - bdb->bi_cache.c_maxsize;
+ efree += bdb->bi_cache.c_minfree;
+ } else {
+ efree = 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;
-
- efree = bdb->bi_cache.c_cursize - bdb->bi_cache.c_maxsize;
- if ( efree < 1 )
- efree = 0;
- else
- efree += bdb->bi_cache.c_minfree;
- if ( bdb->bi_cache.c_leaves > eimax ) {
+ if ( slapMode & SLAP_TOOL_READONLY ) {
+ eifree = bdb->bi_cache.c_leaves;
+ } else if ( bdb->bi_cache.c_eimax &&
+ bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
eifree = bdb->bi_cache.c_minfree * 10;
- if ( eifree >= eimax )
- eifree = eimax / 2;
+ if ( eifree >= bdb->bi_cache.c_leaves )
+ eifree /= 2;
}
if ( !efree && !eifree ) {
int purge = 0;
if ( bdb->bi_cache.c_cursize > bdb->bi_cache.c_maxsize ||
- bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
+ ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > 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 )) {
purge = 1;
bdb->bi_cache.c_purging = 1;
}
- } else if ( bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
+ } else if ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_leaves > bdb->bi_cache.c_eimax ) {
purge = 1;
bdb->bi_cache.c_purging = 1;
}
"DESC 'Directory for database content' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
- { "cachefree", "size", 2, 2, 0, ARG_UINT|ARG_OFFSET,
+ { "cachefree", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET,
(void *)offsetof(struct bdb_info, bi_cache.c_minfree),
"( OLcfgDbAt:1.11 NAME 'olcDbCacheFree' "
"DESC 'Number of extra entries to free when max is reached' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
- { "cachesize", "size", 2, 2, 0, ARG_UINT|ARG_OFFSET,
+ { "cachesize", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET,
(void *)offsetof(struct bdb_info, bi_cache.c_maxsize),
"( OLcfgDbAt:1.1 NAME 'olcDbCacheSize' "
"DESC 'Entry cache size in entries' "
"( OLcfgDbAt:1.5 NAME 'olcDbDirtyRead' "
"DESC 'Allow reads of uncommitted data' "
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
- { "dncachesize", "size", 2, 2, 0, ARG_UINT|ARG_OFFSET,
+ { "dncachesize", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET,
(void *)offsetof(struct bdb_info, bi_cache.c_eimax),
"( OLcfgDbAt:1.12 NAME 'olcDbDNcacheSize' "
"DESC 'DN cache size' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
- { "idlcachesize", "size", 2, 2, 0, ARG_UINT|ARG_OFFSET,
+ { "idlcachesize", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET,
(void *)offsetof(struct bdb_info, bi_idl_cache_max_size),
"( OLcfgDbAt:1.6 NAME 'olcDbIDLcacheSize' "
"DESC 'IDL cache size in IDLs' "
}
bdb->bi_idl_lru_head = ee;
- if ( ++bdb->bi_idl_cache_size > bdb->bi_idl_cache_max_size ) {
+ if ( bdb->bi_idl_cache_size >= bdb->bi_idl_cache_max_size ) {
int i;
ee = bdb->bi_idl_lru_tail;
for ( i = 0; ee != NULL && i < 10; i++, ee = eprev ) {
assert( bdb->bi_idl_lru_tail != NULL
|| bdb->bi_idl_lru_head == NULL );
}
+ bdb->bi_idl_cache_size++;
ldap_pvt_thread_mutex_unlock( &bdb->bi_idl_tree_lrulock );
ldap_pvt_thread_rdwr_wunlock( &bdb->bi_idl_tree_rwlock );
}
}
#endif
- /* Default dncache to 2x entrycache */
- if ( bdb->bi_cache.c_maxsize && !bdb->bi_cache.c_eimax ) {
- bdb->bi_cache.c_eimax = bdb->bi_cache.c_maxsize * 2;
- }
-
- /* dncache must be >= entrycache */
- if ( bdb->bi_cache.c_eimax < bdb->bi_cache.c_maxsize ) {
+ /* dncache defaults to 0 == unlimited
+ * must be >= entrycache
+ */
+ if ( bdb->bi_cache.c_eimax && bdb->bi_cache.c_eimax < bdb->bi_cache.c_maxsize ) {
bdb->bi_cache.c_eimax = bdb->bi_cache.c_maxsize;
}
a = attr_find( e->e_attrs, ad_olmBDBEntryCache );
assert( a != NULL );
bv.bv_val = buf;
- bv.bv_len = snprintf( buf, sizeof( buf ), "%d", bdb->bi_cache.c_cursize );
+ bv.bv_len = snprintf( buf, sizeof( buf ), "%lud", bdb->bi_cache.c_cursize );
ber_bvreplace( &a->a_vals[ 0 ], &bv );
a = attr_find( e->e_attrs, ad_olmBDBDNCache );
assert( a != NULL );
- bv.bv_len = snprintf( buf, sizeof( buf ), "%d", bdb->bi_cache.c_eiused );
+ bv.bv_len = snprintf( buf, sizeof( buf ), "%lud", bdb->bi_cache.c_eiused );
ber_bvreplace( &a->a_vals[ 0 ], &bv );
a = attr_find( e->e_attrs, ad_olmBDBIDLCache );
assert( a != NULL );
- bv.bv_len = snprintf( buf, sizeof( buf ), "%d", bdb->bi_idl_cache_size );
+ bv.bv_len = snprintf( buf, sizeof( buf ), "%lud", bdb->bi_idl_cache_size );
ber_bvreplace( &a->a_vals[ 0 ], &bv );
#ifdef BDB_MONITOR_IDX