conductor-oss/conductor · error · TransientException

Error removing workflow

Error message

Error removing workflow: {}

What it means

Catch-all TransientException thrown by removeWorkflowWithExpiry when any unexpected Exception escapes its body (after recording Monitors.recordDaoError('executionDao','removeWorkflow')). It signals the removal did not complete but is likely retryable — the wrapped exception holds the real cause. Index NotFoundException is handled separately above this catch, so this fires only for other failures.

Solutions

  1. Inspect the wrapped cause in the stack trace to identify the failing store.
  2. If transient (network/timeout), the sweeper or a manual retry will succeed on the next pass — the workflow is still in the DAO.
  3. Check store connectivity, connection-pool sizing, and timeouts.
  4. If it persists, verify the TTL removal is supported by the configured ExecutionDAO implementation.
Defensive patterns

Strategy: retry

Try / catch

try {
    executionDAOFacade.removeWorkflowWithExpiry(workflowId, archive, ttl);
} catch (TransientException e) {
    // underlying store failed; safe to retry, workflow still present in DAO
}

Prevention

When it happens

Trigger: The ExecutionDAO.removeWorkflowWithExpiry or the index removal throws a connectivity/timeout error, or an underlying store returns an unexpected exception during the TTL-based removal path.

Common situations: Database (Redis/Postgres/DynamoDB) temporarily unreachable during a sweep. A lock contention failure. Transient network blip to the index. Triggered by the sweeper's periodic removal of expired workflows.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/2b640f486e08745a. Report an issue: GitHub.

Appendix: source

Thrown at core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java:467

            String workflowId, boolean archiveWorkflow, int ttlSeconds) {
        try {
            WorkflowModel workflow = getWorkflowModelFromDataStore(workflowId, true);

            try {
                removeWorkflowIndex(workflow, archiveWorkflow);
            } catch (NotFoundException e) {
                if (archiveWorkflow) {
                    throw e;
                }
                // Idempotent deletion: missing index records should not block DAO removal.
                LOGGER.info(
                        "Workflow {} not found in index during removal, continuing", workflowId, e);
            }
            // remove workflow from DAO with TTL
            executionDAO.removeWorkflowWithExpiry(workflowId, ttlSeconds);
        } catch (Exception e) {
            Monitors.recordDaoError("executionDao", "removeWorkflow");
            throw new TransientException("Error removing workflow: " + workflowId, e);
        }
    }

    /**
     * Reset the workflow state by removing from the {@link ExecutionDAO} and removing this workflow
     * from the {@link IndexDAO}.
     *
     * @param workflowId the workflow id to be reset
     */
    public void resetWorkflow(String workflowId) {
        getWorkflowModelFromDataStore(workflowId, true);
        executionDAO.removeWorkflow(workflowId);
        try {
            if (properties.isAsyncIndexingEnabled()) {
                indexDAO.asyncRemoveWorkflow(workflowId);
            } else {
                indexDAO.removeWorkflow(workflowId);
            }

View on GitHub (pinned to cf7c3e4a8a)