{"record":{"id":"8c77c713c5958468","repo":"apache/seatunnel","slug":"unknown-row-kind-rowkind","errorCode":null,"errorMessage":"Unknown row kind: ${rowKind}","messagePattern":"Unknown row kind: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/writer/HudiRecordWriter.java","lineNumber":212,"sourceCode":"\n    protected void prepareRecords(SeaTunnelRow element) {\n        HoodieRecord<HoodieAvroPayload> hoodieAvroPayloadHoodieRecord =\n                recordConverter.convertRow(schema, seaTunnelRowType, element, hudiTableConfig);\n        HoodieKey recordKey = hoodieAvroPayloadHoodieRecord.getKey();\n        boolean changeFlag = changeFlag(element.getRowKind());\n        buffer.put(recordKey, Pair.of(changeFlag, hoodieAvroPayloadHoodieRecord));\n    }\n\n    private boolean changeFlag(RowKind rowKind) {\n        switch (rowKind) {\n            case DELETE:\n            case UPDATE_BEFORE:\n                return false;\n            case INSERT:\n            case UPDATE_AFTER:\n                return true;\n            default:\n                throw new UnsupportedOperationException(\"Unknown row kind: \" + rowKind);\n        }\n    }\n\n    protected void checkFlushException() {\n        if (flushException != null) {\n            throw new HudiConnectorException(\n                    HudiErrorCode.FLUSH_DATA_FAILED,\n                    \"Flush records to Hudi failed.\",\n                    flushException);\n        }\n    }\n\n    /** Executes prepared statement and closes all resources of this instance. */\n    public synchronized void close() {\n        if (!closed) {\n            closed = true;\n            try {\n                flush();","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/writer/HudiRecordWriter.java#L194-L230","documentation":"changeFlag() maps a SeaTunnel RowKind to a boolean (insert/update-after -> true, delete/update-before -> false); any other RowKind (e.g. EMPTY) hits default and throws UnsupportedOperationException because the sink cannot interpret it as a change flag.","triggerScenarios":"writeRecord calls changeFlag(rowKind) on a row whose RowKind is not INSERT, UPDATE_AFTER, UPDATE_BEFORE, or DELETE — typically RowKind.ENUM_EMPTY or a custom kind.","commonSituations":"Non-CDC source feeding a CDC-style Hudi sink, producing EMPTY row kind; custom transforms not setting RowKind; translation layers emitting unusual kinds.","solutions":["Ensure the source/transform sets an explicit RowKind (INSERT for append-only data)","If appending plain data, use a source or transform that sets RowKind.INSERT","Verify translation/adapter settings so CDC events get proper row kinds"],"exampleFix":"// before: row created with RowKind.ENUM_EMPTY\n// after\nrow.setRowKind(RowKind.INSERT);","handlingStrategy":"type-guard","validationCode":"RowKind kind = row.getRowKind();\nif (!(kind == RowKind.INSERT || kind == RowKind.UPDATE_AFTER\n    || kind == RowKind.UPDATE_BEFORE || kind == RowKind.DELETE)) {\n    throw new IllegalStateException(\"RowKind \" + kind + \" not usable by Hudi CDC sink\");\n}","typeGuard":"static boolean hasUsableRowKind(SeaTunnelRow row) {\n    RowKind k = row.getRowKind();\n    return k == RowKind.INSERT || k == RowKind.UPDATE_AFTER\n        || k == RowKind.UPDATE_BEFORE || k == RowKind.DELETE;\n}","tryCatchPattern":"try {\n    sink.writeRecord(row);\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().startsWith(\"Unknown row kind:\")) {\n        LOG.error(\"Set an explicit RowKind on rows before the Hudi sink\");\n    } else { throw e; }\n}","preventionTips":["Use CDC-capable sources or set RowKind.INSERT for append-only data","Audit custom transforms to ensure they preserve/set RowKind","Add a pre-submit validation on sample rows' row kinds"],"tags":["hudi","cdc","row-kind","unsupported-operation"],"backgroundTag":"unsupported-enum-value","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"}