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

weichiu pushed a commit to branch HDDS-6517-Snapshot
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-6517-Snapshot by this 
push:
     new d96f207f3a HDDS-7512. [snapshot] List Snapshot returns an empty list 
for a non-existent bucket (#3993)
d96f207f3a is described below

commit d96f207f3ac1853185fd2f41c41ea74699f3e163
Author: Chung En Lee <[email protected]>
AuthorDate: Tue Dec 6 12:38:47 2022 +0800

    HDDS-7512. [snapshot] List Snapshot returns an empty list for a 
non-existent bucket (#3993)
---
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     |  13 +-
 .../hadoop/ozone/om/TestOmMetadataManager.java     | 161 ++++++++++++---------
 2 files changed, 103 insertions(+), 71 deletions(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index 295821b0d9..b1929887f1 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -1169,13 +1169,17 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager {
   public List<SnapshotInfo> listSnapshot(String volumeName, String bucketName)
       throws IOException {
     if (Strings.isNullOrEmpty(volumeName)) {
-      throw new OMException("Volume name is required.",
-          ResultCodes.VOLUME_NOT_FOUND);
+      throw new OMException("Volume name is required.", VOLUME_NOT_FOUND);
     }
 
     if (Strings.isNullOrEmpty(bucketName)) {
-      throw new OMException("Bucket name is required.",
-          ResultCodes.BUCKET_NOT_FOUND);
+      throw new OMException("Bucket name is required.", BUCKET_NOT_FOUND);
+    }
+
+    String bucketNameBytes = getBucketKey(volumeName, bucketName);
+    if (getBucketTable().get(bucketNameBytes) == null) {
+      throw new OMException("Bucket " + bucketName + " not found.",
+          BUCKET_NOT_FOUND);
     }
 
     String prefix = getBucketKey(volumeName, bucketName + OM_KEY_PREFIX);
@@ -1207,6 +1211,7 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager {
     try (TableIterator<String, ? extends KeyValue<String, SnapshotInfo>>
              snapshotIter = snapshotInfoTable.iterator()) {
       KeyValue< String, SnapshotInfo> snapshotinfo;
+      snapshotIter.seek(prefix);
       while (snapshotIter.hasNext()) {
         snapshotinfo = snapshotIter.next();
         if (snapshotinfo != null && snapshotinfo.getKey().startsWith(prefix)) {
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
index 5553ce2e92..84dc514649 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
@@ -33,12 +34,14 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OpenKey;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OpenKeyBucket;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.io.File;
 import java.time.Duration;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -49,11 +52,19 @@ import java.time.Instant;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_OPEN_KEY_EXPIRE_THRESHOLD;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_OPEN_KEY_EXPIRE_THRESHOLD_DEFAULT;
 import static org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_KEY;
 import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_DIRS;
+import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND;
+import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
 
 /**
  * Tests OzoneManager MetadataManager.
@@ -62,16 +73,15 @@ public class TestOmMetadataManager {
 
   private OMMetadataManager omMetadataManager;
   private OzoneConfiguration ozoneConfiguration;
-
-  @Rule
-  public TemporaryFolder folder = new TemporaryFolder();
+  @TempDir
+  private File folder;
 
 
-  @Before
+  @BeforeEach
   public void setup() throws Exception {
     ozoneConfiguration = new OzoneConfiguration();
     ozoneConfiguration.set(OZONE_OM_DB_DIRS,
-        folder.getRoot().getAbsolutePath());
+        folder.getAbsolutePath());
     omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration);
   }
 
@@ -92,8 +102,8 @@ public class TestOmMetadataManager {
     TransactionInfo transactionInfo =
         omMetadataManager.getTransactionInfoTable().get(TRANSACTION_INFO_KEY);
 
-    Assert.assertEquals(3, transactionInfo.getTerm());
-    Assert.assertEquals(250, transactionInfo.getTransactionIndex());
+    assertEquals(3, transactionInfo.getTerm());
+    assertEquals(250, transactionInfo.getTransactionIndex());
 
 
   }
@@ -127,7 +137,7 @@ public class TestOmMetadataManager {
     String startVolume = "vol" + startOrder;
     List<OmVolumeArgs> volumeList = omMetadataManager.listVolumes(ownerName,
         prefix, startVolume, 100);
-    Assert.assertEquals(volumeList.size(), totalVol - startOrder - 1);
+    assertEquals(volumeList.size(), totalVol - startOrder - 1);
   }
 
   @Test
@@ -159,13 +169,13 @@ public class TestOmMetadataManager {
     // Test list all volumes
     List<OmVolumeArgs> volListA = omMetadataManager.listVolumes(null,
         prefix, startKey, 1000);
-    Assert.assertEquals(volListA.size(), 100);
+    assertEquals(volListA.size(), 100);
 
     // Test list all volumes with prefix
     prefix = "volb";
     List<OmVolumeArgs> volListB = omMetadataManager.listVolumes(null,
         prefix, startKey, 1000);
-    Assert.assertEquals(volListB.size(), 50);
+    assertEquals(volListB.size(), 50);
 
     // Test list all volumes with setting startVolume
     // that was not part of result.
@@ -175,7 +185,7 @@ public class TestOmMetadataManager {
     startKey = "volb" + startOrder;
     List<OmVolumeArgs> volListC = omMetadataManager.listVolumes(null,
         prefix, startKey, 1000);
-    Assert.assertEquals(volListC.size(), totalVol - startOrder - 1);
+    assertEquals(volListC.size(), totalVol - startOrder - 1);
   }
 
   @Test
@@ -234,10 +244,10 @@ public class TestOmMetadataManager {
     // Cause adding a exact name in prefixBucketNameWithOzoneOwner
     // and another 49 buckets, so if we list buckets with --prefix
     // prefixBucketNameWithOzoneOwner, we should get 50 buckets.
-    Assert.assertEquals(omBucketInfoList.size(), 50);
+    assertEquals(omBucketInfoList.size(), 50);
 
     for (OmBucketInfo omBucketInfo : omBucketInfoList) {
-      Assert.assertTrue(omBucketInfo.getBucketName().startsWith(
+      assertTrue(omBucketInfo.getBucketName().startsWith(
           prefixBucketNameWithOzoneOwner));
     }
 
@@ -248,7 +258,7 @@ public class TestOmMetadataManager {
             startBucket, prefixBucketNameWithOzoneOwner,
             100);
 
-    Assert.assertEquals(volumeABucketsPrefixWithOzoneOwner.tailSet(
+    assertEquals(volumeABucketsPrefixWithOzoneOwner.tailSet(
         startBucket).size() - 1, omBucketInfoList.size());
 
     startBucket = prefixBucketNameWithOzoneOwner + 38;
@@ -257,13 +267,13 @@ public class TestOmMetadataManager {
             startBucket, prefixBucketNameWithOzoneOwner,
             100);
 
-    Assert.assertEquals(volumeABucketsPrefixWithOzoneOwner.tailSet(
+    assertEquals(volumeABucketsPrefixWithOzoneOwner.tailSet(
         startBucket).size() - 1, omBucketInfoList.size());
 
     for (OmBucketInfo omBucketInfo : omBucketInfoList) {
-      Assert.assertTrue(omBucketInfo.getBucketName().startsWith(
+      assertTrue(omBucketInfo.getBucketName().startsWith(
           prefixBucketNameWithOzoneOwner));
-      Assert.assertFalse(omBucketInfo.getBucketName().equals(
+      assertFalse(omBucketInfo.getBucketName().equals(
           prefixBucketNameWithOzoneOwner + 10));
     }
 
@@ -275,10 +285,10 @@ public class TestOmMetadataManager {
     // Cause adding a exact name in prefixBucketNameWithOzoneOwner
     // and another 49 buckets, so if we list buckets with --prefix
     // prefixBucketNameWithOzoneOwner, we should get 50 buckets.
-    Assert.assertEquals(omBucketInfoList.size(), 50);
+    assertEquals(omBucketInfoList.size(), 50);
 
     for (OmBucketInfo omBucketInfo : omBucketInfoList) {
-      Assert.assertTrue(omBucketInfo.getBucketName().startsWith(
+      assertTrue(omBucketInfo.getBucketName().startsWith(
           prefixBucketNameWithHadoopOwner));
     }
 
@@ -291,24 +301,24 @@ public class TestOmMetadataManager {
       omBucketInfoList = omMetadataManager.listBuckets(volumeName2,
           startBucket, prefixBucketNameWithHadoopOwner, 10);
 
-      Assert.assertEquals(omBucketInfoList.size(), 10);
+      assertEquals(omBucketInfoList.size(), 10);
 
       for (OmBucketInfo omBucketInfo : omBucketInfoList) {
         expectedBuckets.add(omBucketInfo.getBucketName());
-        Assert.assertTrue(omBucketInfo.getBucketName().startsWith(
+        assertTrue(omBucketInfo.getBucketName().startsWith(
             prefixBucketNameWithHadoopOwner));
         startBucket =  omBucketInfo.getBucketName();
       }
     }
 
 
-    Assert.assertEquals(volumeBBucketsPrefixWithHadoopOwner, expectedBuckets);
+    assertEquals(volumeBBucketsPrefixWithHadoopOwner, expectedBuckets);
     // As now we have iterated all 50 buckets, calling next time should
     // return empty list.
     omBucketInfoList = omMetadataManager.listBuckets(volumeName2,
         startBucket, prefixBucketNameWithHadoopOwner, 10);
 
-    Assert.assertEquals(omBucketInfoList.size(), 0);
+    assertEquals(omBucketInfoList.size(), 0);
 
   }
 
@@ -381,10 +391,10 @@ public class TestOmMetadataManager {
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
             null, prefixKeyA, 100);
 
-    Assert.assertEquals(omKeyInfoList.size(),  50);
+    assertEquals(omKeyInfoList.size(),  50);
 
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
-      Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+      assertTrue(omKeyInfo.getKeyName().startsWith(
           prefixKeyA));
     }
 
@@ -394,7 +404,7 @@ public class TestOmMetadataManager {
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
             startKey, prefixKeyA, 100);
 
-    Assert.assertEquals(keysASet.tailSet(
+    assertEquals(keysASet.tailSet(
         startKey).size() - 1, omKeyInfoList.size());
 
     startKey = prefixKeyA + 38;
@@ -402,13 +412,13 @@ public class TestOmMetadataManager {
         omMetadataManager.listKeys(volumeNameA, ozoneBucket,
             startKey, prefixKeyA, 100);
 
-    Assert.assertEquals(keysASet.tailSet(
+    assertEquals(keysASet.tailSet(
         startKey).size() - 1, omKeyInfoList.size());
 
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
-      Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+      assertTrue(omKeyInfo.getKeyName().startsWith(
           prefixKeyA));
-      Assert.assertFalse(omKeyInfo.getBucketName().equals(
+      assertFalse(omKeyInfo.getBucketName().equals(
           prefixKeyA + 38));
     }
 
@@ -417,10 +427,10 @@ public class TestOmMetadataManager {
     omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
         null, prefixKeyB, 100);
 
-    Assert.assertEquals(omKeyInfoList.size(),  50);
+    assertEquals(omKeyInfoList.size(),  50);
 
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
-      Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+      assertTrue(omKeyInfo.getKeyName().startsWith(
           prefixKeyB));
     }
 
@@ -433,17 +443,17 @@ public class TestOmMetadataManager {
       omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
           startKey, prefixKeyB, 10);
 
-      Assert.assertEquals(10, omKeyInfoList.size());
+      assertEquals(10, omKeyInfoList.size());
 
       for (OmKeyInfo omKeyInfo : omKeyInfoList) {
         expectedKeys.add(omKeyInfo.getKeyName());
-        Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+        assertTrue(omKeyInfo.getKeyName().startsWith(
             prefixKeyB));
         startKey =  omKeyInfo.getKeyName();
       }
     }
 
-    Assert.assertEquals(expectedKeys, keysBVolumeBSet);
+    assertEquals(expectedKeys, keysBVolumeBSet);
 
 
     // As now we have iterated all 50 buckets, calling next time should
@@ -451,14 +461,14 @@ public class TestOmMetadataManager {
     omKeyInfoList = omMetadataManager.listKeys(volumeNameB, hadoopBucket,
         startKey, prefixKeyB, 10);
 
-    Assert.assertEquals(omKeyInfoList.size(), 0);
+    assertEquals(omKeyInfoList.size(), 0);
 
     // List all keys with empty prefix
     omKeyInfoList = omMetadataManager.listKeys(volumeNameA, ozoneBucket,
         null, null, 100);
-    Assert.assertEquals(50, omKeyInfoList.size());
+    assertEquals(50, omKeyInfoList.size());
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
-      Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+      assertTrue(omKeyInfo.getKeyName().startsWith(
           prefixKeyA));
     }
   }
@@ -501,16 +511,16 @@ public class TestOmMetadataManager {
             null, prefixKeyA, 100);
 
     // As in total 100, 50 are marked for delete. It should list only 50 keys.
-    Assert.assertEquals(50, omKeyInfoList.size());
+    assertEquals(50, omKeyInfoList.size());
 
     TreeSet<String> expectedKeys = new TreeSet<>();
 
     for (OmKeyInfo omKeyInfo : omKeyInfoList) {
       expectedKeys.add(omKeyInfo.getKeyName());
-      Assert.assertTrue(omKeyInfo.getKeyName().startsWith(prefixKeyA));
+      assertTrue(omKeyInfo.getKeyName().startsWith(prefixKeyA));
     }
 
-    Assert.assertEquals(expectedKeys, keysASet);
+    assertEquals(expectedKeys, keysASet);
 
 
     // Now get key count by 10.
@@ -522,17 +532,17 @@ public class TestOmMetadataManager {
           startKey, prefixKeyA, 10);
 
       System.out.println(i);
-      Assert.assertEquals(10, omKeyInfoList.size());
+      assertEquals(10, omKeyInfoList.size());
 
       for (OmKeyInfo omKeyInfo : omKeyInfoList) {
         expectedKeys.add(omKeyInfo.getKeyName());
-        Assert.assertTrue(omKeyInfo.getKeyName().startsWith(
+        assertTrue(omKeyInfo.getKeyName().startsWith(
             prefixKeyA));
         startKey =  omKeyInfo.getKeyName();
       }
     }
 
-    Assert.assertEquals(keysASet, expectedKeys);
+    assertEquals(keysASet, expectedKeys);
 
 
     // As now we have iterated all 50 buckets, calling next time should
@@ -540,7 +550,7 @@ public class TestOmMetadataManager {
     omKeyInfoList = omMetadataManager.listKeys(volumeNameA, ozoneBucket,
         startKey, prefixKeyA, 10);
 
-    Assert.assertEquals(omKeyInfoList.size(), 0);
+    assertEquals(omKeyInfoList.size(), 0);
 
 
 
@@ -618,24 +628,24 @@ public class TestOmMetadataManager {
         omMetadataManager.getExpiredOpenKeys(expireThreshold,
             numExpiredOpenKeys - 1, bucketLayout);
     List<String> names = getOpenKeyNames(someExpiredKeys);
-    Assert.assertEquals(numExpiredOpenKeys - 1, names.size());
-    Assert.assertTrue(expiredKeys.containsAll(names));
+    assertEquals(numExpiredOpenKeys - 1, names.size());
+    assertTrue(expiredKeys.containsAll(names));
 
     // Test attempting to retrieving more expired keys than actually exist.
     List<OpenKeyBucket> allExpiredKeys =
         omMetadataManager.getExpiredOpenKeys(expireThreshold,
             numExpiredOpenKeys + 1, bucketLayout);
     names = getOpenKeyNames(allExpiredKeys);
-    Assert.assertEquals(numExpiredOpenKeys, names.size());
-    Assert.assertTrue(expiredKeys.containsAll(names));
+    assertEquals(numExpiredOpenKeys, names.size());
+    assertTrue(expiredKeys.containsAll(names));
 
     // Test retrieving exact amount of expired keys that exist.
     allExpiredKeys =
         omMetadataManager.getExpiredOpenKeys(expireThreshold,
             numExpiredOpenKeys, bucketLayout);
     names = getOpenKeyNames(allExpiredKeys);
-    Assert.assertEquals(numExpiredOpenKeys, names.size());
-    Assert.assertTrue(expiredKeys.containsAll(names));
+    assertEquals(numExpiredOpenKeys, names.size());
+    assertTrue(expiredKeys.containsAll(names));
   }
 
   private List<String> getOpenKeyNames(List<OpenKeyBucket> openKeyBuckets) {
@@ -666,7 +676,7 @@ public class TestOmMetadataManager {
         new HashSet<>(Arrays.asList(OmMetadataManagerImpl.ALL_TABLES));
     Set<String> tablesInManager = omMetadataManager.listTableNames();
 
-    Assert.assertEquals(tablesByDefinition, tablesInManager);
+    assertEquals(tablesByDefinition, tablesInManager);
   }
 
   @Test
@@ -688,21 +698,38 @@ public class TestOmMetadataManager {
       }
     }
 
-    //Test listing snapshots with no volume name.
-    Assert.assertThrows(OMException.class, () -> 
omMetadataManager.listSnapshot(
-        null, null));
-
-    //Test listing snapshots with no bucket name.
-    Assert.assertThrows(OMException.class, () -> 
omMetadataManager.listSnapshot(
-        vol1, null));
-
     //Test listing all snapshots.
     List<SnapshotInfo> snapshotInfos = omMetadataManager.listSnapshot(vol1,
         bucket1);
-    Assert.assertEquals(10, snapshotInfos.size());
+    assertEquals(10, snapshotInfos.size());
     for (SnapshotInfo snapshotInfo : snapshotInfos) {
-      Assert.assertTrue(snapshotInfo.getName().startsWith(snapshotName));
+      assertTrue(snapshotInfo.getName().startsWith(snapshotName));
     }
 
   }
+
+  @ParameterizedTest
+  @MethodSource("listSnapshotWithInvalidPathCases")
+  public void testListSnapshotWithInvalidPath(String volume,
+                                              String bucket,
+                                              ResultCodes expectedResultCode)
+      throws Exception {
+    String vol1 = "vol1";
+    String bucket1 = "bucket1";
+
+    OMRequestTestUtils.addVolumeToDB(vol1, omMetadataManager);
+    addBucketsToCache(vol1, bucket1);
+
+    OMException oe = assertThrows(OMException.class,
+        () -> omMetadataManager.listSnapshot(volume, bucket));
+    assertEquals(expectedResultCode, oe.getResult());
+  }
+
+  private static Stream<Arguments> listSnapshotWithInvalidPathCases() {
+    return Stream.of(
+        arguments(null, null, VOLUME_NOT_FOUND),
+        arguments("vol1", null, BUCKET_NOT_FOUND),
+        arguments("vol1", "nonexistentBucket", BUCKET_NOT_FOUND)
+    );
+  }
 }
\ No newline at end of file


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

Reply via email to