r6560: added a tdb_chainlock_read() call in ldb_search(). This guarantees
authorAndrew Tridgell <tridge@samba.org>
Sun, 1 May 2005 12:34:12 +0000 (12:34 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:16:25 +0000 (13:16 -0500)
that ldb_search() sees a single consistent view of the database (by
blocking writes during a ldb_search)

source/lib/ldb/ldb_tdb/ldb_search.c
source/lib/ldb/ldb_tdb/ldb_tdb.c
source/lib/ldb/ldb_tdb/ldb_tdb.h

index 4f45fdf37678cacc8cc2641b53c72009edf783f9..7883ee6e7b730182acc581109859e3fe2da4a9a7 100644 (file)
@@ -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;
 }
index 87582cf4eba2b921e439f24540c7d7bdb9490774..b47d79de528879fe3304b39da691445e695a78ec 100644 (file)
@@ -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
index 9fb60b6359f134ac6f19651f08d6e1ed84281a6a..dfb985319ec84580fd07d381d9df88d7d35c61e2 100644 (file)
@@ -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,