int consecutiveFailures(StateData data, Optional<Integer> exitCode) { return exitCode.map(c -> { switch (c) { case SUCCESS_EXIT_CODE: case MISSING_DEPS_EXIT_CODE: return 0; default: return data.consecutiveFailures() + 1; } }).orElse(data.consecutiveFailures() + 1); }
private void checkRetry(RunState state) { final WorkflowInstance workflowInstance = state.workflowInstance(); if (state.data().retryCost() < MAX_RETRY_COST) { final Optional<Integer> exitCode = state.data().lastExit(); if (shouldFailFast(exitCode)) { stateManager.receiveIgnoreClosed(Event.stop(workflowInstance)); } else { final long delayMillis; if (isMissingDependency(exitCode)) { delayMillis = Duration.ofMinutes(MISSING_DEPS_RETRY_DELAY_MINUTES).toMillis(); } else { delayMillis = retryUtil.calculateDelay(state.data().consecutiveFailures()).toMillis(); } stateManager.receiveIgnoreClosed(Event.retryAfter(workflowInstance, delayMillis)); } } else { stateManager.receiveIgnoreClosed(Event.stop(workflowInstance)); } }
@Override public RunState runError(WorkflowInstance workflowInstance, String message) { switch (state()) { case QUEUED: case SUBMITTING: case SUBMITTED: case RUNNING: case PREPARE: final StateData newStateData = data().builder() .retryCost(data().retryCost() + FAILURE_COST) .lastExit(empty()) .consecutiveFailures(data().consecutiveFailures() + 1) .messages(Message.error(message)) .build(); return state(FAILED, newStateData); default: throw illegalTransition("runError"); } }
.set(PROPERTY_STATE_TIMESTAMP, state.timestamp()) .set(PROPERTY_STATE_TRIES, state.data().tries()) .set(PROPERTY_STATE_CONSECUTIVE_FAILURES, state.data().consecutiveFailures()) .set(PROPERTY_STATE_RETRY_COST, state.data().retryCost())