apache/iceberg · warning
Unable to read delta manifests for table
Error message
Unable to read delta manifests for table {} at checkpoint {} What it means
CommittableToTableChangeConverter.processElement deserializes a Flink write committable's DeltaManifests and converts them into a TableChange for the maintenance committer. If reading/decoding the delta manifests or reading the completed files fails, it logs a warning with the table and checkpoint id and returns early — the committable is dropped, so those files' changes are not applied to the table change summary for that checkpoint.
Solutions
- Verify the savepoint/checkpoint was produced by the same (or compatible) Iceberg/Flink sink version; re-run the pipeline writing fresh checkpoints if versions were mixed
- Check whether referenced manifest files still exist and that FileIO on this operator can read the table location
- Inspect the nested exception; if manifests are corrupted, the affected checkpoint's committable is lost — reconcile via an Iceberg repair or re-write
- Avoid running orphan-file deletion with shorter intervals than checkpoint duration so pending manifests are not deleted
Defensive patterns
Strategy: validation
Validate before calling
// Before upgrading/restoring, verify serializer compatibility
Preconditions.checkState(
DeltaManifestsSerializer.INSTANCE.getVersion() == savedVersion,
"DeltaManifests version mismatch: recheck checkpoint/savepoint compatibility"); Try / catch
// The converter swallows the error and returns; detect via logs/metrics // grep 'Unable to read delta manifests for table' taskmanager.log
Prevention
- Restore jobs only from checkpoints/savepoints written by a compatible Iceberg version
- Keep orphan-cleanup olderThan greater than the checkpoint interval so pending manifests survive
- Ensure FileIO on the committer can read the manifest location
- Alert on this log line — dropped committables mean lost change summaries for that checkpoint
When it happens
Trigger: Raised in processElement when SimpleVersionedSerialization.readVersionAndDeSerialize(DeltaManifestsSerializer...) or FlinkManifestUtil.readCompletedFiles throws — corrupted/truncated manifest payload in the committable, serializer version mismatch (e.g. after an Iceberg upgrade restoring from an old savepoint), or unreadable manifest files in FileIO.
Common situations: Restoring a job from a savepoint/checkpoint made with a different Iceberg version whose DeltaManifests serialization differs; manifest data files deleted by orphan cleanup before conversion; io misconfiguration preventing manifest reads; corrupted object-store objects.
Understand the failure class
Background: "cannot parse invalid wire-format data", "cannot unmarshal", "failed unmarshalling": protobuf unmarshal errors explained — this error's family across 10 libraries.
Related errors
- Unrecognized version or corrupt state:
- Could not deserialize the WriteResult object
- Could not deserialize the WriteResult object
- Could not deserialize the WriteResult object
- Could not deserialize the WriteResult object
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/cb93261fde89128c.
Report an issue: GitHub.
Appendix: source
Thrown at flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/sink/CommittableToTableChangeConverter.java:91
CommittableMessage<IcebergCommittable> value, Context ctx, Collector<TableChange> out)
throws Exception {
if (value instanceof CommittableWithLineage) {
IcebergCommittable committable =
((CommittableWithLineage<IcebergCommittable>) value).getCommittable();
if (committable == null || committable.manifest().length == 0) {
return;
}
DeltaManifests deltaManifests;
WriteResult writeResult;
try {
deltaManifests =
SimpleVersionedSerialization.readVersionAndDeSerialize(
DeltaManifestsSerializer.INSTANCE, committable.manifest());
writeResult = FlinkManifestUtil.readCompletedFiles(deltaManifests, io, specs);
} catch (Exception e) {
LOG.warn(
"Unable to read delta manifests for table {} at checkpoint {}",
tableName,
committable.checkpointId(),
e);
return;
}
TableChange tableChange =
new TableChange(
Arrays.asList(writeResult.dataFiles()), Arrays.asList(writeResult.deleteFiles()));
out.collect(tableChange);
FlinkManifestUtil.deleteCommittedManifests(
tableName, io, deltaManifests.manifests(), flinkJobId, committable.checkpointId());
}
}
}
View on GitHub (pinned to 86d9c8fc54)