{"record":{"id":"219b0c47a306e867","repo":"apache/seatunnel","slug":"data-change-record-shouldn-t-use-read-operation-t","errorCode":null,"errorMessage":"Data change record shouldn't use READ operation, the the record is %s.","messagePattern":"Data change record shouldn't use READ operation, the the record is (.+?)\\.","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/source/reader/external/JdbcSourceFetchTaskContext.java","lineNumber":136,"sourceCode":"                    Instant fetchTs =\n                            Instant.ofEpochMilli((Long) source.get(Envelope.FieldName.TIMESTAMP));\n                    SourceRecord record =\n                            new SourceRecord(\n                                    changeRecord.sourcePartition(),\n                                    changeRecord.sourceOffset(),\n                                    changeRecord.topic(),\n                                    changeRecord.kafkaPartition(),\n                                    changeRecord.keySchema(),\n                                    changeRecord.key(),\n                                    changeRecord.valueSchema(),\n                                    envelope.read(after, source, fetchTs));\n                    outputBuffer.put(key, record);\n                    break;\n                case DELETE:\n                    outputBuffer.remove(key);\n                    break;\n                case READ:\n                    throw new IllegalStateException(\n                            String.format(\n                                    \"Data change record shouldn't use READ operation, the the record is %s.\",\n                                    changeRecord));\n            }\n        }\n    }\n\n    @Override\n    public List<SourceRecord> formatMessageTimestamp(Collection<SourceRecord> snapshotRecords) {\n        return snapshotRecords.stream()\n                .map(\n                        record -> {\n                            Envelope envelope = Envelope.fromSchema(record.valueSchema());\n                            Struct value = (Struct) record.value();\n                            Struct updateAfter = value.getStruct(Envelope.FieldName.AFTER);\n                            // set message timestamp (source.ts_ms) to 0L\n                            Struct source = value.getStruct(Envelope.FieldName.SOURCE);\n                            source.put(Envelope.FieldName.TIMESTAMP, 0L);","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/source/reader/external/JdbcSourceFetchTaskContext.java#L118-L154","documentation":"During buffering of change records (rewriteOutputBuffer), JdbcSourceFetchTaskContext expects only INSERT/UPDATE/DELETE operations; a READ (snapshot-style) event appearing in the change buffer violates the incremental-phase contract, so it throws IllegalStateException. READ events are only valid during snapshot reading, not in the incremental output buffer where upsert semantics are applied.","triggerScenarios":"A data change event with operation READ (from Debezium's op=r or a snapshot event) reaches the incremental fetcher's output-buffer rewrite path, which handles INSERT/UPDATE/DELETE only.","commonSituations":"Connector bug where snapshot records leak into the incremental phase; Debezium signaling/incremental snapshot mode emitting READ events during streaming; custom fetcher configuration mixing snapshot and stream events; version mismatch between Debezium and the SeaTunnel CDC connector.","solutions":["Check that incremental-snapshot (READ events) is not enabled in a way that leaks into the stream phase; align Debezium properties with the connector's expectations.","Verify Debezium connector version compatibility with the SeaTunnel CDC connector version.","Inspect the offending record (printed in the message) to see which table/operation produced the READ event and whether the source emitted it unexpectedly.","Upgrade connector-cdc-base; known fixes adjusted event routing between snapshot and incremental phases."],"exampleFix":"// before: buffer rewrite assumes only DML ops\nswitch (op) {\n    case READ: throw new IllegalStateException(...);\n}\n// after: treat READ as an upsert (insert) at buffer level\ncase READ:\ncase INSERT:\n    outputBuffer.put(key, record);\n    break;","handlingStrategy":"validation","validationCode":"// validate op before buffering\nif (record.getOperation() == Operation.READ) {\n    log.warn(\"READ event in incremental phase; route to snapshot handling\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    fetcherContext.rewriteOutputBuffer(buffer, key, changeRecord);\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"READ operation\")) { /* handle snapshot-event leak */ }\n}","preventionTips":["Keep Debezium and connector-cdc versions compatible.","Do not enable Debezium incremental-snapshot signaling alongside SeaTunnel's own snapshot logic.","Test schema-change and snapshot-to-stream handoff paths before production."],"tags":["cdc","change-events","debezium","invalid-operation"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}