conductor-oss/conductor · error · TransientException

Failed to get task def: %s

Error message

Failed to get task def: %s

What it means

Thrown when a DriverException occurs in getTaskDefFromDB while reading a single TaskDef by name (SELECT + JSON deserialization via setDefaults). Wrapped as TransientException, signalling a retryable infrastructure failure on the read path.

Source

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

                    .collect(Collectors.toList());
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "getAllWorkflowDefsLatestVersions");
            String errorMsg = "Error retrieving all workflow defs latest versions";
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
    }

    private TaskDef getTaskDefFromDB(String name) {
        try {
            ResultSet resultSet = session.execute(selectTaskDefStatement.bind(name));
            recordCassandraDaoRequests("getTaskDef", name, null);
            return Optional.ofNullable(resultSet.one()).map(this::setDefaults).orElse(null);
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "getTaskDef");
            String errorMsg = String.format("Failed to get task def: %s", name);
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
    }

    @SuppressWarnings("unchecked")
    private List<TaskDef> getAllTaskDefsFromDB() {
        try {
            ResultSet resultSet = session.execute(selectAllTaskDefsStatement.bind(TASK_DEFS_KEY));
            List<Row> rows = resultSet.all();
            if (rows.size() == 0) {
                LOGGER.info("No task definitions were found.");
                return Collections.EMPTY_LIST;
            }
            return rows.stream().map(this::setDefaults).collect(Collectors.toList());
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "getAllTaskDefs");
            String errorMsg = "Failed to get all task defs";
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Retry the task-def read with backoff.
  2. Verify cluster health and that the task_def table exists.
  3. Review conductor.cassandra.readConsistencyLevel vs replication factor.
  4. Inspect the wrapped DriverException to identify timeout vs unavailable.

Example fix

// before: single read
TaskDef td = metadataDAO.getTaskDef(name);

// after: retry transient reads
TaskDef td = RetryUtils.retryOn(TransientException.class, 3,
        Duration.ofMillis(150),
        () -> metadataDAO.getTaskDef(name));
Defensive patterns

Strategy: retry

Validate before calling

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

Try / catch

// Retry transient task-def reads
try {
    return metadataDAO.getTaskDef(name);
} catch (TransientException e) {
    return backoffAndRetry(() -> metadataDAO.getTaskDef(name), 3);
}

Prevention

When it happens

Trigger: session.execute(selectTaskDefStatement.bind(name)) raises a DriverException, or deserialization of the row fails inside the read after the driver error path is entered.

Common situations: Looking up a task def during a Cassandra restart or network blip; the task_def table replica set cannot satisfy read consistency; connection pool exhausted.

Related errors


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