Package com.netflix.exhibitor.core.automanage

Source Code of com.netflix.exhibitor.core.automanage.FixedEnsembleBuilder

package com.netflix.exhibitor.core.automanage;

import com.google.common.collect.Lists;
import com.netflix.exhibitor.core.Exhibitor;
import com.netflix.exhibitor.core.activity.ActivityLog;
import com.netflix.exhibitor.core.config.IntConfigs;
import com.netflix.exhibitor.core.state.InstanceStateTypes;
import com.netflix.exhibitor.core.state.ServerList;
import com.netflix.exhibitor.core.state.ServerSpec;
import com.netflix.exhibitor.core.state.ServerType;
import com.netflix.exhibitor.core.state.UsState;
import java.util.List;
import java.util.Map;

class FixedEnsembleBuilder implements EnsembleBuilder
{
    private final Exhibitor exhibitor;
    private final ClusterState clusterState;
    private final UsState usState;
    private final int fixedEnsembleSize;

    FixedEnsembleBuilder(Exhibitor exhibitor, ClusterState clusterState)
    {
        this.exhibitor = exhibitor;
        this.clusterState = clusterState;
        usState = new UsState(exhibitor);
        fixedEnsembleSize = exhibitor.getConfigManager().getConfig().getInt(IntConfigs.AUTO_MANAGE_INSTANCES_FIXED_ENSEMBLE_SIZE);
    }

    @SuppressWarnings("SimplifiableIfStatement")
    @Override
    public boolean newEnsembleNeeded()
    {
        if ( (usState.getUs() != null) )
        {
            // we're in the ensemble - nothing to do
            return false;
        }

        if ( clusterState.getConfiguredServerList().getSpecs().size() < fixedEnsembleSize )
        {
            return true;    // there's room, we can add ourselves in
        }

        if ( !clusterState.hasDeadInstances() )
        {
            exhibitor.getLog().add(ActivityLog.Type.INFO, "Cannot add this instance to the ensemble as the ensemble is at the configured fixed ensemble size.");
            return false;
        }

        return true;
    }

    @Override
    public ServerList createPotentialServerList()
    {
        ServerList configuredServerList = clusterState.getConfiguredServerList();
        Map<ServerSpec, InstanceStateTypes> statusMap = clusterState.buildStatusMap();

        List<ServerSpec>        newList = Lists.newArrayList();
        for ( ServerSpec spec : configuredServerList.getSpecs() )
        {
            if ( statusMap.get(spec) != InstanceStateTypes.DOWN )
            {
                newList.add(spec);
            }
        }
        if ( newList.size() >= fixedEnsembleSize )
        {
            return configuredServerList;    // no room for us
        }

        int                 standardTypeCount = 0;
        for ( ServerSpec spec : newList )
        {
            if ( spec.getServerType() == ServerType.STANDARD )
            {
                ++standardTypeCount;
            }
        }

        int observerThreshold = exhibitor.getConfigManager().getConfig().getInt(IntConfigs.OBSERVER_THRESHOLD);
        ServerType serverType = ((observerThreshold > 0) && (standardTypeCount >= observerThreshold)) ? ServerType.OBSERVER : ServerType.STANDARD;

        int existingMaxId = FlexibleEnsembleBuilder.getExistingMaxId(configuredServerList);
        ServerSpec us = new ServerSpec(exhibitor.getThisJVMHostname(), existingMaxId + 1, serverType);
        newList.add(us);

        return new ServerList(newList);
    }
}
TOP

Related Classes of com.netflix.exhibitor.core.automanage.FixedEnsembleBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.