From 1cea79d4c3c22231a8e39de499d3e2591ef1bf08 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Thu, 9 Aug 2012 14:05:02 +0100 Subject: 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 --- apps/couch/src/couch_doc.erl | 12 ++++++++++-- 1 file 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). -- cgit v1.2.3