mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Use refcnt instead of keeping entry locked in Add response
This commit is contained in:
parent
e92278b457
commit
4f2949b1ce
@ -32,7 +32,7 @@ bdb_add(Operation *op, SlapReply *rs )
|
||||
size_t textlen = sizeof textbuf;
|
||||
AttributeDescription *children = slap_schema.si_ad_children;
|
||||
AttributeDescription *entry = slap_schema.si_ad_entry;
|
||||
DB_TXN *ltid = NULL, *lt2, *rtxn;
|
||||
DB_TXN *ltid = NULL, *lt2;
|
||||
ID eid = NOID;
|
||||
struct bdb_op_info opinfo = {{{ 0 }}};
|
||||
int subentry;
|
||||
@ -121,9 +121,6 @@ txnReturn:
|
||||
|
||||
subentry = is_entry_subentry( op->ora_e );
|
||||
|
||||
/* Get our reader TXN */
|
||||
rs->sr_err = bdb_reader_get( op, bdb->bi_dbenv, &rtxn );
|
||||
|
||||
if( 0 ) {
|
||||
retry: /* transaction retry */
|
||||
if( p ) {
|
||||
@ -480,8 +477,7 @@ retry: /* transaction retry */
|
||||
nrdn = op->ora_e->e_nname;
|
||||
}
|
||||
|
||||
/* Use the reader txn here, outside the add txn */
|
||||
bdb_cache_add( bdb, ei, op->ora_e, &nrdn, rtxn, &lock );
|
||||
bdb_cache_add( bdb, ei, op->ora_e, &nrdn, ltid, &lock );
|
||||
|
||||
if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
|
||||
rs->sr_text = "txn_commit failed";
|
||||
@ -527,7 +523,7 @@ return_results:
|
||||
* Possibly a callback may have mucked with it, although
|
||||
* in general callbacks should treat the entry as read-only.
|
||||
*/
|
||||
bdb_cache_return_entry_r( bdb, oe, &lock );
|
||||
bdb_cache_deref( oe->e_private );
|
||||
if ( op->ora_e == oe )
|
||||
op->ora_e = NULL;
|
||||
|
||||
|
@ -1146,6 +1146,7 @@ bdb_cache_add(
|
||||
ei.bei_nrdn = *nrdn;
|
||||
ei.bei_lockpad = 0;
|
||||
|
||||
#if 0
|
||||
/* Lock this entry so that bdb_add can run to completion.
|
||||
* It can only fail if BDB has run out of lock resources.
|
||||
*/
|
||||
@ -1154,6 +1155,7 @@ bdb_cache_add(
|
||||
bdb_cache_entryinfo_unlock( eip );
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BDB_HIER
|
||||
if ( nrdn->bv_len != e->e_nname.bv_len ) {
|
||||
@ -1197,6 +1199,7 @@ bdb_cache_add(
|
||||
}
|
||||
ldap_pvt_thread_mutex_unlock( &bdb->bi_cache.c_count_mutex );
|
||||
|
||||
new->bei_finders = 1;
|
||||
bdb_cache_lru_link( bdb, new );
|
||||
|
||||
if ( purge )
|
||||
@ -1205,6 +1208,15 @@ bdb_cache_add(
|
||||
return rc;
|
||||
}
|
||||
|
||||
int bdb_cache_deref(
|
||||
EntryInfo *ei
|
||||
)
|
||||
{
|
||||
bdb_cache_entryinfo_lock( ei );
|
||||
ei->bei_finders--;
|
||||
bdb_cache_entryinfo_unlock( ei );
|
||||
}
|
||||
|
||||
int
|
||||
bdb_cache_modify(
|
||||
struct bdb_info *bdb,
|
||||
|
@ -507,6 +507,7 @@ void bdb_unlocked_cache_return_entry_rw( struct bdb_info *bdb, Entry *e, int rw
|
||||
#define bdb_cache_modrdn BDB_SYMBOL(cache_modrdn)
|
||||
#define bdb_cache_release_all BDB_SYMBOL(cache_release_all)
|
||||
#define bdb_cache_delete_entry BDB_SYMBOL(cache_delete_entry)
|
||||
#define bdb_cache_deref BDB_SYMBOL(cache_deref)
|
||||
|
||||
int bdb_cache_children(
|
||||
Operation *op,
|
||||
@ -574,6 +575,7 @@ void bdb_cache_delete_cleanup(
|
||||
EntryInfo *ei
|
||||
);
|
||||
void bdb_cache_release_all( Cache *cache );
|
||||
void bdb_cache_deref( EntryInfo *ei );
|
||||
|
||||
#ifdef BDB_HIER
|
||||
int hdb_cache_load(
|
||||
|
Loading…
Reference in New Issue
Block a user