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
- Ensure workflow.getWorkflowId() is a valid UUID.
- Confirm Cassandra health and retry the update.
- Inspect driver logs for the failure subtype.
- 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
- Validate the workflow ID is a UUID before update.
- Retry TransientException and check Cassandra connectivity.
- Attach the cause (currently dropped) when rethrowing.
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
- Error creating workflow: %s
- Error creating/updating event handler: %s/%s
- Error creating %d tasks for workflow: %s
- Error updating task: %s in workflow: %s
- Failed to remove workflow: %s
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/8f6044b04009f226.
Report an issue: GitHub.