apache/iceberg · warning

Skipping commits to table

Error message

Skipping commits to table {} due to target table mismatch.  Expected: {} Received: {}

What it means

The loaded table's UUID does not match the UUID recorded in the TableReference, meaning the table was dropped and recreated (or replaced) since the coordinator first resolved it. Commits to that table are skipped to avoid writing to a table the connector did not originally target.

Solutions

  1. If the recreation was intentional, restart the connector so TableReferences are refreshed with the new table UUID.
  2. If it was accidental, restore the original table (undrop is rarely possible — recreate and backfill, then restart the connector).
  3. Prevent by stopping maintenance/rebuild jobs from dropping connector target tables while ingestion is running.
  4. Audit which process replaced the table (check catalog metadata logs) before deciding to adopt the new UUID.
Defensive patterns

Strategy: validation

Validate before calling

// detect table recreation before it surprises the connector
Table loaded = catalog.loadTable(identifier);
if (referenceUuid != null && !referenceUuid.equals(loaded.uuid())) {
  // table was replaced: restart connector or restore the original table
}

Prevention

When it happens

Trigger: tableReference.uuid() is non-null and differs from table.uuid() after catalog.loadTable — i.e. the physical table identity changed (drop+create, snapshot restore/replace, or catalog pointing at a different table of the same name).

Common situations: Someone dropped and recreated the target table; a data pipeline rebuilt the table (CREATE OR REPLACE); environments switched (table same name but different table in another catalog); schema-rebuild jobs running concurrently with the connector.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/70f0db493628902c. Report an issue: GitHub.

Appendix: source

Thrown at kafka-connect/kafka-connect/src/main/java/org/apache/iceberg/connect/channel/Coordinator.java:252

  }

  @SuppressWarnings("checkstyle:CyclomaticComplexity")
  private void commitToTable(
      TableReference tableReference,
      List<Envelope> envelopeList,
      Map<Integer, Long> controlTopicOffsets,
      OffsetDateTime validThroughTs) {
    TableIdentifier tableIdentifier = tableReference.identifier();
    Table table;
    try {
      table = catalog.loadTable(tableIdentifier);
    } catch (NoSuchTableException e) {
      LOG.warn("Table not found, skipping commit: {}", tableIdentifier, e);
      return;
    }

    if (tableReference.uuid() != null && !tableReference.uuid().equals(table.uuid())) {
      LOG.warn(
          "Skipping commits to table {} due to target table mismatch.  Expected: {} Received: {}",
          tableIdentifier,
          table.uuid(),
          tableReference.uuid());
      return;
    }

    String branch = config.tableConfig(tableIdentifier.toString()).commitBranch();

    // Control topic partition offsets may include a subset of partition ids if there were no
    // records for other partitions.  Merge the updated topic partitions with the last committed
    // offsets.
    Map<Integer, Long> committedOffsets = lastCommittedOffsetsForTable(table, branch);
    Map<Integer, Long> mergedOffsets =
        Stream.of(committedOffsets, controlTopicOffsets)
            .flatMap(map -> map.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Long::max));
    String offsetsJson = offsetsToJson(mergedOffsets);

View on GitHub (pinned to 86d9c8fc54)