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

  1. Fix the root sink error reported earlier for that table via the failure policy
  2. Use a failure policy with continueOtherTables so the failed table is quarantined while healthy tables keep writing
  3. 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)