private void sendTimeout(WorkflowInstance workflowInstance, RunState runState) { LOG.info("Found stale state {} since {} for workflow {}; Issuing a timeout", runState.state(), Instant.ofEpochMilli(runState.timestamp()), workflowInstance); stateManager.receiveIgnoreClosed(Event.timeout(workflowInstance), runState.counter()); } }
private boolean shouldExecute(RunState runState) { if (runState.state() != State.QUEUED) { return false; } final Instant now = time.get(); final Instant deadline = Instant .ofEpochMilli(runState.timestamp()) .plusMillis(runState.data().retryDelayMillis().orElse(0L)); return !deadline.isAfter(now); }
private static boolean hasTimedOut(Optional<Workflow> workflowOpt, RunState runState, Instant instant, Duration timeout) { if (runState.state().isTerminal()) { return false; } final Duration effectiveTimeout = runState.state() == RunState.State.RUNNING ? workflowOpt .flatMap(workflow -> workflow.configuration().runningTimeout()) .orElse(timeout) : timeout; final Duration sanitizedTimeout = effectiveTimeout.compareTo(timeout) < 0 ? effectiveTimeout : timeout; final Instant deadline = Instant .ofEpochMilli(runState.timestamp()) .plus(sanitizedTimeout); return !deadline.isAfter(instant); }
private RunState state(State state, StateData newStateData) { return new AutoValue_RunState( workflowInstance(), state, timestamp(), newStateData, counter()); }
private RunState state(State state) { return new AutoValue_RunState( workflowInstance(), state, timestamp(), data(), counter()); }
.filter(entry -> !timedOutInstances.contains(entry.workflowInstance())) .filter(entry -> shouldExecute(entry.runState())) .sorted(comparingLong(i -> i.runState().timestamp())) .collect(toList());
SequenceEvent.create(event, nextRunState.counter(), nextRunState.timestamp());
private RunStateData getRunStateData(Backfill backfill, Map<WorkflowInstance, RunState> activeWorkflowInstances, Instant instant) { final WorkflowInstance wfi = WorkflowInstance .create(backfill.workflowId(), toParameter(backfill.schedule(), instant)); if (activeWorkflowInstances.containsKey(wfi)) { final RunState state = activeWorkflowInstances.get(wfi); return RunStateData.newBuilder() .workflowInstance(state.workflowInstance()) .state(state.state().name()) .stateData(state.data()) .latestTimestamp(state.timestamp()) .build(); } return ReplayEvents.getBackfillRunStateData(wfi, storage, backfill.id()) .orElse(RunStateData.create(wfi, UNKNOWN, StateData.zero())); } }
private RunStateData runStateToRunStateData(RunState state) { return RunStateData.newBuilder() .workflowInstance(state.workflowInstance()) .state(state.state().name()) .stateData(state.data()) .latestTimestamp(state.timestamp()) .build(); }
.set(PROPERTY_STATE_TIMESTAMP, state.timestamp()) .set(PROPERTY_STATE_TRIES, state.data().tries()) .set(PROPERTY_STATE_CONSECUTIVE_FAILURES, state.data().consecutiveFailures())