diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2018-10-25 14:26:25 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2019-01-08 11:35:04 -0600 |
commit | 724e772d6030aaa74812fd9c7c92958152a71d06 (patch) | |
tree | 557eb1e4fb13926fbb4310f504ce159232559d73 | |
parent | d6fe14b30ece4540d8a49084509ea94a927c3d46 (diff) | |
download | couchdb-724e772d6030aaa74812fd9c7c92958152a71d06.tar.gz |
Optimize all_docs queries in a single partition
If a user specifies document ids that scope the query to a single
partition key we can automatically determine that we only need to
consuly a single shard range.
Co-authored-by: Robert Newson <rnewson@apache.org>
-rw-r--r-- | src/fabric/src/fabric_view_all_docs.erl | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/fabric/src/fabric_view_all_docs.erl b/src/fabric/src/fabric_view_all_docs.erl index 263538f65..fdc3bd988 100644 --- a/src/fabric/src/fabric_view_all_docs.erl +++ b/src/fabric/src/fabric_view_all_docs.erl @@ -135,6 +135,32 @@ go(DbName, _Options, Workers, QueryArgs, Callback, Acc0) -> {ok, Resp} end. +shards(Db, Args) -> + DbPartitioned = fabric_util:is_partitioned(Db), + Partition = couch_mrview_util:get_extra(Args, partition), + NewArgs = case {DbPartitioned, Partition} of + {true, undefined} -> + % If a user specifies the same partition on both + % the start and end keys we can optimize the + % query by limiting to the partition shard. + Start = couch_partition:extract(Args#mrargs.start_key), + End = couch_partition:extract(Args#mrargs.end_key), + case {Start, End} of + {{Partition, SK}, {Partition, EK}} -> + A1 = Args#mrargs{ + start_key = SK, + end_key = EK + }, + couch_mrview_util:set_extra(A1, partition, Partition); + _ -> + Args + end; + _ -> + Args + end, + fabric_view:get_shards(Db, NewArgs). + + handle_message({rexi_DOWN, _, {_, NodeRef}, _}, _, State) -> fabric_view:check_down_shards(State, NodeRef); |