summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <robert.newson@cloudant.com>2012-08-09 14:05:02 +0100
committerRobert Newson <robert.newson@cloudant.com>2012-08-09 14:21:10 +0100
commit1cea79d4c3c22231a8e39de499d3e2591ef1bf08 (patch)
tree339278862705843c605db90d72e9aeeb1f7f5318
parent90dcfeb1b3547a2869eea50654268b950a62476f (diff)
Don't always require exactly N replies for an mp attachment PUT
It's not safe to assume we require, or will receive, exactly N replies (where N is read from the "n" key of the "cluster" section of the configuaration). This needs proper fabric-ification. This commit will at least allow replication tests with clusters of less than N nodes where the documents have attachments (which triggers the multipart code). BugzID: 14258
-rw-r--r--apps/couch/src/couch_doc.erl12
1 files changed, 10 insertions, 2 deletions
diff --git a/apps/couch/src/couch_doc.erl b/apps/couch/src/couch_doc.erl
index f24f0310..f3f1af65 100644
--- a/apps/couch/src/couch_doc.erl
+++ b/apps/couch/src/couch_doc.erl
@@ -541,7 +541,7 @@ mp_parse_atts({body, Bytes}, {DataList, Offset, Counters, Waiting}) ->
NewAcc = maybe_send_data({DataList++[Bytes], Offset, Counters, Waiting}),
fun(Next) -> mp_parse_atts(Next, NewAcc) end;
mp_parse_atts(eof, {DataList, Offset, Counters, Waiting}) ->
- N = list_to_integer(couch_config:get("cluster", "n", "3")),
+ N = n(),
M = length(Counters),
case (M == N) andalso DataList == [] of
true ->
@@ -581,7 +581,7 @@ maybe_send_data({ChunkList, Offset, Counters, Waiting}) ->
SmallestIndex = lists:min(element(2, lists:unzip(Counters)))
end,
Size = length(Counters),
- N = list_to_integer(couch_config:get("cluster", "n", "3")),
+ N = n(),
if Size == N andalso SmallestIndex == (Offset+1) ->
NewChunkList = tl(ChunkList),
NewOffset = Offset+1;
@@ -619,3 +619,11 @@ abort_multi_part_stream(Parser, MonRef) ->
false ->
erlang:demonitor(MonRef, [flush])
end.
+
+% This exists to permit testing in small clusters (<3). A better fix
+% would use the database's own N value and would consider only the
+% nodes which hold at least one shard of the database.
+n() ->
+ N = list_to_integer(couch_config:get("cluster", "n", "3")),
+ NodeCount = length(nodes()) + 1,
+ erlang:min(N, NodeCount).