apache/iceberg · error · IllegalArgumentException

Unsupported manifest content type

Error message

Unsupported manifest content type:{content}

What it means

ReadManifest.entries iterates manifests by content: DATA, DELETES (and other supported content kinds) each have a dedicated reader branch; an unrecognized ManifestContent falls through to IllegalArgumentException. It guards the manifest-reading switch against future/unknown content kinds.

Solutions

  1. Upgrade the Iceberg Spark runtime to support the manifest content type
  2. Inspect snapshot summary/manifest list to identify the content kind
  3. Avoid mixing writer/reader Iceberg versions on the same table
Defensive patterns

Strategy: try-catch

Validate before calling

boolean supported = content == ManifestContent.DATA || content == ManifestContent.DELETES;

Type guard

boolean isReadableManifest(ManifestContent c) { return c == ManifestContent.DATA || c == ManifestContent.DELETES; }

Try / catch

try { action.execute(); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Unsupported manifest content")) { /* upgrade runtime */ } throw e; }

Prevention

When it happens

Trigger: Actions that scan all manifests (call -> entries) encountering a manifest with a content kind the current code doesn't handle — e.g. newer manifest content types with an older runtime.

Common situations: Iceberg version skew between the writer that produced manifests and the Spark job reading them; corrupted manifest lists referencing wrong content.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java:436

    }

    public CloseableIterator<FileInfo> entries(ManifestFileBean manifest) {
      ManifestContent content = manifest.content();
      FileIO io = table.getValue().io();
      Map<Integer, PartitionSpec> specs = table.getValue().specs();
      List<String> proj = ImmutableList.of(DataFile.FILE_PATH.name(), DataFile.CONTENT.name());

      switch (content) {
        case DATA:
          return CloseableIterator.transform(
              ManifestFiles.read(manifest, io, specs).select(proj).iterator(),
              ReadManifest::toFileInfo);
        case DELETES:
          return CloseableIterator.transform(
              ManifestFiles.readDeleteManifest(manifest, io, specs).select(proj).iterator(),
              ReadManifest::toFileInfo);
        default:
          throw new IllegalArgumentException("Unsupported manifest content type:" + content);
      }
    }

    static FileInfo toFileInfo(ContentFile<?> file) {
      return new FileInfo(file.location(), file.content().toString());
    }
  }
}

View on GitHub (pinned to 86d9c8fc54)