From d7dc4fde4080513e2a62fabbdeee546bd74b9a0d Mon Sep 17 00:00:00 2001 From: Gary Lockyer Date: Thu, 7 Mar 2019 10:18:00 +1300 Subject: [PATCH] lib ldb key value backends: Add nested txn support 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 Reviewed-by: Andrew Bartlett --- lib/ldb/ldb_key_value/ldb_kv.h | 3 +++ lib/ldb/ldb_mdb/ldb_mdb.c | 33 +++++++++++++++++++++++++++++++++ lib/ldb/ldb_tdb/ldb_tdb.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/lib/ldb/ldb_key_value/ldb_kv.h b/lib/ldb/ldb_key_value/ldb_kv.h index 3de29039a98..e7fcbd9be8d 100644 --- a/lib/ldb/ldb_key_value/ldb_kv.h +++ b/lib/ldb/ldb_key_value/ldb_kv.h @@ -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 diff --git a/lib/ldb/ldb_mdb/ldb_mdb.c b/lib/ldb/ldb_mdb/ldb_mdb.c index 9fa10e9e470..35e21434ff0 100644 --- a/lib/ldb/ldb_mdb/ldb_mdb.c +++ b/lib/ldb/ldb_mdb/ldb_mdb.c @@ -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) diff --git a/lib/ldb/ldb_tdb/ldb_tdb.c b/lib/ldb/ldb_tdb/ldb_tdb.c index 6e2cb633a4d..77cd5e9726b 100644 --- a/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/lib/ldb/ldb_tdb/ldb_tdb.c @@ -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, }; /* -- 2.47.3