summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2020-04-22 15:17:20 +0200
committergarren smith <garren.smith@gmail.com>2020-04-23 19:24:43 +0200
commitf522b880b68109feb5960d6d8244ac034990059e (patch)
treef99a96aa78928d8ea2a9160d5526b09140244984
parent38952237def3d6f6390ed5a0f201d580ca27db14 (diff)
downloadcouchdb-f522b880b68109feb5960d6d8244ac034990059e.tar.gz
Refactor fetching rev code in fabric2_fdb
Use a common `get_revs_future` and `get_revs_wait` for fetching winning revs and all revs.
-rw-r--r--src/couch_views/src/couch_views_indexer.erl2
-rw-r--r--src/fabric/src/fabric2_db.erl2
-rw-r--r--src/fabric/src/fabric2_fdb.erl36
3 files changed, 20 insertions, 20 deletions
diff --git a/src/couch_views/src/couch_views_indexer.erl b/src/couch_views/src/couch_views_indexer.erl
index ab5aaade2..bd1bd4de6 100644
--- a/src/couch_views/src/couch_views_indexer.erl
+++ b/src/couch_views/src/couch_views_indexer.erl
@@ -384,7 +384,7 @@ fetch_docs(Db, Changes) ->
RevFutures = maps:keys(RevState),
BodyState = lists:foldl(fun(RevFuture, Acc) ->
{Id, Change} = maps:get(RevFuture, RevState),
- Revs = fabric2_fdb:get_winning_revs_wait(Db, RevFuture),
+ Revs = fabric2_fdb:get_revs_wait(Db, RevFuture),
% I'm assuming that in this changes transaction that the winning
% doc body exists since it is listed in the changes feed as not deleted
diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl
index 6e629f7b4..15694cdde 100644
--- a/src/fabric/src/fabric2_db.erl
+++ b/src/fabric/src/fabric2_db.erl
@@ -1534,7 +1534,7 @@ update_doc_interactive(Db, Doc0, Options) ->
update_doc_interactive(Db, Doc0, Future, _Options) ->
- RevInfos = fabric2_fdb:get_winning_revs_wait(Db, Future),
+ RevInfos = fabric2_fdb:get_revs_wait(Db, Future),
{Winner, SecondPlace} = case RevInfos of
[] -> {not_found, not_found};
[WRI] -> {WRI, not_found};
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index 03f3bad82..b1ada52fc 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -42,9 +42,10 @@
incr_stat/4,
get_all_revs/2,
+ get_all_revs_future/2,
get_winning_revs/3,
get_winning_revs_future/3,
- get_winning_revs_wait/2,
+ get_revs_wait/2,
get_non_deleted_rev/3,
get_doc_body/3,
@@ -602,46 +603,45 @@ incr_stat(#{} = Db, Section, Key, Increment) when is_integer(Increment) ->
get_all_revs(#{} = Db, DocId) ->
DbName = maps:get(name, Db, undefined),
with_span('db.get_all_revs', #{'db.name' => DbName, 'doc.id' => DocId}, fun() ->
- #{
- tx := Tx,
- db_prefix := DbPrefix
- } = ensure_current(Db),
-
- Prefix = erlfdb_tuple:pack({?DB_REVS, DocId}, DbPrefix),
- Options = [{streaming_mode, want_all}],
- Future = erlfdb:get_range_startswith(Tx, Prefix, Options),
- lists:map(fun({K, V}) ->
- Key = erlfdb_tuple:unpack(K, DbPrefix),
- Val = erlfdb_tuple:unpack(V),
- fdb_to_revinfo(Key, Val)
- end, erlfdb:wait(Future))
+ Future = get_all_revs_future(Db, DocId),
+ get_revs_wait(Db, Future)
end).
+get_all_revs_future(#{} = Db, DocId) ->
+ Options = [{streaming_mode, want_all}],
+ get_revs_future(Db, DocId, Options).
+
+
get_winning_revs(Db, DocId, NumRevs) ->
DbName = maps:get(name, Db, undefined),
with_span('db.get_winning_revs', #{'db.name' => DbName, 'doc.id' => DocId}, fun() ->
Future = get_winning_revs_future(Db, DocId, NumRevs),
- get_winning_revs_wait(Db, Future)
+ get_revs_wait(Db, Future)
end).
get_winning_revs_future(#{} = Db, DocId, NumRevs) ->
+ Options = [{reverse, true}, {limit, NumRevs}],
+ get_revs_future(Db, DocId, Options).
+
+
+get_revs_future(#{} = Db, DocId, Options) ->
#{
tx := Tx,
db_prefix := DbPrefix
} = ensure_current(Db),
{StartKey, EndKey} = erlfdb_tuple:range({?DB_REVS, DocId}, DbPrefix),
- Options = [{reverse, true}, {limit, NumRevs}],
erlfdb:fold_range_future(Tx, StartKey, EndKey, Options).
-get_winning_revs_wait(#{} = Db, RangeFuture) ->
+get_revs_wait(#{} = Db, RangeFuture) ->
#{
tx := Tx,
db_prefix := DbPrefix
} = ensure_current(Db),
+
RevRows = erlfdb:fold_range_wait(Tx, RangeFuture, fun({K, V}, Acc) ->
Key = erlfdb_tuple:unpack(K, DbPrefix),
Val = erlfdb_tuple:unpack(V),
@@ -1185,7 +1185,7 @@ load_validate_doc_funs(#{} = Db) ->
id := DDocId,
rev_info := RevInfoFuture
} = Info,
- [RevInfo] = get_winning_revs_wait(Db, RevInfoFuture),
+ [RevInfo] = get_revs_wait(Db, RevInfoFuture),
#{deleted := Deleted} = RevInfo,
if Deleted -> []; true ->
[Info#{