apache/seatunnel · warning

Unsupported row kind

Error message

Unsupported row kind: {}

What it means

This warning is logged by HugeGraphSinkWriter.write() when a SeaTunnelRow arrives with a RowKind the writer does not explicitly handle. The switch covers INSERT, UPDATE_AFTER (via UPDATE_BEFORE pairing / upsert handling) and DELETE; any other kind (e.g. unexpected changelog types) falls into the default branch and the row is skipped without being written.

Solutions

  1. Check the source/transform producing the rows and confirm the changelog kind contract (INSERT/UPDATE_BEFORE/UPDATE_AFTER/DELETE).
  2. Adjust the source or insert a transform so rows are normalized to supported kinds.
  3. If the kind is legitimately unsupported for HugeGraph (e.g. cannot express the op), accept the skip or filter those rows upstream to silence the warning.

Example fix

// before: source emits kinds the sink ignores
// after: normalize with a transform or filter
source {
  ... 
  transform {
    Filter {
      # drop rows whose kind is not representable in HugeGraph
    }
  }
}
Defensive patterns

Strategy: validation

Validate before calling

import static org.apache.seatunnel.api.table.type.RowKind;
Set<String> supported = Set.of("INSERT", "UPDATE_BEFORE", "UPDATE_AFTER", "DELETE");
assert supported.contains(row.getRowKind().name()) : "Sink cannot handle kind " + row.getRowKind();

Prevention

When it happens

Trigger: A row with an unhandled SeaTunnelRowKind reaches write()'s switch default — typically rows outside the connector's expected CDC/upsert contract (kind not INSERT/UPDATE_BEFORE/UPDATE_AFTER/DELETE).

Common situations: Sources emitting row kinds the sink's changelog contract does not anticipate (e.g. unusual transform outputs or connector translations); misuse of the connector with a non-CDC source producing unsupported kinds; version mismatches between API row kinds and connector handling.

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/0decc7202c2d2faa. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-hugegraph/src/main/java/org/apache/seatunnel/connectors/seatunnel/hugegraph/sink/HugeGraphSinkWriter.java:382

        switch (row.getRowKind()) {
            case INSERT:
                handleUpsert(row);
                break;
            case UPDATE_AFTER:
                handleUpdate(pendingUpdateBefore, row);
                pendingUpdateBefore = null;
                break;
            case DELETE:
                handleDelete(row);
                break;
            case UPDATE_BEFORE:
                // Correlated with the immediately following UPDATE_AFTER (changelog contract) and
                // handled together in handleUpdate, so a key-changing update deletes the
                // pre-update element instead of leaving it orphaned.
                pendingUpdateBefore = row;
                break;
            default:
                LOG.warn("Unsupported row kind: {}", row.getRowKind());
                break;
        }
    }

    private void handleUpsert(SeaTunnelRow row) throws IOException {
        List<GraphElementEnvelope> vertexEnvelopes = new ArrayList<>();
        List<GraphElementEnvelope> edgeEnvelopes = new ArrayList<>();

        for (MappingEntry entry : mappingEntries) {
            // mapToEnvelopes returns 1 element normally, or N when unfold expands a list cell.
            for (GraphElementEnvelope envelope : mapToEnvelopes(entry, row)) {
                if (entry.config.getType() == LabelType.VERTEX) {
                    vertexEnvelopes.add(envelope);
                } else {
                    edgeEnvelopes.add(envelope);
                }
            }
        }

View on GitHub (pinned to cf67b549a7)