You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2022/09/22 04:06:10 UTC
[couchdb] 01/01: Add couch_db:open_doc_revs/3
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch add-multi-open-docs-revs-worker-callback
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit d8877202f0fdc7b1eb7815134e4c7ff2edb3a030
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Wed Sep 21 23:57:14 2022 -0400
Add couch_db:open_doc_revs/3
This is the companion to open_doc_revs/4 which operates on a batch of docs at a
time. As a lucky coincidence, the internal open_doc_revs_int/3 function already
operates on batches, so we just expose the batched variant.
This function will be the used to optimize the _bulk_get implementation as
described in issue https://github.com/apache/couchdb/issues/4183. To allow
incremental node updates, let's have the backend implementation in a separate
commit so it could be included in separate rolling updates releases.
Issue: https://github.com/apache/couchdb/issues/4183
---
src/couch/src/couch_db.erl | 22 ++++++++++++++++++++--
src/fabric/src/fabric_rpc.erl | 5 ++++-
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index dd7e07517..969b93636 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -72,6 +72,7 @@
open_doc/2,
open_doc/3,
+ open_doc_revs/3,
open_doc_revs/4,
open_doc_int/3,
get_doc_info/2,
@@ -347,6 +348,18 @@ find_ancestor_rev_pos({RevPos, [RevId | Rest]}, AttsSinceRevs) ->
find_ancestor_rev_pos({RevPos - 1, Rest}, AttsSinceRevs)
end.
+open_doc_revs(Db, IdRevsOpts, Options) when is_list(IdRevsOpts) ->
+ increment_stat(Db, [couchdb, database_reads], length(IdRevsOpts)),
+ % IdRevsOpts looks like [{{Id, Revs}, DocOpts}, ...]
+ {IdRevs, DocOptsOnly} = lists:unzip(IdRevsOpts),
+ % Function open_doc_revs_int takes [{Id, Revs},...] as its argument
+ AllResults = open_doc_revs_int(Db, IdRevs, Options),
+ % Apply document open options like {atts_since, ...} etc
+ ResultsZipFun = fun(DocOpts, {ok, Results}) ->
+ [apply_open_options(R, DocOpts) || R <- Results]
+ end,
+ lists:zipwith(ResultsZipFun, DocOptsOnly, AllResults).
+
open_doc_revs(Db, Id, Revs, Options) ->
increment_stat(Db, [couchdb, database_reads]),
[{ok, Results}] = open_doc_revs_int(Db, [{Id, Revs}], Options),
@@ -1985,12 +1998,17 @@ after_doc_read(#db{} = Db, Doc) ->
DocWithBody = couch_doc:with_ejson_body(Doc),
couch_db_plugin:after_doc_read(Db, DocWithBody).
-increment_stat(#db{options = Options}, Stat) ->
+increment_stat(#db{} = Db, Stat) ->
+ increment_stat(Db, Stat, 1).
+
+increment_stat(#db{options = Options}, Stat, Count) when
+ is_integer(Count), Count >= 0
+->
case lists:member(sys_db, Options) of
true ->
ok;
false ->
- couch_stats:increment_counter(Stat)
+ couch_stats:increment_counter(Stat, Count)
end.
-spec normalize_dbname(list() | binary()) -> binary().
diff --git a/src/fabric/src/fabric_rpc.erl b/src/fabric/src/fabric_rpc.erl
index eb909519b..8b9c94c87 100644
--- a/src/fabric/src/fabric_rpc.erl
+++ b/src/fabric/src/fabric_rpc.erl
@@ -20,7 +20,7 @@
]).
-export([
open_doc/3,
- open_revs/4,
+ open_revs/3, open_revs/4,
get_doc_info/3,
get_full_doc_info/3,
get_missing_revs/2, get_missing_revs/3,
@@ -270,6 +270,9 @@ set_purge_infos_limit(DbName, Limit, Options) ->
open_doc(DbName, DocId, Options) ->
with_db(DbName, Options, {couch_db, open_doc, [DocId, Options]}).
+open_revs(DbName, IdRevsOpts, Options) ->
+ with_db(DbName, Options, {couch_db, open_doc_revs, [IdRevsOpts, Options]}).
+
open_revs(DbName, Id, Revs, Options) ->
with_db(DbName, Options, {couch_db, open_doc_revs, [Id, Revs, Options]}).