diff options
author | Robert Newson <rnewson@apache.org> | 2018-08-06 19:16:09 +0100 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2018-08-30 09:54:15 +0100 |
commit | 07570f4c72ab26cfb5ecb8cc83a2edc19ecd7a3f (patch) | |
tree | db9455b7015f2ab7533b1331ef292348ead626ab | |
parent | 0454547cb88c428900d1706a2ff8d7605de0283a (diff) | |
download | couchdb-07570f4c72ab26cfb5ecb8cc83a2edc19ecd7a3f.tar.gz |
Select only the shard containing the partition, if specified
-rw-r--r-- | src/fabric/src/fabric_util.erl | 1 | ||||
-rw-r--r-- | src/fabric/src/fabric_view.erl | 32 |
2 files changed, 28 insertions, 5 deletions
diff --git a/src/fabric/src/fabric_util.erl b/src/fabric/src/fabric_util.erl index dd4b80da6..4d2f2c700 100644 --- a/src/fabric/src/fabric_util.erl +++ b/src/fabric/src/fabric_util.erl @@ -64,7 +64,6 @@ stream_start(Workers0, Keypos, StartFun, Replacements) -> Timeout = request_timeout(), case rexi_utils:recv(Workers0, Keypos, Fun, Acc, Timeout, infinity) of {ok, #stream_acc{workers=Workers}} -> - true = fabric_view:is_progress_possible(Workers), AckedWorkers = fabric_dict:fold(fun(Worker, From, WorkerAcc) -> rexi:stream_start(From), [Worker | WorkerAcc] diff --git a/src/fabric/src/fabric_view.erl b/src/fabric/src/fabric_view.erl index 69f42909a..b4b8a8c38 100644 --- a/src/fabric/src/fabric_view.erl +++ b/src/fabric/src/fabric_view.erl @@ -309,10 +309,34 @@ index_of(X, [X|_Rest], I) -> index_of(X, [_|Rest], I) -> index_of(X, Rest, I+1). -get_shards(DbName, #mrargs{stable=true}) -> - mem3:ushards(DbName); -get_shards(DbName, #mrargs{stable=false}) -> - mem3:shards(DbName). + +get_shards(DbName, #mrargs{} = Args) -> + Partitioned = couch_mrview_util:get_extra(Args, partitioned), + Partition = partition_docid(Args), + case {Args#mrargs.stable, Partitioned, Partition} of + {true, false, _} -> + mem3:ushards(DbName); + {true, true, undefined} -> + mem3:ushards(DbName); + {true, true, Partition} -> + mem3:ushards(DbName, Partition); + {false, false, _} -> + mem3:shards(DbName); + {false, true, undefined} -> + mem3:shards(DbName); + {false, true, Partition} -> + mem3:shards(DbName, Partition) + end. + +% create a fake docid within the specified partition. +partition_docid(Args) -> + case couch_mrview_util:get_extra(Args, partition) of + undefined -> + undefined; + Partition when is_binary(Partition) -> + <<Partition/binary, ":foo">> + end. + maybe_update_others(DbName, DDoc, ShardsInvolved, ViewName, #mrargs{update=lazy} = Args) -> |