summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2020-01-31 14:58:41 -0500
committerNick Vatamaniuc <vatamane@apache.org>2020-01-31 14:58:41 -0500
commit02fcfa87841a1cd4746fac293c6119f1fd09e8e8 (patch)
treef6c201ed271b9c5fd94ba5a878cfcbe95b52c65d
parent7e0c5bbd498d32ce4974169fb848160d4ec4442a (diff)
downloadcouchdb-multi-transactional-iterators.tar.gz
Use multi-transactional iteratorsmulti-transactional-iterators
-rw-r--r--src/fabric/src/fabric2_db.erl2
-rw-r--r--src/fabric/src/fabric2_fdb.erl53
2 files changed, 54 insertions, 1 deletions
diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl
index 6d015df0e..dd97cf7e9 100644
--- a/src/fabric/src/fabric2_db.erl
+++ b/src/fabric/src/fabric2_db.erl
@@ -755,7 +755,7 @@ fold_docs(Db, UserFun, UserAcc) ->
fold_docs(Db, UserFun, UserAcc0, Options) ->
- fabric2_fdb:transactional(Db, fun(TxDb) ->
+ fabric2_fdb:with_iter(Db, fun(TxDb) ->
try
#{
db_prefix := DbPrefix
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index 6abe1f6de..4e7f3867d 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -24,6 +24,11 @@
delete/1,
exists/1,
+ create_iter/1,
+ destroy_iter/1,
+ checkpoint_iter/1,
+ with_iter/2,
+
get_dir/1,
list_dbs/4,
@@ -307,6 +312,54 @@ exists(#{name := DbName} = Db) when is_binary(DbName) ->
end.
+create_iter(#{tx := undefined} = Db) ->
+ try
+ Db1 = refresh(Db),
+
+ Reopen = maps:get(reopen, Db1, false),
+ Db2 = maps:remove(reopen, Db1),
+
+ Fdb = get_db_handle(),
+ Tx = erlfdb:reate_read_only_transaction(Fdb),
+ Db3 = case Reopen of
+ true -> reopen(Db2#{tx => Tx});
+ false -> Db2#{tx => Tx}
+ end,
+
+ % Here we might throw `reopen`
+ Db4 = ensure_current(Db3),
+
+ % This part might update the Db cache
+ ok = run_on_commit_fun(Tx),
+ erase({?PDICT_ON_COMMIT_FUN, Tx}),
+
+ Db4#{tx => erlfdb:create_iter(Fdb, Tx)}
+ catch throw:{?MODULE, reopen} ->
+ create_iter(Db#{reopen => true})
+ end.
+
+
+destroy_iter(#{tx := {erfdb_transaction, _}} = Db) ->
+ #{tx := Tx} = Db,
+ erlfdb:destroy_iter(Tx),
+ Db#{tx := undefined}.
+
+
+checkpoint_iter(#{tx := {erlfdb_transaction, _}} = Db) ->
+ #{tx := Tx} = Db,
+ erlfdb:checkpoint_iter(Tx),
+ Db.
+
+
+with_iter(#{tx := undefined} = Db, Fun) when is_function(Fun, 1) ->
+ IterDb = create_iter(Db),
+ try
+ Fun(IterDb)
+ after
+ destroy_iter(IterDb)
+ end.
+
+
get_dir(Tx) ->
Root = erlfdb_directory:root(),
Dir = fabric2_server:fdb_directory(),