apache/iceberg · warning

An error occurred reloading table

Error message

An error occurred reloading table {}, table was not reloaded

What it means

Same as error 3402 in the Flink 2.3 flavor: CachingTableSupplier.refreshTable() catches an Exception from the periodic catalog table reload, logs this warning, and continues using the cached (stale) Table. Writers keep operating on outdated metadata until a later reload succeeds.

Solutions

  1. Read the chained exception in the log to identify the catalog load failure and fix it.
  2. Confirm the table exists and the job should keep running against it.
  3. Increase the refresh interval to reduce catalog pressure/timeouts.
  4. Fix credential renewal so long-running jobs can re-authenticate on reload.

Example fix

// before: table dropped mid-job, reload keeps failing
catalog.dropTable(identifier);
// after: stop the Flink job before dropping
catalog.dropTable(identifier); // only after job cancellation
Defensive patterns

Strategy: retry

Try / catch

// alert if reload repeatedly fails; stale metadata may cause commit conflicts
if (reloadFailures(table.name()) > 3) {
  alert("table reload failing; sink running on stale metadata");
}

Prevention

When it happens

Trigger: The table load performed inside refreshTable() throws — catalog unreachable, expired credentials, insufficient permissions, or the table was dropped/renamed while the job was running.

Common situations: Transient REST/metastore outages; IAM credential rotation in long-running streaming jobs; concurrent DROP TABLE; overly aggressive refresh intervals causing throttling.

Related errors


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

Appendix: source

Thrown at flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/sink/CachingTableSupplier.java:87

  }

  void refreshTable() {
    if (System.currentTimeMillis() > lastLoadTimeMillis + tableRefreshInterval.toMillis()) {
      try {
        if (!tableLoader.isOpen()) {
          tableLoader.open();
        }

        this.table = tableLoader.loadTable();
        this.lastLoadTimeMillis = System.currentTimeMillis();

        LOG.info(
            "Table {} reloaded, next min load time threshold is {}",
            table.name(),
            DateTimeUtil.formatTimestampMillis(
                lastLoadTimeMillis + tableRefreshInterval.toMillis()));
      } catch (Exception e) {
        LOG.warn("An error occurred reloading table {}, table was not reloaded", table.name(), e);
      }
    }
  }
}

View on GitHub (pinned to 86d9c8fc54)