Github user mcvsubbu commented on a diff in the pull request:

    https://github.com/apache/helix/pull/145#discussion_r174314122
  
    --- 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 --
    
    instead of option, can we call it 'mode'? Also, it is not clear where we 
specify new partitions to be assigned. "INIT" also seems to be misleading. Why 
not "KEEP"? If "INIT" is specified, then is it true that the existing 
assignments will not be moved? if "REASSIGN" is specified, is it true that the 
algorithm will try not to move existing assignments,  but may do so?


---

Reply via email to