mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
More for #5221, don't muck with kids counters on simple renames
This commit is contained in:
parent
a0fbe9f043
commit
b8fcecd69b
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user