apache/iceberg · error · UncheckedIOException
Failed to read manifest:
Error message
Failed to read manifest:
What it means
Thrown by EqualityConvertDVWriter.readDVEntries when reading a manifest to collect existing deletion vectors fails with an IOException. The library wraps the IOException in an UncheckedIOException, including the manifest path, because the maintenance task cannot proceed without knowing which DVs already exist on the target branch.
Source
Thrown at flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertDVWriter.java:312
}
return anyPartition;
}
private void readDVEntries(
ManifestFile manifest, Set<String> filterPaths, Map<String, DeleteFile> out) {
manifestsRead++;
try (ManifestReader<DeleteFile> reader =
ManifestFiles.readDeleteManifest(manifest, table.io(), table.specs())) {
for (DeleteFile deleteFile : reader) {
if (ContentFileUtil.isDV(deleteFile)
&& deleteFile.referencedDataFile() != null
&& filterPaths.contains(deleteFile.referencedDataFile())) {
out.put(deleteFile.referencedDataFile(), deleteFile);
}
}
} catch (IOException e) {
throw new UncheckedIOException("Failed to read manifest: " + manifest.path(), e);
}
}
@VisibleForTesting
int manifestsReadLastCycle() {
return manifestsRead;
}
@VisibleForTesting
int retainedStateSize() {
return positionsByFile.size();
}
private PositionDeleteIndex loadPreviousDV(String dataFilePath, Map<String, DeleteFile> dvs) {
DeleteFile existingDV = dvs.get(dataFilePath);
if (existingDV == null) {
return null;
}View on GitHub (pinned to 86d9c8fc54)
Solutions
- Check the wrapped cause (e.getCause()) to identify the underlying IOException and verify the manifest at the reported path exists and is readable.
- Ensure no concurrent table maintenance (expireSnapshots, removeOrphanFiles, rewriteDataFiles) runs against the table while the equality-conversion job is active.
- Verify FileIO/storage credentials and connectivity (S3 endpoint, HDFS NameNode) and retry the job after transient failures.
- If manifests are truly missing, inspect table history for metadata corruption and consider rolling back to a valid snapshot.
Example fix
// before: reading manifests while compaction expires old snapshots concurrently maintenanceJob.start(); rewriteDataFiles(table); // causes manifest removal mid-run // after maintenanceJob.start(); maintenanceJob.await(); // or stop other maintenance tasks first rewriteDataFiles(table);
Defensive patterns
Strategy: try-catch
Validate before calling
TableMetadata meta = table.operations().current(); Snapshot snap = meta.currentSnapshot(); // verify referenced manifests are still readable before running the job snap.allManifests(table.io()).forEach(m -> Preconditions.checkArgument(table.io().newInputFile(m.path()).exists(), "missing manifest " + m.path()));
Try / catch
try {
runEqualityConvertJob(table, cfg);
} catch (UncheckedIOException e) {
LOG.error("DV manifest read failed for {}, cause={}", cfg.branch(), e.getCause(), e);
// retry after verifying storage health / stopping concurrent maintenance
} Prevention
- Do not run expireSnapshots/removeOrphanFiles concurrently with equality-delete conversion
- Verify FileIO credentials and storage connectivity before launching the job
- Add object-store retries (S3 throttle handling) in your Hadoop/S3 config
- Monitor manifest availability after compaction jobs
When it happens
Trigger: An IOException (deleted/corrupt manifest file, unavailable filesystem, transient object-store errors, network blips to HDFS/S3) while iterating manifest entries via CloseableIterable in readDVEntries, called from collectExistingDVs during the DV collection phase of equality delete conversion.
Common situations: Underlying data files or manifests deleted by concurrent expiration or compaction while the maintenance job runs; S3/HDFS transient I/O errors or throttling; misconfigured FileIO credentials causing read failures; table metadata pointing to manifests that no longer exist.
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 read manifest: <manifest.path()>
- Failed to read manifest:
- Failed to read manifest:
- Failed to plan files for main index
- Failed to plan files for main index
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/f015e3a8704bd548.
Report an issue: GitHub.