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
- Retry the task-def read with backoff.
- Verify cluster health and that the task_def table exists.
- Review conductor.cassandra.readConsistencyLevel vs replication factor.
- 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
- Wrap task-def reads in retry-with-backoff for TransientException.
- Confirm the task_def table exists after deploys.
- Cache hot task defs to reduce driver round-trips.
- Align read consistency with replication factor.
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
- Error fetching workflow def: %s/%d
- Failed to get all task defs
- Failed to get workflows defs for : %s
- Error creating/updating task definition: %s
- Failed to get workflow: %s
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/15ed1ecf20016034.
Report an issue: GitHub.