{"record":{"id":"f044932c7fddedb8","repo":"apache/iceberg","slug":"skipping-commit-for-table-task-a-dv-writer","errorCode":null,"errorMessage":"Skipping commit for table {} task {}: a DV writer reported an error.","messagePattern":"Skipping commit for table (.+?) task (.+?): a DV writer reported an error\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertCommitter.java","lineNumber":186,"sourceCode":"    // Emit Trigger for the Aggregator (even on error or no-op).\n    output.collect(new StreamRecord<>(Trigger.create(planResult.triggerTimestamp(), 0)));\n\n    bufferedResults.clear();\n    planResult = null;\n\n    super.processWatermark(mark);\n  }\n\n  @Override\n  public void close() throws Exception {\n    super.close();\n    tableLoader.close();\n  }\n\n  private void commitIfNeeded() {\n    for (DVWriteResult result : bufferedResults) {\n      if (result.isAbort()) {\n        LOG.warn(\n            \"Skipping commit for table {} task {}: a DV writer reported an error.\",\n            tableName,\n            taskName);\n        deleteUncommittedDVs();\n        return;\n      }\n    }\n\n    // No-op cycle: the planner emitted an empty plan result (see\n    // EqualityConvertPlanner.emitNoOpResult) because the next staging snapshot was filtered by\n    // shouldSkip or there was nothing new on staging. processWatermark still forwards a Trigger to\n    // TaskResultAggregator, so the maintenance task completes cleanly.\n    if (planResult.noOp()) {\n      return;\n    }\n\n    table.refresh();\n","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v1.20/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertCommitter.java#L168-L204","documentation":"The EqualityConvertCommitter buffers DV write results per task; if a writer marked its result as abort, the committer deliberately skips committing that task's data files and deletes the uncommitted DVs to keep the table consistent. This is a warning of a failed DV writer, not a commit bug.","triggerScenarios":"processWatermark triggers commitIfNeeded(); a buffered DVWriteResult has isAbort() true because its writer task failed (checkpoint failure, upstream error, serializer issue) after producing data files.","commonSituations":"Flink maintenance job task failures mid-checkpoint; writer OOM or IO errors while producing delete vectors; restoring a job from a checkpoint with partially written results.","solutions":["Inspect the upstream DV writer task logs for the root-cause failure and fix it (IO, OOM, serialization)","Re-run/restore the maintenance job so affected tasks are rewritten and committed","Verify checkpointing configuration (interval, timeouts) so writer results are not aborted spuriously","Confirm deleteUncommittedDVs() cleaned the orphaned DV files in the write location"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Ensure writers completed cleanly before commit point\nif (bufferedResults.stream().anyMatch(DVWriteResult::isAbort)) {\n  // expect commit skip; verify deleteUncommittedDVs ran\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Monitor writer task failures in the Flink UI to catch aborts early","Tune checkpoint timeouts/interval so writers are not aborted spuriously","Ensure sufficient taskmanager memory to avoid writer OOMs"],"tags":["flink","maintenance","delete-vectors","commit"],"backgroundTag":"invalid-state-transition","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}