]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Import ITS#3857 fix from HEAD (hdb modrdn)
authorHoward Chu <hyc@openldap.org>
Tue, 12 Jul 2005 13:38:12 +0000 (13:38 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 12 Jul 2005 13:38:12 +0000 (13:38 +0000)
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/cache.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/modrdn.c
servers/slapd/back-bdb/proto-bdb.h

index acf207f49383bae8d6574de5e936d7e194864414..2acb9857a027d834cc620363dbb35d917851e4ec 100644 (file)
@@ -184,6 +184,10 @@ struct bdb_info {
        bdb_idl_cache_entry_t   *bi_idl_lru_tail;
        ldap_pvt_thread_rdwr_t bi_idl_tree_rwlock;
        ldap_pvt_thread_mutex_t bi_idl_tree_lrulock;
+#ifdef BDB_HIER
+       int             bi_modrdns;             /* number of modrdns completed */
+       ldap_pvt_thread_mutex_t bi_modrdns_mutex;
+#endif
 };
 
 #define bi_id2entry    bi_databases[BDB_ID2ENTRY]
index 59021c7d6e2bc3038c195fa7e4c09f4ac3d1c392..5aa1230c6bbaab44035af2d7d87e47efb37fd8ab 100644 (file)
@@ -928,11 +928,11 @@ bdb_cache_modify(
  */
 int
 bdb_cache_modrdn(
+       struct bdb_info *bdb,
        Entry *e,
        struct berval *nrdn,
        Entry *new,
        EntryInfo *ein,
-       DB_ENV *env,
        u_int32_t locker,
        DB_LOCK *lock )
 {
@@ -941,7 +941,7 @@ bdb_cache_modrdn(
        int rc;
 
        /* Get write lock on data */
-       rc =  bdb_cache_entry_db_relock( env, locker, ei, 1, 0, lock );
+       rc =  bdb_cache_entry_db_relock( bdb->bi_dbenv, locker, ei, 1, 0, lock );
        if ( rc ) return rc;
 
        /* If we've done repeated mods on a cached entry, then e_attrs
@@ -986,12 +986,11 @@ bdb_cache_modrdn(
        }
 #ifdef BDB_HIER
        {
-               int max = ei->bei_modrdns;
                /* Record the generation number of this change */
-               for ( pei = ein; pei->bei_parent; pei = pei->bei_parent ) {
-                       if ( pei->bei_modrdns > max ) max = pei->bei_modrdns;
-               }
-               ei->bei_modrdns = max + 1;
+               ldap_pvt_thread_mutex_lock( &bdb->bi_modrdns_mutex );
+               bdb->bi_modrdns++;
+               ei->bei_modrdns = bdb->bi_modrdns;
+               ldap_pvt_thread_mutex_unlock( &bdb->bi_modrdns_mutex );
        }
 #endif
        avl_insert( &ein->bei_kids, ei, bdb_rdn_cmp, avl_dup_error );
index a6ca86f6315c5bb40d14411a3e1d5349e15cc29a..3c1dd9f62850bba39a2d648450eb0af54fdeb21d 100644 (file)
@@ -90,6 +90,9 @@ bdb_db_init( BackendDB *be )
        ldap_pvt_thread_mutex_init( &bdb->bi_database_mutex );
        ldap_pvt_thread_mutex_init( &bdb->bi_lastid_mutex );
        ldap_pvt_thread_rdwr_init ( &bdb->bi_pslist_rwlock );
+#ifdef BDB_HIER
+       ldap_pvt_thread_mutex_init( &bdb->bi_modrdns_mutex );
+#endif
        ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_mutex );
        ldap_pvt_thread_mutex_init( &bdb->bi_cache.c_dntree.bei_kids_mutex );
        ldap_pvt_thread_rdwr_init ( &bdb->bi_cache.c_rwlock );
@@ -459,6 +462,9 @@ bdb_db_destroy( BackendDB *be )
        ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.lru_mutex );
        ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.c_dntree.bei_kids_mutex );
        ldap_pvt_thread_rdwr_destroy ( &bdb->bi_pslist_rwlock );
+#ifdef BDB_HIER
+       ldap_pvt_thread_mutex_destroy( &bdb->bi_modrdns_mutex );
+#endif
        ldap_pvt_thread_mutex_destroy( &bdb->bi_lastid_mutex );
        ldap_pvt_thread_mutex_destroy( &bdb->bi_database_mutex );
        if ( bdb->bi_idl_cache_max_size ) {
index 57fd983f2fe7fa991fe5f9fb633eb108e5dcd60b..9db88593b11b9c88969839808063824ba2d53dac 100644 (file)
@@ -842,8 +842,8 @@ retry:      /* transaction retry */
                }
 
        } else {
-               rc = bdb_cache_modrdn( e, &op->orr_nnewrdn, &dummy, neip,
-                       bdb->bi_dbenv, locker, &lock );
+               rc = bdb_cache_modrdn( bdb, e, &op->orr_nnewrdn, &dummy, neip,
+                       locker, &lock );
                switch( rc ) {
                case DB_LOCK_DEADLOCK:
                case DB_LOCK_NOTGRANTED:
index ae74e93f38a658281765248cf79d86b1974e36ca..58777432036f7f369b117b18771ac047a58700a7 100644 (file)
@@ -451,11 +451,11 @@ int bdb_cache_add(
        u_int32_t locker
 );
 int bdb_cache_modrdn(
+       struct bdb_info *bdb,
        Entry   *e,
        struct berval *nrdn,
        Entry   *new,
        EntryInfo *ein,
-       DB_ENV *env,
        u_int32_t locker,
        DB_LOCK *lock
 );