You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2014/08/28 14:22:55 UTC

[35/50] mem3 commit: updated refs/heads/master to 64c0c74

Refactor global candidate selection

The old approach was getting unwieldy, hopefully this makes the tests
more explicit.

BugzID: 24466


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

Branch: refs/heads/master
Commit: 5c3c9c93ec19dfa50530f79dc6bb743bcb26ce81
Parents: 5ec7d04
Author: Adam Kocoloski <ad...@cloudant.com>
Authored: Wed Oct 30 13:10:42 2013 -0400
Committer: Robert Newson <rn...@apache.org>
Committed: Wed Jul 23 18:46:27 2014 +0100

----------------------------------------------------------------------
 src/mem3_rebalance.erl | 51 ++++++++++++++++++++++++++-------------------
 1 file changed, 29 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mem3/blob/5c3c9c93/src/mem3_rebalance.erl
----------------------------------------------------------------------
diff --git a/src/mem3_rebalance.erl b/src/mem3_rebalance.erl
index 234cad2..b7d161c 100644
--- a/src/mem3_rebalance.erl
+++ b/src/mem3_rebalance.erl
@@ -175,33 +175,40 @@ donate_fold(#shard{node = Node} = Shard, #gacc{node = Node} = Acc0) ->
     Shards = apply_shard_moves(mem3:shards(Shard#shard.dbname), Moves),
     InZone = filter_map_by_zone(shards_by_node(Shards, Nodes), Zone),
     SortedByCount = lists:sort(smallest_first(Moves), InZone),
-    Candidates = lists:dropwhile(fun({_Node, OwnShards}) ->
-        lists:keymember(Shard#shard.range, #shard.range, OwnShards)
-    end, SortedByCount),
-    case {lists:member(Shard, Shards), Candidates} of
+    SourceCount = get_shard_count(Node, SortedByCount),
+    Fun = fun({CandidateNode, OwnShards}) ->
+        HasRange = lists:keymember(Shard#shard.range, #shard.range, OwnShards),
+        TargetCount = get_shard_count(CandidateNode, SortedByCount),
+        NodeKey = couch_util:to_binary(CandidateNode),
+        Total = couch_util:get_value(NodeKey, shard_count_by_node(Moves)),
+        if
+            CandidateNode =:= Node ->
+                % Can't move a shard to ourselves
+                true;
+            HasRange ->
+                % The candidate already has this shard
+                true;
+            TargetCount >= SourceCount ->
+                % Executing this move would create a local imbalance in the DB
+                true;
+            Total >= TargetLevel ->
+                % The candidate has already achieved the target level
+                true;
+            true ->
+                false
+        end
+    end,
+    case {lists:member(Shard, Shards), lists:dropwhile(Fun, SortedByCount)} of
         {false, _} ->
             Acc0;
         {true, []} ->
             Acc0;
-        {true, [{Node, _} | _]} ->
-            Acc0;
         {true, [{Target, _} | _]} ->
-            % Execute the move only if the target has fewer shards for this DB
-            % than the source. Otherwise we'd generate a local imbalance.
-            SourceCount = get_shard_count(Node, SortedByCount),
-            TargetCount = get_shard_count(Target, SortedByCount),
-            % Execute the move only if the target needs shards.
-            NodeKey = couch_util:to_binary(Target),
-            Total = couch_util:get_value(NodeKey, shard_count_by_node(Moves)),
-            if (TargetCount < SourceCount), (Total < TargetLevel) ->
-                print({move, Shard, Target}),
-                Acc0#gacc{
-                    moves = [{move, Shard, Target} | Moves],
-                    limit = DC - 1
-                };
-            true ->
-                Acc0
-            end
+            print({move, Shard, Target}),
+            Acc0#gacc{
+                moves = [{move, Shard, Target} | Moves],
+                limit = DC - 1
+            }
     end;
 donate_fold(_Shard, Acc) ->
     Acc.