in src/main/java/com/uber/cadence/internal/testservice/TestWorkflowService.java [230:275]
StartWorkflowExecutionResponse startWorkflowExecutionImpl(
StartWorkflowExecutionRequest startRequest,
int backoffStartIntervalInSeconds,
Optional<TestWorkflowMutableState> parent,
OptionalLong parentChildInitiatedEventId,
Optional<SignalWorkflowExecutionRequest> signalWithStartSignal)
throws BadRequestError, WorkflowExecutionAlreadyStartedError, InternalServiceError {
String requestWorkflowId = requireNotNull("WorkflowId", startRequest.getWorkflowId());
String domain = requireNotNull("Domain", startRequest.getDomain());
WorkflowId workflowId = new WorkflowId(domain, requestWorkflowId);
TestWorkflowMutableState existing;
lock.lock();
try {
existing = executionsByWorkflowId.get(workflowId);
if (existing != null) {
Optional<WorkflowExecutionCloseStatus> statusOptional = existing.getCloseStatus();
WorkflowIdReusePolicy policy =
startRequest.isSetWorkflowIdReusePolicy()
? startRequest.getWorkflowIdReusePolicy()
: WorkflowIdReusePolicy.AllowDuplicateFailedOnly;
if (!statusOptional.isPresent() || policy == WorkflowIdReusePolicy.RejectDuplicate) {
return throwDuplicatedWorkflow(startRequest, existing);
}
WorkflowExecutionCloseStatus status = statusOptional.get();
if (policy == WorkflowIdReusePolicy.AllowDuplicateFailedOnly
&& (status == WorkflowExecutionCloseStatus.COMPLETED
|| status == WorkflowExecutionCloseStatus.CONTINUED_AS_NEW)) {
return throwDuplicatedWorkflow(startRequest, existing);
}
}
RetryPolicy retryPolicy = startRequest.getRetryPolicy();
Optional<RetryState> retryState = newRetryStateLocked(retryPolicy);
return startWorkflowExecutionNoRunningCheckLocked(
startRequest,
Optional.empty(),
retryState,
backoffStartIntervalInSeconds,
null,
parent,
parentChildInitiatedEventId,
signalWithStartSignal,
workflowId);
} finally {
lock.unlock();
}
}