apache/iceberg · warning

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

Error message

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

What it means

This warning comes from EqualityConvertCommitter.deleteUncommittedDVs, which cleans up deletion-vector (DV) files produced by the equality-to-DV conversion task when they were never committed. When table.io().deleteFile() throws a RuntimeException for one of these orphan DV files, the committer logs the file location, table, and task name and continues cleaning the remaining files rather than aborting. Leftover files become potential orphans, recoverable by the RemoveOrphanFiles action.

Source

Thrown at flink/v2.2/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)

Solutions

  1. Treat as mostly benign: uncommitted DVs are garbage; run the DeleteOrphanFiles action to remove leftovers
  2. Check the nested RuntimeException for permissions or object-store throttling and fix credentials/ACLs
  3. Ensure FileIO on the committer has delete permissions for the table's data location
  4. If a specific file consistently fails, verify it exists and that no concurrent job holds locks on it
Defensive patterns

Strategy: fallback

Try / catch

// Library catches internally; run orphan cleanup periodically as the safety net
// DeleteOrphanFiles action with olderThan > checkpoint interval

Prevention

When it happens

Trigger: Raised in deleteUncommittedDVs (called from commitIfNeeded) when table.io().deleteFile(dvFile.location()) throws RuntimeException for a DV file written by a task whose commit never landed — e.g. after an abort/cleanup following a failed checkpoint.

Common situations: DV file already removed by a concurrent orphan-files cleanup; object-store permission errors on the data prefix; transient S3/GCS deletion errors; FileIO misconfiguration on the committer TaskManager.

Related errors


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