mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-23 14:09:39 +08:00
Propagate deadlock results for internal searches on write ops
This commit is contained in:
parent
fda5733477
commit
9f808bd4b6
@ -204,6 +204,9 @@ static int search_aliases(
|
|||||||
BDB_IDL_CPY( curscop, aliases );
|
BDB_IDL_CPY( curscop, aliases );
|
||||||
rs->sr_err = bdb_dn2idl( op, txn, &e->e_nname, BEI(e), subscop,
|
rs->sr_err = bdb_dn2idl( op, txn, &e->e_nname, BEI(e), subscop,
|
||||||
subscop2+BDB_IDL_DB_SIZE );
|
subscop2+BDB_IDL_DB_SIZE );
|
||||||
|
if ( rs->sr_err == DB_LOCK_DEADLOCK )
|
||||||
|
return rs->sr_err;
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
first = 0;
|
first = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -223,8 +226,10 @@ retry1:
|
|||||||
rs->sr_err = bdb_cache_find_id(op, txn,
|
rs->sr_err = bdb_cache_find_id(op, txn,
|
||||||
ida, &ei, 0, &lockr );
|
ida, &ei, 0, &lockr );
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
if (rs->sr_err != LDAP_SUCCESS) {
|
||||||
if ( rs->sr_err == DB_LOCK_DEADLOCK ||
|
if ( rs->sr_err == DB_LOCK_DEADLOCK )
|
||||||
rs->sr_err == DB_LOCK_NOTGRANTED ) goto retry1;
|
return rs->sr_err;
|
||||||
|
if ( rs->sr_err == DB_LOCK_NOTGRANTED )
|
||||||
|
goto retry1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
a = ei->bei_e;
|
a = ei->bei_e;
|
||||||
@ -253,6 +258,8 @@ retry1:
|
|||||||
}
|
}
|
||||||
bdb_cache_return_entry_r( bdb, a, &lockr);
|
bdb_cache_return_entry_r( bdb, a, &lockr);
|
||||||
|
|
||||||
|
} else if ( rs->sr_err == DB_LOCK_DEADLOCK ) {
|
||||||
|
return rs->sr_err;
|
||||||
} else if (matched) {
|
} else if (matched) {
|
||||||
/* Alias could not be dereferenced, or it deref'd to
|
/* Alias could not be dereferenced, or it deref'd to
|
||||||
* an ID we've already seen. Ignore it.
|
* an ID we've already seen. Ignore it.
|
||||||
@ -289,8 +296,9 @@ sameido:
|
|||||||
rs->sr_err = bdb_cache_find_id(op, txn, ido, &ei,
|
rs->sr_err = bdb_cache_find_id(op, txn, ido, &ei,
|
||||||
0, &locka );
|
0, &locka );
|
||||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||||
if ( rs->sr_err == DB_LOCK_DEADLOCK ||
|
if ( rs->sr_err == DB_LOCK_DEADLOCK )
|
||||||
rs->sr_err == DB_LOCK_NOTGRANTED )
|
return rs->sr_err;
|
||||||
|
if ( rs->sr_err == DB_LOCK_NOTGRANTED )
|
||||||
goto sameido;
|
goto sameido;
|
||||||
goto nextido;
|
goto nextido;
|
||||||
}
|
}
|
||||||
@ -370,10 +378,14 @@ dn2entry_retry:
|
|||||||
case 0:
|
case 0:
|
||||||
e = ei->bei_e;
|
e = ei->bei_e;
|
||||||
break;
|
break;
|
||||||
|
case DB_LOCK_DEADLOCK:
|
||||||
|
if ( !opinfo )
|
||||||
|
goto dn2entry_retry;
|
||||||
|
opinfo->boi_err = rs->sr_err;
|
||||||
|
/* FALLTHRU */
|
||||||
case LDAP_BUSY:
|
case LDAP_BUSY:
|
||||||
send_ldap_error( op, rs, LDAP_BUSY, "ldap server busy" );
|
send_ldap_error( op, rs, LDAP_BUSY, "ldap server busy" );
|
||||||
return LDAP_BUSY;
|
return LDAP_BUSY;
|
||||||
case DB_LOCK_DEADLOCK:
|
|
||||||
case DB_LOCK_NOTGRANTED:
|
case DB_LOCK_NOTGRANTED:
|
||||||
goto dn2entry_retry;
|
goto dn2entry_retry;
|
||||||
default:
|
default:
|
||||||
@ -566,6 +578,12 @@ dn2entry_retry:
|
|||||||
BDB_IDL_ZERO( scopes );
|
BDB_IDL_ZERO( scopes );
|
||||||
rs->sr_err = search_candidates( op, rs, &base,
|
rs->sr_err = search_candidates( op, rs, &base,
|
||||||
ltid, candidates, scopes );
|
ltid, candidates, scopes );
|
||||||
|
if ( rs->sr_err == DB_LOCK_DEADLOCK ) {
|
||||||
|
if ( opinfo )
|
||||||
|
opinfo->boi_err = rs->sr_err;
|
||||||
|
send_ldap_error( op, rs, LDAP_BUSY, "ldap server busy" );
|
||||||
|
return LDAP_BUSY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* start cursor at beginning of candidates.
|
/* start cursor at beginning of candidates.
|
||||||
@ -682,8 +700,13 @@ fetch_entry_retry:
|
|||||||
send_ldap_result( op, rs );
|
send_ldap_result( op, rs );
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
} else if ( rs->sr_err == DB_LOCK_DEADLOCK
|
} else if ( rs->sr_err == DB_LOCK_DEADLOCK ) {
|
||||||
|| rs->sr_err == DB_LOCK_NOTGRANTED )
|
if ( opinfo )
|
||||||
|
opinfo->boi_err = rs->sr_err;
|
||||||
|
send_ldap_error( op, rs, LDAP_BUSY, "ldap server busy" );
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
} else if ( rs->sr_err == DB_LOCK_NOTGRANTED )
|
||||||
{
|
{
|
||||||
goto fetch_entry_retry;
|
goto fetch_entry_retry;
|
||||||
} else if ( rs->sr_err == LDAP_OTHER ) {
|
} else if ( rs->sr_err == LDAP_OTHER ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user