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

priyeshkaratha pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 04547b2632b HDDS-16195. Reuse computed replicated sizes in 
KeyDeletingService (#11028)
04547b2632b is described below

commit 04547b2632b489fafba1e77fa28304760d368908
Author: Chi-Hsuan Huang <[email protected]>
AuthorDate: Thu Sep 3 12:10:52 2026 +0800

    HDDS-16195. Reuse computed replicated sizes in KeyDeletingService (#11028)
---
 .../org/apache/hadoop/ozone/om/KeyManagerImpl.java |  5 +--
 .../ozone/om/service/TestKeyDeletingService.java   | 39 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
index 74a3dea120e..99429d52ec3 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
@@ -176,7 +176,6 @@
 import org.apache.hadoop.ozone.om.helpers.WithParentObjectId;
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
 import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyRequest;
 import org.apache.hadoop.ozone.om.request.util.OMMultipartUploadUtils;
 import org.apache.hadoop.ozone.om.service.CompactionService;
 import org.apache.hadoop.ozone.om.service.DirectoryDeletingService;
@@ -894,6 +893,8 @@ public PendingKeysDeletion getPendingDeletionKeys(
                           QuotaUtil.getReplicatedSize(b.getLength(), 
info.getReplicationConfig()),
                           QuotaUtil.getSizePerReplica(b.getLength(), 
info.getReplicationConfig())
                       ))).collect(Collectors.toList());
+              // Reuse the replicated sizes computed above.
+              long purgedBytes = 
deletedBlocks.stream().mapToLong(DeletedBlock::getReplicatedSize).sum();
               String blockGroupName = kv.getKey() + "/" + 
reclaimableKeyCount++;
 
               BlockGroup keyBlocks = 
BlockGroup.newBuilder().setKeyName(blockGroupName)
@@ -901,7 +902,7 @@ public PendingKeysDeletion getPendingDeletionKeys(
                   .build();
               reclaimableKeys.put(blockGroupName,
                   new PurgedKey(info.getVolumeName(), info.getBucketName(), 
bucketId,
-                  keyBlocks, kv.getKey(), OMKeyRequest.sumBlockLengths(info), 
info.isDeletedKeyCommitted()));
+                  keyBlocks, kv.getKey(), purgedBytes, 
info.isDeletedKeyCommitted()));
               currentCount++;
             } else {
               notReclaimableKeyInfo.addOmKeyInfo(info);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
index 411cd65bebc..900d64315f6 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
@@ -350,6 +350,45 @@ void checkDeletionForKeysWithMultipleVersions() throws 
Exception {
           .isGreaterThanOrEqualTo(initialDeletedBlockCount + 3);
     }
 
+    @Test
+    void checkPurgedBytesMatchBlocksQueuedForDeletion() throws Exception {
+      final String volumeName = getTestName();
+      final String bucketName = uniqueObjectName("bucket");
+      final String keyName = uniqueObjectName("key");
+      final long initialDeletedCount = getDeletedKeyCount();
+
+      // Create Volume and Bucket with versioning enabled
+      createVolumeAndBucket(volumeName, bucketName, true);
+
+      keyDeletingService.suspend();
+
+      // Create 2 versions of the same key, so the delete entry spans two 
version groups
+      OmKeyArgs firstVersion = createAndCommitKey(volumeName, bucketName, 
keyName, 1);
+      OmKeyArgs secondVersion = createAndCommitKey(volumeName, bucketName, 
keyName, 3);
+      writeClient.deleteKey(firstVersion);
+      // The delete has to reach RocksDB before getPendingDeletionKeys() can 
see it.
+      om.awaitDoubleBufferFlush();
+
+      // Both versions are queued for deletion, so the purged bytes must 
account for both.
+      long expectedPurgedBytes =
+          QuotaUtil.getReplicatedSize(firstVersion.getDataSize(), 
firstVersion.getReplicationConfig())
+              + QuotaUtil.getReplicatedSize(secondVersion.getDataSize(), 
secondVersion.getReplicationConfig());
+
+      Map<String, PurgedKey> purgedKeys =
+          keyManager.getPendingDeletionKeys((kv) -> true, 
Integer.MAX_VALUE).getPurgedKeys();
+      assertThat(purgedKeys).hasSize(1);
+      PurgedKey purgedKey = purgedKeys.values().iterator().next();
+      assertEquals(4, purgedKey.getBlockGroup().getDeletedBlocks().size(),
+          "the 1st version has 1 block and the 2nd version has 3");
+      assertEquals(expectedPurgedBytes, purgedKey.getPurgedBytes());
+
+      // Drain the key so it does not remain pending for the next test.
+      keyDeletingService.resume();
+      GenericTestUtils.waitFor(
+          () -> getDeletedKeyCount() >= initialDeletedCount + 1,
+          1000, 10000);
+    }
+
     @Test
     void checkDeletedTableCleanUpForSnapshot() throws Exception {
       final String volumeName = getTestName();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to