From 13f662dc94d4c30db2a7c476173a62ac2bc1e807 Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Wed, 4 Feb 2026 12:22:16 +0530 Subject: [PATCH 1/3] HDDS-14467. Expose pending delete bytes/namespace in OzoneBucket. --- .../hadoop/ozone/client/OzoneBucket.java | 30 +++ .../hadoop/ozone/client/rpc/RpcClient.java | 4 + .../ozone/client/rpc/OzoneRpcClientTests.java | 185 +++++++++++++----- 3 files changed, 169 insertions(+), 50 deletions(-) diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java index 566427424223..75d7d82c5e11 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java @@ -151,6 +151,14 @@ public class OzoneBucket extends WithMetadata { * Bucket Owner. */ private String owner; + /** + * Pending deletion bytes (Includes bytes retained by snapshots). + */ + private long pendingDeleteBytes; + /** + * Pending deletion namespace (Includes keys retained by snapshots). + */ + private long pendingDeleteNamespace; protected OzoneBucket(Builder builder) { super(builder); @@ -167,6 +175,8 @@ protected OzoneBucket(Builder builder) { } this.usedBytes = builder.usedBytes; this.usedNamespace = builder.usedNamespace; + this.pendingDeleteBytes = builder.pendingDeleteBytes; + this.pendingDeleteNamespace = builder.pendingDeleteNamespace; this.creationTime = Instant.ofEpochMilli(builder.creationTime); if (builder.modificationTime != 0) { this.modificationTime = Instant.ofEpochMilli(builder.modificationTime); @@ -610,6 +620,14 @@ public long getUsedNamespace() { return usedNamespace; } + public long getPendingDeleteBytes() { + return pendingDeleteBytes; + } + + public long getPendingDeleteNamespace() { + return pendingDeleteNamespace; + } + /** * Returns Iterator to iterate over all keys in the bucket. * The result can be restricted using key prefix, will return all @@ -1127,6 +1145,8 @@ public static class Builder extends WithMetadata.Builder { private long quotaInNamespace; private BucketLayout bucketLayout; private String owner; + private long pendingDeleteBytes; + private long pendingDeleteNamespace; protected Builder() { } @@ -1223,6 +1243,16 @@ public Builder setOwner(String owner) { return this; } + public Builder setPendingDeleteBytes(long pendingDeleteBytes) { + this.pendingDeleteBytes = pendingDeleteBytes; + return this; + } + + public Builder setPendingDeleteNamespace(long pendingDeleteNamespace) { + this.pendingDeleteNamespace = pendingDeleteNamespace; + return this; + } + public OzoneBucket build() { return new OzoneBucket(this); } diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java index 3947e4b6818b..1702e433b320 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java @@ -1299,6 +1299,8 @@ public OzoneBucket getBucketDetails( .setSourceBucket(bucketInfo.getSourceBucket()) .setUsedBytes(bucketInfo.getTotalBucketSpace()) .setUsedNamespace(bucketInfo.getTotalBucketNamespace()) + .setPendingDeleteBytes(bucketInfo.getSnapshotUsedBytes()) + .setPendingDeleteNamespace(bucketInfo.getSnapshotUsedNamespace()) .setQuotaInBytes(bucketInfo.getQuotaInBytes()) .setQuotaInNamespace(bucketInfo.getQuotaInNamespace()) .setBucketLayout(bucketInfo.getBucketLayout()) @@ -1330,6 +1332,8 @@ public List listBuckets(String volumeName, String bucketPrefix, .setSourceBucket(bucket.getSourceBucket()) .setUsedBytes(bucket.getTotalBucketSpace()) .setUsedNamespace(bucket.getTotalBucketNamespace()) + .setPendingDeleteBytes(bucket.getSnapshotUsedBytes()) + .setPendingDeleteNamespace(bucket.getSnapshotUsedNamespace()) .setQuotaInBytes(bucket.getQuotaInBytes()) .setQuotaInNamespace(bucket.getQuotaInNamespace()) .setBucketLayout(bucket.getBucketLayout()) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java index 2832a281ebb2..18e8156941db 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java @@ -33,6 +33,7 @@ import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVICE_INTERVAL; import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE; import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT; +import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SNAPSHOT_DELETING_SERVICE_INTERVAL; import static org.apache.hadoop.ozone.OzoneConsts.DEFAULT_OM_UPDATE_ID; import static org.apache.hadoop.ozone.OzoneConsts.ETAG; import static org.apache.hadoop.ozone.OzoneConsts.GB; @@ -211,6 +212,7 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -248,7 +250,6 @@ abstract class OzoneRpcClientTests extends OzoneTestBase { @BeforeAll public static void initialize() throws NoSuchAlgorithmException, UnsupportedEncodingException { eTagProvider = MessageDigest.getInstance(MD5_HASH); - AuditLogTestUtils.enableAuditLog(); output = GenericTestUtils.captureOut(); } @@ -263,6 +264,7 @@ static void startCluster(OzoneConfiguration conf, MiniOzoneCluster.Builder build conf.setInt(OZONE_SCM_RATIS_PIPELINE_LIMIT, 10); conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 1, TimeUnit.SECONDS); conf.setTimeDuration(OZONE_DIR_DELETING_SERVICE_INTERVAL, 1, TimeUnit.SECONDS); + conf.setTimeDuration(OZONE_SNAPSHOT_DELETING_SERVICE_INTERVAL, 1, TimeUnit.SECONDS); ClientConfigForTesting.newBuilder(StorageUnit.MB) .setDataStreamMinPacketSize(1) @@ -1095,63 +1097,146 @@ public void testDeleteLinkedBucket() throws Exception { @Test public void testDeleteAuditLog() throws Exception { + String oldLog4jConfig = System.getProperty("log4j.configurationFile"); + AuditLogTestUtils.enableAuditLog(); + org.apache.logging.log4j.core.LoggerContext ctx = + (org.apache.logging.log4j.core.LoggerContext) + org.apache.logging.log4j.LogManager.getContext(false); + ctx.reconfigure(); + try { + String volumeName = UUID.randomUUID().toString(); + String bucketName = UUID.randomUUID().toString(); + + byte[] value = "sample value".getBytes(UTF_8); + int valueLength = value.length; + store.createVolume(volumeName); + OzoneVolume volume = store.getVolume(volumeName); + volume.createBucket(bucketName); + OzoneBucket bucket = volume.getBucket(bucketName); + + // create a three replica file + String keyName1 = "key1"; + TestDataUtil.createKey(bucket, keyName1, + ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + // create a EC replica file + String keyName2 = "key2"; + ReplicationConfig replicationConfig = new ECReplicationConfig( + "rs-3-2-1024k"); + TestDataUtil.createKey(bucket, keyName2, replicationConfig, value); + + // create a directory and a file + String dirName = "dir1"; + bucket.createDirectory(dirName); + String keyName3 = "key3"; + TestDataUtil.createKey(bucket, keyName3, + ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + // delete files and directory + output.reset(); + bucket.deleteKey(keyName1); + bucket.deleteKey(keyName2); + bucket.deleteDirectory(dirName, true); + + // create keys for deleteKeys case + String keyName4 = "key4"; + TestDataUtil.createKey(bucket, dirName + "/" + keyName4, + ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + String keyName5 = "key5"; + TestDataUtil.createKey(bucket, dirName + "/" + keyName5, + replicationConfig, value); + + List keysToDelete = new ArrayList<>(); + keysToDelete.add(dirName + "/" + keyName4); + keysToDelete.add(dirName + "/" + keyName5); + bucket.deleteKeys(keysToDelete); + + String consoleOutput = output.get(); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"key1\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"RATIS/THREE"); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"key2\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"EC{rs-3-2-1024k}"); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"dir1\",\"Transaction\""); + assertThat(consoleOutput).contains( + "op=DELETE_KEYS {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"deletedKeysList\":\"{key=dir1/key4, dataSize=" + valueLength + + ", replicationConfig=RATIS/THREE}, {key=dir1/key5, dataSize=" + valueLength + + ", replicationConfig=EC{rs-3-2-1024k}}\",\"unDeletedKeysList\""); + } finally { + if (oldLog4jConfig == null) { + System.clearProperty("log4j.configurationFile"); + } else { + System.setProperty("log4j.configurationFile", oldLog4jConfig); + } + ctx.reconfigure(); + } + } + + /** + * Verifies pendingDelete* fields are populated after key delete, + * with/without snapshot retention. + * + * @param withSnapshot whether to create a snapshot before deleting the key + * @throws Exception on failure + */ + @ParameterizedTest + @ValueSource(booleans = {false, true}) + public void testBucketPendingDeleteBytes(boolean withSnapshot) throws Exception { String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); + String keyName = UUID.randomUUID().toString(); + String snapshotName = "snap-" + UUID.randomUUID(); + String value = "sample value"; + int valueLength = value.getBytes(UTF_8).length; - byte[] value = "sample value".getBytes(UTF_8); - int valueLength = value.length; store.createVolume(volumeName); OzoneVolume volume = store.getVolume(volumeName); volume.createBucket(bucketName); OzoneBucket bucket = volume.getBucket(bucketName); - // create a three replica file - String keyName1 = "key1"; - TestDataUtil.createKey(bucket, keyName1, ReplicationConfig - .fromTypeAndFactor(RATIS, THREE), value); - - // create a EC replica file - String keyName2 = "key2"; - ReplicationConfig replicationConfig = new ECReplicationConfig("rs-3-2-1024k"); - TestDataUtil.createKey(bucket, keyName2, replicationConfig, value); - - // create a directory and a file - String dirName = "dir1"; - bucket.createDirectory(dirName); - String keyName3 = "key3"; - TestDataUtil.createKey(bucket, keyName3, ReplicationConfig - .fromTypeAndFactor(RATIS, THREE), value); - - // delete files and directory - output.reset(); - bucket.deleteKey(keyName1); - bucket.deleteKey(keyName2); - bucket.deleteDirectory(dirName, true); - - // create keys for deleteKeys case - String keyName4 = "key4"; - TestDataUtil.createKey(bucket, dirName + "/" + keyName4, - ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); - - String keyName5 = "key5"; - TestDataUtil.createKey(bucket, dirName + "/" + keyName5, replicationConfig, value); - - List keysToDelete = new ArrayList<>(); - keysToDelete.add(dirName + "/" + keyName4); - keysToDelete.add(dirName + "/" + keyName5); - bucket.deleteKeys(keysToDelete); - - String consoleOutput = output.get(); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"key1\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"RATIS/THREE"); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"key2\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"EC{rs-3-2-1024k}"); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"dir1\",\"Transaction\""); - assertThat(consoleOutput).contains("op=DELETE_KEYS {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"deletedKeysList\":\"{key=dir1/key4, dataSize=" + valueLength + - ", replicationConfig=RATIS/THREE}, {key=dir1/key5, dataSize=" + valueLength + - ", replicationConfig=EC{rs-3-2-1024k}}\",\"unDeletedKeysList\""); + writeKey(bucket, keyName, ONE, value, valueLength); + + OzoneBucket bucketAfterKeyWrite = store.getVolume(volumeName) + .getBucket(bucketName); + assertThat(bucketAfterKeyWrite.getUsedBytes()).isEqualTo(valueLength); + assertThat(bucketAfterKeyWrite.getUsedNamespace()).isEqualTo(1); + assertThat(bucketAfterKeyWrite.getPendingDeleteBytes()).isEqualTo(0); + assertThat(bucketAfterKeyWrite.getPendingDeleteNamespace()).isEqualTo(0); + + if (withSnapshot) { + store.createSnapshot(volumeName, bucketName, snapshotName); + } + bucket.deleteKey(keyName); + // After delete: usedBytes should still be totalBucketSpace. + OzoneBucket bucketAfterKeyDelete = store.getVolume(volumeName) + .getBucket(bucketName); + assertThat(bucketAfterKeyDelete.getUsedBytes()).isEqualTo(valueLength); + assertThat(bucketAfterKeyDelete.getUsedNamespace()).isEqualTo(1); + assertThat(bucketAfterKeyDelete.getPendingDeleteBytes()).isEqualTo(valueLength); + assertThat(bucketAfterKeyDelete.getPendingDeleteNamespace()).isEqualTo(1); + + if (withSnapshot) { + // if snapshot is present bytes won't be released until snapshot is deleted. + store.deleteSnapshot(volumeName, bucketName, snapshotName); + } + + GenericTestUtils.waitFor(() -> { + OzoneBucket buck = null; + try { + buck = store.getVolume(volumeName).getBucket(bucketName); + } catch (IOException e) { + fail("Failed to get bucket details", e); + } + return buck.getUsedBytes() == 0 && buck.getUsedNamespace() == 0; + }, 1000, 30000); + OzoneBucket bucketAfterKeyPurge = store.getVolume(volumeName) + .getBucket(bucketName); + assertThat(bucketAfterKeyPurge.getUsedBytes()).isEqualTo(0); + assertThat(bucketAfterKeyPurge.getUsedNamespace()).isEqualTo(0); + assertThat(bucketAfterKeyPurge.getPendingDeleteBytes()).isEqualTo(0); + assertThat(bucketAfterKeyPurge.getPendingDeleteNamespace()).isEqualTo(0); } protected void verifyReplication(String volumeName, String bucketName, From 643bcebc4267d5ee4eda6b7ef05a00fef83a3005 Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Wed, 4 Feb 2026 15:19:31 +0530 Subject: [PATCH 2/3] revert test change --- .../ozone/client/rpc/OzoneRpcClientTests.java | 128 ++++++++---------- 1 file changed, 54 insertions(+), 74 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java index 18e8156941db..ae1e7159664f 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java @@ -250,6 +250,7 @@ abstract class OzoneRpcClientTests extends OzoneTestBase { @BeforeAll public static void initialize() throws NoSuchAlgorithmException, UnsupportedEncodingException { eTagProvider = MessageDigest.getInstance(MD5_HASH); + AuditLogTestUtils.enableAuditLog(); output = GenericTestUtils.captureOut(); } @@ -1097,81 +1098,60 @@ public void testDeleteLinkedBucket() throws Exception { @Test public void testDeleteAuditLog() throws Exception { - String oldLog4jConfig = System.getProperty("log4j.configurationFile"); - AuditLogTestUtils.enableAuditLog(); - org.apache.logging.log4j.core.LoggerContext ctx = - (org.apache.logging.log4j.core.LoggerContext) - org.apache.logging.log4j.LogManager.getContext(false); - ctx.reconfigure(); - try { - String volumeName = UUID.randomUUID().toString(); - String bucketName = UUID.randomUUID().toString(); + String volumeName = UUID.randomUUID().toString(); + String bucketName = UUID.randomUUID().toString(); - byte[] value = "sample value".getBytes(UTF_8); - int valueLength = value.length; - store.createVolume(volumeName); - OzoneVolume volume = store.getVolume(volumeName); - volume.createBucket(bucketName); - OzoneBucket bucket = volume.getBucket(bucketName); - - // create a three replica file - String keyName1 = "key1"; - TestDataUtil.createKey(bucket, keyName1, - ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); - - // create a EC replica file - String keyName2 = "key2"; - ReplicationConfig replicationConfig = new ECReplicationConfig( - "rs-3-2-1024k"); - TestDataUtil.createKey(bucket, keyName2, replicationConfig, value); - - // create a directory and a file - String dirName = "dir1"; - bucket.createDirectory(dirName); - String keyName3 = "key3"; - TestDataUtil.createKey(bucket, keyName3, - ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); - - // delete files and directory - output.reset(); - bucket.deleteKey(keyName1); - bucket.deleteKey(keyName2); - bucket.deleteDirectory(dirName, true); - - // create keys for deleteKeys case - String keyName4 = "key4"; - TestDataUtil.createKey(bucket, dirName + "/" + keyName4, - ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); - - String keyName5 = "key5"; - TestDataUtil.createKey(bucket, dirName + "/" + keyName5, - replicationConfig, value); - - List keysToDelete = new ArrayList<>(); - keysToDelete.add(dirName + "/" + keyName4); - keysToDelete.add(dirName + "/" + keyName5); - bucket.deleteKeys(keysToDelete); - - String consoleOutput = output.get(); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"key1\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"RATIS/THREE"); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"key2\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"EC{rs-3-2-1024k}"); - assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"key\":\"dir1\",\"Transaction\""); - assertThat(consoleOutput).contains( - "op=DELETE_KEYS {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + - "\",\"deletedKeysList\":\"{key=dir1/key4, dataSize=" + valueLength + - ", replicationConfig=RATIS/THREE}, {key=dir1/key5, dataSize=" + valueLength + - ", replicationConfig=EC{rs-3-2-1024k}}\",\"unDeletedKeysList\""); - } finally { - if (oldLog4jConfig == null) { - System.clearProperty("log4j.configurationFile"); - } else { - System.setProperty("log4j.configurationFile", oldLog4jConfig); - } - ctx.reconfigure(); - } + byte[] value = "sample value".getBytes(UTF_8); + int valueLength = value.length; + store.createVolume(volumeName); + OzoneVolume volume = store.getVolume(volumeName); + volume.createBucket(bucketName); + OzoneBucket bucket = volume.getBucket(bucketName); + + // create a three replica file + String keyName1 = "key1"; + TestDataUtil.createKey(bucket, keyName1, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + // create a EC replica file + String keyName2 = "key2"; + ReplicationConfig replicationConfig = new ECReplicationConfig("rs-3-2-1024k"); + TestDataUtil.createKey(bucket, keyName2, replicationConfig, value); + + // create a directory and a file + String dirName = "dir1"; + bucket.createDirectory(dirName); + String keyName3 = "key3"; + TestDataUtil.createKey(bucket, keyName3, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + // delete files and directory + output.reset(); + bucket.deleteKey(keyName1); + bucket.deleteKey(keyName2); + bucket.deleteDirectory(dirName, true); + + // create keys for deleteKeys case + String keyName4 = "key4"; + TestDataUtil.createKey(bucket, dirName + "/" + keyName4, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + + String keyName5 = "key5"; + TestDataUtil.createKey(bucket, dirName + "/" + keyName5, replicationConfig, value); + + List keysToDelete = new ArrayList<>(); + keysToDelete.add(dirName + "/" + keyName4); + keysToDelete.add(dirName + "/" + keyName5); + bucket.deleteKeys(keysToDelete); + + String consoleOutput = output.get(); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"key1\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"RATIS/THREE"); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"key2\",\"dataSize\":\"" + valueLength + "\",\"replicationConfig\":\"EC{rs-3-2-1024k}"); + assertThat(consoleOutput).contains("op=DELETE_KEY {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"key\":\"dir1\",\"Transaction\""); + assertThat(consoleOutput).contains("op=DELETE_KEYS {\"volume\":\"" + volumeName + "\",\"bucket\":\"" + bucketName + + "\",\"deletedKeysList\":\"{key=dir1/key4, dataSize=" + valueLength + + ", replicationConfig=RATIS/THREE}, {key=dir1/key5, dataSize=" + valueLength + + ", replicationConfig=EC{rs-3-2-1024k}}\",\"unDeletedKeysList\""); } /** From 0914cd763fae34e5bac9f1c1ce98b66f04507eba Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Wed, 4 Feb 2026 15:21:56 +0530 Subject: [PATCH 3/3] indentation --- .../hadoop/ozone/client/rpc/OzoneRpcClientTests.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java index ae1e7159664f..7a946116fc76 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java @@ -1110,7 +1110,8 @@ public void testDeleteAuditLog() throws Exception { // create a three replica file String keyName1 = "key1"; - TestDataUtil.createKey(bucket, keyName1, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + TestDataUtil.createKey(bucket, keyName1, ReplicationConfig + .fromTypeAndFactor(RATIS, THREE), value); // create a EC replica file String keyName2 = "key2"; @@ -1121,7 +1122,8 @@ public void testDeleteAuditLog() throws Exception { String dirName = "dir1"; bucket.createDirectory(dirName); String keyName3 = "key3"; - TestDataUtil.createKey(bucket, keyName3, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + TestDataUtil.createKey(bucket, keyName3, ReplicationConfig + .fromTypeAndFactor(RATIS, THREE), value); // delete files and directory output.reset(); @@ -1131,7 +1133,8 @@ public void testDeleteAuditLog() throws Exception { // create keys for deleteKeys case String keyName4 = "key4"; - TestDataUtil.createKey(bucket, dirName + "/" + keyName4, ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); + TestDataUtil.createKey(bucket, dirName + "/" + keyName4, + ReplicationConfig.fromTypeAndFactor(RATIS, THREE), value); String keyName5 = "key5"; TestDataUtil.createKey(bucket, dirName + "/" + keyName5, replicationConfig, value);