conductor-oss/conductor · error · TransientException

Failed to update workflow: %s

Error message

Failed to update workflow: %s

What it means

Thrown by CassandraExecutionDAO.updateWorkflow when updating an existing workflow row fails. DriverException during the update (or UUID.fromString on the workflowId) is wrapped in TransientException (cause not attached). Reports the workflowId.

Source

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

    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) {
            Monitors.error(CLASS_NAME, "updateWorkflow");
            String errorMsg =
                    String.format("Failed to update workflow: %s", workflow.getWorkflowId());
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg);
        }
    }

    @Override
    public boolean removeWorkflow(String workflowId) {
        WorkflowModel workflow = getWorkflow(workflowId, true);
        boolean removed = false;
        // TODO: calculate number of shards and iterate
        if (workflow != null) {
            try {
                recordCassandraDaoRequests("removeWorkflow", "n/a", workflow.getWorkflowName());
                ResultSet resultSet =
                        session.execute(
                                deleteWorkflowStatement.bind(
                                        UUID.fromString(workflowId), DEFAULT_SHARD_ID));
                removed = resultSet.wasApplied();
            } catch (DriverException e) {
                Monitors.error(CLASS_NAME, "removeWorkflow");

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Ensure workflow.getWorkflowId() is a valid UUID.
  2. Confirm Cassandra health and retry the update.
  3. Inspect driver logs for the failure subtype.
  4. Preserve the cause when rethrowing for better diagnostics.

Example fix

// before
throw new TransientException(errorMsg);

// after
throw new TransientException(errorMsg, e);
Defensive patterns

Strategy: validation

Validate before calling

// Ensure workflow id is a UUID before updateWorkflow
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.updateWorkflow(workflow);
} catch (TransientException e) {
    log.warn("Transient updateWorkflow failure for {}; retrying", workflow.getWorkflowId());
    throw e;

Prevention

When it happens

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

Common situations: Cassandra connectivity loss. Non-UUID workflow ID. Write timeout under high update frequency. Schema drift.

Related errors


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