apache/seatunnel · error · RuntimeException
multi table sink can not write table:
Error message
multi table sink can not write table:
What it means
Thrown in MultiTableSinkWriter.write when a row cannot be routed to any writer queue for its table — typically the table's writer has failed and, under the active failure policy, no healthy queue remains to accept the row.
Solutions
- Fix the root sink error reported earlier for that table via the failure policy
- Use a failure policy with continueOtherTables so the failed table is quarantined while healthy tables keep writing
- Verify the row's tableId matches a configured sink table
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/sink/multitablesink/MultiTableSinkWriter.java:614 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/2c357522fff5b2ed.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/sink/multitablesink/MultiTableSinkWriter.java:614
if (failurePolicy.continueOtherTables() && isTableFailed(tableId)) {
log.debug("Skip row for quarantined table {}", tableId);
return;
}
Optional<Integer> primaryKey = tableId == null ? null : sinkPrimaryKeys.get(tableId);
if ((primaryKey == null && sinkPrimaryKeys.size() == 1)
|| (primaryKey != null && !primaryKey.isPresent())) {
int index = random.nextInt(blockingQueues.size());
offerRowElement(index, element);
} else if (primaryKey == null) {
if (failurePolicy.continueOtherTables()) {
handleTableFailure(
tableId,
MultiTableFailurePhase.RUNTIME_WRITE,
new IllegalStateException(
"No active sink writer found for table " + tableId));
return;
}
throw new RuntimeException("multi table sink can not write table: " + tableId);
} else {
Object object = element.getField(primaryKey.get());
int index = 0;
if (object != null) {
index = Math.abs(object.hashCode()) % blockingQueues.size();
}
offerRowElement(index, element);
}
}
/**
* Starts the queue workers exactly once before the first ordered request enters the queues.
* Schema changes must share the same bootstrap path as row writes so the first DDL cannot
* bypass the in-band barrier while another thread is still bringing workers online.
*/
private synchronized void ensureQueueWorkersSubmitted() {
if (submitted) {
return;View on GitHub (pinned to cf67b549a7)