@Override protected void handleExpiringObject(SingularityExpiringPause expiringObject, SingularityRequestWithState requestWithState, String message) { if (requestWithState.getState() != RequestState.PAUSED) { LOG.warn("Discarding {} because request {} is in state {}", expiringObject, requestWithState.getRequest().getId(), requestWithState.getState()); return; } LOG.info("Unpausing request {} because of {}", requestWithState.getRequest().getId(), expiringObject); requestHelper.unpause(requestWithState.getRequest(), expiringObject.getUser(), Optional.of(message), Optional.absent()); }
public SingularityRequestParent unpause(String requestId, Optional<SingularityUnpauseRequest> unpauseRequest, SingularityUser user) { SingularityRequestWithState requestWithState = fetchRequestWithState(requestId, user); authorizationHelper.checkForAuthorization(requestWithState.getRequest(), user, SingularityAuthorizationScope.WRITE); checkConflict(requestWithState.getState() == RequestState.PAUSED, "Request %s is not in PAUSED state, it is in %s", requestId, requestWithState.getState()); Optional<String> message = Optional.absent(); Optional<Boolean> skipHealthchecks = Optional.absent(); if (unpauseRequest.isPresent()) { message = unpauseRequest.get().getMessage(); skipHealthchecks = unpauseRequest.get().getSkipHealthchecks(); } requestManager.deleteExpiringObject(SingularityExpiringPause.class, requestId); final long now = requestHelper.unpause(requestWithState.getRequest(), user.getEmail(), message, skipHealthchecks); return fillEntireRequest(new SingularityRequestWithState(requestWithState.getRequest(), RequestState.ACTIVE, now)); }
private void failPendingDeployDueToState(SingularityPendingDeploy pendingDeploy, Optional<SingularityRequestWithState> maybeRequestWithState, Optional<SingularityDeploy> deploy) { SingularityDeployResult deployResult = new SingularityDeployResult(DeployState.FAILED, Optional.of(String.format("Request in state %s is not deployable", SingularityRequestWithState.getRequestState(maybeRequestWithState))), Optional.<SingularityLoadBalancerUpdate>absent()); if (!maybeRequestWithState.isPresent()) { deployManager.saveDeployResult(pendingDeploy.getDeployMarker(), deploy, deployResult); removePendingDeploy(pendingDeploy); return; } saveNewDeployState(pendingDeploy.getDeployMarker(), Optional.<SingularityDeployMarker> absent()); finishDeploy(maybeRequestWithState.get(), deploy, pendingDeploy, Collections.<SingularityTaskId>emptyList(), deployResult); }
if (requestWithState.getRequest().isScheduled()) { Optional<String> schedule = requestWithState.getRequest().getSchedule(); Optional<String> quartzSchedule = requestWithState.getRequest().getQuartzSchedule(); Optional<ScheduleType> scheduleType = requestWithState.getRequest().getScheduleType(); LOG.info("Skipping {}, it had schedule type: {}", requestWithState.getRequest().getId(), scheduleType.get()); continue; LOG.info("Skipping {}, assuming it was quartz - it had quartz schedule == schedule {}", requestWithState.getRequest().getId(), schedule.get()); continue; LOG.info("Skipping {}, it had no schedule", requestWithState.getRequest().getId()); continue; newQuartzSchedule = validator.getQuartzScheduleFromCronSchedule(actualSchedule); } catch (WebApplicationException e) { LOG.error("Failed to convert {} ({}) due to {}", requestWithState.getRequest().getId(), actualSchedule, e.getResponse().getEntity()); continue; LOG.info("Skipping {}, migration had no effect {}", requestWithState.getRequest().getId(), newQuartzSchedule); continue; SingularityRequest newRequest = requestWithState.getRequest().toBuilder().setQuartzSchedule(Optional.of(newQuartzSchedule)).build(); requestTranscoder.toBytes(new SingularityRequestWithState(newRequest, requestWithState.getState(), requestWithState.getTimestamp()))); num++; } catch (Throwable t) {
@Override public String apply(@Nonnull SingularityRequestWithState input) { return input.getRequest().getId(); } });
LOG.debug("Pending request {} was obsolete (request {})", requestId, SingularityRequestWithState.getRequestState(maybeRequest)); obsoleteRequests.getAndIncrement(); for (SingularityPendingRequest pendingRequest : pendingRequestsForDeploy) { List<SingularityTaskId> matchingTaskIds = getMatchingTaskIds(request.getRequest(), deployKey); LOG.debug("Pending request {} was obsolete (request {})", pendingRequest, SingularityRequestWithState.getRequestState(maybeRequest)); obsoleteRequests.getAndIncrement(); requestManager.deletePendingRequest(pendingRequest); RequestState requestState = checkCooldown(request.getState(), request.getRequest(), deployStatistics); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.IMMEDIATE) { effectivePendingRequests.add(pendingRequest); RequestState requestState = checkCooldown(request.getState(), request.getRequest(), deployStatistics); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.ONEOFF) { effectivePendingRequests.add(pendingRequest); RequestState requestState = checkCooldown(request.getState(), request.getRequest(), deployStatistics); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest);
@Override public boolean apply(SingularityRequestWithState input) { for (RequestState state : states) { if (input.getState() == state) { return true; } } return false; }
if (!(maybeRequestWithState.isPresent() && maybeRequestWithState.get().getState() == RequestState.FINISHED) && !(configuration.isAllowDeployOfPausedRequests() && maybeRequestWithState.isPresent() && maybeRequestWithState.get().getState() == RequestState.PAUSED) && !SingularityRequestWithState.isActive(maybeRequestWithState)) { LOG.warn("Deploy {} request was {}, removing deploy", pendingDeploy, SingularityRequestWithState.getRequestState(maybeRequestWithState)); final SingularityRequest request = pendingDeploy.getUpdatedRequest().or(requestWithState.getRequest()); getDeployResult(request, requestWithState.getState(), cancelRequest, pendingDeploy, updatePendingDeployRequest, deploy, deployMatchingTasks, allOtherMatchingTasks, inactiveDeployMatchingTasks);
private void checkActiveRequest(SingularityRequestWithState requestWithState, Map<SingularityDeployKey, SingularityPendingTaskId> deployKeyToPendingTaskId, final long timestamp) { final SingularityRequest request = requestWithState.getRequest(); if (request.getRequestType() == RequestType.ON_DEMAND || request.getRequestType() == RequestType.RUN_ONCE) { return; // There's no situation where we'd want to schedule an On Demand or Run Once request at startup, so don't even bother with them. } Optional<SingularityRequestDeployState> requestDeployState = deployManager.getRequestDeployState(request.getId()); if (!requestDeployState.isPresent() || !requestDeployState.get().getActiveDeploy().isPresent()) { LOG.debug("No active deploy for {} - not scheduling on startup", request.getId()); return; } final String activeDeployId = requestDeployState.get().getActiveDeploy().get().getDeployId(); if (request.isScheduled()) { SingularityDeployKey deployKey = new SingularityDeployKey(request.getId(), activeDeployId); SingularityPendingTaskId pendingTaskId = deployKeyToPendingTaskId.get(deployKey); if (pendingTaskId != null && pendingTaskId.getCreatedAt() >= requestWithState.getTimestamp()) { LOG.info("Not rescheduling {} because {} is newer than {}", request.getId(), pendingTaskId, requestWithState.getTimestamp()); return; } } requestManager.addToPendingQueue(new SingularityPendingRequest(request.getId(), activeDeployId, timestamp, Optional.<String> absent(), PendingType.STARTUP, Optional.<Boolean> absent(), Optional.<String> absent())); }
if (SingularityRequestWithState.isActive(requestWithState)) { if (isObsolete(start, requestCleanup.getTimestamp())) { killScheduledTasks = false; killActiveTasks = false; LOG.info("Ignoring {}, because {} is {}", requestCleanup, requestCleanup.getRequestId(), requestWithState.get().getState()); } else { LOG.debug("Waiting on {} (it will expire after {}), because {} is {}", requestCleanup, JavaUtils.durationFromMillis(getObsoleteExpirationTime()), requestCleanup.getRequestId(), requestWithState.get().getState()); return;
public SingularityCreateResult save(SingularityRequest request, RequestState state, RequestHistoryType eventType, long timestamp, Optional<String> user, Optional<String> message) { saveHistory(new SingularityRequestHistory(timestamp, user, eventType, request, message)); leaderCache.putRequest(new SingularityRequestWithState(request, state, timestamp)); return save(getRequestPath(request.getId()), new SingularityRequestWithState(request, state, timestamp), requestTranscoder); }
private boolean isRequestActive(Optional<SingularityRequestWithState> maybeRequestWithState) { return SingularityRequestWithState.isActive(maybeRequestWithState); }
public void cacheRequests(List<SingularityRequestWithState> requests) { requestsMissMeter.mark(); Map<String, SingularityRequestWithState> newRequests = new HashMap<>(requests.size()); for (SingularityRequestWithState request : requests) { newRequests.put(request.getRequest().getId(), request); } cachedRequests = newRequests; lastRequestsCache = System.currentTimeMillis(); }
LOG.warn("Not scheduling a new task, {} is {}", taskId.getRequestId(), SingularityRequestWithState.getRequestState(maybeRequestWithState)); return Optional.absent(); RequestState requestState = maybeRequestWithState.get().getState(); final SingularityRequest request = maybePendingDeploy.isPresent() ? maybePendingDeploy.get().getUpdatedRequest().or(maybeRequestWithState.get().getRequest()) : maybeRequestWithState.get().getRequest();
if (requestWithState.getRequest().isScheduled()) { Optional<String> schedule = requestWithState.getRequest().getSchedule(); Optional<String> quartzSchedule = requestWithState.getRequest().getQuartzSchedule(); Optional<ScheduleType> scheduleType = requestWithState.getRequest().getScheduleType(); LOG.info("Skipping {}, it had schedule type: {}", requestWithState.getRequest().getId(), scheduleType.get()); continue; LOG.info("Skipping {}, assuming it was quartz - it had quartz schedule == schedule {}", requestWithState.getRequest().getId(), schedule.get()); continue; LOG.info("Skipping {}, it had no schedule", requestWithState.getRequest().getId()); continue; newQuartzSchedule = validator.getQuartzScheduleFromCronSchedule(actualSchedule); } catch (WebApplicationException e) { LOG.error("Failed to convert {} ({}) due to {}", requestWithState.getRequest().getId(), actualSchedule, e.getResponse().getEntity()); continue; LOG.info("Skipping {}, migration had no effect {}", requestWithState.getRequest().getId(), newQuartzSchedule); continue; SingularityRequest newRequest = requestWithState.getRequest().toBuilder().setQuartzSchedule(Optional.of(newQuartzSchedule)).build(); requestTranscoder.toBytes(new SingularityRequestWithState(newRequest, requestWithState.getState(), requestWithState.getTimestamp()))); num++; } catch (Throwable t) {
public static String getRequestState(Optional<SingularityRequestWithState> maybeRequestWithState) { if (maybeRequestWithState.isPresent()) { return maybeRequestWithState.get().getState().name(); } return "MISSING"; }
if (!(maybeRequestWithState.isPresent() && maybeRequestWithState.get().getState() == RequestState.FINISHED) && !(configuration.isAllowDeployOfPausedRequests() && maybeRequestWithState.isPresent() && maybeRequestWithState.get().getState() == RequestState.PAUSED) && !SingularityRequestWithState.isActive(maybeRequestWithState)) { LOG.warn("Deploy {} request was {}, removing deploy", pendingDeploy, SingularityRequestWithState.getRequestState(maybeRequestWithState)); final SingularityRequest request = pendingDeploy.getUpdatedRequest().or(requestWithState.getRequest()); getDeployResult(request, requestWithState.getState(), cancelRequest, pendingDeploy, updatePendingDeployRequest, deploy, deployMatchingTasks, allOtherMatchingTasks, inactiveDeployMatchingTasks);
private void checkActiveRequest(SingularityRequestWithState requestWithState, Map<SingularityDeployKey, SingularityPendingTaskId> deployKeyToPendingTaskId, final long timestamp) { final SingularityRequest request = requestWithState.getRequest(); if (request.getRequestType() == RequestType.ON_DEMAND || request.getRequestType() == RequestType.RUN_ONCE) { return; // There's no situation where we'd want to schedule an On Demand or Run Once request at startup, so don't even bother with them. } Optional<SingularityRequestDeployState> requestDeployState = deployManager.getRequestDeployState(request.getId()); if (!requestDeployState.isPresent() || !requestDeployState.get().getActiveDeploy().isPresent()) { LOG.debug("No active deploy for {} - not scheduling on startup", request.getId()); return; } final String activeDeployId = requestDeployState.get().getActiveDeploy().get().getDeployId(); if (request.isScheduled()) { SingularityDeployKey deployKey = new SingularityDeployKey(request.getId(), activeDeployId); SingularityPendingTaskId pendingTaskId = deployKeyToPendingTaskId.get(deployKey); if (pendingTaskId != null && pendingTaskId.getCreatedAt() >= requestWithState.getTimestamp()) { LOG.info("Not rescheduling {} because {} is newer than {}", request.getId(), pendingTaskId, requestWithState.getTimestamp()); return; } } requestManager.addToPendingQueue(new SingularityPendingRequest(request.getId(), activeDeployId, timestamp, Optional.<String> absent(), PendingType.STARTUP, Optional.<Boolean> absent(), Optional.<String> absent())); }
if (SingularityRequestWithState.isActive(requestWithState)) { if (isObsolete(start, requestCleanup.getTimestamp())) { killScheduledTasks = false; killActiveTasks = false; LOG.info("Ignoring {}, because {} is {}", requestCleanup, requestCleanup.getRequestId(), requestWithState.get().getState()); } else { LOG.debug("Waiting on {} (it will expire after {}), because {} is {}", requestCleanup, JavaUtils.durationFromMillis(getObsoleteExpirationTime()), requestCleanup.getRequestId(), requestWithState.get().getState()); return;
public SingularityAuthorizationHelperTest() { requestManager = mock(RequestManager.class); when(requestManager.getRequest(REQUEST_WITH_NO_GROUP.getId())).thenReturn(Optional.of(new SingularityRequestWithState(REQUEST_WITH_NO_GROUP, RequestState.ACTIVE, 0))); when(requestManager.getRequest(REQUEST_WITH_GROUP_A.getId())).thenReturn(Optional.of(new SingularityRequestWithState(REQUEST_WITH_GROUP_A, RequestState.ACTIVE, 0))); when(requestManager.getRequest(REQUEST_WITH_GROUP_B.getId())).thenReturn(Optional.of(new SingularityRequestWithState(REQUEST_WITH_GROUP_B, RequestState.ACTIVE, 0))); }