conductor-oss/conductor · error · TransientException

Error getting task by id: %s

Error message

Error getting task by id: %s

What it means

Thrown by CassandraExecutionDAO.getTask when reading a single task by id fails. DriverException during the workflow/task lookup is wrapped in TransientException (cause not attached). Reports the requested taskId.

Source

Thrown at cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java:380

                    .map(
                            row -> {
                                String taskRow = row.getString(PAYLOAD_KEY);
                                TaskModel task = readValue(taskRow, TaskModel.class);
                                recordCassandraDaoRequests(
                                        "getTask", task.getTaskType(), task.getWorkflowType());
                                recordCassandraDaoPayloadSize(
                                        "getTask",
                                        taskRow.length(),
                                        task.getTaskType(),
                                        task.getWorkflowType());
                                return task;
                            })
                    .orElse(null);
        } catch (DriverException e) {
            Monitors.error(CLASS_NAME, "getTask");
            String errorMsg = String.format("Error getting task by id: %s", taskId);
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg);
        }
    }

    @Override
    public List<TaskModel> getTasks(List<String> taskIds) {
        Preconditions.checkNotNull(taskIds);
        Preconditions.checkArgument(taskIds.size() > 0, "Task ids list cannot be empty");
        String workflowId = lookupWorkflowIdFromTaskId(taskIds.get(0));
        if (workflowId == null) {
            return null;
        }
        return getWorkflow(workflowId, true).getTasks().stream()
                .filter(task -> taskIds.contains(task.getTaskId()))
                .collect(Collectors.toList());
    }

    /**
     * This is a dummy implementation and this feature is not implemented for Cassandra backed

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Verify the taskId exists in task_lookup and maps to a valid UUID workflowId.
  2. Confirm Cassandra health and retry.
  3. Inspect driver logs for the DriverException subtype.
  4. Preserve the cause when rethrowing to aid debugging.

Example fix

// before
throw new TransientException(errorMsg);

// after
throw new TransientException(errorMsg, e);
Defensive patterns

Strategy: retry

Validate before calling

// Validate the taskId maps to a UUID workflow before getTask
String wfId = lookupWorkflowIdFromTaskId(taskId);
if (wfId == null || !isUuid(wfId)) return null;

Type guard

static boolean isUuid(String s) {
    try { java.util.UUID.fromString(s); return true; } catch (IllegalArgumentException e) { return false; }
}

Try / catch

try {
    return dao.getTask(taskId);
} catch (TransientException e) {
    log.warn("Transient getTask failure for {}; retrying", taskId);
    throw e;

Prevention

When it happens

Trigger: Calling getTask(String taskId) when the lookup or workflow read fails — Cassandra unavailable, timeout, or the taskId maps to a workflowId that is not a valid UUID (UUID.fromString inside the path).

Common situations: Cassandra connectivity loss. Stale task_lookup row pointing at a non-UUID workflow. Read timeout under load. Schema drift.

Related errors


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