{"record":{"id":"c06b0acde7c2b25a","repo":"apache/seatunnel","slug":"common-error-code-unsupported-operation","errorCode":"COMMON_ERROR_CODE.UNSUPPORTED_OPERATION","errorMessage":"Unsupported handleSplitRequest: %d","messagePattern":"Unsupported handleSplitRequest: (.+?)","errorType":"error_code","errorClass":"MongodbConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/enumerator/MongodbSplitEnumerator.java","lineNumber":113,"sourceCode":"            clientProvider.close();\n        }\n    }\n\n    @Override\n    public void addSplitsBack(List<MongoSplit> splits, int subtaskId) {\n        if (splits != null) {\n            log.info(\"Received {} split(s) back from subtask {}.\", splits.size(), subtaskId);\n            pendingSplits.addAll(splits);\n        }\n    }\n\n    @Override\n    public int currentUnassignedSplitSize() {\n        return pendingSplits.size();\n    }\n\n    @Override\n    public void handleSplitRequest(int subtaskId) {\n        throw new MongodbConnectorException(\n                CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,\n                String.format(\"Unsupported handleSplitRequest: %d\", subtaskId));\n    }\n\n    @Override\n    public void registerReader(int subtaskId) {\n        log.debug(\"Register reader {} to MongodbSplitEnumerator.\", subtaskId);\n        if (!pendingSplits.isEmpty()) {\n            assignSplits(Collections.singletonList(subtaskId));\n        }\n    }\n\n    @Override\n    public ArrayList<MongoSplit> snapshotState(long checkpointId) {\n        synchronized (stateLock) {\n            return pendingSplits;\n        }","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-mongodb/src/main/java/org/apache/seatunnel/connectors/seatunnel/mongodb/source/enumerator/MongodbSplitEnumerator.java#L95-L131","documentation":"MongodbSplitEnumerator.handleSplitRequest always throws UNSUPPORTED_OPERATION. In SeaTunnel's split-assignment protocol the enumerator pushes splits to readers proactively; readers must never request splits, so any incoming split request indicates a protocol violation.","triggerScenarios":"A SourceReader (or custom/translated reader) calls handleSplitRequest(subtaskId) on the MongoDB enumerator — e.g. a custom reader implementation that pulls splits instead of registering a SplitEnumeratorContext-driven assignment.","commonSituations":"Custom source reader code or a translation-layer mismatch where the reader actively requests splits; misuse of the SourceReader API in an extension built on the MongoDB connector.","solutions":["Remove any reader-side call to handleSplitRequest; readers should receive splits via addSplitBack/assigned splits callbacks.","Use the stock MongoDBSourceReader instead of a custom one, or follow the SourceReader contract where splits are pushed by the enumerator.","Check SourceReaderContext/reader registration so the enumerator's assignment logic runs (registerReader + assignment on start)."],"exampleFix":"// before (in reader)\nenumerator.handleSplitRequest(subtaskId);\n// after (rely on pushed splits)\n// implement handleAddSplits(list) on the reader; never request splits","handlingStrategy":"type-guard","validationCode":"// Reader side: never call enumerator.handleSplitRequest; assert protocol usage in tests:\n// assertDoesNotThrow(() -> reader reads only via onSplitAssigned callbacks)","typeGuard":"static boolean enumeratorSupportsSplitRequest(SplitEnumerator<?, ?> e) {\n    return !(e instanceof MongodbSplitEnumerator); // it does not support pull-style requests\n}","tryCatchPattern":"try {\n    enumerator.handleSplitRequest(id);\n} catch (MongodbConnectorException e) {\n    // UNSUPPORTED_OPERATION: switch to pushed-assignment reader design\n}","preventionTips":["Follow the push-based Source/SplitEnumerator contract; never poll the enumerator from readers.","Use the stock MongoDB reader rather than a custom one.","Write integration tests that exercise enumerator-reader interaction."],"tags":["mongodb","source-split","protocol-violation"],"backgroundTag":"unsupported-operation","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"}