apache/seatunnel · error · IOException

Row kind ${rowKind} is not supported in NebulaGraph ${writeM

Error message

Row kind ${rowKind} is not supported in NebulaGraph ${writeMode} mode.

What it means

NebulaGraphSinkWriter.write inspects each row's RowKind. DELETE rows are always rejected, and in INSERT mode only INSERT rows are accepted; UPDATE_BEFORE rows are skipped. Unsupported combinations throw UNSUPPORTED_DATA_TYPE via unsupportedRowKind, naming the row kind and current write mode.

Source

Thrown at seatunnel-connectors-v2/connector-nebulagraph/src/main/java/org/apache/seatunnel/connectors/seatunnel/nebulagraph/sink/NebulaGraphSinkWriter.java:67

    }

    NebulaGraphSinkWriter(
            NebulaGraphSinkConfig config, SeaTunnelRowType rowType, NebulaGraphClient client) {
        this.config = config;
        this.converter = new NebulaGraphRowConverter(config, rowType);
        this.statementBuilder =
                new NebulaGraphStatementBuilder(
                        config.getTag(), converter.getPropertyNames(), config.getWriteMode());
        this.buffer = new ArrayList<>(config.getBatchSize());
        this.client = client == null ? new SessionPoolNebulaGraphClient(config) : client;
    }

    @Override
    public void write(SeaTunnelRow row) throws IOException {
        ensureWritable();
        RowKind rowKind = row.getRowKind();
        if (rowKind == RowKind.DELETE) {
            throw unsupportedRowKind(rowKind);
        }
        if (config.getWriteMode() == NebulaGraphWriteMode.INSERT && rowKind != RowKind.INSERT) {
            throw unsupportedRowKind(rowKind);
        }
        if (rowKind == RowKind.UPDATE_BEFORE) {
            return;
        }

        buffer.add(converter.convert(row));
        if (buffer.size() >= config.getBatchSize()) {
            flush();
        }
    }

    @Override
    public Optional<Void> prepareCommit() {
        try {
            ensureWritable();

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Set write_mode = UPDATE (or the mode that supports the row kinds you ingest) for CDC streams
  2. Filter DELETE rows upstream with a Sql transform (e.g. WHERE __op != 'DELETE' or row kind filtering)
  3. Use a transform to convert UPDATE_BEFORE/DELETE rows appropriately before the sink
  4. Route delete events to a separate sink or handle them via explicit delete logic if supported

Example fix

// before
NebulaGraph {
  write_mode = INSERT  // CDC stream has UPDATE/DELETE kinds
}
// after
NebulaGraph {
  write_mode = UPDATE
}
Defensive patterns

Strategy: validation

Validate before calling

RowKind k = row.getRowKind();
if (k == RowKind.DELETE) throw new IllegalArgumentException("DELETE rows unsupported by NebulaGraph sink");
if (writeMode == INSERT && k != RowKind.INSERT) throw new IllegalArgumentException("mode INSERT only accepts INSERT rows");

Try / catch

try {
    sink.write(row);
} catch (NebulaGraphConnectorException e) {
    if (e.getMessage() != null && e.getMessage().contains("Row kind")) {
        // switch write_mode or filter the row kind upstream
    }
    throw e;
}

Prevention

When it happens

Trigger: Consuming CDC data (e.g. MySQL-CDC) where DELETE or UPDATE_AFTER/UPDATE_BEFORE rows reach an INSERT-mode NebulaGraph sink; DELETE rows in any write mode.

Common situations: CDC pipeline targeting NebulaGraph with default INSERT mode; Debezium-style changelog streams not filtered; using the sink where a delete/delete-supporting sink is expected.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/f925ae1dec1ac203. Report an issue: GitHub.