From: Howard Chu Date: Sat, 29 Nov 2003 13:59:10 +0000 (+0000) Subject: Fix ITS#2848 - revert dbcache behavior to REL_ENG_2_1_5. X-Git-Tag: OPENLDAP_REL_ENG_2_1_24~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36023b1e09e81d3e9ac36f6d40ceb1436d5a867a;p=thirdparty%2Fopenldap.git Fix ITS#2848 - revert dbcache behavior to REL_ENG_2_1_5. --- diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index d5e2627423..b2d33f455d 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -110,6 +110,7 @@ struct bdb_info { int bi_ndatabases; struct bdb_db_info **bi_databases; + ldap_pvt_thread_mutex_t bi_database_mutex; int bi_db_opflags; /* db-specific flags */ slap_mask_t bi_defaultmask; @@ -159,7 +160,7 @@ struct bdb_op_info { int boi_acl_cache; }; -#define DB_OPEN(db, txn, file, name, type, flags, mode) \ +#define DB_OPEN(db, file, name, type, flags, mode) \ (db)->open(db, file, name, type, flags, mode) #if DB_VERSION_MAJOR < 4 @@ -190,8 +191,8 @@ struct bdb_op_info { /* BDB 4.1.17 adds txn arg to db->open */ #if DB_VERSION_MINOR > 1 || DB_VERSION_PATCH >= 17 #undef DB_OPEN -#define DB_OPEN(db, txn, file, name, type, flags, mode) \ - (db)->open(db, txn, file, name, type, flags, mode) +#define DB_OPEN(db, file, name, type, flags, mode) \ + (db)->open(db, NULL, file, name, type, (flags)|DB_AUTO_COMMIT, mode) #endif #define BDB_REUSE_LOCKERS diff --git a/servers/slapd/back-bdb/dbcache.c b/servers/slapd/back-bdb/dbcache.c index 603815b929..7f5d6718d0 100644 --- a/servers/slapd/back-bdb/dbcache.c +++ b/servers/slapd/back-bdb/dbcache.c @@ -46,19 +46,14 @@ bdb_db_hash( int bdb_db_cache( Backend *be, - DB_TXN *tid, const char *name, DB **dbout ) { int i; int rc; - int flags; struct bdb_info *bdb = (struct bdb_info *) be->be_private; struct bdb_db_info *db; char *file; - DBT lockobj; - DB_LOCK lock; - u_int32_t locker = 0; *dbout = NULL; @@ -69,33 +64,19 @@ bdb_db_cache( } } - lockobj.data = "bdb_db_cache"; - lockobj.size = sizeof("bdb_db_cache"); - - if (tid) { - locker = TXN_ID( tid ); - } else { -#ifdef BDB_REUSE_LOCKERS -#define op NULL /* implicit arg in LOCK_ID */ -#endif - rc = LOCK_ID( bdb->bi_dbenv, &locker ); - if (rc) return rc; - } - rc = LOCK_GET( bdb->bi_dbenv, locker, 0, &lockobj, - DB_LOCK_WRITE, &lock ); - if (rc) return rc; + ldap_pvt_thread_mutex_lock( &bdb->bi_database_mutex ); /* check again! may have been added by another thread */ for( i=BDB_NDB; bdb->bi_databases[i]; i++ ) { if( !strcmp( bdb->bi_databases[i]->bdi_name, name) ) { *dbout = bdb->bi_databases[i]->bdi_db; - LOCK_PUT( bdb->bi_dbenv, &lock); + ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex ); return 0; } } if( i >= BDB_INDICES ) { - LOCK_PUT( bdb->bi_dbenv, &lock); + ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex ); return -1; } @@ -114,7 +95,7 @@ bdb_db_cache( "bdb_db_cache: db_create(%s) failed: %s (%d)\n", bdb->bi_dbenv_home, db_strerror(rc), rc ); #endif - LOCK_PUT( bdb->bi_dbenv, &lock); + ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex ); return rc; } @@ -129,11 +110,9 @@ bdb_db_cache( #ifdef HAVE_EBCDIC __atoe( file ); #endif - flags = bdb->bi_db_opflags | DB_CREATE | DB_THREAD; - if ( !tid ) flags |= DB_AUTO_COMMIT; - rc = DB_OPEN( db->bdi_db, tid, + rc = DB_OPEN( db->bdi_db, file, name, - DB_HASH, flags, + DB_HASH, bdb->bi_db_opflags | DB_CREATE | DB_THREAD, bdb->bi_dbenv_mode ); ch_free( file ); @@ -148,7 +127,7 @@ bdb_db_cache( "bdb_db_cache: db_open(%s) failed: %s (%d)\n", name, db_strerror(rc), rc ); #endif - LOCK_PUT( bdb->bi_dbenv, &lock); + ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex ); return rc; } @@ -158,6 +137,6 @@ bdb_db_cache( *dbout = db->bdi_db; - LOCK_PUT( bdb->bi_dbenv, &lock ); + ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex ); return 0; } diff --git a/servers/slapd/back-bdb/index.c b/servers/slapd/back-bdb/index.c index 82268eaa09..32d393145a 100644 --- a/servers/slapd/back-bdb/index.c +++ b/servers/slapd/back-bdb/index.c @@ -97,7 +97,7 @@ int bdb_index_param( return LDAP_INAPPROPRIATE_MATCHING; } - rc = bdb_db_cache( be, NULL, prefixp->bv_val, &db ); + rc = bdb_db_cache( be, prefixp->bv_val, &db ); if( rc != LDAP_SUCCESS ) { return rc; @@ -158,7 +158,7 @@ static int indexer( assert( mask ); - rc = bdb_db_cache( be, txn, atname->bv_val, &db ); + rc = bdb_db_cache( be, atname->bv_val, &db ); if ( rc != LDAP_SUCCESS ) { #ifdef NEW_LOGGING diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index 4b25f12124..8b28447278 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -98,6 +98,7 @@ bdb_db_init( BackendDB *be ) LDAP_LIST_INIT (&bdb->psearch_list); #endif + ldap_pvt_thread_mutex_init( &bdb->bi_database_mutex ); ldap_pvt_thread_mutex_init( &bdb->bi_lastid_mutex ); ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_mutex ); ldap_pvt_thread_rdwr_init ( &bdb->bi_cache.c_rwlock ); @@ -379,14 +380,14 @@ bdb_db_open( BackendDB *be ) #ifdef HAVE_EBCDIC strcpy( path, bdbi_databases[i].file ); __atoe( path ); - rc = DB_OPEN( db->bdi_db, NULL, + rc = DB_OPEN( db->bdi_db, path, /* bdbi_databases[i].name, */ NULL, bdbi_databases[i].type, bdbi_databases[i].flags | flags | DB_AUTO_COMMIT, bdb->bi_dbenv_mode ); #else - rc = DB_OPEN( db->bdi_db, NULL, + rc = DB_OPEN( db->bdi_db, bdbi_databases[i].file, /* bdbi_databases[i].name, */ NULL, bdbi_databases[i].type, @@ -524,6 +525,7 @@ bdb_db_destroy( BackendDB *be ) ldap_pvt_thread_rdwr_destroy ( &bdb->bi_cache.c_rwlock ); ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.lru_mutex ); ldap_pvt_thread_mutex_destroy( &bdb->bi_lastid_mutex ); + ldap_pvt_thread_mutex_destroy( &bdb->bi_database_mutex ); ch_free( bdb ); be->be_private = NULL; diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index 8cb1ed5808..01103d1585 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -51,7 +51,6 @@ BI_acl_attribute bdb_attribute; int bdb_db_cache( Backend *be, - DB_TXN *tid, const char *name, DB **db );