From 425350bb618b7168de1d5d808c9ac5a76d84fcf0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 1 May 2005 12:34:12 +0000 Subject: r6560: added a tdb_chainlock_read() call in ldb_search(). This guarantees that ldb_search() sees a single consistent view of the database (by blocking writes during a ldb_search) (This used to be commit 917f2a8a073fd501f0626bea4f9deb91b95fdc90) --- source4/lib/ldb/ldb_tdb/ldb_search.c | 7 +++++++ source4/lib/ldb/ldb_tdb/ldb_tdb.c | 34 ++++++++++++++++++++++++++++++++++ source4/lib/ldb/ldb_tdb/ldb_tdb.h | 2 ++ 3 files changed, 43 insertions(+) (limited to 'source4') diff --git a/source4/lib/ldb/ldb_tdb/ldb_search.c b/source4/lib/ldb/ldb_tdb/ldb_search.c index 4f45fdf376..7883ee6e7b 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_search.c +++ b/source4/lib/ldb/ldb_tdb/ldb_search.c @@ -472,9 +472,14 @@ int ltdb_search(struct ldb_module *module, const char *base, struct ldb_parse_tree *tree; int ret; + if (ltdb_lock_read(module) != 0) { + return -1; + } + ltdb->last_err_string = NULL; if (ltdb_cache_load(module) != 0) { + ltdb_unlock_read(module); return -1; } @@ -484,6 +489,7 @@ int ltdb_search(struct ldb_module *module, const char *base, tree = ldb_parse_tree(ldb, expression); if (!tree) { ltdb->last_err_string = "expression parse failed"; + ltdb_unlock_read(module); return -1; } @@ -501,6 +507,7 @@ int ltdb_search(struct ldb_module *module, const char *base, } ldb_parse_tree_free(ldb, tree); + ltdb_unlock_read(module); return ret; } diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c index 87582cf4eb..b47d79de52 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c @@ -248,6 +248,40 @@ static int ltdb_unlock(struct ldb_module *module, const char *lockname) } +/* + lock the database for read - use by ltdb_search +*/ +int ltdb_lock_read(struct ldb_module *module) +{ + struct ltdb_private *ltdb = module->private_data; + TDB_DATA key; + int ret; + key = ltdb_key(module, LDBLOCK); + if (!key.dptr) { + return -1; + } + ret = tdb_chainlock_read(ltdb->tdb, key); + talloc_free(key.dptr); + return ret; +} + +/* + unlock the database after a ltdb_lock_read() +*/ +int ltdb_unlock_read(struct ldb_module *module) +{ + struct ltdb_private *ltdb = module->private_data; + TDB_DATA key; + key = ltdb_key(module, LDBLOCK); + if (!key.dptr) { + return -1; + } + tdb_chainunlock_read(ltdb->tdb, key); + talloc_free(key.dptr); + return 0; +} + + /* we've made a modification to a dn - possibly reindex and update sequence number diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.h b/source4/lib/ldb/ldb_tdb/ldb_tdb.h index 9fb60b6359..dfb985319e 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.h +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.h @@ -104,6 +104,8 @@ struct TDB_DATA ltdb_key(struct ldb_module *module, const char *dn); int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flgs); int ltdb_delete_noindex(struct ldb_module *module, const char *dn); int ltdb_modify_internal(struct ldb_module *module, const struct ldb_message *msg); +int ltdb_lock_read(struct ldb_module *module); +int ltdb_unlock_read(struct ldb_module *module); /* The following definitions come from lib/ldb/ldb_tdb/ldb_match.c */ int ltdb_val_equal(struct ldb_module *module, -- cgit