summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2018-08-06 19:16:09 +0100
committerRobert Newson <rnewson@apache.org>2018-10-08 09:51:20 +0100
commit1b382dead8cec19499cf22d71fffc7155172f764 (patch)
treec2ae80223f5dbdc7e0ad43826dc7f57b08b42d0a
parent121fcf8e10e7b24439efb6d45f2a9b277d41a2f4 (diff)
downloadcouchdb-1b382dead8cec19499cf22d71fffc7155172f764.tar.gz
Select only the shard containing the partition, if specified
-rw-r--r--src/fabric/src/fabric_util.erl1
-rw-r--r--src/fabric/src/fabric_view.erl32
2 files changed, 28 insertions, 5 deletions
diff --git a/src/fabric/src/fabric_util.erl b/src/fabric/src/fabric_util.erl
index e622c6aa0..bf534a48e 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) ->