Fix IDL caching

This commit is contained in:
Howard Chu 2005-10-27 01:41:34 +00:00
parent 888731e6c3
commit b3c3335418

View File

@ -678,8 +678,10 @@ bdb_tool_idl_flush_one( void *v1, void *arg )
int i, rc; int i, rc;
ID id, nid; ID id, nid;
if ( !ic->count ) if ( !ic->count ) {
ch_free( ic );
return 0; return 0;
}
rc = db->cursor( db, NULL, &curs, 0 ); rc = db->cursor( db, NULL, &curs, 0 );
if ( rc ) if ( rc )
@ -696,7 +698,7 @@ bdb_tool_idl_flush_one( void *v1, void *arg )
rc = curs->c_get( curs, &key, &data, DB_SET ); rc = curs->c_get( curs, &key, &data, DB_SET );
/* If key already exists and we're writing a range... */ /* If key already exists and we're writing a range... */
if ( rc == 0 && ic->idn == -1 ) { if ( rc == 0 && ic->count > BDB_IDL_DB_SIZE ) {
/* If it's not currently a range, must delete old info */ /* If it's not currently a range, must delete old info */
if ( nid ) { if ( nid ) {
/* Skip lo */ /* Skip lo */
@ -722,7 +724,7 @@ bdb_tool_idl_flush_one( void *v1, void *arg )
rc = 0; rc = 0;
} else if ( rc && rc != DB_NOTFOUND ) { } else if ( rc && rc != DB_NOTFOUND ) {
rc = -1; rc = -1;
} else if ( ic->idn == -1 ) { } else if ( ic->count > BDB_IDL_DB_SIZE ) {
/* range, didn't exist before */ /* range, didn't exist before */
nid = 0; nid = 0;
rc = curs->c_put( curs, &key, &data, DB_KEYLAST ); rc = curs->c_put( curs, &key, &data, DB_KEYLAST );
@ -744,7 +746,14 @@ bdb_tool_idl_flush_one( void *v1, void *arg )
rc = 0; rc = 0;
for ( n=0; n<=ic->idn; n++ ) { for ( n=0; n<=ic->idn; n++ ) {
ID *ids = bdb_tool_idls + ic->idls[n]; ID *ids = bdb_tool_idls + ic->idls[n];
int end = ( n < ic->idn ) ? IDBLOCK : (ic->count & (IDBLOCK-1)); int end;
if ( n < ic->idn ) {
end = IDBLOCK;
} else {
end = ic->count & (IDBLOCK-1);
if ( !end )
end = IDBLOCK;
}
for ( i=0; i<end; i++ ) { for ( i=0; i<end; i++ ) {
if ( !ids[i] ) continue; if ( !ids[i] ) continue;
BDB_ID2DISK( ids[i], &nid ); BDB_ID2DISK( ids[i], &nid );
@ -811,11 +820,11 @@ int bdb_tool_idl_add(
if ( !bdb->bi_idl_cache_max_size ) if ( !bdb->bi_idl_cache_max_size )
return bdb_idl_insert_key( be, db, txn, key, id ); return bdb_idl_insert_key( be, db, txn, key, id );
DBT2bv( key, &itmp.kstr );
retry: retry:
root = db->app_private; root = db->app_private;
DBT2bv( key, &itmp.kstr );
ic = avl_find( root, &itmp, bdb_tool_idl_cmp ); ic = avl_find( root, &itmp, bdb_tool_idl_cmp );
/* No entry yet, create one */ /* No entry yet, create one */