apache/iceberg · warning

The Iceberg property '{}' and/or '{}' is enabled on table '{

Error message

The Iceberg property '{}' and/or '{}' is enabled on table '{}' in NessieCatalog. This will likely make data in other Nessie branches and tags and in earlier, historical Nessie commits inaccessible. The recommended setting for those properties is 'false'. Use the 'nessie-gc' tool for Nessie reference-aware garbage collection.

What it means

NessieUtil.checkAndUpdateGCProperties warns when write.delete.mode/GC-related Iceberg properties write.metadata.delete-after-commit.enabled or write.metadata.previous-versions-max style GC settings are enabled on a Nessie table. Because Nessie keeps historical references, deleting metadata/data files via Iceberg GC can make data in other branches, tags, or older commits inaccessible; Nessie recommends disabling these and using nessie-gc.

Source

Thrown at nessie/src/main/java/org/apache/iceberg/nessie/NessieUtil.java:145

        NessieTableOperations.NESSIE_GC_NO_WARNING_PROPERTY, false)) {
      return;
    }

    // To prevent accidental deletion of files that are still referenced by other branches/tags,
    // setting GC_ENABLED to 'false' is recommended, so that all Iceberg's gc operations like
    // expire_snapshots, remove_orphan_files, drop_table with purge will fail with an error.
    // `nessie-gc` CLI provides a reference-aware GC functionality for the expired/unreferenced
    // files.
    // Advanced users may still want to use the simpler Iceberg GC tools iff their Nessie Server
    // contains only one branch (in which case the full Nessie history will be reflected in the
    // Iceberg sequence of snapshots).
    if (tableMetadata.propertyAsBoolean(
            TableProperties.GC_ENABLED, TableProperties.GC_ENABLED_DEFAULT)
        || tableMetadata.propertyAsBoolean(
            TableProperties.METADATA_DELETE_AFTER_COMMIT_ENABLED,
            TableProperties.METADATA_DELETE_AFTER_COMMIT_ENABLED_DEFAULT)) {
      updatedProperties.put(NessieTableOperations.NESSIE_GC_NO_WARNING_PROPERTY, "true");
      LOG.warn(
          "The Iceberg property '{}' and/or '{}' is enabled on table '{}' in NessieCatalog."
              + " This will likely make data in other Nessie branches and tags and in earlier, historical Nessie"
              + " commits inaccessible. The recommended setting for those properties is 'false'. Use the 'nessie-gc'"
              + " tool for Nessie reference-aware garbage collection.",
          TableProperties.GC_ENABLED,
          TableProperties.METADATA_DELETE_AFTER_COMMIT_ENABLED,
          identifier);
    }
  }

  public static TableMetadata updateTableMetadataWithNessieSpecificProperties(
      TableMetadata tableMetadata,
      String metadataLocation,
      IcebergTable table,
      String identifier,
      Reference reference) {
    // Update the TableMetadata with the Content of NessieTableState.
    Map<String, String> newProperties = Maps.newHashMap(tableMetadata.properties());

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Set the offending properties to false on the table (e.g. write.metadata.delete-after-commit.enabled=false) or set the nessie no-gc-warning marker property
  2. Use the nessie-gc tool for reference-aware garbage collection instead of Iceberg's built-in expiry
  3. Audit scheduled expireSnapshots/removeOrphanFiles jobs that operate on Nessie tables

Example fix

// before
ALTER TABLE catalog.db.t SET TBLPROPERTIES ('write.metadata.delete-after-commit.enabled'='true');
// after
ALTER TABLE catalog.db.t SET TBLPROPERTIES ('write.metadata.delete-after-commit.enabled'='false');
Defensive patterns

Strategy: validation

Validate before calling

boolean gcEnabled = table.propertyAsBoolean(TableProperties.GC_ENABLED, TableProperties.GC_ENABLED_DEFAULT);
boolean delMeta = table.propertyAsBoolean(TableProperties.METADATA_DELETE_AFTER_COMMIT_ENABLED, TableProperties.METADATA_DELETE_AFTER_COMMIT_ENABLED_DEFAULT);
if (gcEnabled || delMeta) { /* unset before writing via Nessie */ }

Prevention

When it happens

Trigger: Committing table metadata through NessieCatalog while write.delete.mode, garbage-collection, or metadata-delete-after-commit style properties (write.metadata.delete-after-commit.enabled / write.metadata.previous-versions-max equivalents) are enabled.

Common situations: Tables created against other catalogs then accessed via NessieCatalog with GC defaults enabled; routine expiry/deleteOrphanFiles jobs that delete metadata files; copying TableProperties from non-Nessie setups.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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