{"record":{"id":"2db67eac90928664","repo":"apache/iceberg","slug":"failed-to-read-manifest-manifest-path","errorCode":null,"errorMessage":"Failed to read manifest: <manifest.path()>","messagePattern":"Failed to read manifest: <manifest\\.path\\(\\)>","errorType":"exception","errorClass":"UncheckedIOException","httpStatus":null,"severity":"error","filePath":"flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertDVWriter.java","lineNumber":312,"sourceCode":"    }\n\n    return anyPartition;\n  }\n\n  private void readDVEntries(\n      ManifestFile manifest, Set<String> filterPaths, Map<String, DeleteFile> out) {\n    manifestsRead++;\n    try (ManifestReader<DeleteFile> reader =\n        ManifestFiles.readDeleteManifest(manifest, table.io(), table.specs())) {\n      for (DeleteFile deleteFile : reader) {\n        if (ContentFileUtil.isDV(deleteFile)\n            && deleteFile.referencedDataFile() != null\n            && filterPaths.contains(deleteFile.referencedDataFile())) {\n          out.put(deleteFile.referencedDataFile(), deleteFile);\n        }\n      }\n    } catch (IOException e) {\n      throw new UncheckedIOException(\"Failed to read manifest: \" + manifest.path(), e);\n    }\n  }\n\n  @VisibleForTesting\n  int manifestsReadLastCycle() {\n    return manifestsRead;\n  }\n\n  @VisibleForTesting\n  int retainedStateSize() {\n    return positionsByFile.size();\n  }\n\n  private PositionDeleteIndex loadPreviousDV(String dataFilePath, Map<String, DeleteFile> dvs) {\n    DeleteFile existingDV = dvs.get(dataFilePath);\n    if (existingDV == null) {\n      return null;\n    }","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertDVWriter.java#L294-L330","documentation":"Wrapped IOException thrown while reading a manifest file during collectExistingDVs, when scanning manifests for existing deletion vectors referenced by data files. The library converts the checked IOException into UncheckedIOException because stream operators cannot throw checked exceptions. Indicates the manifest listed in the snapshot could not be opened or read.","triggerScenarios":"Manifest file missing, deleted by an expired/expired-and-cleaned snapshot, corrupted, or inaccessible storage (permissions, network, credentials) while readDVEntries iterates manifests via ManifestReader.","commonSituations":"Snapshot expiration removed manifests still referenced by the staging snapshot; S3/GCS transient outages or expired credentials; orphan-file cleanup ran mid-cycle; corrupted warehouse.","solutions":["Check the wrapped cause (getCause()) for the real storage error and fix connectivity/credentials to the catalog's FileIO storage.","Verify the referenced manifests still exist in object storage; if orphan/expiry cleanup deleted them, restore or re-run maintenance from an intact snapshot.","Re-run the maintenance cycle; if the failure persists, validate table metadata and manifests with Iceberg's CheckTables/validate tooling.","Increase storage retry/timeouts (FileIO config) for transient IO errors."],"exampleFix":"// diagnose with\ntry { rewrite.run(); } catch (UncheckedIOException e) {\n  LOG.error(\"manifest read failed: {} cause: {}\", e.getMessage(), e.getCause());\n}\n// ensure snapshot expiration is not racing maintenance\n// before\nexpireSnapshots olderThan(now - 1h).execute();\n// after\nexpireSnapshots olderThan(now - 1h).execute(); // only after maintenance cycle completes","handlingStrategy":"retry","validationCode":"// before the cycle, verify manifests of the planning snapshot are readable\nfor (ManifestFile mf : table.currentSnapshot().allManifests(table.io())) {\n  try (ManifestReader<?> r = ManifestFiles.read(mf, table.io())) {\n    r.liveEntries().iterator().hasNext(); // force open\n  }\n}","typeGuard":"boolean manifestReadable(ManifestFile mf, FileIO io) {\n  try { return io.newInputFile(mf.path()).exists(); } catch (Exception e) { return false; }\n}","tryCatchPattern":"try {\n  collectExistingDVs(manifest, filterPaths, out);\n} catch (UncheckedIOException e) {\n  LOG.error(\"manifest {} unreadable: {}\", manifest.path(), e.getCause());\n  throw new RetryableMaintenanceException(e);\n}","preventionTips":["Never run snapshot expiration/orphan cleanup concurrently with the maintenance job.","Configure storage client retries and long-enough timeouts in FileIO settings.","Rotate storage credentials before expiry; use instance roles where possible.","Alert on object-storage 4xx/5xx rates from taskmanager logs."],"tags":["flink","io","manifest"],"backgroundTag":"file-read-failed","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}