{"record":{"id":"0cf0da41ba1bb300","repo":"apache/iceberg","slug":"the-iceberg-transaction-has-been-committed-but-we-0cf0da","errorCode":null,"errorMessage":"The iceberg transaction has been committed, but we failed to clean the temporary flink manifests: {}","messagePattern":"The iceberg transaction has been committed, but we failed to clean the temporary flink manifests: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java","lineNumber":181,"sourceCode":"  static void deleteCommittedManifests(\n      String tableName,\n      FileIO io,\n      List<ManifestFile> manifestsPath,\n      String newFlinkJobId,\n      long checkpointId) {\n    for (ManifestFile manifest : manifestsPath) {\n      try {\n        io.deleteFile(manifest.path());\n      } catch (Exception e) {\n        // The flink manifests cleaning failure shouldn't abort the completed checkpoint.\n        String details =\n            MoreObjects.toStringHelper(FlinkManifestUtil.class)\n                .add(\"tableName\", tableName)\n                .add(\"flinkJobId\", newFlinkJobId)\n                .add(\"checkpointId\", checkpointId)\n                .add(\"manifestPath\", manifest)\n                .toString();\n        LOG.warn(\n            \"The iceberg transaction has been committed, but we failed to clean the temporary flink manifests: {}\",\n            details,\n            e);\n      }\n    }\n  }\n}\n","sourceCodeStart":163,"sourceCodeEnd":189,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java#L163-L189","documentation":"After a successful Iceberg commit, deleteCommittedManifests removes temporary Flink manifest files. Failure to delete them does not affect the committed transaction; the method logs this warning with job/checkpoint/manifest details and swallows the exception.","triggerScenarios":"deleteCommittedManifests is called after commit and the underlying FileIO throws while deleting a manifest or manifest-list file (already deleted by retention/orphan cleanup, permission denied, or transient storage error).","commonSituations":"ExpireSnapshots or DeleteOrphanFiles running concurrently removed the manifests first; S3/HDFS permission changes; short-lived credentials expiring mid-job.","solutions":["Safe to ignore in most cases - the commit succeeded and leftover files are cleaned by DeleteOrphanFiles","Ensure orphan-file cleanup actions are scheduled to reclaim the leaked manifest files","Avoid running expireSnapshots concurrently with the writing job","Verify FileIO credentials/permissions remain valid for the job's lifetime"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat this as benign; schedule DeleteOrphanFiles to reclaim leftover manifests","Keep FileIO credentials valid for the whole job lifetime","Avoid concurrent expire/cleanup jobs touching the same locations"],"tags":["flink","iceberg","cleanup","file-deletion"],"backgroundTag":"file-write-permission-denied","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"}