{"record":{"id":"059bfe0582cbfb70","repo":"apache/seatunnel","slug":"operation-not-supported","errorCode":"OPERATION_NOT_SUPPORTED","errorMessage":"Unsupported handleSplitRequest: ","messagePattern":"Unsupported handleSplitRequest: ","errorType":"error_code","errorClass":"ElasticsearchConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/source/ElasticsearchSourceSplitEnumerator.java","lineNumber":204,"sourceCode":"        esRestClient.close();\n    }\n\n    @Override\n    public void addSplitsBack(List<ElasticsearchSourceSplit> splits, int subtaskId) {\n        if (!splits.isEmpty()) {\n            addPendingSplit(splits, subtaskId);\n            assignSplit(Collections.singletonList(subtaskId));\n        }\n    }\n\n    @Override\n    public int currentUnassignedSplitSize() {\n        return pendingSplit.size();\n    }\n\n    @Override\n    public void handleSplitRequest(int subtaskId) {\n        throw new ElasticsearchConnectorException(\n                CommonErrorCode.OPERATION_NOT_SUPPORTED,\n                \"Unsupported handleSplitRequest: \" + subtaskId);\n    }\n\n    @Override\n    public void registerReader(int subtaskId) {\n        log.debug(\"Register reader {} to ElasticsearchSourceSplitEnumerator.\", subtaskId);\n        if (!pendingSplit.isEmpty()) {\n            assignSplit(Collections.singletonList(subtaskId));\n        }\n    }\n\n    @Override\n    public ElasticsearchSourceState snapshotState(long checkpointId) throws Exception {\n        synchronized (stateLock) {\n            return new ElasticsearchSourceState(shouldEnumerate, pendingSplit);\n        }\n    }","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/source/ElasticsearchSourceSplitEnumerator.java#L186-L222","documentation":"ElasticsearchSourceSplitEnumerator does not support readers requesting splits (it pushes splits proactively in assignSplits). Any call to handleSplitRequest throws ElasticsearchConnectorException with OPERATION_NOT_SUPPORTED, including the requesting subtask id.","triggerScenarios":"A SourceReader (or engine framework) calls handleSplitRequest(subtaskId) on the ES split enumerator — usually when the engine is configured for request-based split assignment or a reader incorrectly requests a split after startup.","commonSituations":"Engine/connector protocol mismatch where the runtime expects request-driven enumeration; custom source readers built against a request-response enumeration contract.","solutions":["Do not call handleSplitRequest on the ES enumerator; rely on its proactive split assignment","Align engine and connector versions so the expected enumeration protocol matches","For custom readers, use registerReader + the push-based split flow instead"],"exampleFix":"// before\nenumerator.handleSplitRequest(subtaskId);\n// after\nenumerator.registerReader(subtaskId); // splits are pushed proactively by the enumerator","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the push-based split flow (registerReader) rather than request-based enumeration","Keep engine and connector versions aligned on the enumeration protocol","Do not call handleSplitRequest on enumerators that document proactive assignment"],"tags":["elasticsearch","source","split-enumeration","unsupported-operation"],"backgroundTag":"operation-not-supported","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"}