Github user jiajunwang commented on a diff in the pull request:
https://github.com/apache/helix/pull/145#discussion_r174576961
--- Diff:
helix-core/src/main/java/org/apache/helix/util/WeightAwareRebalanceUtil.java ---
@@ -0,0 +1,141 @@
+package org.apache.helix.util;
+
+import org.apache.helix.HelixException;
+import org.apache.helix.ZNRecord;
+import org.apache.helix.api.config.RebalanceConfig;
+import
org.apache.helix.api.rebalancer.constraint.AbstractRebalanceHardConstraint;
+import
org.apache.helix.api.rebalancer.constraint.AbstractRebalanceSoftConstraint;
+import org.apache.helix.controller.common.PartitionStateMap;
+import org.apache.helix.controller.common.ResourcesStateMap;
+import
org.apache.helix.controller.rebalancer.strategy.ConstraintRebalanceStrategy;
+import org.apache.helix.controller.stages.ClusterDataCache;
+import org.apache.helix.model.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A rebalance tool that generate an resource partition assignment based
on the input.
+ * Note the assignment won't be automatically applied to the cluster.
Applications are supposed to
+ * apply the change.
+ */
+public class WeightAwareRebalanceUtil {
+ private final ClusterConfig _clusterConfig;
+ private final Map<String, InstanceConfig> _instanceConfigMap = new
HashMap<>();
+ // For the possible customized state models.
+ private final Map<String, StateModelDefinition> _stateModelDefs = new
HashMap<>();
+ private final ClusterDataCache _dataCache;
+
+ public enum RebalanceOption {
+ INIT,
+ REASSIGN
+ }
+
+ public WeightAwareRebalanceUtil(ClusterConfig clusterConfig,
+ List<InstanceConfig> instanceConfigs) {
+ for (InstanceConfig instanceConfig : instanceConfigs) {
+ _instanceConfigMap.put(instanceConfig.getInstanceName(),
instanceConfig);
+ }
+ _clusterConfig = clusterConfig;
+
+ _dataCache = new ClusterDataCache();
+ _dataCache.setInstanceConfigMap(_instanceConfigMap);
+ _dataCache.setClusterConfig(_clusterConfig);
+ List<LiveInstance> liveInstanceList = new ArrayList<>();
+ for (String instance : _instanceConfigMap.keySet()) {
+ LiveInstance liveInstance = new LiveInstance(instance);
+ liveInstanceList.add(liveInstance);
+ }
+ _dataCache.setLiveInstances(liveInstanceList);
+ }
+
+ /**
+ * The method to generate partition assignment mappings.
+ *
+ * @param resourceConfigs Config of all the resources that need to be
rebalanced.
+ * The tool throws Exception if any resource
has no IS or broken/uninitialized IS.
+ * The tool throws Exception if any resource
is in full-auto mode.
+ * @param existingAssignment The existing partition assignment of the
input resources.
+ * @param option INIT or REASSIGN
+ * INIT: Keep existing assignment. Only
generate new partition assignment.
--- End diff --
You are right, Subbu.
The existingAssignment is old partition assignment.
For incremental, those old assignments won't be changed unless they are not
valid (compared with State Model requirement).
For full rebalance, the old assignments are only used to minimize movement
if possible. But all existing assignment will be recalculated.
And totally agree with your suggestion that make 2 separate APIs. This also
helps clean the javadoc for parameters.
I will do it. Thanks for the comment.
---