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]