lib ldb key value backends: Add nested txn support
authorGary Lockyer <gary@catalyst.net.nz>
Wed, 6 Mar 2019 21:18:00 +0000 (10:18 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 21 Jun 2019 04:27:12 +0000 (04:27 +0000)
Add limited nested transaction support to the back ends to make the key value
operations atomic (for those back ends that support nested transactions).

Note: that only the lmdb backend currently supports nested transactions.

Signed-off-by: Gary Lockyer <gary@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/ldb/ldb_key_value/ldb_kv.h
lib/ldb/ldb_mdb/ldb_mdb.c
lib/ldb/ldb_tdb/ldb_tdb.c

index 3de29039a98636dcd617599308a529bc7ab8982f..e7fcbd9be8d42d1723f931a33eccdd830298c2b1 100644 (file)
@@ -51,6 +51,9 @@ struct kv_db_ops {
        bool (*has_changed)(struct ldb_kv_private *ldb_kv);
        bool (*transaction_active)(struct ldb_kv_private *ldb_kv);
        size_t (*get_size)(struct ldb_kv_private *ldb_kv);
+       int (*begin_nested_write)(struct ldb_kv_private *);
+       int (*finish_nested_write)(struct ldb_kv_private *);
+       int (*abort_nested_write)(struct ldb_kv_private *);
 };
 
 /* this private structure is used by the key value backends in the
index 9fa10e9e470739d5884386727456d75cb06f8395..35e21434ff0f037f3d04d32bef3238910aa4db0e 100644 (file)
@@ -739,6 +739,36 @@ static size_t lmdb_get_size(struct ldb_kv_private *ldb_kv)
        return stats.ms_entries;
 }
 
+/*
+ * Start a sub transaction
+ * As lmdb supports nested transactions we can start a new transaction
+ */
+static int lmdb_nested_transaction_start(struct ldb_kv_private *ldb_kv)
+{
+       int ret = lmdb_transaction_start(ldb_kv);
+       return ret;
+}
+
+/*
+ * Commit a sub transaction
+ * As lmdb supports nested transactions we can commit the nested transaction
+ */
+static int lmdb_nested_transaction_commit(struct ldb_kv_private *ldb_kv)
+{
+       int ret = lmdb_transaction_commit(ldb_kv);
+       return ret;
+}
+
+/*
+ * Cancel a sub transaction
+ * As lmdb supports nested transactions we can cancel the nested transaction
+ */
+static int lmdb_nested_transaction_cancel(struct ldb_kv_private *ldb_kv)
+{
+       int ret = lmdb_transaction_cancel(ldb_kv);
+       return ret;
+}
+
 static struct kv_db_ops lmdb_key_value_ops = {
        .options            = LDB_KV_OPTION_STABLE_READ_LOCK,
 
@@ -760,6 +790,9 @@ static struct kv_db_ops lmdb_key_value_ops = {
        .has_changed        = lmdb_changed,
        .transaction_active = lmdb_transaction_active,
        .get_size           = lmdb_get_size,
+       .begin_nested_write = lmdb_nested_transaction_start,
+       .finish_nested_write = lmdb_nested_transaction_commit,
+       .abort_nested_write = lmdb_nested_transaction_cancel,
 };
 
 static const char *lmdb_get_path(const char *url)
index 6e2cb633a4d83f51885da7f0865231d260599ce4..77cd5e9726b40ffd4bd74264af3978311bf6e254 100644 (file)
@@ -437,6 +437,36 @@ static size_t ltdb_get_size(struct ldb_kv_private *ldb_kv)
        return size;
 }
 
+/*
+ * Start a sub transaction
+ * As TDB does not currently support nested transactions, we do nothing and
+ * return LDB_SUCCESS
+ */
+static int ltdb_nested_transaction_start(struct ldb_kv_private *ldb_kv)
+{
+       return LDB_SUCCESS;
+}
+
+/*
+ * Commit a sub transaction
+ * As TDB does not currently support nested transactions, we do nothing and
+ * return LDB_SUCCESS
+ */
+static int ltdb_nested_transaction_commit(struct ldb_kv_private *ldb_kv)
+{
+       return LDB_SUCCESS;
+}
+
+/*
+ * Cancel a sub transaction
+ * As TDB does not currently support nested transactions, we do nothing and
+ * return LDB_SUCCESS
+ */
+static int ltdb_nested_transaction_cancel(struct ldb_kv_private *ldb_kv)
+{
+       return LDB_SUCCESS;
+}
+
 static const struct kv_db_ops key_value_ops = {
        /* No support for any additional features */
        .options = 0,
@@ -459,6 +489,9 @@ static const struct kv_db_ops key_value_ops = {
        .has_changed = ltdb_changed,
        .transaction_active = ltdb_transaction_active,
        .get_size = ltdb_get_size,
+       .begin_nested_write = ltdb_nested_transaction_start,
+       .finish_nested_write = ltdb_nested_transaction_commit,
+       .abort_nested_write = ltdb_nested_transaction_cancel,
 };
 
 /*