From d162e8c7425c7141b2974091dbee55aca86db3ea Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 17 Dec 2004 10:29:05 +0000 Subject: [PATCH] Import ITS#3365 fix from HEAD, BDB lockinfo --- servers/slapd/back-bdb/add.c | 2 +- servers/slapd/back-bdb/back-bdb.h | 8 +++++- servers/slapd/back-bdb/delete.c | 2 +- servers/slapd/back-bdb/id2entry.c | 42 +++++++++++++++++++++++-------- servers/slapd/back-bdb/modify.c | 2 +- servers/slapd/back-bdb/modrdn.c | 2 +- servers/slapd/backend.c | 7 ------ 7 files changed, 43 insertions(+), 22 deletions(-) diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index 59080c4e24..20fe4bc110 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -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 diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index 0528d096ec..3bde9d8beb 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -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) \ diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 89b077dcb9..f07a9fe7dc 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -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; diff --git a/servers/slapd/back-bdb/id2entry.c b/servers/slapd/back-bdb/id2entry.c index 0efa3d82f6..203d39b45f 100644 --- a/servers/slapd/back-bdb/id2entry.c +++ b/servers/slapd/back-bdb/id2entry.c @@ -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); diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index 3c402a8749..f44c362b11 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -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; diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index a424c24aa3..f9eef05339 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -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; diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index bbf1405a59..026c620f61 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -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; -- 2.39.5