]> git.sur5r.net Git - openldap/commitdiff
Additional cache / BDB 4.3 / cleanup from HEAD
authorHoward Chu <hyc@openldap.org>
Wed, 24 Nov 2004 06:02:18 +0000 (06:02 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 24 Nov 2004 06:02:18 +0000 (06:02 +0000)
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/cache.c
servers/slapd/back-bdb/ctxcsn.c
servers/slapd/back-bdb/error.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/proto-bdb.h

index 7d8b389c6f6af6d701f050087280bfad912a2694..0528d096ec884e500d80d960350c0d0316b04343 100644 (file)
@@ -227,7 +227,7 @@ struct bdb_op_info {
 #define XLOCK_ID_FREE(env, locker)     (env)->lock_id_free(env, locker)
 
 /* BDB 4.1.17 adds txn arg to db->open */
-#if DB_VERSION_MINOR > 1 || DB_VERSION_PATCH >= 17
+#if DB_VERSION_FULL >= 0x04010011
 #undef DB_OPEN
 #define        DB_OPEN(db, file, name, type, flags, mode) \
        (db)->open(db, NULL, file, name, type, (flags)|DB_AUTO_COMMIT, mode)
index 62f5450d40932437e6f01d29b591ececf99a7e40..eaabdf020dbb604dc7217f2afe072b931da93fbe 100644 (file)
@@ -35,7 +35,7 @@ static int    bdb_cache_delete_internal(Cache *cache, EntryInfo *e, int decr);
 static void    bdb_lru_print(Cache *cache);
 #endif
 
-static int bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn );
+static int bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn, int reset );
 
 static EntryInfo *
 bdb_cache_entryinfo_new( Cache *cache )
@@ -93,15 +93,9 @@ bdb_cache_entry_db_relock(
                list, 2, NULL );
 
        if (rc && !tryOnly) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( CACHE, DETAIL1, 
-                       "bdb_cache_entry_db_relock: entry %ld, rw %d, rc %d\n",
-                       ei->bei_id, rw, rc );
-#else
                Debug( LDAP_DEBUG_TRACE,
                        "bdb_cache_entry_db_relock: entry %ld, rw %d, rc %d\n",
                        ei->bei_id, rw, rc );
-#endif
        } else {
                *lock = list[1].lock;
        }
@@ -133,15 +127,9 @@ bdb_cache_entry_db_lock( DB_ENV *env, u_int32_t locker, EntryInfo *ei,
        rc = LOCK_GET(env, locker, tryOnly ? DB_LOCK_NOWAIT : 0,
                                        &lockobj, db_rw, lock);
        if (rc && !tryOnly) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( CACHE, DETAIL1, 
-                       "bdb_cache_entry_db_lock: entry %ld, rw %d, rc %d\n",
-                       ei->bei_id, rw, rc );
-#else
                Debug( LDAP_DEBUG_TRACE,
                        "bdb_cache_entry_db_lock: entry %ld, rw %d, rc %d\n",
                        ei->bei_id, rw, rc );
-#endif
        }
        return rc;
 #endif /* NO_THREADS */
@@ -583,8 +571,8 @@ bdb_cache_find_info(
        struct bdb_info *bdb,
        ID id )
 {
-       EntryInfo ei = { 0 };
-       EntryInfo *ei2;
+       EntryInfo       ei = { 0 },
+                       *ei2;
 
        ei.bei_id = id;
 
@@ -701,7 +689,7 @@ load1:              if ( !(*eip)->bei_e && !((*eip)->bei_state & CACHE_ENTRY_LOADING)) {
                                         * we use a long-lived per-thread txn for this step.
                                         */
                                        if ( !ep && !tid ) {
-                                               rc = bdb_txn_get( op, bdb->bi_dbenv, &ltid );
+                                               rc = bdb_txn_get( op, bdb->bi_dbenv, &ltid, 0 );
                                                if ( ltid )
                                                        locker2 = TXN_ID( ltid );
                                        } else {
@@ -743,6 +731,12 @@ load1:             if ( !(*eip)->bei_e && !((*eip)->bei_state & CACHE_ENTRY_LOADING)) {
                                                list.obj = NULL;
                                                bdb->bi_dbenv->lock_vec( bdb->bi_dbenv, locker2,
                                                        0, &list, 1, NULL );
+                                               /* If this txn was deadlocked, we must abort it
+                                                * and invalidate this per-thread txn.
+                                                */
+                                               if ( rc == DB_LOCK_DEADLOCK ) {
+                                                       bdb_txn_get( op, bdb->bi_dbenv, &ltid, 1 );
+                                               }
                                        }
                                } else if ( !(*eip)->bei_e ) {
                                        /* Some other thread is trying to load the entry,
@@ -1142,11 +1136,7 @@ bdb_cache_release_all( Cache *cache )
        /* set lru mutex */
        ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( CACHE, ENTRY, "bdb_cache_release_all: enter\n", 0, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "====> bdb_cache_release_all\n", 0, 0, 0 );
-#endif
 
        avl_free( cache->c_dntree.bei_kids, NULL );
        avl_free( cache->c_idtree, bdb_entryinfo_release );
@@ -1189,12 +1179,13 @@ bdb_txn_free( void *key, void *data )
        TXN_ABORT( txn );
 }
 
-/* Obtain a long-lived transaction for the current thread */
+/* Obtain a long-lived transaction for the current thread.
+ * If reset == 1, remove the current transaction. */
 static int
-bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn )
+bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn, int reset )
 {
        int i, rc, lockid;
-       void *ctx, *data;
+       void *ctx, *data = NULL;
 
        /* If no op was provided, try to find the ctx anyway... */
        if ( op ) {
@@ -1209,7 +1200,13 @@ bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn )
                return 0;
        }
 
-       if ( ldap_pvt_thread_pool_getkey( ctx, ((char *)env)+1, &data, NULL ) ) {
+       if ( reset ) {
+               TXN_ABORT( *txn );
+               return ldap_pvt_thread_pool_setkey( ctx, ((char *)env)+1, NULL, NULL );
+       }
+
+       if ( ldap_pvt_thread_pool_getkey( ctx, ((char *)env)+1, &data, NULL ) ||
+               data == NULL ) {
                for ( i=0, rc=1; rc != 0 && i<4; i++ ) {
                        rc = TXN_BEGIN( env, NULL, txn, 0 );
                        if (rc) ldap_pvt_thread_yield();
@@ -1220,13 +1217,8 @@ bdb_txn_get( Operation *op, DB_ENV *env, DB_TXN **txn )
                if ( ( rc = ldap_pvt_thread_pool_setkey( ctx, ((char *)env)+1,
                        *txn, bdb_txn_free ) ) ) {
                        TXN_ABORT( *txn );
-#ifdef NEW_LOGGING
-                       LDAP_LOG( BACK_BDB, ERR, "bdb_txn_get: err %s(%d)\n",
-                               db_strerror(rc), rc, 0 );
-#else
                        Debug( LDAP_DEBUG_ANY, "bdb_txn_get: err %s(%d)\n",
                                db_strerror(rc), rc, 0 );
-#endif
 
                        return rc;
                }
@@ -1247,15 +1239,9 @@ bdb_locker_id_free( void *key, void *data )
        rc = XLOCK_ID_FREE( env, lockid );
        if ( rc == EINVAL ) {
                DB_LOCKREQ lr;
-#ifdef NEW_LOGGING
-               LDAP_LOG( BACK_BDB, ERR,
-                       "bdb_locker_id_free: %d err %s(%d)\n",
-                       lockid, db_strerror(rc), rc );
-#else
                Debug( LDAP_DEBUG_ANY,
                        "bdb_locker_id_free: %d err %s(%d)\n",
                        lockid, db_strerror(rc), rc );
-#endif
                /* release all locks held by this locker. */
                lr.op = DB_LOCK_PUT_ALL;
                lr.obj = NULL;
@@ -1298,13 +1284,8 @@ bdb_locker_id( Operation *op, DB_ENV *env, int *locker )
                if ( ( rc = ldap_pvt_thread_pool_setkey( ctx, env,
                        data, bdb_locker_id_free ) ) ) {
                        XLOCK_ID_FREE( env, lockid );
-#ifdef NEW_LOGGING
-                       LDAP_LOG( BACK_BDB, ERR, "bdb_locker_id: err %s(%d)\n",
-                               db_strerror(rc), rc, 0 );
-#else
                        Debug( LDAP_DEBUG_ANY, "bdb_locker_id: err %s(%d)\n",
                                db_strerror(rc), rc, 0 );
-#endif
 
                        return rc;
                }
index 2aef9ce60f4177c587c55ffa763f9cf661b63ccb..dd37c9926c8faf89c2806ae6b13e207f85a56b9f 100644 (file)
@@ -376,8 +376,9 @@ txn_retry:
 
                        ctxcsn_locker = TXN_ID ( ltid );
 
-                       rs->sr_err = bdb_csn_commit( op, rs, ltid, NULL, &suffix_ei,
-                                                                       &ctxcsn_e, &ctxcsn_added, ctxcsn_locker );
+                       rs->sr_err = bdb_csn_commit( op, rs, ltid, NULL,
+                                               &suffix_ei, &ctxcsn_e,
+                                               &ctxcsn_added, ctxcsn_locker );
                        switch( rs->sr_err ) {
                        case BDB_CSN_ABORT:
                                rs->sr_err = LDAP_OTHER;
@@ -401,8 +402,10 @@ txn_retry:
                                goto done;
                        }
 
-                       rs->sr_err = bdb_dn2entry( op, NULL, &op->o_bd->be_context_csn, &ctxcsn_ei,
-                                    0, ctxcsn_locker, ctxcsn_lock );
+                       rs->sr_err = bdb_dn2entry( op, NULL,
+                                               &op->o_bd->be_context_csn,
+                                               &ctxcsn_ei, 0, ctxcsn_locker,
+                                               ctxcsn_lock );
 
                        if ( ctxcsn_ei ) {
                                ctxcsn_e = ctxcsn_ei->bei_e;
index 19771dd382a024b9a772fb316e0357935bf3f22b..4d2f22277a39cff05e7ceda6c47be48b97453822 100644 (file)
@@ -25,7 +25,7 @@
 #if DB_VERSION_FULL < 0x04030000
 void bdb_errcall( const char *pfx, char * msg )
 #else
-void bdb_errcall( const DB_ENV *env, const char *pfx, char * msg )
+void bdb_errcall( const DB_ENV *env, const char *pfx, const char * msg )
 #endif
 {
 #ifdef HAVE_EBCDIC
index 9250f94f082d3d1d1a2cc7044fdf633048fccdf9..618760a2cc3eb9ff1d0e74b68bce151bdc7b29d9 100644 (file)
@@ -588,7 +588,7 @@ bdb_initialize(
        bi->bi_controls = controls;
 
        {       /* version check */
-               int major, minor, patch;
+               int major, minor, patch, ver;
                char *version = db_version( &major, &minor, &patch );
 #ifdef HAVE_EBCDIC
                char v2[1024];
@@ -602,9 +602,8 @@ bdb_initialize(
                version = v2;
 #endif
 
-               if( major != DB_VERSION_MAJOR ||
-                       minor != DB_VERSION_MINOR ||
-                       patch < DB_VERSION_PATCH )
+               ver = (major << 24) | (minor << 16) | patch;
+               if( ver < DB_VERSION_FULL )
                {
                        Debug( LDAP_DEBUG_ANY,
                                LDAP_XSTRING(bdb_back_initialize) ": "
index f3418805dadda4065b66c6ff536bdc1c97d26bb2..5f33ddd5a11a54ec1f94ca89bf53f8cebc517922 100644 (file)
@@ -144,7 +144,7 @@ int bdb_fix_dn( Entry *e, int checkit );
 #if DB_VERSION_FULL < 0x04030000
 void bdb_errcall( const char *pfx, char * msg );
 #else
-void bdb_errcall( const DB_ENV *env, const char *pfx, char * msg );
+void bdb_errcall( const DB_ENV *env, const char *pfx, const char * msg );
 #endif
 
 #ifdef HAVE_EBCDIC