apache/iceberg · error · RuntimeIOException

Cannot read manifest list file: %s

Error message

Cannot read manifest list file: %s

What it means

AllManifestsTable's rows() reader wraps IOException from reading a snapshot's manifest list file into RuntimeIOException with this message. The manifest list is the Avro file listing a snapshot's manifests; if it cannot be read (missing, unreadable, corrupt, or unreachable storage), the all_manifests metadata table scan fails. The table name/UUID in the message identifies which snapshot's manifest list failed.

Source

Thrown at core/src/main/java/org/apache/iceberg/AllManifestsTable.java:216

          InternalData.read(FileFormat.AVRO, io.newInputFile(manifestList))
              .setRootType(GenericManifestFile.class)
              .setCustomType(
                  ManifestFile.PARTITION_SUMMARIES_ELEMENT_ID, GenericPartitionFieldSummary.class)
              .project(ManifestFile.schema())
              .build()) {

        CloseableIterable<StructLike> rowIterable =
            CloseableIterable.transform(
                manifests,
                manifest ->
                    manifestFileToRow(
                        specs.get(manifest.partitionSpecId()), manifest, referenceSnapshotId));

        StructProjection projection = StructProjection.create(MANIFEST_FILE_SCHEMA, schema);
        return CloseableIterable.transform(rowIterable, projection::wrap);

      } catch (IOException e) {
        throw new RuntimeIOException(
            e, "Cannot read manifest list file: %s", manifestList.location());
      }
    }

    @Override
    public DataFile file() {
      if (lazyDataFile == null) {
        this.lazyDataFile =
            DataFiles.builder(PartitionSpec.unpartitioned())
                .withInputFile(io.newInputFile(manifestList))
                .withRecordCount(1)
                .withFormat(FileFormat.AVRO)
                .build();
      }

      return lazyDataFile;
    }

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Verify the manifest list file exists at the location referenced by the snapshot (check table metadata)
  2. Fix storage credentials/permissions for the FileIO used by the table
  3. Restore the file from backup or use register_table/rollback to a snapshot whose manifest lists are intact
  4. Check network connectivity and endpoint configuration for the object store
  5. Enable FileIO-level logging to distinguish NotFound vs permission vs IO errors

Example fix

// before
Table t = catalog.loadTable("db.t");
t.scan(AllManifestsTable.NAME);
// after
if (t.currentSnapshot() != null) {
  try {
    t.io().newInputFile(t.currentSnapshot().manifestListLocation()).exists(); // precheck
    t.scan(AllManifestsTable.NAME);
  } catch (RuntimeIOException e) {
    LOG.error("Manifest list unreadable: {}", e.getMessage());
  }
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify manifest list readability before scanning the metadata table
String loc = table.currentSnapshot().manifestListLocation();
if (loc != null && !table.io().newInputFile(loc).exists()) {
  throw new IllegalStateException("Missing manifest list: " + loc);
}

Type guard

null

Try / catch

try { table.scan(AllManifestsTable.NAME).planFiles(); } catch (RuntimeIOException e) { /* handle missing/unreadable manifest list; check cause */ }

Prevention

When it happens

Trigger: Querying the table.all_manifests metadata table when the manifest list Avro file for a snapshot is missing/deleted, storage credentials are invalid, or the file is corrupt/truncated.

Common situations: Expired or rotated S3/GCS/ADLS credentials; lifecycle policies that deleted old manifest lists; manually pruned metadata files; network/firewall issues to object storage; interrupted commit that left dangling references.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


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