You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by zz...@apache.org on 2013/07/30 01:18:54 UTC
git commit: HELIX-148: Current preferred placement for auto rebalace
is suboptimal for n > p
Updated Branches:
refs/heads/master 04ca91bd8 -> 937bc9aa0
HELIX-148: Current preferred placement for auto rebalace is suboptimal for n > p
Project: http://git-wip-us.apache.org/repos/asf/incubator-helix/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-helix/commit/937bc9aa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-helix/tree/937bc9aa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-helix/diff/937bc9aa
Branch: refs/heads/master
Commit: 937bc9aa06cccb7b021972b0a904f7d6dc791d78
Parents: 04ca91b
Author: zzhang <zz...@uci.edu>
Authored: Mon Jul 29 16:18:47 2013 -0700
Committer: zzhang <zz...@uci.edu>
Committed: Mon Jul 29 16:18:47 2013 -0700
----------------------------------------------------------------------
.../controller/strategy/AutoRebalanceStrategy.java | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/937bc9aa/helix-core/src/main/java/org/apache/helix/controller/strategy/AutoRebalanceStrategy.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/controller/strategy/AutoRebalanceStrategy.java b/helix-core/src/main/java/org/apache/helix/controller/strategy/AutoRebalanceStrategy.java
index ee398d2..58f5f17 100644
--- a/helix-core/src/main/java/org/apache/helix/controller/strategy/AutoRebalanceStrategy.java
+++ b/helix-core/src/main/java/org/apache/helix/controller/strategy/AutoRebalanceStrategy.java
@@ -420,13 +420,23 @@ public class AutoRebalanceStrategy implements Rebalancer {
Map<Replica, Node> preferredMapping;
preferredMapping = new HashMap<Replica, Node>();
int partitionId = 0;
-
for (String partition : _partitions) {
int replicaId = 0;
for (String state : _states.keySet()) {
for (int i = 0; i < _states.get(state); i++) {
Replica replica = new Replica(partition, state, i);
- int index = (partitionId + replicaId) % allNodes.size();
+ int index;
+ if (allNodes.size() > _partitions.size()) {
+ // assign replicas in partition order in case there are more nodes than partitions
+ index = (partitionId + replicaId * _partitions.size()) % allNodes.size();
+ } else if (allNodes.size() == _partitions.size()) {
+ // need a replica offset in case the sizes of these sets are the same
+ index = ((partitionId + replicaId * _partitions.size()) % allNodes.size()
+ + replicaId) % allNodes.size();
+ } else {
+ // in all other cases, assigning a replica at a time for each partition is reasonable
+ index = (partitionId + replicaId) % allNodes.size();
+ }
preferredMapping.put(replica, _nodeMap.get(allNodes.get(index)));
replicaId = replicaId + 1;
}