apache/iceberg · warning

Failed to delete uncommitted DV

Error message

Failed to delete uncommitted DV {} for table {} task {}

What it means

This is a warning logged by the Flink maintenance EqualityConvertCommitter when it cannot physically delete a deletion-vector file that was written by a task but never committed to the table (e.g. after a failure mid-commit). The table state is unaffected since the DV was never committed, but the file remains as garbage that an ExpireSnapshots/RemoveOrphanFiles cleanup should eventually remove.

Solutions

  1. Ignore in most cases: run RemoveOrphanFiles/ExpireSnapshots afterwards to clean the leftover file
  2. Check the underlying exception in the log for the real cause (permissions vs network vs already-deleted)
  3. Verify the Flink job's filesystem credentials/roles include delete permissions on the table location
  4. Retry the maintenance job if the deletion was due to a transient storage error
Defensive patterns

Strategy: try-catch

Validate before calling

// Ensure cleanup is available
assert table.io() != null;
// Later run RemoveOrphanFiles to collect leftovers

Try / catch

try { table.io().deleteFile(dvFile.location()); } catch (RuntimeException e) { LOG.warn("leftover DV {} will be cleaned by RemoveOrphanFiles", dvFile.location(), e); }

Prevention

When it happens

Trigger: deleteUncommittedDVs iterates result.dvFiles() and calls table.io().deleteFile(dvFile.location()) after a commit decision; any RuntimeException from the FileIO (network blip, permissions, S3 throttling) triggers the log for that file.

Common situations: Object-store transient 5xx/throttling during maintenance jobs; IAM or HDFS permissions lacking delete on the table's data location; the file already deleted by concurrent cleanup causing a not-found runtime exception.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/c25a51975cb30514. Report an issue: GitHub.

Appendix: source

Thrown at flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/EqualityConvertCommitter.java:281

    return removedEqDeleteNumCounter.getCount();
  }

  /**
   * Deletes the DVs this cycle wrote but did not commit (abort or definite commit failure). Only
   * the newly written DVs are removed; rewritten DVs remain referenced on the target branch. Best
   * effort: a delete failure is logged, not propagated, so it never masks the original error.
   */
  private void deleteUncommittedDVs() {
    for (DVWriteResult result : bufferedResults) {
      if (result.isAbort()) {
        continue;
      }

      for (DeleteFile dvFile : result.dvFiles()) {
        try {
          table.io().deleteFile(dvFile.location());
        } catch (RuntimeException e) {
          LOG.warn(
              "Failed to delete uncommitted DV {} for table {} task {}",
              dvFile.location(),
              tableName,
              taskName,
              e);
        }
      }
    }
  }

  private RowDelta buildRowDelta(
      List<DataFile> dataFiles, List<DeleteFile> allDvFiles, List<DeleteFile> allRewrittenDvFiles) {
    RowDelta rowDelta = table.newRowDelta();

    // Fail the commit on external target-branch activity since the planner's snapshot. The next
    // trigger detects the change and reindexes.
    if (planResult.mainSnapshotId() != null) {
      rowDelta.validateFromSnapshot(planResult.mainSnapshotId());

View on GitHub (pinned to 86d9c8fc54)