conductor-oss/conductor · error · TransientException

Error creating/updating task definition: %s

Error message

Error creating/updating task definition: %s

What it means

Thrown when a DriverException occurs in insertOrUpdateTaskDef while serializing a TaskDef to JSON and writing it to the task_def table. Wrapped as TransientException - the store could not complete due to an infrastructure-level driver failure.

Source

Thrown at cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java:410

            String errorMsg = String.format("Failed to get workflows defs for : %s", name);
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
    }

    private TaskDef insertOrUpdateTaskDef(TaskDef taskDef) {
        try {
            String taskDefinition = toJson(taskDef);
            session.execute(insertTaskDefStatement.bind(taskDef.getName(), taskDefinition));
            recordCassandraDaoRequests("storeTaskDef");
            recordCassandraDaoPayloadSize(
                    "storeTaskDef", taskDefinition.length(), taskDef.getName(), "n/a");
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "insertOrUpdateTaskDef");
            String errorMsg =
                    String.format("Error creating/updating task definition: %s", taskDef.getName());
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
        return taskDef;
    }

    @VisibleForTesting
    String getWorkflowDefIndexValue(String name, int version) {
        return name + INDEX_DELIMITER + version;
    }

    @VisibleForTesting
    ImmutablePair<String, Integer> getWorkflowNameAndVersion(String nameVersionStr) {
        int lastIndexOfDelimiter = nameVersionStr.lastIndexOf(INDEX_DELIMITER);

        if (lastIndexOfDelimiter == -1) {
            throw new IllegalStateException(
                    nameVersionStr
                            + " is not in the 'workflowName"
                            + INDEX_DELIMITER

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Retry the store operation - TransientException is retryable.
  2. Verify the Cassandra cluster and task_def table are present.
  3. Review conductor.cassandra.writeConsistencyLevel and timeouts.
  4. Check the wrapped DriverException to distinguish timeout vs unavailable.

Example fix

// before: single write
metadataDAO.createTaskDef(taskDef);

// after: retry transient write failures
RetryUtils.retryOn(TransientException.class, 3, Duration.ofMillis(200),
    () -> metadataDAO.createTaskDef(taskDef));
Defensive patterns

Strategy: retry

Validate before calling

// Pre-flight: verify session before writing a task def
if (cassandraSession.isClosed()) {
    throw new IllegalStateException("Cassandra session is closed; cannot store task def");
}

Try / catch

// Retry transient task-def store failures
try {
    metadataDAO.createTaskDef(taskDef);
} catch (TransientException e) {
    backoffAndRetry(() -> metadataDAO.createTaskDef(taskDef), 3);
}

Prevention

When it happens

Trigger: session.execute(insertTaskDefStatement.bind(name, json)) raises a DriverException (write timeout, unavailable, closed session) during task-definition create/update.

Common situations: Registering/updating a task def during a node loss; keyspace/table missing after partial deploy; connection pool exhausted; large payload timing out.

Related errors


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