Repository: couchdb-fabric
Updated Branches:
  refs/heads/master b17c8801b -> 4553f9013


Ignore already received replies for same shards

It is possible to get a reply for same shard
from different node sent before its collector
get stopped in remove_overlapping_shards.

This running condition leads to a possibility
of same info to be aggregated multiple times.


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fabric/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fabric/commit/ae2a8f7c
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fabric/tree/ae2a8f7c
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fabric/diff/ae2a8f7c

Branch: refs/heads/master
Commit: ae2a8f7cb61dd4fc160c3b26091a885fb254f23f
Parents: b17c880
Author: Eric Avdey <e...@eiri.ca>
Authored: Fri Jul 8 15:54:47 2016 -0300
Committer: Eric Avdey <e...@eiri.ca>
Committed: Tue Jul 12 15:21:23 2016 -0300

----------------------------------------------------------------------
 src/fabric_group_info.erl | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fabric/blob/ae2a8f7c/src/fabric_group_info.erl
----------------------------------------------------------------------
diff --git a/src/fabric_group_info.erl b/src/fabric_group_info.erl
index 24232a8..f6ed9cb 100644
--- a/src/fabric_group_info.erl
+++ b/src/fabric_group_info.erl
@@ -58,17 +58,23 @@ handle_message({rexi_EXIT, Reason}, Shard, {Counters, Acc, 
Ushards}) ->
     end;
 
 handle_message({ok, Info}, Shard, {Counters0, Acc, Ushards}) ->
-    NewAcc = append_result(Info, Shard, Acc, Ushards),
-    Counters1 = fabric_dict:store(Shard, ok, Counters0),
-    Counters = fabric_view:remove_overlapping_shards(Shard, Counters1),
-    case is_complete(Counters) of
-    false ->
-        {ok, {Counters, NewAcc, Ushards}};
-    true ->
-        Pending = aggregate_pending(NewAcc),
-        Infos = get_infos(NewAcc),
-        Results = [{updates_pending, {Pending}} | merge_results(Infos)],
-        {stop, Results}
+    case fabric_dict:lookup_element(Shard, Counters0) of
+    undefined ->
+        % already heard from other node in this range
+        {ok, {Counters0, Acc, Ushards}};
+    nil ->
+        NewAcc = append_result(Info, Shard, Acc, Ushards),
+        Counters1 = fabric_dict:store(Shard, ok, Counters0),
+        Counters = fabric_view:remove_overlapping_shards(Shard, Counters1),
+        case is_complete(Counters) of
+        false ->
+            {ok, {Counters, NewAcc, Ushards}};
+        true ->
+            Pending = aggregate_pending(NewAcc),
+            Infos = get_infos(NewAcc),
+            Results = [{updates_pending, {Pending}} | merge_results(Infos)],
+            {stop, Results}
+        end
     end;
 handle_message(_, _, Acc) ->
     {ok, Acc}.

Reply via email to