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
- Verify the manifest list file exists at the location referenced by the snapshot (check table metadata)
- Fix storage credentials/permissions for the FileIO used by the table
- Restore the file from backup or use register_table/rollback to a snapshot whose manifest lists are intact
- Check network connectivity and endpoint configuration for the object store
- 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
- Disable lifecycle policies on metadata/manifest locations
- Use consistent credentials for table IO
- Avoid manually deleting manifest list files
- Monitor commits so snapshots never reference pruned files
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
- Failed to close manifest list: %s
- Failed to create snapshot list writer for path: %s
- Cannot read manifest list file: %s
- Failed to close manifest reader
- Failed to create manifest writer for path: %s
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/e1209b72243f4a23.
Report an issue: GitHub.