apache/iceberg · error · NoSuchTableException

Metadata object is absent while refresh a loaded table…

Error message

Metadata object %s is absent while refresh a loaded table. Maybe the table is deleted/moved.

What it means

NoSuchTableException thrown by EcsTableOperations.doRefresh when the table's metadata object disappeared from ECS during a refresh of an already-loaded table. It signals the table was deleted or moved after it was loaded.

Solutions

  1. Reload the table from the catalog instead of refreshing a stale reference
  2. Coordinate table drops with running consumers
  3. Check whether the table was deleted/moved and re-create or re-point it

Example fix

// before
table.refresh();
// after
try {
  table.refresh();
} catch (NoSuchTableException e) {
  table = catalog.loadTable(tableId); // reload or handle deletion
}
Defensive patterns

Strategy: try-catch

Try / catch

try { table.refresh(); } catch (NoSuchTableException e) { table = catalog.loadTable(tableId); /* or stop processing */ }

Prevention

When it happens

Trigger: Refreshing a previously loaded Table whose metadata properties object no longer exists in ECS (currentMetadataLocation was non-null).

Common situations: Another process dropped the table while a long-running job held a loaded reference, manual deletion of ECS objects, table moved to a different location.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at dell/src/main/java/org/apache/iceberg/dell/ecs/EcsTableOperations.java:70

    this.catalog = catalog;
  }

  @Override
  protected String tableName() {
    return tableName;
  }

  @Override
  public FileIO io() {
    return fileIO;
  }

  @Override
  protected void doRefresh() {
    String metadataLocation;
    if (!catalog.objectMetadata(tableObject).isPresent()) {
      if (currentMetadataLocation() != null) {
        throw new NoSuchTableException(
            "Metadata object %s is absent while refresh a loaded table. "
                + "Maybe the table is deleted/moved.",
            tableObject);
      } else {
        metadataLocation = null;
      }
    } else {
      EcsCatalog.Properties metadata = catalog.loadProperties(tableObject);
      this.eTag = metadata.eTag();
      metadataLocation = metadata.content().get(ICEBERG_METADATA_LOCATION);
      Preconditions.checkNotNull(
          metadataLocation, "Can't find location from table metadata %s", tableObject);
    }

    refreshFromMetadataLocation(metadataLocation);
  }

  @Override

View on GitHub (pinned to 86d9c8fc54)