conductor-oss/conductor · error · TransientException

Error creating workflow: %s

Error message

Error creating workflow: %s

What it means

Thrown by CassandraExecutionDAO.createWorkflow when inserting a new workflow row fails. DriverException during the insert (plus toJson serialization of the workflow) is wrapped in TransientException. Reports the workflowId.

Source

Thrown at cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java:433

            List<TaskModel> tasks = workflow.getTasks();
            workflow.setTasks(new LinkedList<>());
            String payload = toJson(workflow);

            recordCassandraDaoRequests("createWorkflow", "n/a", workflow.getWorkflowName());
            recordCassandraDaoPayloadSize(
                    "createWorkflow", payload.length(), "n/a", workflow.getWorkflowName());
            session.execute(
                    insertWorkflowStatement.bind(
                            UUID.fromString(workflow.getWorkflowId()), 1, "", payload, 0, 1));

            workflow.setTasks(tasks);
            return workflow.getWorkflowId();
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "createWorkflow");
            String errorMsg =
                    String.format("Error creating workflow: %s", workflow.getWorkflowId());
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
    }

    @Override
    public String updateWorkflow(WorkflowModel workflow) {
        try {
            List<TaskModel> tasks = workflow.getTasks();
            workflow.setTasks(new LinkedList<>());
            String payload = toJson(workflow);
            recordCassandraDaoRequests("updateWorkflow", "n/a", workflow.getWorkflowName());
            recordCassandraDaoPayloadSize(
                    "updateWorkflow", payload.length(), "n/a", workflow.getWorkflowName());
            session.execute(
                    updateWorkflowStatement.bind(
                            payload, UUID.fromString(workflow.getWorkflowId())));
            workflow.setTasks(tasks);
            return workflow.getWorkflowId();
        } catch (DriverException e) {

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Ensure workflow.getWorkflowId() is a valid UUID.
  2. Confirm Cassandra is reachable and the workflows table exists.
  3. Retry — TransientException is retryable; ensure createWorkflow is idempotent on the workflowId before retrying.
  4. Inspect the wrapped DriverException for timeout vs unavailable.
Defensive patterns

Strategy: validation

Validate before calling

// Ensure workflow id is a UUID before createWorkflow
if (!isUuid(workflow.getWorkflowId()))
    throw new IllegalArgumentException("non-UUID workflow id: " + workflow.getWorkflowId());

Type guard

static boolean isUuid(String s) {
    try { java.util.UUID.fromString(s); return true; } catch (IllegalArgumentException e) { return false; }
}

Try / catch

try {
    return dao.createWorkflow(workflow);
} catch (TransientException e) {
    log.warn("Transient createWorkflow failure for {}; retrying idempotently", workflow.getWorkflowId());
    throw e;

Prevention

When it happens

Trigger: Calling createWorkflow(WorkflowModel) when Cassandra is unavailable, the workflowId is not a valid UUID (UUID.fromString inside the try), toJson fails, or the write times out.

Common situations: Cassandra connectivity loss. Non-UUID workflow ID from a custom generator. Write timeout. Schema drift in the workflows table.

Related errors


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