]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/cache.c
Memory context tweaks for other ops
[openldap] / servers / slapd / back-bdb / cache.c
index dcfa51c68e5dd63db08d195fe32799dd55594913..badc54723a274b5650d8169765c706a2e66d9ac6 100644 (file)
@@ -1,7 +1,7 @@
 /* cache.c - routines to maintain an in-core cache of entries */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -19,7 +19,9 @@
 
 /* BDB backend specific entry info -- visible only to the cache */
 typedef struct bdb_entry_info {
+#if 0
        ldap_pvt_thread_rdwr_t  bei_rdwr;       /* reader/writer lock */
+#endif
 
        /*
         * remaining fields require backend cache lock to access
@@ -45,6 +47,7 @@ static int    bdb_cache_delete_entry_internal(Cache *cache, Entry *e);
 static void    bdb_lru_print(Cache *cache);
 #endif
 
+#if 0  /* unused */
 static int
 bdb_cache_entry_rdwr_lock(Entry *e, int rw)
 {
@@ -98,7 +101,9 @@ bdb_cache_entry_rdwr_unlock(Entry *e, int rw)
        else
                return ldap_pvt_thread_rdwr_runlock(&BEI(e)->bei_rdwr);
 }
+#endif /* unused */
 
+#if 0
 static int
 bdb_cache_entry_rdwr_init(Entry *e)
 {
@@ -110,6 +115,7 @@ bdb_cache_entry_rdwr_destroy(Entry *e)
 {
        return ldap_pvt_thread_rdwr_destroy( &BEI(e)->bei_rdwr );
 }
+#endif
 
 static int
 bdb_cache_entry_private_init( Entry *e )
@@ -123,11 +129,13 @@ bdb_cache_entry_private_init( Entry *e )
 
        e->e_private = ch_calloc(1, sizeof(struct bdb_entry_info));
 
+#if 0
        if( bdb_cache_entry_rdwr_init( e ) != 0 ) {
                free( BEI(e) );
                e->e_private = NULL;
                return 1;
        } 
+#endif
 
        return 0;
 }
@@ -136,6 +144,9 @@ int
 bdb_cache_entry_db_lock
 ( DB_ENV *env, u_int32_t locker, Entry *e, int rw, u_int32_t flags, DB_LOCK *lock )
 {
+#ifdef NO_THREADS
+       return 0;
+#else
        int       rc;
        DBT       lockobj;
        int       db_rw;
@@ -145,21 +156,42 @@ bdb_cache_entry_db_lock
        else
                db_rw = DB_LOCK_READ;
 
+#if 0
        lockobj.data = e->e_nname.bv_val;
        lockobj.size = e->e_nname.bv_len;
+#else
+       lockobj.data = &e->e_private;
+       lockobj.size = sizeof(e->e_private);
+#endif
        rc = LOCK_GET(env, locker, flags | DB_LOCK_NOWAIT,
                                        &lockobj, db_rw, lock);
+       if (rc) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( CACHE, DETAIL1, 
+                       "bdb_cache_entry_db_lock: entry %s, rw %d, rc %d\n",
+                       e->e_nname.bv_val, rw, rc );
+#else
+               Debug( LDAP_DEBUG_TRACE,
+                       "bdb_cache_entry_db_lock: entry %s, rw %d, rc %d\n",
+                       e->e_nname.bv_val, rw, rc );
+#endif
+       }
        return rc;
+#endif /* NO_THREADS */
 }
 
 int
 bdb_cache_entry_db_unlock
 ( DB_ENV *env, DB_LOCK *lock )
 {
+#ifdef NO_THREADS
+       return 0;
+#else
        int rc;
 
        rc = LOCK_PUT ( env, lock );
        return rc;
+#endif
 }
 
 /*
@@ -184,7 +216,9 @@ bdb_cache_entry_private_destroy( Entry *e )
 {
        assert( e->e_private );
 
+#if 0
        bdb_cache_entry_rdwr_destroy( e );
+#endif
 
        free( e->e_private );
        e->e_private = NULL;
@@ -470,7 +504,7 @@ bdb_cache_add_entry_rw(
        }
 
        if ( avl_insert( &cache->c_dntree, (caddr_t) e,
-               (AVL_CMP) entry_dn_cmp, avl_dup_error ) != 0 )
+                        entry_dn_cmp, avl_dup_error ) != 0 )
        {
                /* free cache write lock */
                ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
@@ -492,7 +526,7 @@ bdb_cache_add_entry_rw(
 
        /* id tree */
        if ( avl_insert( &cache->c_idtree, (caddr_t) e,
-               (AVL_CMP) entry_id_cmp, avl_dup_error ) != 0 )
+                        entry_id_cmp, avl_dup_error ) != 0 )
        {
 #ifdef NEW_LOGGING
                LDAP_LOG( CACHE, DETAIL1, 
@@ -506,7 +540,7 @@ bdb_cache_add_entry_rw(
 
                /* delete from dn tree inserted above */
                if ( avl_delete( &cache->c_dntree, (caddr_t) e,
-                       (AVL_CMP) entry_dn_cmp ) == NULL )
+                                entry_dn_cmp ) == NULL )
                {
 #ifdef NEW_LOGGING
                        LDAP_LOG( CACHE, INFO, 
@@ -533,7 +567,7 @@ bdb_cache_add_entry_rw(
        case DB_LOCK_NOTGRANTED :
                /* undo avl changes immediately */
                if ( avl_delete( &cache->c_idtree, (caddr_t) e,
-                       (AVL_CMP) entry_id_cmp ) == NULL ) {
+                                entry_id_cmp ) == NULL ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( CACHE, INFO, 
                                "bdb_cache_add_entry: can't delete (%s) from cache.\n", 
@@ -543,7 +577,7 @@ bdb_cache_add_entry_rw(
 #endif
                }
                if ( avl_delete( &cache->c_dntree, (caddr_t) e,
-                               (AVL_CMP) entry_dn_cmp ) == NULL ) {
+                                entry_dn_cmp ) == NULL ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( CACHE, INFO, 
                                "bdb_cache_add_entry: can't delete (%s) from cache.\n", 
@@ -632,7 +666,7 @@ bdb_cache_update_entry(
        assert( e->e_private );
 
        if ( avl_insert( &cache->c_dntree, (caddr_t) e,
-               (AVL_CMP) entry_dn_cmp, avl_dup_error ) != 0 )
+                        entry_dn_cmp, avl_dup_error ) != 0 )
        {
 #ifdef NEW_LOGGING
                LDAP_LOG( CACHE, DETAIL1, 
@@ -651,7 +685,7 @@ bdb_cache_update_entry(
 
        /* id tree */
        if ( avl_insert( &cache->c_idtree, (caddr_t) e,
-               (AVL_CMP) entry_id_cmp, avl_dup_error ) != 0 )
+                        entry_id_cmp, avl_dup_error ) != 0 )
        {
 #ifdef NEW_LOGGING
                LDAP_LOG( CACHE, DETAIL1, 
@@ -665,7 +699,7 @@ bdb_cache_update_entry(
 
                /* delete from dn tree inserted above */
                if ( avl_delete( &cache->c_dntree, (caddr_t) e,
-                       (AVL_CMP) entry_dn_cmp ) == NULL )
+                                entry_dn_cmp ) == NULL )
                {
 #ifdef NEW_LOGGING
                        LDAP_LOG( CACHE, INFO, 
@@ -753,7 +787,7 @@ try_again:
        ldap_pvt_thread_rdwr_rlock( &cache->c_rwlock );
 
        if ( (ep = (Entry *) avl_find( cache->c_dntree, (caddr_t) &e,
-               (AVL_CMP) entry_dn_cmp )) != NULL )
+                                      entry_dn_cmp )) != NULL )
        {
                int state;
                count++;
@@ -773,7 +807,7 @@ try_again:
                /*
                 * entry is deleted or not fully created yet
                 */
-               if ( state != CACHE_ENTRY_READY ) {
+               if ( state != CACHE_ENTRY_READY && state != CACHE_ENTRY_COMMITTED ) {
                        assert(state != CACHE_ENTRY_UNDEFINED);
 
                        /* free cache read lock */
@@ -853,7 +887,7 @@ try_again:
        ldap_pvt_thread_rdwr_rlock( &cache->c_rwlock );
 
        if ( (ep = (Entry *) avl_find( cache->c_idtree, (caddr_t) &e,
-               (AVL_CMP) entry_id_cmp )) != NULL )
+                                      entry_id_cmp )) != NULL )
        {
                int state;
                ID      ep_id;
@@ -868,7 +902,7 @@ try_again:
                /*
                 * entry is deleted or not fully created yet
                 */
-               if ( state != CACHE_ENTRY_READY ) {
+               if ( state != CACHE_ENTRY_READY && state != CACHE_ENTRY_COMMITTED ) {
 
                        assert(state != CACHE_ENTRY_UNDEFINED);
 
@@ -1008,15 +1042,13 @@ bdb_cache_delete_entry_internal(
        int rc = 0;     /* return code */
 
        /* dn tree */
-       if ( avl_delete( &cache->c_dntree, (caddr_t) e, (AVL_CMP) entry_dn_cmp )
-               == NULL )
+       if ( avl_delete( &cache->c_dntree, (caddr_t) e, entry_dn_cmp ) == NULL )
        {
                rc = -1;
        }
 
        /* id tree */
-       if ( avl_delete( &cache->c_idtree, (caddr_t) e, (AVL_CMP) entry_id_cmp )
-               == NULL )
+       if ( avl_delete( &cache->c_idtree, (caddr_t) e, entry_id_cmp ) == NULL )
        {
                rc = -1;
        }
@@ -1116,16 +1148,24 @@ bdb_locker_id( Operation *op, DB_ENV *env, int *locker )
 {
        int i, rc, lockid;
        void *data;
+       void *ctx;
 
-       if ( !env || !op || !locker ) return -1;
+       if ( !env || !locker ) return -1;
+
+       /* If no op was provided, try to find the ctx anyway... */
+       if ( op ) {
+               ctx = op->o_threadctx;
+       } else {
+               ctx = ldap_pvt_thread_pool_context();
+       }
 
        /* Shouldn't happen unless we're single-threaded */
-       if ( !op->o_threadctx ) {
+       if ( !ctx ) {
                *locker = 0;
                return 0;
        }
 
-       if ( ldap_pvt_thread_pool_getkey( op->o_threadctx, env, &data, NULL ) ) {
+       if ( ldap_pvt_thread_pool_getkey( ctx, env, &data, NULL ) ) {
                for ( i=0, rc=1; rc != 0 && i<4; i++ ) {
                        rc = XLOCK_ID( env, &lockid );
                        if (rc) ldap_pvt_thread_yield();
@@ -1134,7 +1174,7 @@ bdb_locker_id( Operation *op, DB_ENV *env, int *locker )
                        return rc;
                }
                data = (void *)lockid;
-               if ( ( rc = ldap_pvt_thread_pool_setkey( op->o_threadctx, env,
+               if ( ( rc = ldap_pvt_thread_pool_setkey( ctx, env,
                        data, bdb_locker_id_free ) ) ) {
                        XLOCK_ID_FREE( env, lockid );
 #ifdef NEW_LOGGING