Search in sources :

Example 1 with MachineState

use of com.hubspot.singularity.MachineState in project Singularity by HubSpot.

the class SingularitySlaveAndRackManager method slaveLost.

void slaveLost(AgentID slaveIdObj) {
    final String slaveId = slaveIdObj.getValue();
    Optional<SingularitySlave> slave = slaveManager.getObject(slaveId);
    if (slave.isPresent()) {
        MachineState previousState = slave.get().getCurrentState().getState();
        slaveManager.changeState(slave.get(), MachineState.DEAD, Optional.absent(), Optional.absent());
        if (configuration.getDisasterDetection().isEnabled()) {
            updateDisasterCounter(previousState);
        }
        checkRackAfterSlaveLoss(slave.get());
    } else {
        LOG.warn("Lost a slave {}, but didn't know about it", slaveId);
    }
}
Also used : SingularitySlave(com.hubspot.singularity.SingularitySlave) MachineState(com.hubspot.singularity.MachineState)

Example 2 with MachineState

use of com.hubspot.singularity.MachineState in project Singularity by HubSpot.

the class SingularityScheduler method checkForDecomissions.

@Timed
public void checkForDecomissions() {
    final long start = System.currentTimeMillis();
    final Map<String, Optional<String>> requestIdsToUserToReschedule = Maps.newHashMap();
    final Set<SingularityTaskId> matchingTaskIds = Sets.newHashSet();
    final Collection<SingularityTaskId> activeTaskIds = leaderCache.getActiveTaskIds();
    final Map<SingularitySlave, MachineState> slaves = getDefaultMap(slaveManager.getObjectsFiltered(MachineState.STARTING_DECOMMISSION));
    for (SingularitySlave slave : slaves.keySet()) {
        boolean foundTask = false;
        for (SingularityTask activeTask : taskManager.getTasksOnSlave(activeTaskIds, slave)) {
            cleanupTaskDueToDecomission(requestIdsToUserToReschedule, matchingTaskIds, activeTask, slave);
            foundTask = true;
        }
        if (!foundTask) {
            slaves.put(slave, MachineState.DECOMMISSIONED);
        }
    }
    final Map<SingularityRack, MachineState> racks = getDefaultMap(rackManager.getObjectsFiltered(MachineState.STARTING_DECOMMISSION));
    for (SingularityRack rack : racks.keySet()) {
        final String sanitizedRackId = JavaUtils.getReplaceHyphensWithUnderscores(rack.getId());
        boolean foundTask = false;
        for (SingularityTaskId activeTaskId : activeTaskIds) {
            if (sanitizedRackId.equals(activeTaskId.getSanitizedRackId())) {
                foundTask = true;
            }
            if (matchingTaskIds.contains(activeTaskId)) {
                continue;
            }
            if (sanitizedRackId.equals(activeTaskId.getSanitizedRackId())) {
                Optional<SingularityTask> maybeTask = taskManager.getTask(activeTaskId);
                cleanupTaskDueToDecomission(requestIdsToUserToReschedule, matchingTaskIds, maybeTask.get(), rack);
            }
        }
        if (!foundTask) {
            racks.put(rack, MachineState.DECOMMISSIONED);
        }
    }
    for (Entry<String, Optional<String>> requestIdAndUser : requestIdsToUserToReschedule.entrySet()) {
        final String requestId = requestIdAndUser.getKey();
        LOG.trace("Rescheduling request {} due to decomissions", requestId);
        Optional<String> maybeDeployId = deployManager.getInUseDeployId(requestId);
        if (maybeDeployId.isPresent()) {
            requestManager.addToPendingQueue(new SingularityPendingRequest(requestId, maybeDeployId.get(), start, requestIdAndUser.getValue(), PendingType.DECOMISSIONED_SLAVE_OR_RACK, Optional.<Boolean>absent(), Optional.<String>absent()));
        } else {
            LOG.warn("Not rescheduling a request ({}) because of no active deploy", requestId);
        }
    }
    changeState(slaves, slaveManager);
    changeState(racks, rackManager);
    if (slaves.isEmpty() && racks.isEmpty() && requestIdsToUserToReschedule.isEmpty() && matchingTaskIds.isEmpty()) {
        LOG.trace("Decomission check found nothing");
    } else {
        LOG.info("Found {} decomissioning slaves, {} decomissioning racks, rescheduling {} requests and scheduling {} tasks for cleanup in {}", slaves.size(), racks.size(), requestIdsToUserToReschedule.size(), matchingTaskIds.size(), JavaUtils.duration(start));
    }
}
Also used : Optional(com.google.common.base.Optional) SingularityPendingRequest(com.hubspot.singularity.SingularityPendingRequest) SingularityRack(com.hubspot.singularity.SingularityRack) SingularitySlave(com.hubspot.singularity.SingularitySlave) SingularityTask(com.hubspot.singularity.SingularityTask) SingularityTaskId(com.hubspot.singularity.SingularityTaskId) MachineState(com.hubspot.singularity.MachineState) Timed(com.codahale.metrics.annotation.Timed)

Example 3 with MachineState

use of com.hubspot.singularity.MachineState in project Singularity by HubSpot.

the class SingularityValidator method validateExpiringMachineStateChange.

public void validateExpiringMachineStateChange(Optional<SingularityMachineChangeRequest> maybeChangeRequest, MachineState currentState, Optional<SingularityExpiringMachineState> currentExpiringObject) {
    if (!maybeChangeRequest.isPresent() || !maybeChangeRequest.get().getDurationMillis().isPresent()) {
        return;
    }
    SingularityMachineChangeRequest changeRequest = maybeChangeRequest.get();
    checkBadRequest(changeRequest.getRevertToState().isPresent(), "Must include a machine state to revert to for an expiring machine state change");
    MachineState newState = changeRequest.getRevertToState().get();
    checkConflict(!currentExpiringObject.isPresent(), "A current expiring object already exists, delete it first");
    checkBadRequest(!(newState == MachineState.STARTING_DECOMMISSION && currentState.isDecommissioning()), "Cannot start decommission when it has already been started");
    checkBadRequest(!(((newState == MachineState.DECOMMISSIONING) || (newState == MachineState.DECOMMISSIONED)) && (currentState == MachineState.FROZEN)), "Cannot transition from FROZEN to DECOMMISSIONING or DECOMMISSIONED");
    checkBadRequest(!(((newState == MachineState.DECOMMISSIONING) || (newState == MachineState.DECOMMISSIONED)) && (currentState == MachineState.ACTIVE)), "Cannot transition from ACTIVE to DECOMMISSIONING or DECOMMISSIONED");
    checkBadRequest(!(newState == MachineState.FROZEN && currentState.isDecommissioning()), "Cannot transition from a decommissioning state to FROZEN");
    List<MachineState> systemOnlyStateTransitions = ImmutableList.of(MachineState.DEAD, MachineState.MISSING_ON_STARTUP, MachineState.DECOMMISSIONING);
    checkBadRequest(!systemOnlyStateTransitions.contains(newState), "States {} are reserved for system usage, you cannot manually transition to {}", systemOnlyStateTransitions, newState);
    checkBadRequest(!(newState == MachineState.DECOMMISSIONED && !changeRequest.isKillTasksOnDecommissionTimeout()), "Must specify that all tasks on slave get killed if transitioning to DECOMMISSIONED state");
}
Also used : SingularityMachineChangeRequest(com.hubspot.singularity.api.SingularityMachineChangeRequest) SingularityExpiringMachineState(com.hubspot.singularity.expiring.SingularityExpiringMachineState) MachineState(com.hubspot.singularity.MachineState)

Example 4 with MachineState

use of com.hubspot.singularity.MachineState in project Singularity by HubSpot.

the class AbstractMachineManager method clearExpiringStateChangeIfInvalid.

private void clearExpiringStateChangeIfInvalid(T object, MachineState newState) {
    Optional<SingularityExpiringMachineState> maybeExpiring = getExpiringObject(object.getId());
    if (!maybeExpiring.isPresent()) {
        return;
    }
    MachineState targetExpiringState = maybeExpiring.get().getRevertToState();
    Optional<StateChangeResult> maybeInvalidStateChange = getInvalidStateChangeResult(newState, targetExpiringState, true);
    if (maybeInvalidStateChange.isPresent()) {
        LOG.info("Cannot complete expiring state transition from {} to {}, removing expiring action for {}", newState, targetExpiringState, object.getId());
        deleteExpiringObject(object.getId());
    }
}
Also used : SingularityExpiringMachineState(com.hubspot.singularity.expiring.SingularityExpiringMachineState) MachineState(com.hubspot.singularity.MachineState) SingularityExpiringMachineState(com.hubspot.singularity.expiring.SingularityExpiringMachineState)

Example 5 with MachineState

use of com.hubspot.singularity.MachineState in project Singularity by HubSpot.

the class SingularitySlaveAndRackManager method check.

private <T extends SingularityMachineAbstraction<T>> CheckResult check(T object, AbstractMachineManager<T> manager) {
    Optional<T> existingObject = manager.getObject(object.getId());
    if (!existingObject.isPresent()) {
        manager.saveObject(object);
        return CheckResult.NEW;
    }
    MachineState currentState = existingObject.get().getCurrentState().getState();
    switch(currentState) {
        case ACTIVE:
            return CheckResult.ALREADY_ACTIVE;
        case DEAD:
        case MISSING_ON_STARTUP:
            manager.changeState(object.getId(), MachineState.ACTIVE, Optional.absent(), Optional.absent());
            return CheckResult.NEW;
        case FROZEN:
        case DECOMMISSIONED:
        case DECOMMISSIONING:
        case STARTING_DECOMMISSION:
            return CheckResult.NOT_ACCEPTING_TASKS;
    }
    throw new IllegalStateException(String.format("Invalid state %s for %s", currentState, object.getId()));
}
Also used : MachineState(com.hubspot.singularity.MachineState)

Aggregations

MachineState (com.hubspot.singularity.MachineState)6 SingularitySlave (com.hubspot.singularity.SingularitySlave)2 SingularityTask (com.hubspot.singularity.SingularityTask)2 SingularityTaskId (com.hubspot.singularity.SingularityTaskId)2 SingularityExpiringMachineState (com.hubspot.singularity.expiring.SingularityExpiringMachineState)2 Timed (com.codahale.metrics.annotation.Timed)1 Optional (com.google.common.base.Optional)1 SingularityPendingRequest (com.hubspot.singularity.SingularityPendingRequest)1 SingularityPendingTask (com.hubspot.singularity.SingularityPendingTask)1 SingularityPendingTaskId (com.hubspot.singularity.SingularityPendingTaskId)1 SingularityRack (com.hubspot.singularity.SingularityRack)1 SlavePlacement (com.hubspot.singularity.SlavePlacement)1 SingularityMachineChangeRequest (com.hubspot.singularity.api.SingularityMachineChangeRequest)1