From 4f2949b1cec228e1bb5e435faefcde5e6484ea76 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 23 Feb 2011 03:53:21 +0000 Subject: [PATCH] Use refcnt instead of keeping entry locked in Add response --- servers/slapd/back-bdb/add.c | 10 +++------- servers/slapd/back-bdb/cache.c | 12 ++++++++++++ servers/slapd/back-bdb/proto-bdb.h | 2 ++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index d91ee1ada8..9811177c12 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -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; diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c index 468b565142..a7d1757edb 100644 --- a/servers/slapd/back-bdb/cache.c +++ b/servers/slapd/back-bdb/cache.c @@ -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, diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index de6b4d4957..f0070775d2 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -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(