{"record":{"id":"1ff807c86fb0622b","repo":"apache/iceberg","slug":"unexpected-delete-file-content-deletefile","errorCode":null,"errorMessage":"Unexpected delete file content: <deleteFile>","messagePattern":"Unexpected delete file content: <deleteFile>","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/TableChange.java","lineNumber":85,"sourceCode":"    dataFiles.forEach(\n        dataFile -> {\n          this.dataFileCount++;\n          this.dataFileSizeInBytes += dataFile.fileSizeInBytes();\n        });\n\n    deleteFiles.forEach(\n        deleteFile -> {\n          switch (deleteFile.content()) {\n            case POSITION_DELETES:\n              this.posDeleteFileCount++;\n              this.posDeleteRecordCount += deleteFile.recordCount();\n              break;\n            case EQUALITY_DELETES:\n              this.eqDeleteFileCount++;\n              this.eqDeleteRecordCount += deleteFile.recordCount();\n              break;\n            default:\n              throw new IllegalArgumentException(\"Unexpected delete file content: \" + deleteFile);\n          }\n        });\n\n    this.commitCount = 1;\n  }\n\n  static TableChange empty() {\n    return new TableChange(0, 0L, 0, 0L, 0, 0L, 0);\n  }\n\n  public static Builder builder() {\n    return new Builder();\n  }\n\n  int dataFileCount() {\n    return dataFileCount;\n  }\n","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/TableChange.java#L67-L103","documentation":"When building a TableChange from delete files, Iceberg distinguishes position deletes and equality deletes; the switch over DeleteFile.content() has a default arm that throws if the content is neither POSITION_DELETES nor EQUALITY_DELETES. Since the enum is closed, this signals a new/unexpected delete-file content type reaching the maintenance trigger code.","triggerScenarios":"A DeleteFile with content other than EQUALITY_DELETES or POSITION_DELETES is fed into the TableChange constructor that aggregates delete-file statistics.","commonSituations":"Running an older iceberg-flink maintenance job against tables written by a newer Iceberg spec that introduces new delete-file content types; corrupted metadata listing unexpected content.","solutions":["Upgrade the iceberg-flink runtime so it recognizes all delete file content types produced by the writer version.","Check the table metadata for delete files with unexpected content values.","Exclude the problematic snapshots from maintenance until versions are aligned."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (deleteFile.content() != ContentFile.POSITION_DELETES && deleteFile.content() != ContentFile.EQUALITY_DELETES) { /* skip or upgrade */ }","typeGuard":"switch (deleteFile.content()) { case POSITION_DELETES, EQUALITY_DELETES -> { /* handle */ } default -> { /* unsupported */ } }","tryCatchPattern":"try { buildTableChange(deleteFiles); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Unexpected delete file content\")) { upgradeRuntimeOrSkip(); } }","preventionTips":["Keep the iceberg-flink maintenance runtime at or above the writer version","Check table metadata for new delete-file content types after writer upgrades","Align all jobs reading/writing a table to the same Iceberg release"],"tags":["flink","delete-files","iceberg-maintenance"],"backgroundTag":"unsupported-enum-value","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"}