apache/seatunnel · warning
Unsupported row type:
Error message
Unsupported row type:
What it means
While consuming TiKV CDC streaming events, TiDBSourceReader.handleRow only handles specific row event types (e.g. PREWRITE, COMMIT, ROLLBACK in the prewrite handling switch). An event row of an unrecognized type falls into the default branch and this warning is logged; the row is skipped but streaming continues (returns true).
Source
Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-tidb/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/tidb/source/reader/TiDBSourceReader.java:385
return false;
}
log.debug("binlog record, type: {}, data: {}", row.getType(), row);
switch (row.getType()) {
case COMMITTED:
preWrites.put(RowKeyWithTs.ofStart(row), row);
commits.put(RowKeyWithTs.ofCommit(row), row);
break;
case COMMIT:
commits.put(RowKeyWithTs.ofCommit(row), row);
break;
case PREWRITE:
preWrites.put(RowKeyWithTs.ofStart(row), row);
break;
case ROLLBACK:
preWrites.remove(RowKeyWithTs.ofStart(row));
break;
default:
log.warn("Unsupported row type:" + row.getType());
}
return true;
}
protected void flushRows(final long resolvedTs) throws Exception {
flushRowsAndGetSafeResolvedTs(resolvedTs);
}
private long flushRowsAndGetSafeResolvedTs(final long resolvedTs) throws Exception {
long safeResolvedTs = resolvedTs;
while (!commits.isEmpty() && commits.firstKey().getTimestamp() <= resolvedTs) {
final RowKeyWithTs commitKey = commits.firstKey();
final Cdcpb.Event.Row commitRow = commits.firstEntry().getValue();
final Cdcpb.Event.Row prewriteRow = preWrites.remove(RowKeyWithTs.ofStart(commitRow));
if (prewriteRow == null) {
safeResolvedTs = Math.min(safeResolvedTs, commitKey.getTimestamp() - 1);
log.warn(
"Commit row has no matched prewrite row yet, hold it and stop advancing resolvedTs. "View on GitHub (pinned to cf67b549a7)
Solutions
- Verify TiDB/TiKV cluster version compatibility with the connector version; upgrade the seatunnel connector-cdc-tidb plugin if the cluster is newer.
- Inspect the logged row type; if it corresponds to a known TiKV event type that should be handled, file/apply a patch adding that case.
- No immediate action required — the event is skipped, but monitor for data loss if the type is significant.
Example fix
// before
default:
log.warn("Unsupported row type:" + row.getType());
// after
case TYPE_UNKNOWN:
case INT_EVENT:
// ignore non-data events
break;
default:
log.warn("Unsupported row type:" + row.getType()); Defensive patterns
Strategy: fallback
Validate before calling
// verify cluster/connector compatibility before running // ensure TiDB/TiKV version is within the connector's supported matrix
Prevention
- Pin TiDB/TiKV versions supported by your connector-cdc-tidb version
- Upgrade the connector when upgrading the TiDB cluster
- Watch for repeated warnings indicating systematically dropped event types
When it happens
Trigger: A Cdcpb.Event.Row arrives whose getType() is not one of the types handled by the switch (e.g. newer TiKV event types or marker/unknown types).
Common situations: Connecting to a newer TiDB/TiKV version that emits event types this connector version does not know about; unusual raft/txn event propagation during region merges.
Related errors
- Commit row has no matched prewrite row yet, hold it and stop
- Unable to convert to decimal from unexpected value '${value}
- Unsupported BYTES value type: ${value.getClass().getSimpleNa
- Unable to convert TIMESTAMP_TZ from String value: '${value}'
- Unsupported value type for TIMESTAMP_TZ conversion: ${value.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/a828a7c8d8c0121e.
Report an issue: GitHub.