{"record":{"id":"03f0ffda1f4b0ab3","repo":"apache/seatunnel","slug":"reader-is-not-registered-pending-splits-are-03f0ff","errorCode":null,"errorMessage":"Reader {} is not registered. Pending splits {} are not assigned.","messagePattern":"Reader (.+?) is not registered\\. Pending splits (.+?) are not assigned\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceSplitEnumerator.java","lineNumber":195,"sourceCode":"                query = query + \" and ( \" + sqlCondition + \" ) \";\n            }\n            if (!Strings.isNullOrEmpty(sqlAlign)) {\n                query = query + \" align by \" + sqlAlign;\n            }\n            iotDBSourceSplits.add(new IoTDBSourceSplit(String.valueOf(query.hashCode()), query));\n        }\n        return iotDBSourceSplits;\n    }\n\n    @Override\n    public void addSplitsBack(List<IoTDBSourceSplit> splits, int subtaskId) {\n        log.debug(\"Add back splits {} to IoTDBSourceSplitEnumerator.\", splits);\n        if (!splits.isEmpty()) {\n            addPendingSplit(splits, subtaskId);\n            if (context.registeredReaders().contains(subtaskId)) {\n                assignSplit(Collections.singletonList(subtaskId));\n            } else {\n                log.warn(\n                        \"Reader {} is not registered. Pending splits {} are not assigned.\",\n                        subtaskId,\n                        splits);\n            }\n        }\n    }\n\n    @Override\n    public int currentUnassignedSplitSize() {\n        return pendingSplit.size();\n    }\n\n    @Override\n    public void registerReader(int subtaskId) {\n        log.debug(\"Register reader {} to IoTDBSourceSplitEnumerator.\", subtaskId);\n        if (!pendingSplit.isEmpty()) {\n            assignSplit(Collections.singletonList(subtaskId));\n        }","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceSplitEnumerator.java#L177-L213","documentation":"IoTDBSourceSplitEnumerator (v1 connector) logs this warning in addSplitsBack when the returning reader's subtaskId is not registered with the coordinator; the splits are kept as pending and not immediately assigned. This is a failover/restore race guard; assignment happens once the reader registers.","triggerScenarios":"addSplitsBack(splits, subtaskId) with subtaskId absent from context.registeredReaders() — reader failed over or job was restored and the new reader hasn't registered yet.","commonSituations":"Task failure on IoTDB source readers; checkpoint restore ordering where enumerator starts before readers; dynamic scaling moving readers.","solutions":["No action typically required — pending splits get assigned after registration","If splits remain unassigned, verify reader startup and restart the job if needed","Reduce reader failures by checking IoTDB connectivity/session limits","Ensure the standard register-reader flow is used in any customized source code"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Expect this warning during reader failover; confirm splits reassign later","Ensure IoTDB session limits/connectivity don't cause repeated reader deaths","Verify checkpoint/restore ordering works for this source","Keep cluster capacity sufficient to avoid frequent reader restarts"],"tags":["iotdb","source","split-assignment","reader-registration"],"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-14T11:17:12.474Z"}