@Override public Service createServiceInstance() { return new ClosureService(driverRegistry, maintenanceTimeout); }
private void processMaintenance(Operation op, Closure closure, ClosureDescription taskDef) { if (closure == null) { logWarning("Skip maintenance call..."); return; } if (isTaskExpired(closure, taskDef)) { completeCancelTask(taskDef, closure); } op.complete(); }
protected void updateRequestStatus(Closure closure) { ClosureTaskState state = fromClosure(closure); String requestStatusLink = ManagementUriParts.REQUEST_STATUS + "/" + getSelfId(); sendRequest(Operation .createGet(getHost(), requestStatusLink) .setCompletion((op, ex) -> { if (ex != null) { if (op.getStatusCode() == 404) { createRequestTracker(state); } else { logWarning("Unable to update request status for:" + closure .documentSelfLink, ex); } } else { state.requestTrackerLink = requestStatusLink; updateRequestTracker(state, ClosureProps.RETRIES_COUNT); } })); }
private void completeCancelTask(ClosureDescription closureDesc, Closure closure) { String errorMsg = "Configured timeout of [%s] seconds has expired. Closure %s is" + " cancelled."; logInfo(errorMsg, closureDesc.resources.timeoutSeconds, closure.documentSelfLink); closure.state = TaskStage.CANCELLED; closure.errorMsg = String.format(errorMsg, closureDesc.resources.timeoutSeconds, closure.documentSelfLink); closure.endTimeMillis = System.currentTimeMillis(); sendSelfPatch(closure); getExecutionDriver(closureDesc) .cleanClosure(closure, (error) -> logWarning("Unable to clean resources for %s", closure.documentSelfLink)); }
private void handleStateChanged(Closure closure) { fetchLogs(closure, () -> { }); if (isDone(closure)) { sendRequest(Operation .createGet(this, closure.descriptionLink) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to fetch definition of closure: %s. Reason: %s", closure.documentSelfLink, Utils.toString(ex)); } else { ClosureDescription closureDesc = op.getBody(ClosureDescription.class); getHost().schedule(() -> fetchLogs(closure, () -> { if (!ClosureProps.IS_KEEP_ON_COMPLETION_ON && closure.state != TaskStage.CANCELLED) { logInfo("Cleaning execution container for closure: %s", closure.documentSelfLink); getExecutionDriver(closureDesc).cleanClosure(closure, (error) -> logWarning( "Unable to clean resources for %s", closure.documentSelfLink)); && closureDesc.notifyUrl.length() > 0) { callWebhook(closureDesc.notifyUrl, closure); notifyCallerService(closure);
protected void updateRequestTracker(ClosureTaskState state, int retryCount) { if (state != null && state.requestTrackerLink != null) { sendRequest(Operation .createPatch(this, state.requestTrackerLink) .setBody(fromTask(state)) .setCompletion((o, ex) -> { if (ex != null) { logFine("CancellationException: Failed to update request tracker:" + " %s", state.requestTrackerLink); || TaskStage.FAILED.name().equals(state.taskInfo.stage.name()) && retryCount > 0) { getHost().schedule( () -> updateRequestTracker(state, retryCount - 1), QueryUtil.QUERY_RETRY_INTERVAL_MILLIS, TimeUnit.MILLISECONDS); } else { logWarning("Failed to update request tracker: %s. Error: %s", state.requestTrackerLink, Utils.toString(ex)); logFine("Task doesn't have a requestTrackerLink set: %s ", state.documentSelfLink);
@Override public void handlePeriodicMaintenance(Operation post) { if (getProcessingStage() != ProcessingStage.AVAILABLE) { logWarning("Skipping maintenance since service is not available: %s ", getUri()); return; } sendRequest(Operation .createGet(getUri()) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to fetch closure state. Reason: %s", ex.getMessage()); post.fail(new Exception("Unable to fetch closure state.")); } else { Closure closure = op.getBody(Closure.class); handleMaintenance(post, closure); } })); }
private void createRequestTracker(ClosureTaskState state) { sendRequest(Operation.createPost(this, ManagementUriParts.REQUEST_STATUS) .setBodyNoCloning(fromTask(state)) .setCompletion((o, e) -> { if (e != null) { logWarning("Failed to create request tracker for: " + state.documentSelfLink, e); return; } state.requestTrackerLink = o.getBody(TaskStatusState.class).documentSelfLink; logInfo("Created request tracker: %s", state.requestTrackerLink); updateRequestTracker(state, ClosureProps.RETRIES_COUNT); })); }
private void handleReadyState(Operation op, Closure closure, ClosureDescription closureDesc) { ExecutionDriver execDriver = getExecutionDriver(closureDesc); if (execDriver == null) { logWarning("No exec driver found"); op.fail(new Exception("No execution driver available.")); return; } sendSelfPatch(closure); String token = getToken(op); execDriver.executeClosure(closure, closureDesc, token, (error) -> { if (error != null) { closure.state = TaskStage.FAILED; closure.errorMsg = error.getMessage(); sendSelfPatch(closure); } }); this.setState(op, closure); op.setBody(closure).complete(); }