More for #5221, don't muck with kids counters on simple renames

This commit is contained in:
Howard Chu 2007-11-21 15:11:26 +00:00
parent a0fbe9f043
commit b8fcecd69b

View File

@ -1158,12 +1158,16 @@ bdb_cache_modrdn(
rdn.bv_len = ptr - rdn.bv_val; rdn.bv_len = ptr - rdn.bv_val;
} }
ber_dupbv( &ei->bei_rdn, &rdn ); ber_dupbv( &ei->bei_rdn, &rdn );
/* If new parent, decrement kid counts */
if ( ein ) {
pei->bei_ckids--; pei->bei_ckids--;
if ( pei->bei_dkids ) { if ( pei->bei_dkids ) {
pei->bei_dkids--; pei->bei_dkids--;
if ( pei->bei_kids < 2 ) if ( pei->bei_kids < 2 )
pei->bei_state |= CACHE_ENTRY_NO_KIDS | CACHE_ENTRY_NO_GRANDKIDS; pei->bei_state |= CACHE_ENTRY_NO_KIDS | CACHE_ENTRY_NO_GRANDKIDS;
} }
}
#endif #endif
if (!ein) { if (!ein) {
@ -1172,29 +1176,32 @@ bdb_cache_modrdn(
ei->bei_parent = ein; ei->bei_parent = ein;
bdb_cache_entryinfo_unlock( pei ); bdb_cache_entryinfo_unlock( pei );
bdb_cache_entryinfo_lock( ein ); bdb_cache_entryinfo_lock( ein );
}
/* parent now has kids */ /* new parent now has kids */
if ( ein->bei_state & CACHE_ENTRY_NO_KIDS ) if ( ein->bei_state & CACHE_ENTRY_NO_KIDS )
ein->bei_state ^= CACHE_ENTRY_NO_KIDS; ein->bei_state ^= CACHE_ENTRY_NO_KIDS;
/* grandparent has grandkids */ /* grandparent has grandkids */
if ( ein->bei_parent ) if ( ein->bei_parent )
ein->bei_parent->bei_state &= ~CACHE_ENTRY_NO_GRANDKIDS; ein->bei_parent->bei_state &= ~CACHE_ENTRY_NO_GRANDKIDS;
#ifdef BDB_HIER #ifdef BDB_HIER
/* parent might now have grandkids */ /* parent might now have grandkids */
if ( ein->bei_state & CACHE_ENTRY_NO_GRANDKIDS && if ( ein->bei_state & CACHE_ENTRY_NO_GRANDKIDS &&
!(ei->bei_state & CACHE_ENTRY_NO_KIDS)) !(ei->bei_state & CACHE_ENTRY_NO_KIDS))
ein->bei_state ^= CACHE_ENTRY_NO_GRANDKIDS; ein->bei_state ^= CACHE_ENTRY_NO_GRANDKIDS;
ein->bei_ckids++;
if ( ein->bei_dkids ) ein->bei_dkids++;
#endif
}
#ifdef BDB_HIER
/* Record the generation number of this change */ /* Record the generation number of this change */
ldap_pvt_thread_mutex_lock( &bdb->bi_modrdns_mutex ); ldap_pvt_thread_mutex_lock( &bdb->bi_modrdns_mutex );
bdb->bi_modrdns++; bdb->bi_modrdns++;
ei->bei_modrdns = bdb->bi_modrdns; ei->bei_modrdns = bdb->bi_modrdns;
ldap_pvt_thread_mutex_unlock( &bdb->bi_modrdns_mutex ); ldap_pvt_thread_mutex_unlock( &bdb->bi_modrdns_mutex );
ein->bei_ckids++;
if ( ein->bei_dkids ) ein->bei_dkids++;
#endif #endif
avl_insert( &ein->bei_kids, ei, bdb_rdn_cmp, avl_dup_error ); avl_insert( &ein->bei_kids, ei, bdb_rdn_cmp, avl_dup_error );
bdb_cache_entryinfo_unlock( ein ); bdb_cache_entryinfo_unlock( ein );
return rc; return rc;