This is an automated email from the ASF dual-hosted git repository.

aokolnychyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new 549674b3fc Core: Adapt commit, scan, and snapshot stats for DVs 
(#11464)
549674b3fc is described below

commit 549674b3fc0cdb18d6cad3e2d6320236fba8c562
Author: Anton Okolnychyi <[email protected]>
AuthorDate: Tue Nov 5 17:02:00 2024 +0100

    Core: Adapt commit, scan, and snapshot stats for DVs (#11464)
---
 .../java/org/apache/iceberg/SnapshotSummary.java   | 25 +++++++-
 .../iceberg/metrics/CommitMetricsResult.java       | 16 +++++
 .../iceberg/metrics/CommitMetricsResultParser.java | 12 ++++
 .../org/apache/iceberg/metrics/ScanMetrics.java    |  6 ++
 .../apache/iceberg/metrics/ScanMetricsResult.java  |  7 +++
 .../iceberg/metrics/ScanMetricsResultParser.java   |  6 ++
 .../apache/iceberg/metrics/ScanMetricsUtil.java    |  7 ++-
 .../org/apache/iceberg/TestSnapshotSummary.java    | 72 ++++++++++++++++++++++
 .../metrics/TestCommitMetricsResultParser.java     | 12 ++++
 .../metrics/TestScanMetricsResultParser.java       |  7 +++
 .../iceberg/metrics/TestScanReportParser.java      |  6 ++
 11 files changed, 173 insertions(+), 3 deletions(-)

diff --git a/core/src/main/java/org/apache/iceberg/SnapshotSummary.java 
b/core/src/main/java/org/apache/iceberg/SnapshotSummary.java
index ad832a5e78..6043424cd7 100644
--- a/core/src/main/java/org/apache/iceberg/SnapshotSummary.java
+++ b/core/src/main/java/org/apache/iceberg/SnapshotSummary.java
@@ -25,6 +25,7 @@ import 
org.apache.iceberg.relocated.com.google.common.base.Joiner.MapJoiner;
 import org.apache.iceberg.relocated.com.google.common.base.Strings;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
 import org.apache.iceberg.relocated.com.google.common.collect.Maps;
+import org.apache.iceberg.util.ContentFileUtil;
 import org.apache.iceberg.util.ScanTaskUtil;
 
 public class SnapshotSummary {
@@ -36,6 +37,8 @@ public class SnapshotSummary {
   public static final String REMOVED_EQ_DELETE_FILES_PROP = 
"removed-equality-delete-files";
   public static final String ADD_POS_DELETE_FILES_PROP = 
"added-position-delete-files";
   public static final String REMOVED_POS_DELETE_FILES_PROP = 
"removed-position-delete-files";
+  public static final String ADDED_DVS_PROP = "added-dvs";
+  public static final String REMOVED_DVS_PROP = "removed-dvs";
   public static final String REMOVED_DELETE_FILES_PROP = 
"removed-delete-files";
   public static final String TOTAL_DELETE_FILES_PROP = "total-delete-files";
   public static final String ADDED_RECORDS_PROP = "added-records";
@@ -222,6 +225,8 @@ public class SnapshotSummary {
     private int removedEqDeleteFiles = 0;
     private int addedPosDeleteFiles = 0;
     private int removedPosDeleteFiles = 0;
+    private int addedDVs = 0;
+    private int removedDVs = 0;
     private int addedDeleteFiles = 0;
     private int removedDeleteFiles = 0;
     private long addedRecords = 0L;
@@ -243,6 +248,8 @@ public class SnapshotSummary {
       this.removedPosDeleteFiles = 0;
       this.addedDeleteFiles = 0;
       this.removedDeleteFiles = 0;
+      this.addedDVs = 0;
+      this.removedDVs = 0;
       this.addedRecords = 0L;
       this.deletedRecords = 0L;
       this.addedPosDeletes = 0L;
@@ -262,6 +269,8 @@ public class SnapshotSummary {
           removedPosDeleteFiles > 0, builder, REMOVED_POS_DELETE_FILES_PROP, 
removedPosDeleteFiles);
       setIf(addedDeleteFiles > 0, builder, ADDED_DELETE_FILES_PROP, 
addedDeleteFiles);
       setIf(removedDeleteFiles > 0, builder, REMOVED_DELETE_FILES_PROP, 
removedDeleteFiles);
+      setIf(addedDVs > 0, builder, ADDED_DVS_PROP, addedDVs);
+      setIf(removedDVs > 0, builder, REMOVED_DVS_PROP, removedDVs);
       setIf(addedRecords > 0, builder, ADDED_RECORDS_PROP, addedRecords);
       setIf(deletedRecords > 0, builder, DELETED_RECORDS_PROP, deletedRecords);
 
@@ -283,8 +292,13 @@ public class SnapshotSummary {
           this.addedRecords += file.recordCount();
           break;
         case POSITION_DELETES:
+          DeleteFile deleteFile = (DeleteFile) file;
+          if (ContentFileUtil.isDV(deleteFile)) {
+            this.addedDVs += 1;
+          } else {
+            this.addedPosDeleteFiles += 1;
+          }
           this.addedDeleteFiles += 1;
-          this.addedPosDeleteFiles += 1;
           this.addedPosDeletes += file.recordCount();
           break;
         case EQUALITY_DELETES:
@@ -306,8 +320,13 @@ public class SnapshotSummary {
           this.deletedRecords += file.recordCount();
           break;
         case POSITION_DELETES:
+          DeleteFile deleteFile = (DeleteFile) file;
+          if (ContentFileUtil.isDV(deleteFile)) {
+            this.removedDVs += 1;
+          } else {
+            this.removedPosDeleteFiles += 1;
+          }
           this.removedDeleteFiles += 1;
-          this.removedPosDeleteFiles += 1;
           this.removedPosDeletes += file.recordCount();
           break;
         case EQUALITY_DELETES:
@@ -344,6 +363,8 @@ public class SnapshotSummary {
       this.removedEqDeleteFiles += other.removedEqDeleteFiles;
       this.addedPosDeleteFiles += other.addedPosDeleteFiles;
       this.removedPosDeleteFiles += other.removedPosDeleteFiles;
+      this.addedDVs += other.addedDVs;
+      this.removedDVs += other.removedDVs;
       this.addedDeleteFiles += other.addedDeleteFiles;
       this.removedDeleteFiles += other.removedDeleteFiles;
       this.addedSize += other.addedSize;
diff --git 
a/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResult.java 
b/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResult.java
index ad66e8d324..7a87172708 100644
--- a/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResult.java
+++ b/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResult.java
@@ -34,7 +34,9 @@ public interface CommitMetricsResult {
   String ADDED_DELETE_FILES = "added-delete-files";
   String ADDED_EQ_DELETE_FILES = "added-equality-delete-files";
   String ADDED_POS_DELETE_FILES = "added-positional-delete-files";
+  String ADDED_DVS = "added-dvs";
   String REMOVED_POS_DELETE_FILES = "removed-positional-delete-files";
+  String REMOVED_DVS = "removed-dvs";
   String REMOVED_EQ_DELETE_FILES = "removed-equality-delete-files";
   String REMOVED_DELETE_FILES = "removed-delete-files";
   String TOTAL_DELETE_FILES = "total-delete-files";
@@ -75,6 +77,12 @@ public interface CommitMetricsResult {
   @Nullable
   CounterResult addedPositionalDeleteFiles();
 
+  @Nullable
+  @Value.Default
+  default CounterResult addedDVs() {
+    return null;
+  }
+
   @Nullable
   CounterResult removedDeleteFiles();
 
@@ -84,6 +92,12 @@ public interface CommitMetricsResult {
   @Nullable
   CounterResult removedPositionalDeleteFiles();
 
+  @Nullable
+  @Value.Default
+  default CounterResult removedDVs() {
+    return null;
+  }
+
   @Nullable
   CounterResult totalDeleteFiles();
 
@@ -136,6 +150,7 @@ public interface CommitMetricsResult {
         .addedDeleteFiles(counterFrom(snapshotSummary, 
SnapshotSummary.ADDED_DELETE_FILES_PROP))
         .addedPositionalDeleteFiles(
             counterFrom(snapshotSummary, 
SnapshotSummary.ADD_POS_DELETE_FILES_PROP))
+        .addedDVs(counterFrom(snapshotSummary, SnapshotSummary.ADDED_DVS_PROP))
         .addedEqualityDeleteFiles(
             counterFrom(snapshotSummary, 
SnapshotSummary.ADD_EQ_DELETE_FILES_PROP))
         .removedDeleteFiles(counterFrom(snapshotSummary, 
SnapshotSummary.REMOVED_DELETE_FILES_PROP))
@@ -143,6 +158,7 @@ public interface CommitMetricsResult {
             counterFrom(snapshotSummary, 
SnapshotSummary.REMOVED_EQ_DELETE_FILES_PROP))
         .removedPositionalDeleteFiles(
             counterFrom(snapshotSummary, 
SnapshotSummary.REMOVED_POS_DELETE_FILES_PROP))
+        .removedDVs(counterFrom(snapshotSummary, 
SnapshotSummary.REMOVED_DVS_PROP))
         .totalDeleteFiles(counterFrom(snapshotSummary, 
SnapshotSummary.TOTAL_DELETE_FILES_PROP))
         .addedRecords(counterFrom(snapshotSummary, 
SnapshotSummary.ADDED_RECORDS_PROP))
         .removedRecords(counterFrom(snapshotSummary, 
SnapshotSummary.DELETED_RECORDS_PROP))
diff --git 
a/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResultParser.java 
b/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResultParser.java
index d4fd883c43..2c45581ba5 100644
--- 
a/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResultParser.java
+++ 
b/core/src/main/java/org/apache/iceberg/metrics/CommitMetricsResultParser.java
@@ -81,6 +81,11 @@ class CommitMetricsResultParser {
       CounterResultParser.toJson(metrics.addedPositionalDeleteFiles(), gen);
     }
 
+    if (null != metrics.addedDVs()) {
+      gen.writeFieldName(CommitMetricsResult.ADDED_DVS);
+      CounterResultParser.toJson(metrics.addedDVs(), gen);
+    }
+
     if (null != metrics.removedDeleteFiles()) {
       gen.writeFieldName(CommitMetricsResult.REMOVED_DELETE_FILES);
       CounterResultParser.toJson(metrics.removedDeleteFiles(), gen);
@@ -91,6 +96,11 @@ class CommitMetricsResultParser {
       CounterResultParser.toJson(metrics.removedPositionalDeleteFiles(), gen);
     }
 
+    if (null != metrics.removedDVs()) {
+      gen.writeFieldName(CommitMetricsResult.REMOVED_DVS);
+      CounterResultParser.toJson(metrics.removedDVs(), gen);
+    }
+
     if (null != metrics.removedEqualityDeleteFiles()) {
       gen.writeFieldName(CommitMetricsResult.REMOVED_EQ_DELETE_FILES);
       CounterResultParser.toJson(metrics.removedEqualityDeleteFiles(), gen);
@@ -186,10 +196,12 @@ class CommitMetricsResultParser {
             
CounterResultParser.fromJson(CommitMetricsResult.ADDED_EQ_DELETE_FILES, json))
         .addedPositionalDeleteFiles(
             
CounterResultParser.fromJson(CommitMetricsResult.ADDED_POS_DELETE_FILES, json))
+        .addedDVs(CounterResultParser.fromJson(CommitMetricsResult.ADDED_DVS, 
json))
         .removedEqualityDeleteFiles(
             
CounterResultParser.fromJson(CommitMetricsResult.REMOVED_EQ_DELETE_FILES, json))
         .removedPositionalDeleteFiles(
             
CounterResultParser.fromJson(CommitMetricsResult.REMOVED_POS_DELETE_FILES, 
json))
+        
.removedDVs(CounterResultParser.fromJson(CommitMetricsResult.REMOVED_DVS, json))
         .removedDeleteFiles(
             
CounterResultParser.fromJson(CommitMetricsResult.REMOVED_DELETE_FILES, json))
         .totalDeleteFiles(
diff --git a/core/src/main/java/org/apache/iceberg/metrics/ScanMetrics.java 
b/core/src/main/java/org/apache/iceberg/metrics/ScanMetrics.java
index 421466f0fa..0f7def3763 100644
--- a/core/src/main/java/org/apache/iceberg/metrics/ScanMetrics.java
+++ b/core/src/main/java/org/apache/iceberg/metrics/ScanMetrics.java
@@ -40,6 +40,7 @@ public abstract class ScanMetrics {
   public static final String INDEXED_DELETE_FILES = "indexed-delete-files";
   public static final String EQUALITY_DELETE_FILES = "equality-delete-files";
   public static final String POSITIONAL_DELETE_FILES = 
"positional-delete-files";
+  public static final String DVS = "dvs";
 
   public static ScanMetrics noop() {
     return ScanMetrics.of(MetricsContext.nullMetrics());
@@ -127,6 +128,11 @@ public abstract class ScanMetrics {
     return metricsContext().counter(POSITIONAL_DELETE_FILES);
   }
 
+  @Value.Derived
+  public Counter dvs() {
+    return metricsContext().counter(DVS);
+  }
+
   public static ScanMetrics of(MetricsContext metricsContext) {
     return 
ImmutableScanMetrics.builder().metricsContext(metricsContext).build();
   }
diff --git 
a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResult.java 
b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResult.java
index b930dd83ad..2137e52e0a 100644
--- a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResult.java
+++ b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResult.java
@@ -73,6 +73,12 @@ public interface ScanMetricsResult {
   @Nullable
   CounterResult positionalDeleteFiles();
 
+  @Nullable
+  @Value.Default
+  default CounterResult dvs() {
+    return null;
+  }
+
   static ScanMetricsResult fromScanMetrics(ScanMetrics scanMetrics) {
     Preconditions.checkArgument(null != scanMetrics, "Invalid scan metrics: 
null");
     return ImmutableScanMetricsResult.builder()
@@ -93,6 +99,7 @@ public interface ScanMetricsResult {
         
.indexedDeleteFiles(CounterResult.fromCounter(scanMetrics.indexedDeleteFiles()))
         
.equalityDeleteFiles(CounterResult.fromCounter(scanMetrics.equalityDeleteFiles()))
         
.positionalDeleteFiles(CounterResult.fromCounter(scanMetrics.positionalDeleteFiles()))
+        .dvs(CounterResult.fromCounter(scanMetrics.dvs()))
         .build();
   }
 }
diff --git 
a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResultParser.java 
b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResultParser.java
index 5cff1ae8e0..f85c267532 100644
--- a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResultParser.java
+++ b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsResultParser.java
@@ -121,6 +121,11 @@ class ScanMetricsResultParser {
       CounterResultParser.toJson(metrics.positionalDeleteFiles(), gen);
     }
 
+    if (null != metrics.dvs()) {
+      gen.writeFieldName(ScanMetrics.DVS);
+      CounterResultParser.toJson(metrics.dvs(), gen);
+    }
+
     gen.writeEndObject();
   }
 
@@ -159,6 +164,7 @@ class ScanMetricsResultParser {
         
.equalityDeleteFiles(CounterResultParser.fromJson(ScanMetrics.EQUALITY_DELETE_FILES,
 json))
         .positionalDeleteFiles(
             CounterResultParser.fromJson(ScanMetrics.POSITIONAL_DELETE_FILES, 
json))
+        .dvs(CounterResultParser.fromJson(ScanMetrics.DVS, json))
         .build();
   }
 }
diff --git a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsUtil.java 
b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsUtil.java
index 1ba891f584..6e6aa25636 100644
--- a/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsUtil.java
+++ b/core/src/main/java/org/apache/iceberg/metrics/ScanMetricsUtil.java
@@ -21,6 +21,7 @@ package org.apache.iceberg.metrics;
 import org.apache.iceberg.DataFile;
 import org.apache.iceberg.DeleteFile;
 import org.apache.iceberg.FileContent;
+import org.apache.iceberg.util.ContentFileUtil;
 import org.apache.iceberg.util.ScanTaskUtil;
 
 public class ScanMetricsUtil {
@@ -31,7 +32,11 @@ public class ScanMetricsUtil {
     metrics.indexedDeleteFiles().increment();
 
     if (deleteFile.content() == FileContent.POSITION_DELETES) {
-      metrics.positionalDeleteFiles().increment();
+      if (ContentFileUtil.isDV(deleteFile)) {
+        metrics.dvs().increment();
+      } else {
+        metrics.positionalDeleteFiles().increment();
+      }
     } else if (deleteFile.content() == FileContent.EQUALITY_DELETES) {
       metrics.equalityDeleteFiles().increment();
     }
diff --git a/core/src/test/java/org/apache/iceberg/TestSnapshotSummary.java 
b/core/src/test/java/org/apache/iceberg/TestSnapshotSummary.java
index 529e0cc614..b0b9d003e3 100644
--- a/core/src/test/java/org/apache/iceberg/TestSnapshotSummary.java
+++ b/core/src/test/java/org/apache/iceberg/TestSnapshotSummary.java
@@ -358,4 +358,76 @@ public class TestSnapshotSummary extends TestBase {
         .containsEntry(SnapshotSummary.TOTAL_FILE_SIZE_PROP, "20")
         .containsEntry(SnapshotSummary.TOTAL_RECORDS_PROP, "1");
   }
+
+  @TestTemplate
+  public void testFileSizeSummaryWithDVs() {
+    assumeThat(formatVersion).isGreaterThanOrEqualTo(3);
+
+    DeleteFile dv1 = newDV(FILE_A);
+    table.newRowDelta().addDeletes(dv1).commit();
+
+    DeleteFile dv2 = newDV(FILE_B);
+    table.newRowDelta().addDeletes(dv2).commit();
+
+    Map<String, String> summary1 = table.currentSnapshot().summary();
+    long addedPosDeletes1 = dv2.recordCount();
+    long addedFileSize1 = dv2.contentSizeInBytes();
+    long totalPosDeletes1 = dv1.recordCount() + dv2.recordCount();
+    long totalFileSize1 = dv1.contentSizeInBytes() + dv2.contentSizeInBytes();
+    assertThat(summary1)
+        .hasSize(12)
+        .doesNotContainKey(SnapshotSummary.ADD_POS_DELETE_FILES_PROP)
+        .doesNotContainKey(SnapshotSummary.REMOVED_POS_DELETE_FILES_PROP)
+        .containsEntry(SnapshotSummary.ADDED_DELETE_FILES_PROP, "1")
+        .doesNotContainKey(SnapshotSummary.REMOVED_DELETE_FILES_PROP)
+        .containsEntry(SnapshotSummary.ADDED_DVS_PROP, "1")
+        .doesNotContainKey(SnapshotSummary.REMOVED_DVS_PROP)
+        .containsEntry(SnapshotSummary.ADDED_POS_DELETES_PROP, 
String.valueOf(addedPosDeletes1))
+        .doesNotContainKey(SnapshotSummary.REMOVED_POS_DELETES_PROP)
+        .containsEntry(SnapshotSummary.ADDED_FILE_SIZE_PROP, 
String.valueOf(addedFileSize1))
+        .doesNotContainKey(SnapshotSummary.REMOVED_FILE_SIZE_PROP)
+        .containsEntry(SnapshotSummary.TOTAL_DELETE_FILES_PROP, "2")
+        .containsEntry(SnapshotSummary.TOTAL_POS_DELETES_PROP, 
String.valueOf(totalPosDeletes1))
+        .containsEntry(SnapshotSummary.TOTAL_FILE_SIZE_PROP, 
String.valueOf(totalFileSize1))
+        .containsEntry(SnapshotSummary.TOTAL_DATA_FILES_PROP, "0")
+        .containsEntry(SnapshotSummary.TOTAL_EQ_DELETES_PROP, "0")
+        .containsEntry(SnapshotSummary.TOTAL_RECORDS_PROP, "0")
+        .containsEntry(SnapshotSummary.CHANGED_PARTITION_COUNT_PROP, "1");
+
+    DeleteFile dv3 = newDV(FILE_A);
+    table
+        .newRowDelta()
+        .removeDeletes(dv1)
+        .removeDeletes(dv2)
+        .addDeletes(dv3)
+        .validateFromSnapshot(table.currentSnapshot().snapshotId())
+        .commit();
+
+    Map<String, String> summary2 = table.currentSnapshot().summary();
+    long addedPosDeletes2 = dv3.recordCount();
+    long removedPosDeletes2 = dv1.recordCount() + dv2.recordCount();
+    long addedFileSize2 = dv3.contentSizeInBytes();
+    long removedFileSize2 = dv1.contentSizeInBytes() + 
dv2.contentSizeInBytes();
+    long totalPosDeletes2 = dv3.recordCount();
+    long totalFileSize2 = dv3.contentSizeInBytes();
+    assertThat(summary2)
+        .hasSize(16)
+        .doesNotContainKey(SnapshotSummary.ADD_POS_DELETE_FILES_PROP)
+        .doesNotContainKey(SnapshotSummary.REMOVED_POS_DELETE_FILES_PROP)
+        .containsEntry(SnapshotSummary.ADDED_DELETE_FILES_PROP, "1")
+        .containsEntry(SnapshotSummary.REMOVED_DELETE_FILES_PROP, "2")
+        .containsEntry(SnapshotSummary.ADDED_DVS_PROP, "1")
+        .containsEntry(SnapshotSummary.REMOVED_DVS_PROP, "2")
+        .containsEntry(SnapshotSummary.ADDED_POS_DELETES_PROP, 
String.valueOf(addedPosDeletes2))
+        .containsEntry(SnapshotSummary.REMOVED_POS_DELETES_PROP, 
String.valueOf(removedPosDeletes2))
+        .containsEntry(SnapshotSummary.ADDED_FILE_SIZE_PROP, 
String.valueOf(addedFileSize2))
+        .containsEntry(SnapshotSummary.REMOVED_FILE_SIZE_PROP, 
String.valueOf(removedFileSize2))
+        .containsEntry(SnapshotSummary.TOTAL_DELETE_FILES_PROP, "1")
+        .containsEntry(SnapshotSummary.TOTAL_POS_DELETES_PROP, 
String.valueOf(totalPosDeletes2))
+        .containsEntry(SnapshotSummary.TOTAL_FILE_SIZE_PROP, 
String.valueOf(totalFileSize2))
+        .containsEntry(SnapshotSummary.TOTAL_DATA_FILES_PROP, "0")
+        .containsEntry(SnapshotSummary.TOTAL_EQ_DELETES_PROP, "0")
+        .containsEntry(SnapshotSummary.TOTAL_RECORDS_PROP, "0")
+        .containsEntry(SnapshotSummary.CHANGED_PARTITION_COUNT_PROP, "2");
+  }
 }
diff --git 
a/core/src/test/java/org/apache/iceberg/metrics/TestCommitMetricsResultParser.java
 
b/core/src/test/java/org/apache/iceberg/metrics/TestCommitMetricsResultParser.java
index 5aa2660143..1b51066cf1 100644
--- 
a/core/src/test/java/org/apache/iceberg/metrics/TestCommitMetricsResultParser.java
+++ 
b/core/src/test/java/org/apache/iceberg/metrics/TestCommitMetricsResultParser.java
@@ -74,6 +74,8 @@ public class TestCommitMetricsResultParser {
             .put(SnapshotSummary.ADDED_DELETE_FILES_PROP, "4")
             .put(SnapshotSummary.ADD_EQ_DELETE_FILES_PROP, "5")
             .put(SnapshotSummary.ADD_POS_DELETE_FILES_PROP, "6")
+            .put(SnapshotSummary.ADDED_DVS_PROP, "1")
+            .put(SnapshotSummary.REMOVED_DVS_PROP, "4")
             .put(SnapshotSummary.REMOVED_POS_DELETE_FILES_PROP, "7")
             .put(SnapshotSummary.REMOVED_EQ_DELETE_FILES_PROP, "8")
             .put(SnapshotSummary.REMOVED_DELETE_FILES_PROP, "9")
@@ -101,6 +103,8 @@ public class TestCommitMetricsResultParser {
     assertThat(result.addedDeleteFiles().value()).isEqualTo(4L);
     assertThat(result.addedEqualityDeleteFiles().value()).isEqualTo(5L);
     assertThat(result.addedPositionalDeleteFiles().value()).isEqualTo(6L);
+    assertThat(result.addedDVs().value()).isEqualTo(1L);
+    assertThat(result.removedDVs().value()).isEqualTo(4L);
     assertThat(result.removedPositionalDeleteFiles().value()).isEqualTo(7L);
     assertThat(result.removedEqualityDeleteFiles().value()).isEqualTo(8L);
     assertThat(result.removedDeleteFiles().value()).isEqualTo(9L);
@@ -153,6 +157,10 @@ public class TestCommitMetricsResultParser {
             + "    \"unit\" : \"count\",\n"
             + "    \"value\" : 6\n"
             + "  },\n"
+            + "  \"added-dvs\" : {\n"
+            + "    \"unit\" : \"count\",\n"
+            + "    \"value\" : 1\n"
+            + "  },\n"
             + "  \"removed-delete-files\" : {\n"
             + "    \"unit\" : \"count\",\n"
             + "    \"value\" : 9\n"
@@ -161,6 +169,10 @@ public class TestCommitMetricsResultParser {
             + "    \"unit\" : \"count\",\n"
             + "    \"value\" : 7\n"
             + "  },\n"
+            + "  \"removed-dvs\" : {\n"
+            + "    \"unit\" : \"count\",\n"
+            + "    \"value\" : 4\n"
+            + "  },\n"
             + "  \"removed-equality-delete-files\" : {\n"
             + "    \"unit\" : \"count\",\n"
             + "    \"value\" : 8\n"
diff --git 
a/core/src/test/java/org/apache/iceberg/metrics/TestScanMetricsResultParser.java
 
b/core/src/test/java/org/apache/iceberg/metrics/TestScanMetricsResultParser.java
index 44d5803c4a..f5cb1e2373 100644
--- 
a/core/src/test/java/org/apache/iceberg/metrics/TestScanMetricsResultParser.java
+++ 
b/core/src/test/java/org/apache/iceberg/metrics/TestScanMetricsResultParser.java
@@ -178,6 +178,7 @@ public class TestScanMetricsResultParser {
     scanMetrics.skippedDeleteManifests().increment(3L);
     scanMetrics.indexedDeleteFiles().increment(10L);
     scanMetrics.positionalDeleteFiles().increment(6L);
+    scanMetrics.dvs().increment();
     scanMetrics.equalityDeleteFiles().increment(4L);
 
     ScanMetricsResult scanMetricsResult = 
ScanMetricsResult.fromScanMetrics(scanMetrics);
@@ -199,6 +200,7 @@ public class TestScanMetricsResultParser {
                     + 
"\"indexed-delete-files\":{\"unit\":\"count\",\"value\":10},"
                     + 
"\"equality-delete-files\":{\"unit\":\"count\",\"value\":4},"
                     + 
"\"positional-delete-files\":{\"unit\":\"count\",\"value\":6},"
+                    + "\"dvs\":{\"unit\":\"count\",\"value\":1},"
                     + "\"extra\": \"value\",\"extra2\":23}"))
         .isEqualTo(scanMetricsResult);
   }
@@ -242,6 +244,7 @@ public class TestScanMetricsResultParser {
     scanMetrics.skippedDeleteManifests().increment(3L);
     scanMetrics.indexedDeleteFiles().increment(10L);
     scanMetrics.positionalDeleteFiles().increment(6L);
+    scanMetrics.dvs().increment(3L);
     scanMetrics.equalityDeleteFiles().increment(4L);
 
     ScanMetricsResult scanMetricsResult = 
ScanMetricsResult.fromScanMetrics(scanMetrics);
@@ -312,6 +315,10 @@ public class TestScanMetricsResultParser {
             + "  \"positional-delete-files\" : {\n"
             + "    \"unit\" : \"count\",\n"
             + "    \"value\" : 6\n"
+            + "  },\n"
+            + "  \"dvs\" : {\n"
+            + "    \"unit\" : \"count\",\n"
+            + "    \"value\" : 3\n"
             + "  }\n"
             + "}";
 
diff --git 
a/core/src/test/java/org/apache/iceberg/metrics/TestScanReportParser.java 
b/core/src/test/java/org/apache/iceberg/metrics/TestScanReportParser.java
index 51e21ad9bf..caac0704cd 100644
--- a/core/src/test/java/org/apache/iceberg/metrics/TestScanReportParser.java
+++ b/core/src/test/java/org/apache/iceberg/metrics/TestScanReportParser.java
@@ -84,6 +84,7 @@ public class TestScanReportParser {
     scanMetrics.skippedDeleteManifests().increment(3L);
     scanMetrics.indexedDeleteFiles().increment(10L);
     scanMetrics.positionalDeleteFiles().increment(6L);
+    scanMetrics.dvs().increment();
     scanMetrics.equalityDeleteFiles().increment(4L);
 
     String tableName = "roundTripTableName";
@@ -118,6 +119,7 @@ public class TestScanReportParser {
                     + 
"\"indexed-delete-files\":{\"unit\":\"count\",\"value\":10},"
                     + 
"\"equality-delete-files\":{\"unit\":\"count\",\"value\":4},"
                     + 
"\"positional-delete-files\":{\"unit\":\"count\",\"value\":6},"
+                    + "\"dvs\":{\"unit\":\"count\",\"value\":1},"
                     + "\"extra-metric\":\"extra-val\"},"
                     + "\"extra\":\"extraVal\"}"))
         .isEqualTo(scanReport);
@@ -279,6 +281,10 @@ public class TestScanReportParser {
             + "    \"positional-delete-files\" : {\n"
             + "      \"unit\" : \"count\",\n"
             + "      \"value\" : 6\n"
+            + "    },\n"
+            + "    \"dvs\" : {\n"
+            + "      \"unit\" : \"count\",\n"
+            + "      \"value\" : 0\n"
             + "    }\n"
             + "  }\n"
             + "}";

Reply via email to