@Override protected void handleExpiringObject(SingularityExpiringBounce expiringObject, SingularityRequestWithState requestWithState, String message) { for (SingularityTaskCleanup taskCleanup : taskManager.getCleanupTasks()) { if (taskCleanup.getTaskId().getRequestId().equals(expiringObject.getRequestId()) && taskCleanup.getActionId().isPresent() && expiringObject.getActionId().equals(taskCleanup.getActionId().get())) { LOG.info("Discarding cleanup for {} ({}) because of {}", taskCleanup.getTaskId(), taskCleanup, expiringObject); taskManager.deleteCleanupTask(taskCleanup.getTaskId().getId()); if (!taskManager.getTaskCleanup(taskCleanup.getTaskId().getId()).isPresent()) { LOG.info("No other task cleanups found, removing task cleanup update for {}", taskCleanup.getTaskId()); List<SingularityTaskHistoryUpdate> historyUpdates = taskManager.getTaskHistoryUpdates(taskCleanup.getTaskId()); Collections.sort(historyUpdates); if (Iterables.getLast(historyUpdates).getTaskState() == ExtendedTaskState.TASK_CLEANING) { Optional<SingularityTaskHistoryUpdate> maybePreviousHistoryUpdate = historyUpdates.size() > 1 ? Optional.of(historyUpdates.get(historyUpdates.size() - 2)) : Optional.<SingularityTaskHistoryUpdate>absent(); taskManager.deleteTaskHistoryUpdate(taskCleanup.getTaskId(), ExtendedTaskState.TASK_CLEANING, maybePreviousHistoryUpdate); } } } } Optional<SingularityPendingRequest> pendingRequest = requestManager.getPendingRequest(expiringObject.getRequestId(), expiringObject.getDeployId()); if (pendingRequest.isPresent() && pendingRequest.get().getActionId().isPresent() && pendingRequest.get().getActionId().get().equals(expiringObject.getActionId())) { LOG.info("Discarding pending request for {} ({}) because of {}", expiringObject.getRequestId(), pendingRequest.get(), expiringObject); requestManager.deletePendingRequest(pendingRequest.get()); } requestManager.addToPendingQueue(new SingularityPendingRequest(expiringObject.getRequestId(), expiringObject.getDeployId(), System.currentTimeMillis(), expiringObject.getUser(), PendingType.CANCEL_BOUNCE, Optional.absent(), Optional.absent(), Optional.absent(), Optional.of(message), Optional.of(expiringObject.getActionId()))); }
obsoleteRequests.getAndIncrement(); for (SingularityPendingRequest pendingRequest : pendingRequestsForDeploy) { requestManager.deletePendingRequest(pendingRequest); LOG.debug("Pending request {} was obsolete (request {})", pendingRequest, SingularityRequestWithState.getRequestState(maybeRequest)); obsoleteRequests.getAndIncrement(); requestManager.deletePendingRequest(pendingRequest); continue; scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.IMMEDIATE) { effectivePendingRequests.add(pendingRequest); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.ONEOFF) { effectivePendingRequests.add(pendingRequest); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (updatedRequest.isScheduled() && (pendingRequest.getPendingType() == PendingType.NEW_DEPLOY requestManager.deletePendingRequest(pendingRequest);
System.out.println(curator.getChildren().forPath("/requests/pending")); requestManager.deletePendingRequest(newDeploy); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed, non-timestamped nodes can be deleted") .contains(oneOffRequest.toString(), immediateRequest.toString()); requestManager.deletePendingRequest(oneOffRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed immediate (i.e., run-now scheduled without a runId) nodes can be deleted") .contains(immediateRequest.toString()); requestManager.deletePendingRequest(immediateRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Renamed one-off (i.e., run-now on-demand) nodes can be deleted")
System.out.println(curator.getChildren().forPath("/requests/pending")); requestManager.deletePendingRequest(newDeploy); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed, non-timestamped nodes can be deleted") .contains(oneOffRequest.toString(), immediateRequest.toString()); requestManager.deletePendingRequest(oneOffRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed timestamped nodes can be deleted") .contains(immediateRequest.toString()); requestManager.deletePendingRequest(immediateRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Renamed nodes can be deleted")
@Test public void testImmediateRequestsAreConsistentlyDeleted() { long now = System.currentTimeMillis(); initRequestWithType(RequestType.SCHEDULED, false); startFirstDeploy(); SingularityPendingRequest pendingDeployRequest = new SingularityPendingRequest(requestId, firstDeploy.getId(), now, Optional.absent(), PendingType.NEW_DEPLOY, firstDeploy.getSkipHealthchecksOnDeploy(), Optional.absent()); SingularityPendingRequest pendingRunNowRequest = new SingularityPendingRequest(requestId, firstDeploy.getId(), now + 200, Optional.absent(), PendingType.IMMEDIATE, firstDeploy.getSkipHealthchecksOnDeploy(), Optional.absent()); requestManager.addToPendingQueue(pendingDeployRequest); requestManager.addToPendingQueue(pendingRunNowRequest); // Pending queue has two requests: NEW_DEPLOY & IMMEDIATE Assert.assertEquals(2, requestManager.getPendingRequests().size()); finishNewTaskChecks(); requestManager.deletePendingRequest(pendingDeployRequest); // Just the immediate run Assert.assertEquals(1, requestManager.getPendingRequests().size()); requestManager.deletePendingRequest(pendingRunNowRequest); // Immediate run was successfully deleted Assert.assertEquals(0, requestManager.getPendingRequests().size()); }
@Override protected void handleExpiringObject(SingularityExpiringBounce expiringObject, SingularityRequestWithState requestWithState, String message) { for (SingularityTaskCleanup taskCleanup : taskManager.getCleanupTasks()) { if (taskCleanup.getTaskId().getRequestId().equals(expiringObject.getRequestId()) && taskCleanup.getActionId().isPresent() && expiringObject.getActionId().equals(taskCleanup.getActionId().get())) { LOG.info("Discarding cleanup for {} ({}) because of {}", taskCleanup.getTaskId(), taskCleanup, expiringObject); taskManager.deleteCleanupTask(taskCleanup.getTaskId().getId()); if (!taskManager.getTaskCleanup(taskCleanup.getTaskId().getId()).isPresent()) { LOG.info("No other task cleanups found, removing task cleanup update for {}", taskCleanup.getTaskId()); List<SingularityTaskHistoryUpdate> historyUpdates = taskManager.getTaskHistoryUpdates(taskCleanup.getTaskId()); Collections.sort(historyUpdates); if (Iterables.getLast(historyUpdates).getTaskState() == ExtendedTaskState.TASK_CLEANING) { Optional<SingularityTaskHistoryUpdate> maybePreviousHistoryUpdate = historyUpdates.size() > 1 ? Optional.of(historyUpdates.get(historyUpdates.size() - 2)) : Optional.<SingularityTaskHistoryUpdate>absent(); taskManager.deleteTaskHistoryUpdate(taskCleanup.getTaskId(), ExtendedTaskState.TASK_CLEANING, maybePreviousHistoryUpdate); } } } } Optional<SingularityPendingRequest> pendingRequest = requestManager.getPendingRequest(expiringObject.getRequestId(), expiringObject.getDeployId()); if (pendingRequest.isPresent() && pendingRequest.get().getActionId().isPresent() && pendingRequest.get().getActionId().get().equals(expiringObject.getActionId())) { LOG.info("Discarding pending request for {} ({}) because of {}", expiringObject.getRequestId(), pendingRequest.get(), expiringObject); requestManager.deletePendingRequest(pendingRequest.get()); } requestManager.addToPendingQueue(new SingularityPendingRequest(expiringObject.getRequestId(), expiringObject.getDeployId(), System.currentTimeMillis(), expiringObject.getUser(), PendingType.CANCEL_BOUNCE, Optional.absent(), Optional.absent(), Optional.absent(), Optional.of(message), Optional.of(expiringObject.getActionId()))); }
obsoleteRequests.getAndIncrement(); for (SingularityPendingRequest pendingRequest : pendingRequestsForDeploy) { requestManager.deletePendingRequest(pendingRequest); LOG.debug("Pending request {} was obsolete (request {})", pendingRequest, SingularityRequestWithState.getRequestState(maybeRequest)); obsoleteRequests.getAndIncrement(); requestManager.deletePendingRequest(pendingRequest); continue; scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.IMMEDIATE) { effectivePendingRequests.add(pendingRequest); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (pendingRequest.getPendingType() == PendingType.ONEOFF) { effectivePendingRequests.add(pendingRequest); scheduledTasks += scheduleTasks(request.getRequest(), requestState, deployStatistics, pendingRequest, matchingTaskIds, maybePendingDeploy); requestManager.deletePendingRequest(pendingRequest); } else if (updatedRequest.isScheduled() && (pendingRequest.getPendingType() == PendingType.NEW_DEPLOY requestManager.deletePendingRequest(pendingRequest);
System.out.println(curator.getChildren().forPath("/requests/pending")); requestManager.deletePendingRequest(newDeploy); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed, non-timestamped nodes can be deleted") .contains(oneOffRequest.toString(), immediateRequest.toString()); requestManager.deletePendingRequest(oneOffRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed immediate (i.e., run-now scheduled without a runId) nodes can be deleted") .contains(immediateRequest.toString()); requestManager.deletePendingRequest(immediateRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Renamed one-off (i.e., run-now on-demand) nodes can be deleted")
System.out.println(curator.getChildren().forPath("/requests/pending")); requestManager.deletePendingRequest(newDeploy); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed, non-timestamped nodes can be deleted") .contains(oneOffRequest.toString(), immediateRequest.toString()); requestManager.deletePendingRequest(oneOffRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Non-renamed timestamped nodes can be deleted") .contains(immediateRequest.toString()); requestManager.deletePendingRequest(immediateRequest); Assertions.assertThat(requestManager.getPendingRequests()) .as("Renamed nodes can be deleted")
@Test public void testImmediateRequestsAreConsistentlyDeleted() { long now = System.currentTimeMillis(); initRequestWithType(RequestType.SCHEDULED, false); startFirstDeploy(); SingularityPendingRequest pendingDeployRequest = new SingularityPendingRequest(requestId, firstDeploy.getId(), now, Optional.absent(), PendingType.NEW_DEPLOY, firstDeploy.getSkipHealthchecksOnDeploy(), Optional.absent()); SingularityPendingRequest pendingRunNowRequest = new SingularityPendingRequest(requestId, firstDeploy.getId(), now + 200, Optional.absent(), PendingType.IMMEDIATE, firstDeploy.getSkipHealthchecksOnDeploy(), Optional.absent()); requestManager.addToPendingQueue(pendingDeployRequest); requestManager.addToPendingQueue(pendingRunNowRequest); // Pending queue has two requests: NEW_DEPLOY & IMMEDIATE Assert.assertEquals(2, requestManager.getPendingRequests().size()); finishNewTaskChecks(); requestManager.deletePendingRequest(pendingDeployRequest); // Just the immediate run Assert.assertEquals(1, requestManager.getPendingRequests().size()); requestManager.deletePendingRequest(pendingRunNowRequest); // Immediate run was successfully deleted Assert.assertEquals(0, requestManager.getPendingRequests().size()); }