Search in sources :

Example 1 with MappingCalculator

use of org.apache.helix.controller.rebalancer.internal.MappingCalculator in project helix by apache.

the class BestPossibleStateCalcStage method computeResourceBestPossibleState.

private boolean computeResourceBestPossibleState(ClusterEvent event, ClusterDataCache cache, CurrentStateOutput currentStateOutput, Resource resource, BestPossibleStateOutput output) {
    // for each ideal state
    // read the state model def
    // for each resource
    // get the preference list
    // for each instanceName check if its alive then assign a state
    String resourceName = resource.getResourceName();
    logger.debug("Processing resource:" + resourceName);
    // Ideal state may be gone. In that case we need to get the state model name
    // from the current state
    IdealState idealState = cache.getIdealState(resourceName);
    if (idealState == null) {
        // if ideal state is deleted, use an empty one
        logger.info("resource:" + resourceName + " does not exist anymore");
        idealState = new IdealState(resourceName);
        idealState.setStateModelDefRef(resource.getStateModelDefRef());
    }
    Rebalancer rebalancer = getRebalancer(idealState, resourceName, cache.isMaintenanceModeEnabled());
    MappingCalculator mappingCalculator = getMappingCalculator(rebalancer, resourceName);
    if (rebalancer == null || mappingCalculator == null) {
        logger.error("Error computing assignment for resource " + resourceName + ". no rebalancer found. rebalancer: " + rebalancer + " mappingCaculator: " + mappingCalculator);
    }
    if (rebalancer != null && mappingCalculator != null) {
        if (rebalancer instanceof TaskRebalancer) {
            TaskRebalancer taskRebalancer = TaskRebalancer.class.cast(rebalancer);
            taskRebalancer.setClusterStatusMonitor((ClusterStatusMonitor) event.getAttribute(AttributeName.clusterStatusMonitor.name()));
        }
        ResourceAssignment partitionStateAssignment = null;
        try {
            HelixManager manager = event.getAttribute(AttributeName.helixmanager.name());
            rebalancer.init(manager);
            idealState = rebalancer.computeNewIdealState(resourceName, idealState, currentStateOutput, cache);
            output.setPreferenceLists(resourceName, idealState.getPreferenceLists());
            // Use the internal MappingCalculator interface to compute the final assignment
            // The next release will support rebalancers that compute the mapping from start to finish
            partitionStateAssignment = mappingCalculator.computeBestPossiblePartitionState(cache, idealState, resource, currentStateOutput);
            for (Partition partition : resource.getPartitions()) {
                Map<String, String> newStateMap = partitionStateAssignment.getReplicaMap(partition);
                output.setState(resourceName, partition, newStateMap);
            }
            // Check if calculation is done successfully
            return checkBestPossibleStateCalculation(idealState);
        } catch (Exception e) {
            logger.error("Error computing assignment for resource " + resourceName + ". Skipping.", e);
            // TODO : remove this part after debugging NPE
            StringBuilder sb = new StringBuilder();
            sb.append(String.format("HelixManager is null : %s\n", event.getAttribute("helixmanager") == null));
            sb.append(String.format("Rebalancer is null : %s\n", rebalancer == null));
            sb.append(String.format("Calculated idealState is null : %s\n", idealState == null));
            sb.append(String.format("MappingCaculator is null : %s\n", mappingCalculator == null));
            sb.append(String.format("PartitionAssignment is null : %s\n", partitionStateAssignment == null));
            sb.append(String.format("Output is null : %s\n", output == null));
            logger.error(sb.toString());
        }
    }
    // Exception or rebalancer is not found
    return false;
}
Also used : AutoRebalancer(org.apache.helix.controller.rebalancer.AutoRebalancer) Rebalancer(org.apache.helix.controller.rebalancer.Rebalancer) SemiAutoRebalancer(org.apache.helix.controller.rebalancer.SemiAutoRebalancer) CustomRebalancer(org.apache.helix.controller.rebalancer.CustomRebalancer) MaintenanceRebalancer(org.apache.helix.controller.rebalancer.MaintenanceRebalancer) HelixManager(org.apache.helix.HelixManager) StageException(org.apache.helix.controller.pipeline.StageException) MappingCalculator(org.apache.helix.controller.rebalancer.internal.MappingCalculator)

Aggregations

HelixManager (org.apache.helix.HelixManager)1 StageException (org.apache.helix.controller.pipeline.StageException)1 AutoRebalancer (org.apache.helix.controller.rebalancer.AutoRebalancer)1 CustomRebalancer (org.apache.helix.controller.rebalancer.CustomRebalancer)1 MaintenanceRebalancer (org.apache.helix.controller.rebalancer.MaintenanceRebalancer)1 Rebalancer (org.apache.helix.controller.rebalancer.Rebalancer)1 SemiAutoRebalancer (org.apache.helix.controller.rebalancer.SemiAutoRebalancer)1 MappingCalculator (org.apache.helix.controller.rebalancer.internal.MappingCalculator)1