From: Howard Chu Date: Tue, 12 Jul 2005 13:38:12 +0000 (+0000) Subject: Import ITS#3857 fix from HEAD (hdb modrdn) X-Git-Tag: OPENLDAP_REL_ENG_2_2_28~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f650b6d5ace864aa0026276798e6115f86e5288;p=thirdparty%2Fopenldap.git Import ITS#3857 fix from HEAD (hdb modrdn) --- diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index acf207f493..2acb9857a0 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -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] diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c index 59021c7d6e..5aa1230c6b 100644 --- a/servers/slapd/back-bdb/cache.c +++ b/servers/slapd/back-bdb/cache.c @@ -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 ); diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index a6ca86f631..3c1dd9f628 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -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 ) { diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index 57fd983f2f..9db88593b1 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -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: diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index ae74e93f38..5877743203 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -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 );