]> git.sur5r.net Git - openldap/commitdiff
Use refcnt instead of keeping entry locked in Add response
authorHoward Chu <hyc@openldap.org>
Wed, 23 Feb 2011 03:53:21 +0000 (03:53 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 23 Feb 2011 03:53:21 +0000 (03:53 +0000)
servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/cache.c
servers/slapd/back-bdb/proto-bdb.h

index d91ee1ada820e8d5ecfdb6d4b87be69233272a84..9811177c1219dba02d42603acebdb025e6bc621d 100644 (file)
@@ -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;
 
index 468b565142471f79e9f62583ec23ffac6131b955..a7d1757edbf3d7d4e11f90124c4e535ec24480b3 100644 (file)
@@ -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,
index de6b4d4957d66cf176457947a42f33d511c22f97..f0070775d25cd27d3d720e15f2eb446e2a32832a 100644 (file)
@@ -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(