From 8c2c204ecbe957129554ec66e04cccfd64c6ad45 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Thu, 1 Dec 2022 11:31:10 +0530 Subject: [PATCH 1/5] HDDS-7565. FSO purge directory for old bucket can update quota for new bucket --- .../key/OMDirectoriesPurgeRequestWithFSO.java | 37 ++++++-- .../OMDirectoriesPurgeResponseWithFSO.java | 8 +- ...tOMDirectoriesPurgeRequestAndResponse.java | 95 +++++++++++++++++-- 3 files changed, 123 insertions(+), 17 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java index d783064fc2d2..25b93ea72f7c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java @@ -75,12 +75,13 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, volumeName, bucketName); lockSet.add(volBucketPair); } - OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, - volumeName, bucketName); + updateBucketInfo(volBucketInfoMap, omMetadataManager, path, + volumeName, bucketName, volBucketPair); + OmBucketInfo omBucketInfo = volBucketInfoMap.get(volBucketPair); // bucketInfo can be null in case of delete volume or bucket + // or key does not belong to bucket as bucket is recreated if (null != omBucketInfo) { omBucketInfo.incrUsedNamespace(-1L); - volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } @@ -95,13 +96,14 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, volumeName, bucketName); lockSet.add(volBucketPair); } - OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, - volumeName, bucketName); + updateBucketInfo(volBucketInfoMap, omMetadataManager, + path, volumeName, bucketName, volBucketPair); + OmBucketInfo omBucketInfo = volBucketInfoMap.get(volBucketPair); // bucketInfo can be null in case of delete volume or bucket + // or key does not belong to bucket as bucket is recreated if (null != omBucketInfo) { omBucketInfo.incrUsedBytes(-sumBlockLengths(keyInfo)); omBucketInfo.incrUsedNamespace(-1L); - volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } } @@ -116,7 +118,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, e.getValue())); for (Map.Entry, OmBucketInfo> entry : volBucketInfoMap.entrySet()) { - entry.setValue(entry.getValue().copyObject()); + if (null != entry.getValue()) { + entry.setValue(entry.getValue().copyObject()); + } } } @@ -130,4 +134,23 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, return omClientResponse; } + + private void updateBucketInfo( + Map, OmBucketInfo> volBucketInfoMap, + OMMetadataManager omMetadataManager, + OzoneManagerProtocolProtos.PurgePathRequest path, String volumeName, + String bucketName, Pair volBucketPair) { + if (!volBucketInfoMap.containsKey(volBucketPair)) { + OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, + volumeName, bucketName); + // null is added to avoid again lookup, in case of bucket not found + // or bucket is not matching as recreated + if (null == omBucketInfo + || omBucketInfo.getObjectID() != path.getBucketId()) { + volBucketInfoMap.put(volBucketPair, null); + } else { + volBucketInfoMap.put(volBucketPair, omBucketInfo); + } + } + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java index eed768fbb0f1..f5d12891dfb2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java @@ -133,9 +133,11 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, // update bucket usedBytes. for (OmBucketInfo omBucketInfo : volBucketInfoMap.values()) { - omMetadataManager.getBucketTable().putWithBatch(batchOperation, - omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), - omBucketInfo.getBucketName()), omBucketInfo); + if (null != omBucketInfo) { + omMetadataManager.getBucketTable().putWithBatch(batchOperation, + omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), + omBucketInfo.getBucketName()), omBucketInfo); + } } } } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index f7d1384451f0..0724be3a4bef 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -39,6 +39,7 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; /** @@ -52,6 +53,17 @@ public class TestOMDirectoriesPurgeRequestAndResponse extends TestOMKeyRequest { * Creates volume, bucket and key entries and adds to OM DB and then * deletes these keys to move them to deletedKeys table. */ + @Before + public void cleanup() { + try { + String bucketKey = omMetadataManager.getBucketKey(volumeName, + bucketName); + omMetadataManager.getBucketTable().delete(bucketKey); + } catch (Exception e) { + // do nothing + } + } + private List createAndDeleteKeys(Integer trxnIndex, String bucket) throws Exception { if (bucket == null) { @@ -108,7 +120,7 @@ private void updateBlockInfo(OmKeyInfo omKeyInfo) throws IOException { * @return OMRequest */ private OMRequest createPurgeKeysRequest(String purgeDeletedDir, - List keyList) throws IOException { + List keyList, OmBucketInfo bucketInfo) throws IOException { List purgePathRequestList = new ArrayList<>(); List subFiles = new ArrayList<>(); @@ -117,7 +129,7 @@ private OMRequest createPurgeKeysRequest(String purgeDeletedDir, } List subDirs = new ArrayList<>(); Long volumeId = 1L; - Long bucketId = 1L; + Long bucketId = bucketInfo.getObjectID(); OzoneManagerProtocolProtos.PurgePathRequest request = wrapPurgeRequest( volumeId, bucketId, purgeDeletedDir, subFiles, subDirs); purgePathRequestList.add(request); @@ -190,15 +202,15 @@ public void testValidateAndUpdateCacheCheckQuota() throws Exception { } // Create PurgeKeysRequest to purge the deleted keys - OMRequest omRequest = createPurgeKeysRequest(null, deletedKeyInfos); - + String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); + OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable().get( + bucketKey); + OMRequest omRequest = createPurgeKeysRequest( + null, deletedKeyInfos, omBucketInfo); OMRequest preExecutedRequest = preExecute(omRequest); OMDirectoriesPurgeRequestWithFSO omKeyPurgeRequest = new OMDirectoriesPurgeRequestWithFSO(preExecutedRequest); - String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); - OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable().get( - bucketKey); Assert.assertEquals(1000L * deletedKeyNames.size(), omBucketInfo.getUsedBytes()); OMDirectoriesPurgeResponseWithFSO omClientResponse @@ -225,4 +237,73 @@ public void testValidateAndUpdateCacheCheckQuota() throws Exception { deletedKey)); } } + + @Test + public void testValidateAndUpdateCacheQuotaBucketRecreated() + throws Exception { + // Create and Delete keys. The keys should be moved to DeletedKeys table + List deletedKeyInfos = createAndDeleteKeys(1, null); + // The keys should be present in the DeletedKeys table before purging + List deletedKeyNames = new ArrayList<>(); + for (OmKeyInfo deletedKey : deletedKeyInfos) { + String keyName = omMetadataManager.getOzoneKey(deletedKey.getVolumeName(), + deletedKey.getBucketName(), deletedKey.getKeyName()); + Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( + keyName)); + deletedKeyNames.add(keyName); + } + + + // Create PurgeKeysRequest to purge the deleted keys + String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); + OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable().get( + bucketKey); + OMRequest omRequest = createPurgeKeysRequest( + null, deletedKeyInfos, omBucketInfo); + OMRequest preExecutedRequest = preExecute(omRequest); + OMDirectoriesPurgeRequestWithFSO omKeyPurgeRequest = + new OMDirectoriesPurgeRequestWithFSO(preExecutedRequest); + + // recreate bucket + omMetadataManager.getBucketTable().delete(bucketKey); + OMRequestTestUtils.addBucketToDB(volumeName, bucketName, + omMetadataManager); + omBucketInfo = omMetadataManager.getBucketTable().get( + bucketKey); + omBucketInfo.incrUsedBytes(1000); + omBucketInfo.incrUsedNamespace(100L); + omMetadataManager.getBucketTable().addCacheEntry(new CacheKey<>(bucketKey), + new CacheValue<>(Optional.of(omBucketInfo), 1L)); + omMetadataManager.getBucketTable().put(bucketKey, omBucketInfo); + + // prevalidate bucket + omBucketInfo = omMetadataManager.getBucketTable().get(bucketKey); + Assert.assertEquals(1000L, omBucketInfo.getUsedBytes()); + + // perform delete + OMDirectoriesPurgeResponseWithFSO omClientResponse + = (OMDirectoriesPurgeResponseWithFSO) omKeyPurgeRequest + .validateAndUpdateCache(ozoneManager, 100L, + ozoneManagerDoubleBufferHelper); + + // validate bucket info, no change expected + omBucketInfo = omMetadataManager.getBucketTable().get( + bucketKey); + Assert.assertEquals(1000L, omBucketInfo.getUsedBytes()); + + try (BatchOperation batchOperation = + omMetadataManager.getStore().initBatchOperation()) { + + omClientResponse.addToDBBatch(omMetadataManager, batchOperation); + + // Do manual commit and see whether addToBatch is successful or not. + omMetadataManager.getStore().commitBatchOperation(batchOperation); + } + + // The keys should exist in the DeletedKeys table after dir delete + for (String deletedKey : deletedKeyNames) { + Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( + deletedKey)); + } + } } From e4aa45b9e33c99c5c278f461b7afe1758c9938ce Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Thu, 1 Dec 2022 11:47:24 +0530 Subject: [PATCH 2/5] HDDS-7565. FSO purge directory for old bucket can update quota for new bucket --- .../TestOMDirectoriesPurgeRequestAndResponse.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index 0724be3a4bef..fa48de60883f 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -54,14 +54,10 @@ public class TestOMDirectoriesPurgeRequestAndResponse extends TestOMKeyRequest { * deletes these keys to move them to deletedKeys table. */ @Before - public void cleanup() { - try { - String bucketKey = omMetadataManager.getBucketKey(volumeName, - bucketName); - omMetadataManager.getBucketTable().delete(bucketKey); - } catch (Exception e) { - // do nothing - } + public void cleanup() throws Exception { + String bucketKey = omMetadataManager.getBucketKey(volumeName, + bucketName); + omMetadataManager.getBucketTable().delete(bucketKey); } private List createAndDeleteKeys(Integer trxnIndex, String bucket) From c060e61d32f45a947595a68151cab148b3477b65 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Wed, 14 Dec 2022 08:29:21 +0530 Subject: [PATCH 3/5] HDDS-7565. FSO purge directory for old bucket can update quota for new bucket --- .../key/OMDirectoriesPurgeRequestWithFSO.java | 38 ++++++------------- ...tOMDirectoriesPurgeRequestAndResponse.java | 7 ---- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java index 25b93ea72f7c..d95a2b04acf7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java @@ -75,13 +75,15 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, volumeName, bucketName); lockSet.add(volBucketPair); } - updateBucketInfo(volBucketInfoMap, omMetadataManager, path, - volumeName, bucketName, volBucketPair); - OmBucketInfo omBucketInfo = volBucketInfoMap.get(volBucketPair); + + OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, + volumeName, bucketName); // bucketInfo can be null in case of delete volume or bucket // or key does not belong to bucket as bucket is recreated - if (null != omBucketInfo) { + if (null != omBucketInfo + && omBucketInfo.getObjectID() == path.getBucketId()) { omBucketInfo.incrUsedNamespace(-1L); + volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } @@ -96,14 +98,15 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, volumeName, bucketName); lockSet.add(volBucketPair); } - updateBucketInfo(volBucketInfoMap, omMetadataManager, - path, volumeName, bucketName, volBucketPair); - OmBucketInfo omBucketInfo = volBucketInfoMap.get(volBucketPair); + OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, + volumeName, bucketName); // bucketInfo can be null in case of delete volume or bucket // or key does not belong to bucket as bucket is recreated - if (null != omBucketInfo) { + if (null != omBucketInfo + && omBucketInfo.getObjectID() == path.getBucketId()) { omBucketInfo.incrUsedBytes(-sumBlockLengths(keyInfo)); omBucketInfo.incrUsedNamespace(-1L); + volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } } @@ -134,23 +137,4 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, return omClientResponse; } - - private void updateBucketInfo( - Map, OmBucketInfo> volBucketInfoMap, - OMMetadataManager omMetadataManager, - OzoneManagerProtocolProtos.PurgePathRequest path, String volumeName, - String bucketName, Pair volBucketPair) { - if (!volBucketInfoMap.containsKey(volBucketPair)) { - OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager, - volumeName, bucketName); - // null is added to avoid again lookup, in case of bucket not found - // or bucket is not matching as recreated - if (null == omBucketInfo - || omBucketInfo.getObjectID() != path.getBucketId()) { - volBucketInfoMap.put(volBucketPair, null); - } else { - volBucketInfoMap.put(volBucketPair, omBucketInfo); - } - } - } } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index fa48de60883f..9121d29a72db 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -53,13 +53,6 @@ public class TestOMDirectoriesPurgeRequestAndResponse extends TestOMKeyRequest { * Creates volume, bucket and key entries and adds to OM DB and then * deletes these keys to move them to deletedKeys table. */ - @Before - public void cleanup() throws Exception { - String bucketKey = omMetadataManager.getBucketKey(volumeName, - bucketName); - omMetadataManager.getBucketTable().delete(bucketKey); - } - private List createAndDeleteKeys(Integer trxnIndex, String bucket) throws Exception { if (bucket == null) { From d0467325257c8f9d6fb41614ed29b9cfca28cc50 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Wed, 14 Dec 2022 08:33:50 +0530 Subject: [PATCH 4/5] HDDS-7565. FSO purge directory for old bucket can update quota for new bucket --- .../om/request/key/OMDirectoriesPurgeRequestWithFSO.java | 4 +--- .../response/key/OMDirectoriesPurgeResponseWithFSO.java | 8 +++----- .../key/TestOMDirectoriesPurgeRequestAndResponse.java | 1 - 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java index d95a2b04acf7..f319a5c9c8ef 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java @@ -121,9 +121,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, e.getValue())); for (Map.Entry, OmBucketInfo> entry : volBucketInfoMap.entrySet()) { - if (null != entry.getValue()) { - entry.setValue(entry.getValue().copyObject()); - } + entry.setValue(entry.getValue().copyObject()); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java index f5d12891dfb2..eed768fbb0f1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java @@ -133,11 +133,9 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, // update bucket usedBytes. for (OmBucketInfo omBucketInfo : volBucketInfoMap.values()) { - if (null != omBucketInfo) { - omMetadataManager.getBucketTable().putWithBatch(batchOperation, - omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), - omBucketInfo.getBucketName()), omBucketInfo); - } + omMetadataManager.getBucketTable().putWithBatch(batchOperation, + omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), + omBucketInfo.getBucketName()), omBucketInfo); } } } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index 9121d29a72db..1e3ae647fb66 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -39,7 +39,6 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; /** From 2637d8a751cec4bdaa8158fc730670105f24b156 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Mon, 19 Dec 2022 13:00:01 +0530 Subject: [PATCH 5/5] HDDS-7565. FSO purge directory for old bucket can update quota for new bucket --- ...tOMDirectoriesPurgeRequestAndResponse.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index 1e3ae647fb66..d3f5933e2bd1 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -38,6 +38,7 @@ import org.apache.hadoop.ozone.om.response.key.OMKeyPurgeResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; +import org.jetbrains.annotations.NotNull; import org.junit.Assert; import org.junit.Test; @@ -180,14 +181,7 @@ public void testValidateAndUpdateCacheCheckQuota() throws Exception { // Create and Delete keys. The keys should be moved to DeletedKeys table List deletedKeyInfos = createAndDeleteKeys(1, null); // The keys should be present in the DeletedKeys table before purging - List deletedKeyNames = new ArrayList<>(); - for (OmKeyInfo deletedKey : deletedKeyInfos) { - String keyName = omMetadataManager.getOzoneKey(deletedKey.getVolumeName(), - deletedKey.getBucketName(), deletedKey.getKeyName()); - Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( - keyName)); - deletedKeyNames.add(keyName); - } + List deletedKeyNames = validateDeletedKeysTable(deletedKeyInfos); // Create PurgeKeysRequest to purge the deleted keys String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); @@ -210,20 +204,10 @@ public void testValidateAndUpdateCacheCheckQuota() throws Exception { Assert.assertEquals(0L * deletedKeyNames.size(), omBucketInfo.getUsedBytes()); - try (BatchOperation batchOperation = - omMetadataManager.getStore().initBatchOperation()) { - - omClientResponse.addToDBBatch(omMetadataManager, batchOperation); - - // Do manual commit and see whether addToBatch is successful or not. - omMetadataManager.getStore().commitBatchOperation(batchOperation); - } + performBatchOperationCommit(omClientResponse); // The keys should exist in the DeletedKeys table after dir delete - for (String deletedKey : deletedKeyNames) { - Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( - deletedKey)); - } + validateDeletedKeys(deletedKeyNames); } @Test @@ -232,15 +216,7 @@ public void testValidateAndUpdateCacheQuotaBucketRecreated() // Create and Delete keys. The keys should be moved to DeletedKeys table List deletedKeyInfos = createAndDeleteKeys(1, null); // The keys should be present in the DeletedKeys table before purging - List deletedKeyNames = new ArrayList<>(); - for (OmKeyInfo deletedKey : deletedKeyInfos) { - String keyName = omMetadataManager.getOzoneKey(deletedKey.getVolumeName(), - deletedKey.getBucketName(), deletedKey.getKeyName()); - Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( - keyName)); - deletedKeyNames.add(keyName); - } - + List deletedKeyNames = validateDeletedKeysTable(deletedKeyInfos); // Create PurgeKeysRequest to purge the deleted keys String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); @@ -279,6 +255,14 @@ public void testValidateAndUpdateCacheQuotaBucketRecreated() bucketKey); Assert.assertEquals(1000L, omBucketInfo.getUsedBytes()); + performBatchOperationCommit(omClientResponse); + + // The keys should exist in the DeletedKeys table after dir delete + validateDeletedKeys(deletedKeyNames); + } + + private void performBatchOperationCommit( + OMDirectoriesPurgeResponseWithFSO omClientResponse) throws IOException { try (BatchOperation batchOperation = omMetadataManager.getStore().initBatchOperation()) { @@ -287,8 +271,24 @@ public void testValidateAndUpdateCacheQuotaBucketRecreated() // Do manual commit and see whether addToBatch is successful or not. omMetadataManager.getStore().commitBatchOperation(batchOperation); } + } - // The keys should exist in the DeletedKeys table after dir delete + @NotNull + private List validateDeletedKeysTable( + List deletedKeyInfos) throws IOException { + List deletedKeyNames = new ArrayList<>(); + for (OmKeyInfo deletedKey : deletedKeyInfos) { + String keyName = omMetadataManager.getOzoneKey(deletedKey.getVolumeName(), + deletedKey.getBucketName(), deletedKey.getKeyName()); + Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( + keyName)); + deletedKeyNames.add(keyName); + } + return deletedKeyNames; + } + + private void validateDeletedKeys( + List deletedKeyNames) throws IOException { for (String deletedKey : deletedKeyNames) { Assert.assertTrue(omMetadataManager.getDeletedTable().isExist( deletedKey));