]> git.sur5r.net Git - openldap/commitdiff
Import ITS#3365 fix from HEAD, BDB lockinfo
authorHoward Chu <hyc@openldap.org>
Fri, 17 Dec 2004 10:29:05 +0000 (10:29 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 17 Dec 2004 10:29:05 +0000 (10:29 +0000)
servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/delete.c
servers/slapd/back-bdb/id2entry.c
servers/slapd/back-bdb/modify.c
servers/slapd/back-bdb/modrdn.c
servers/slapd/backend.c

index 59080c4e24c710440ad58eb2f2423173ca9b95f6..20fe4bc1109e0e7c6fb13e6bba6373833d6746ed 100644 (file)
@@ -34,7 +34,7 @@ bdb_add(Operation *op, SlapReply *rs )
        AttributeDescription *children = slap_schema.si_ad_children;
        AttributeDescription *entry = slap_schema.si_ad_entry;
        DB_TXN          *ltid = NULL, *lt2;
-       struct bdb_op_info opinfo;
+       struct bdb_op_info opinfo = {0};
 #ifdef BDB_SUBENTRIES
        int subentry;
 #endif
index 0528d096ec884e500d80d960350c0d0316b04343..3bde9d8bebb2b29599907e568c2ca54c7323389a 100644 (file)
@@ -189,13 +189,19 @@ struct bdb_info {
 #define bi_id2entry    bi_databases[BDB_ID2ENTRY]
 #define bi_dn2id       bi_databases[BDB_DN2ID]
 
+struct bdb_lock_info {
+       struct bdb_lock_info *bli_next;
+       ID              bli_id;
+       DB_LOCK bli_lock;
+};
+
 struct bdb_op_info {
        BackendDB*      boi_bdb;
        DB_TXN*         boi_txn;
-       DB_LOCK         boi_lock;       /* used when no txn */
        u_int32_t       boi_err;
        u_int32_t       boi_locker;
        int             boi_acl_cache;
+       struct bdb_lock_info *boi_locks;        /* used when no txn */
 };
 
 #define        DB_OPEN(db, file, name, type, flags, mode) \
index 89b077dcb9c1e0e8a0c3ff3bf6e56ef4aafe4dd8..f07a9fe7dc2a2003babff6259106005f99b9f059 100644 (file)
@@ -35,7 +35,7 @@ bdb_delete( Operation *op, SlapReply *rs )
        AttributeDescription *children = slap_schema.si_ad_children;
        AttributeDescription *entry = slap_schema.si_ad_entry;
        DB_TXN          *ltid = NULL, *lt2;
-       struct bdb_op_info opinfo;
+       struct bdb_op_info opinfo = {0};
        ID      eid;
 
        u_int32_t       locker = 0;
index 0efa3d82f6098bf783868bd536f61efdc2b590eb..203d39b45f33771a2c6fb3fad17ae1625449a1ca 100644 (file)
@@ -214,9 +214,21 @@ int bdb_entry_release(
                if ( !boi || boi->boi_txn ) {
                        bdb_unlocked_cache_return_entry_rw( &bdb->bi_cache, e, rw );
                } else {
-                       bdb_cache_return_entry_rw( bdb->bi_dbenv, &bdb->bi_cache, e, rw, &boi->boi_lock );
-                       o->o_tmpfree( boi, o->o_tmpmemctx );
-                       o->o_private = NULL;
+                       struct bdb_lock_info *bli, *prev;
+                       for ( prev=(struct bdb_lock_info *)&boi->boi_locks,
+                               bli = boi->boi_locks; bli; prev=bli, bli=bli->bli_next ) {
+                               if ( bli->bli_id == e->e_id ) {
+                                       bdb_cache_return_entry_rw( bdb->bi_dbenv, &bdb->bi_cache,
+                                               e, rw, &bli->bli_lock );
+                                       prev->bli_next = bli->bli_next;
+                                       o->o_tmpfree( bli, o->o_tmpmemctx );
+                                       break;
+                               }
+                       }
+                       if ( !boi->boi_locks ) {
+                               o->o_tmpfree( boi, o->o_tmpmemctx );
+                               o->o_private = NULL;
+                       }
                }
        } else {
                if (e->e_private != NULL)
@@ -379,15 +391,25 @@ return_results:
                if ( slapMode == SLAP_SERVER_MODE ) {
                        *ent = e;
                        /* big drag. we need a place to store a read lock so we can
-                        * release it later??
+                        * release it later?? If we're in a txn, nothing is needed
+                        * here because the locks will go away with the txn.
                         */
-                       if ( op && !boi ) {
-                               boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
-                               boi->boi_lock = lock;
-                               boi->boi_bdb = op->o_bd;
-                               op->o_private = boi;
+                       if ( op ) {
+                               if ( !boi ) {
+                                       boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
+                                       boi->boi_bdb = op->o_bd;
+                                       op->o_private = boi;
+                               }
+                               if ( !boi->boi_txn ) {
+                                       struct bdb_lock_info *bli;
+                                       bli = op->o_tmpalloc( sizeof(struct bdb_lock_info),
+                                               op->o_tmpmemctx );
+                                       bli->bli_next = boi->boi_locks;
+                                       bli->bli_id = e->e_id;
+                                       bli->bli_lock = lock;
+                                       boi->boi_locks = bli;
+                               }
                        }
-
                } else {
                        *ent = entry_dup( e );
                        bdb_cache_return_entry_rw(bdb->bi_dbenv, &bdb->bi_cache, e, rw, &lock);
index 3c402a87495bc58c6e95bf95c766c86084e927ff..f44c362b11a2b52192ae786f745486b7dafd361b 100644 (file)
@@ -270,7 +270,7 @@ bdb_modify( Operation *op, SlapReply *rs )
        char textbuf[SLAP_TEXT_BUFLEN];
        size_t textlen = sizeof textbuf;
        DB_TXN  *ltid = NULL, *lt2;
-       struct bdb_op_info opinfo;
+       struct bdb_op_info opinfo = {0};
        Entry           dummy = {0};
 
        u_int32_t       locker = 0;
index a424c24aa3b3cfeee4cfb78571f63dea7a5f0323..f9eef05339c0c5e9ec0da14636e0abe9937be7c8 100644 (file)
@@ -40,7 +40,7 @@ bdb_modrdn( Operation *op, SlapReply *rs )
        char textbuf[SLAP_TEXT_BUFLEN];
        size_t textlen = sizeof textbuf;
        DB_TXN          *ltid = NULL, *lt2;
-       struct bdb_op_info opinfo;
+       struct bdb_op_info opinfo = {0};
        Entry dummy = {0};
 
        ID                      id;
index bbf1405a5996a27cb70656f01f83382e86d57e3b..026c620f61b6f115027629660ff713f8c1bc0f83 100644 (file)
@@ -1336,15 +1336,10 @@ backend_group(
                                Filter *filter;
                                Entry *user;
                                Backend *b2 = op->o_bd;
-                               void *o_private = op->o_private;
 
                                if ( target && dn_match( &target->e_nname, op_ndn ) ) {
                                        user = target;
                                } else {
-                                       /* back-bdb stored lockinfo here, we saved it
-                                        * above. Clear it out so that a new lock can be used.
-                                        */
-                                       op->o_private = NULL;
                                        op->o_bd = select_backend( op_ndn, 0, 0 );
                                        rc = be_entry_get_rw(op, op_ndn, NULL, NULL, 0, &user );
                                }
@@ -1409,8 +1404,6 @@ loopit:
                                        }
                                        if ( user != target ) {
                                                be_entry_release_r( op, user );
-                                               /* restore previous lockinfo, if any */
-                                               op->o_private = o_private;
                                        }
                                }
                                op->o_bd = b2;