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

  1. Confirm the Cassandra cluster is reachable and the workflow_def table is present.
  2. Retry the update - TransientException denotes a retryable failure.
  3. Review conductor.cassandra.writeConsistencyLevel against your replication factor.
  4. 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

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


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