diff options
author | Robert Newson <rnewson@apache.org> | 2018-08-13 22:34:59 +0100 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2018-10-08 09:51:20 +0100 |
commit | a167a41d97f1b75cc6ef35554a6889dbd8c8a157 (patch) | |
tree | 9d6de3861f30ad09521727379d6259ccbc0d0183 | |
parent | f2bceb4d82954026e1ef6ff2c87beb3a6b319480 (diff) | |
download | couchdb-a167a41d97f1b75cc6ef35554a6889dbd8c8a157.tar.gz |
optimize _all_docs requests that are bounded within a single partition
-rw-r--r-- | src/fabric/src/fabric_view_all_docs.erl | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/fabric/src/fabric_view_all_docs.erl b/src/fabric/src/fabric_view_all_docs.erl index d515ab830..83c3790a1 100644 --- a/src/fabric/src/fabric_view_all_docs.erl +++ b/src/fabric/src/fabric_view_all_docs.erl @@ -21,7 +21,7 @@ -include_lib("couch_mrview/include/couch_mrview.hrl"). go(DbName, Options, #mrargs{keys=undefined} = QueryArgs, Callback, Acc) -> - Shards = mem3:shards(DbName), + Shards = shards(DbName, QueryArgs), Workers0 = fabric_util:submit_jobs( Shards, fabric_rpc, all_docs, [Options, QueryArgs]), RexiMon = fabric_util:create_monitors(Workers0), @@ -136,6 +136,28 @@ go(DbName, _Options, Workers, QueryArgs, Callback, Acc0) -> {ok, Resp} end. +shards(DbName, Args) -> + case couch_mrview_util:get_extra(Args, partitioned) of + true -> + StartKey = partition(Args#mrargs.start_key), + EndKey = partition(Args#mrargs.end_key), + case {StartKey, EndKey} of + {Same, Same} when Same =/= undefined -> + mem3:shards(DbName, <<Same/binary, ":foo">>); + {_, _} -> + mem3:shards(DbName) + end; + _ -> + mem3:shards(DbName) + end. + +partition(undefined) -> + undefined; +partition(null) -> + null; +partition(Key) when is_binary(Key) -> + hd(binary:split(Key, <<":">>)). + handle_message({rexi_DOWN, _, {_, NodeRef}, _}, _, State) -> fabric_view:check_down_shards(State, NodeRef); |