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
- Typically benign — the periodic split assignment will re-run after readers register; verify splits are eventually assigned
- If splits are never assigned, check reader registration failures in the worker logs
- Ensure reader startup isn't blocked (resources, connector dependencies, network to data source)
- 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
- Check reader startup logs if a job's sources receive no splits
- Ensure connectors and their dependencies are installed on all workers so readers register promptly
- Avoid starving worker threads; give the coordinator time to register readers before enumerator assignment
- Upgrade SeaTunnel if your version drops assignments for late readers
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
- Task init is not complete, try to get it again after 200 ms
- BigtableSourceSplitEnumerator already closed; cannot create…
- BigtableSourceSplitEnumerator closed during client creation
- BUFFER_ADD_FAILED
- Cannot fetch from another split - no split remaining.
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)