apache/iceberg · error · RuntimeIOException

Cannot read manifest list file

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.

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.

Appendix: 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)