diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2020-01-31 14:58:41 -0500 |
---|---|---|
committer | Nick Vatamaniuc <vatamane@apache.org> | 2020-01-31 14:58:41 -0500 |
commit | 02fcfa87841a1cd4746fac293c6119f1fd09e8e8 (patch) | |
tree | f6c201ed271b9c5fd94ba5a878cfcbe95b52c65d | |
parent | 7e0c5bbd498d32ce4974169fb848160d4ec4442a (diff) | |
download | couchdb-multi-transactional-iterators.tar.gz |
Use multi-transactional iteratorsmulti-transactional-iterators
-rw-r--r-- | src/fabric/src/fabric2_db.erl | 2 | ||||
-rw-r--r-- | src/fabric/src/fabric2_fdb.erl | 53 |
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(), |