[ https://issues.apache.org/jira/browse/HELIX-631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15531493#comment-15531493 ]
ASF GitHub Bot commented on HELIX-631: -------------------------------------- Github user lei-xia commented on a diff in the pull request: https://github.com/apache/helix/pull/52#discussion_r81051316 --- Diff: helix-core/src/main/java/org/apache/helix/controller/rebalancer/strategy/AutoRebalanceStrategy.java --- @@ -177,15 +176,26 @@ private void assignOrphans() { while (it.hasNext()) { Replica replica = it.next(); boolean added = false; - int startIndex = computeRandomStartIndex(replica); - for (int index = startIndex; index < startIndex + _liveNodesList.size(); index++) { - Node receiver = _liveNodesList.get(index % _liveNodesList.size()); - if (receiver.capacity > receiver.currentlyAssigned && receiver.canAdd(replica)) { - receiver.currentlyAssigned = receiver.currentlyAssigned + 1; - receiver.nonPreferred.add(replica); - receiver.newReplicas.add(replica); - added = true; - break; + + // first find if it preferred node still has capacity + Node preferred = _preferredAssignment.get(replica); + if (preferred.capacity > preferred.currentlyAssigned && preferred.canAdd(replica)) { --- End diff -- Fixed, refactored to a separated method. > AutoRebalanceStrategy does not work correctly all the time > ---------------------------------------------------------- > > Key: HELIX-631 > URL: https://issues.apache.org/jira/browse/HELIX-631 > Project: Apache Helix > Issue Type: Bug > Reporter: Subbu > Assignee: Lei Xia > > I have 16 partitions, 3 replicas each, and 4 instances to distribute these > on. The auto-rebalancer assigns only 2 replicas for one of the partitions. > Here is the code snippet to reproduce the problem > {code} > final String resourceName = "something"; > final List<String> instanceNames = null; // Initialize to 4 unique strings > final int nReplicas = 3; > List<String> partitions = new ArrayList<>(nPartitions); > for (int i = 0; i < nPartitions; i++) { > partitions.add(Integer.toString(i)); > } > LinkedHashMap<String, Integer> states = new LinkedHashMap<>(2); > states.put("OFFLINE", 0); > states.put("ONLINE", nReplicas); > AutoRebalanceStrategy strategy = new AutoRebalanceStrategy(resourceName, > partitions, states); > ZNRecord znRecord = strategy.computePartitionAssignment(instanceNames, > new HashMap<String, Map<String, String>>(0), instanceNames); > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)