X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Finit.c;h=f64e5a35708c21b00cc41eab656503a8541bc870;hb=60c4893b9379627eb3da95558e65c162f6805d3a;hp=77a48492802124b1b05227578d19d94831b973b0;hpb=ddb1124e42df2f5a71d93d986c806f4ee4783964;p=openldap diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index 77a4849280..f64e5a3570 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -66,10 +66,33 @@ bdb_db_init( BackendDB *be ) bdb->bi_dbenv_xflags = 0; bdb->bi_dbenv_mode = DEFAULT_MODE; +#ifndef NO_THREADS + bdb->bi_lock_detect = DB_LOCK_NORUN; +#endif + be->be_private = bdb; return 0; } +#ifndef NO_THREADS +static void *lock_detect_task( void *arg ) +{ + struct bdb_info *bdb = (struct bdb_info *) arg; + + while( bdb->bi_dbenv != NULL ) { + int rc; + sleep( bdb->bi_lock_detect_seconds ); + + rc = lock_detect( bdb->bi_dbenv, DB_LOCK_CONFLICT, bdb->bi_lock_detect, NULL ); + if( rc != 0 ) { + break; + } + } + + return NULL; +} +#endif + static int bdb_db_open( BackendDB *be ) { @@ -91,14 +114,8 @@ bdb_db_open( BackendDB *be ) return rc; } - flags = DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN | - DB_CREATE | DB_RECOVER | DB_THREAD; - -#ifdef SLAPD_BDB_PRIVATE - flags |= DB_PRIVATE; -#else - flags |= DB_INIT_MPOOL; -#endif + flags = DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | + DB_THREAD | DB_CREATE | DB_RECOVER; bdb->bi_dbenv->set_errpfx( bdb->bi_dbenv, be->be_suffix[0] ); bdb->bi_dbenv->set_errcall( bdb->bi_dbenv, bdb_errcall ); @@ -192,9 +209,26 @@ bdb_db_open( BackendDB *be ) bdb->bi_databases[i] = db; } + /* get nextid */ + rc = bdb_last_id( be, NULL ); + if( rc != 0 ) { + Debug( LDAP_DEBUG_ANY, + "bdb_db_open: last_id(%s) failed: %s (%d)\n", + bdb->bi_dbenv_home, db_strerror(rc), rc ); + return rc; + } + + /* open (and create) index databases */ +#ifndef NO_THREADS + if( bdb->bi_lock_detect != DB_LOCK_NORUN ) { + /* listener as a separate THREAD */ + rc = ldap_pvt_thread_create( &bdb->bi_lock_detect_tid, + 1, lock_detect_task, bdb ); + } +#endif return 0; } @@ -228,13 +262,15 @@ bdb_db_destroy( BackendDB *be ) struct bdb_info *bdb = (struct bdb_info *) be->be_private; /* close db environment */ - rc = bdb->bi_dbenv->close( bdb->bi_dbenv, 0 ); - bdb->bi_dbenv = NULL; - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "bdb_db_destroy: close failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - return rc; + if( bdb->bi_dbenv ) { + rc = bdb->bi_dbenv->close( bdb->bi_dbenv, 0 ); + bdb->bi_dbenv = NULL; + if( rc != 0 ) { + Debug( LDAP_DEBUG_ANY, + "bdb_db_destroy: close failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); + return rc; + } } return 0; @@ -317,7 +353,6 @@ bdb_initialize( bi->bi_acl_group = bdb_group; bi->bi_acl_attribute = bdb_attribute; - #endif bi->bi_chk_referrals = bdb_referrals;