{"record":{"id":"a78b5b05f24763a8","repo":"apache/seatunnel","slug":"no-reader-is-obtained-skip-this-assign","errorCode":null,"errorMessage":"No reader is obtained, skip this assign!","messagePattern":"No reader is obtained, skip this assign!","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/context/SeaTunnelSplitEnumeratorContext.java","lineNumber":76,"sourceCode":"        this.task = task;\n        this.metricsContext = metricsContext;\n        this.eventListener = eventListener;\n    }\n\n    @Override\n    public int currentParallelism() {\n        return parallelism;\n    }\n\n    @Override\n    public Set<Integer> registeredReaders() {\n        return new HashSet<>(task.getRegisteredReaders());\n    }\n\n    @Override\n    public void assignSplit(int subtaskIndex, List<SplitT> splits) {\n        if (registeredReaders().isEmpty()) {\n            log.warn(\"No reader is obtained, skip this assign!\");\n            return;\n        }\n\n        List<byte[]> splitBytes =\n                splits.stream()\n                        .map(split -> sneaky(() -> task.getSplitSerializer().serialize(split)))\n                        .collect(Collectors.toList());\n        task.getExecutionContext()\n                .sendToMember(\n                        new AssignSplitOperation<>(\n                                task.getTaskMemberLocationByIndex(subtaskIndex), splitBytes),\n                        task.getTaskMemberAddressByIndex(subtaskIndex))\n                .join();\n    }\n\n    @Override\n    public void signalNoMoreSplits(int subtaskIndex) {\n        noMoreSplitsSignaledReaders.add(subtaskIndex);","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/context/SeaTunnelSplitEnumeratorContext.java#L58-L94","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// poll /running-jobs and verify splits get assigned shortly after job start\nconst resp = await fetch(baseUrl + '/running-jobs');\nconst job = (await resp.json()).find(j => j.jobId === id);\nif (Date.now() - job.startTime > 60000) console.warn('readers may have missed split assignment');","typeGuard":null,"tryCatchPattern":"try {\n  waitForReadersRegistered(jobId, timeoutMs);\n} catch (TimeoutException e) {\n  // restart the source task so split assignment re-runs after readers register\n  restartJobTask(jobId);\n}","preventionTips":["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"],"tags":["source-connector","split-assignment","race-condition","zeta"],"backgroundTag":"invalid-state-transition","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}