conductor-oss/conductor · error · TransientException
Error updating workflow definition: %s/%d
Error message
Error updating workflow definition: %s/%d
What it means
Thrown when a DriverException occurs during updateWorkflowDef's UPDATE against the workflow_def table. The DAO wraps it as TransientException, indicating an infrastructure-level, retryable failure rather than a data problem.
Source
Thrown at cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java:218
session.execute(
updateWorkflowDefStatement.bind(
workflowDefinition, workflowDef.getName(), workflowDef.getVersion()));
String workflowDefIndex =
getWorkflowDefIndexValue(workflowDef.getName(), workflowDef.getVersion());
session.execute(
insertWorkflowDefVersionIndexStatement.bind(
workflowDefIndex, workflowDefIndex));
recordCassandraDaoRequests("updateWorkflowDef");
recordCassandraDaoPayloadSize(
"updateWorkflowDef", workflowDefinition.length(), "n/a", workflowDef.getName());
} catch (DriverException e) {
Monitors.error(CLASS_NAME, "updateWorkflowDef");
String errorMsg =
String.format(
"Error updating workflow definition: %s/%d",
workflowDef.getName(), workflowDef.getVersion());
LOGGER.error(errorMsg, e);
throw new TransientException(errorMsg, e);
}
}
@Override
public Optional<WorkflowDef> getLatestWorkflowDef(String name) {
List<WorkflowDef> workflowDefList = getAllWorkflowDefVersions(name);
if (workflowDefList != null && workflowDefList.size() > 0) {
workflowDefList.sort(Comparator.comparingInt(WorkflowDef::getVersion));
return Optional.of(workflowDefList.get(workflowDefList.size() - 1));
}
return Optional.empty();
}
@Override
public Optional<WorkflowDef> getWorkflowDef(String name, int version) {
try {
recordCassandraDaoRequests("getWorkflowDef");
ResultSet resultSet = session.execute(selectWorkflowDefStatement.bind(name, version));View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Confirm the Cassandra cluster is reachable and the workflow_def table is present.
- Retry the update - TransientException denotes a retryable failure.
- Review conductor.cassandra.writeConsistencyLevel against your replication factor.
- Check driver logs for the underlying DriverException (UnavailableException, WriteTimeoutException, etc.) to pinpoint the cause.
Example fix
// before: no retry, update fails on a momentary blip
metadataDAO.updateWorkflowDef(def);
// after: retry transient failures
RetryUtils.retryOn(TransientException.class, 3, Duration.ofMillis(200),
() -> metadataDAO.updateWorkflowDef(def)); Defensive patterns
Strategy: retry
Validate before calling
// Pre-flight: confirm session is usable before updating
if (cassandraSession.isClosed()) {
throw new IllegalStateException("Cassandra session is closed; cannot update workflow def");
} Try / catch
// Retry transient update failures
try {
metadataDAO.updateWorkflowDef(def);
} catch (TransientException e) {
// backoff and retry, then surface if still failing
backoffAndRetry(() -> metadataDAO.updateWorkflowDef(def), 3);
} Prevention
- Retry updateWorkflowDef on TransientException with backoff.
- Keep read/write consistency levels aligned with your replication factor.
- Run the schema migration so the workflow_def table exists.
- Alert on recurring TransientException to catch cluster issues early.
When it happens
Trigger: session.execute(updateWorkflowDefStatement.bind(...)) raises a DriverException (timeout, unavailable host, closed session) while persisting an updated workflow definition.
Common situations: Cluster node loss mid-update; schema/table missing after a partial deploy; connection drop under heavy load; consistency level cannot be satisfied by live replicas.
Related errors
- Error creating workflow definition: %s/%d
- Error fetching workflow def: %s/%d
- Failed to remove workflow definition: %s/%d
- Error retrieving all workflow defs
- Error retrieving all workflow defs latest versions
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/739589410fafa47d.
Report an issue: GitHub.