mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-02-03 20:40:05 -05:00
Must use txns everywhere, otherwise it will deadlock
This commit is contained in:
parent
447f3f746e
commit
e3e7a22b5d
1 changed files with 19 additions and 2 deletions
|
|
@ -34,6 +34,10 @@ bdb_hasSubordinates(
|
|||
Entry *e,
|
||||
int *hasSubordinates )
|
||||
{
|
||||
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
|
||||
struct bdb_op_info *opinfo;
|
||||
OpExtra *oex;
|
||||
DB_TXN *rtxn;
|
||||
int rc;
|
||||
|
||||
assert( e != NULL );
|
||||
|
|
@ -47,12 +51,25 @@ bdb_hasSubordinates(
|
|||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
/* Check for a txn in a parent op, otherwise use reader txn */
|
||||
LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
|
||||
if ( oex->oe_key == bdb )
|
||||
break;
|
||||
}
|
||||
opinfo = (struct bdb_op_info *) oex;
|
||||
if ( opinfo && opinfo->boi_txn ) {
|
||||
rtxn = opinfo->boi_txn;
|
||||
} else {
|
||||
rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn);
|
||||
if ( rc ) return LDAP_OTHER;
|
||||
}
|
||||
|
||||
retry:
|
||||
/* FIXME: we can no longer assume the entry's e_private
|
||||
* field is correctly populated; so we need to reacquire
|
||||
* it with reader lock */
|
||||
rc = bdb_cache_children( op, NULL, e );
|
||||
|
||||
rc = bdb_cache_children( op, rtxn, e );
|
||||
|
||||
switch( rc ) {
|
||||
case DB_LOCK_DEADLOCK:
|
||||
case DB_LOCK_NOTGRANTED:
|
||||
|
|
|
|||
Loading…
Reference in a new issue