apache/seatunnel · warning

No reader is obtained, skip this assign!

Error message

No reader is obtained, skip this assign!

What it means

SeaTunnelSplitEnumeratorContext.assignSplit() is asked to deliver splits to a reader subtask, but no readers have registered yet. Rather than failing or losing the splits, it logs this warning and skips the assignment entirely.

Solutions

  1. Typically benign — the periodic split assignment will re-run after readers register; verify splits are eventually assigned
  2. If splits are never assigned, check reader registration failures in the worker logs
  3. Ensure reader startup isn't blocked (resources, connector dependencies, network to data source)
  4. Upgrade SeaTunnel — newer versions may buffer splits for late-registering readers instead of dropping the assign
Defensive patterns

Strategy: retry

Validate before calling

// poll /running-jobs and verify splits get assigned shortly after job start
const resp = await fetch(baseUrl + '/running-jobs');
const job = (await resp.json()).find(j => j.jobId === id);
if (Date.now() - job.startTime > 60000) console.warn('readers may have missed split assignment');

Try / catch

try {
  waitForReadersRegistered(jobId, timeoutMs);
} catch (TimeoutException e) {
  // restart the source task so split assignment re-runs after readers register
  restartJobTask(jobId);
}

Prevention

When it happens

Trigger: The split enumerator calls assignSplit (e.g. during open() or handleSplitRequest) before any SourceReader has registered with the coordinator task — common right after job start or reader restart.

Common situations: Fast enumerators assigning splits immediately on startup before readers connect; reader startup delayed by slow connector init or resource contention; failover scenarios where the enumerator recovers before the readers re-register.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/a78b5b05f24763a8. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/context/SeaTunnelSplitEnumeratorContext.java:76

        this.task = task;
        this.metricsContext = metricsContext;
        this.eventListener = eventListener;
    }

    @Override
    public int currentParallelism() {
        return parallelism;
    }

    @Override
    public Set<Integer> registeredReaders() {
        return new HashSet<>(task.getRegisteredReaders());
    }

    @Override
    public void assignSplit(int subtaskIndex, List<SplitT> splits) {
        if (registeredReaders().isEmpty()) {
            log.warn("No reader is obtained, skip this assign!");
            return;
        }

        List<byte[]> splitBytes =
                splits.stream()
                        .map(split -> sneaky(() -> task.getSplitSerializer().serialize(split)))
                        .collect(Collectors.toList());
        task.getExecutionContext()
                .sendToMember(
                        new AssignSplitOperation<>(
                                task.getTaskMemberLocationByIndex(subtaskIndex), splitBytes),
                        task.getTaskMemberAddressByIndex(subtaskIndex))
                .join();
    }

    @Override
    public void signalNoMoreSplits(int subtaskIndex) {
        noMoreSplitsSignaledReaders.add(subtaskIndex);

View on GitHub (pinned to cf67b549a7)