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

  1. Check the wrapped cause (e.getCause()) to identify the underlying IOException and verify the manifest at the reported path exists and is readable.
  2. Ensure no concurrent table maintenance (expireSnapshots, removeOrphanFiles, rewriteDataFiles) runs against the table while the equality-conversion job is active.
  3. Verify FileIO/storage credentials and connectivity (S3 endpoint, HDFS NameNode) and retry the job after transient failures.
  4. 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

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


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