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

sshenoy 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 9af1d8df7a HDDS-9094. [Snapshot] Added data integrity integration test 
for SST filtering service (#5128)
9af1d8df7a is described below

commit 9af1d8df7a88e1e4b247b0be034a2ad699ee5b37
Author: Hemant Kumar <[email protected]>
AuthorDate: Mon Aug 7 02:39:51 2023 -0700

    HDDS-9094. [Snapshot] Added data integrity integration test for SST 
filtering service (#5128)
---
 .../hadoop/ozone/om/TestSstFilteringService.java   | 385 +++++++++++++--------
 1 file changed, 247 insertions(+), 138 deletions(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
index 19f6d031c8..64c3e36599 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
@@ -18,80 +18,81 @@
  */
 package org.apache.hadoop.ozone.om;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
-import org.apache.hadoop.hdds.server.ServerUtils;
-import org.apache.hadoop.hdds.utils.db.DBConfigFromFile;
 import org.apache.hadoop.hdds.utils.db.DBProfile;
 import org.apache.hadoop.hdds.utils.db.RDBStore;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.om.helpers.OpenKeySession;
 import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
 import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
+import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted;
+import org.apache.hadoop.ozone.om.snapshot.SnapshotCache;
 import 
org.apache.hadoop.security.authentication.client.AuthenticationException;
-import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ratis.util.ExitUtils;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.awaitility.core.ConditionTimeoutException;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.rocksdb.LiveFileMetaData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 
 import static 
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_CONTAINER_REPORT_INTERVAL;
 import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DB_PROFILE;
+import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_DIR;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_SST_FILTERING_SERVICE_INTERVAL;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.awaitility.Awaitility.with;
+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;
 
 /**
  * Test SST Filtering Service.
  */
 public class TestSstFilteringService {
-  @Rule
-  public TemporaryFolder folder = new TemporaryFolder();
+  @TempDir
+  private File folder;
   private OzoneManagerProtocol writeClient;
   private OzoneManager om;
-  private static final Logger LOG =
-      LoggerFactory.getLogger(TestSstFilteringService.class);
+  private OzoneConfiguration conf;
+  private KeyManager keyManager;
 
-  @BeforeClass
+  @BeforeAll
   public static void setup() {
     ExitUtils.disableSystemExit();
   }
 
-  private OzoneConfiguration createConfAndInitValues() throws IOException {
-    OzoneConfiguration conf = new OzoneConfiguration();
-    File newFolder = folder.newFolder();
-    if (!newFolder.exists()) {
-      Assert.assertTrue(newFolder.mkdirs());
-    }
-    System.setProperty(DBConfigFromFile.CONFIG_DIR, "/");
-    ServerUtils.setOzoneMetaDirPath(conf, newFolder.toString());
+  @BeforeEach
+  public void init() throws AuthenticationException, IOException {
+    conf = new OzoneConfiguration();
+    conf.set(OZONE_METADATA_DIRS, folder.getAbsolutePath());
     conf.setTimeDuration(HDDS_CONTAINER_REPORT_INTERVAL, 200,
         TimeUnit.MILLISECONDS);
     conf.setTimeDuration(OZONE_SNAPSHOT_SST_FILTERING_SERVICE_INTERVAL, 100,
@@ -99,11 +100,20 @@ public class TestSstFilteringService {
     conf.setEnum(HDDS_DB_PROFILE, DBProfile.TEST);
     conf.setQuietMode(false);
 
-    return conf;
+    OmTestManagers omTestManagers = new OmTestManagers(conf);
+    keyManager = omTestManagers.getKeyManager();
+    writeClient = omTestManagers.getWriteClient();
+    om = omTestManagers.getOzoneManager();
   }
 
-  @After
+  @AfterEach
   public void cleanup() throws Exception {
+    if (keyManager != null) {
+      keyManager.stop();
+    }
+    if (writeClient != null) {
+      writeClient.close();
+    }
     if (om != null) {
       om.stop();
     }
@@ -113,99 +123,91 @@ public class TestSstFilteringService {
    * Test checks whether for existing snapshots
    * the checkpoint should not have any sst files that do not correspond to
    * the bucket on which create snapshot command was issued.
-   *
+   * <p>
    * The SSTFiltering service deletes only the last level of
    * sst file (rocksdb behaviour).
-   *
+   * <p>
    * 1. Create Keys for vol1/buck1 (L0 ssts will be created for vol1/buck1)
    * 2. compact the db (new level SSTS will be created for vol1/buck1)
    * 3. Create keys for vol1/buck2 (L0 ssts will be created for vol1/buck2)
    * 4. Take snapshot on vol1/buck2.
    * 5. The snapshot will contain compacted sst files pertaining to vol1/buck1
-   *    Wait till the BG service deletes these.
+   * Wait till the BG service deletes these.
    *
    * @throws IOException - on Failure.
    */
-
   @Test
   public void testIrrelevantSstFileDeletion()
-      throws IOException, TimeoutException, InterruptedException,
-      AuthenticationException {
-    OzoneConfiguration conf = createConfAndInitValues();
-    OmTestManagers omTestManagers = new OmTestManagers(conf);
-    KeyManager keyManager = omTestManagers.getKeyManager();
-    writeClient = omTestManagers.getWriteClient();
-    om = omTestManagers.getOzoneManager();
-    RDBStore store = (RDBStore) om.getMetadataManager().getStore();
-
-    final int keyCount = 100;
-    createKeys(keyManager, "vol1", "buck1", keyCount / 2, 1);
-    SstFilteringService sstFilteringService =
+      throws IOException, InterruptedException {
+    RDBStore activeDbStore = (RDBStore) om.getMetadataManager().getStore();
+    SstFilteringService filteringService =
         keyManager.getSnapshotSstFilteringService();
-
     String rocksDbDir = om.getRocksDbDirectory();
 
-    store.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
+    final int keyCount = 100;
+    String volumeName = "vol1";
+    String bucketName1 = "buck1";
+    createVolumeAndBucket(volumeName, bucketName1);
+
+    createKeys(volumeName, bucketName1, keyCount / 2);
+    activeDbStore.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
 
-    createKeys(keyManager, "vol1", "buck1", keyCount / 2, 1);
-    store.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
+    createKeys(volumeName, bucketName1, keyCount / 2);
+    activeDbStore.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
 
     int level0FilesCount = 0;
     int totalFileCount = 0;
 
-    List<LiveFileMetaData> initialsstFileList = store.getDb().getSstFileList();
+    List<LiveFileMetaData> initialsstFileList =
+        activeDbStore.getDb().getSstFileList();
     for (LiveFileMetaData fileMetaData : initialsstFileList) {
       totalFileCount++;
       if (fileMetaData.level() == 0) {
         level0FilesCount++;
       }
     }
-    LOG.debug("Total files : {}", totalFileCount);
-    LOG.debug("Total L0 files: {}", level0FilesCount);
 
-    Assert.assertEquals(totalFileCount, level0FilesCount);
+    assertEquals(totalFileCount, level0FilesCount);
 
-    store.getDb().compactRange(OmMetadataManagerImpl.KEY_TABLE);
+    activeDbStore.getDb().compactRange(OmMetadataManagerImpl.KEY_TABLE);
 
-    int level0FilesCountAfterCompact = 0;
-    int totalFileCountAfterCompact = 0;
-    int nonlevel0FilesCountAfterCompact = 0;
-    List<LiveFileMetaData> nonlevelOFiles = new ArrayList<>();
+    int nonLevel0FilesCountAfterCompact = 0;
 
-    for (LiveFileMetaData fileMetaData : store.getDb().getSstFileList()) {
-      totalFileCountAfterCompact++;
-      if (fileMetaData.level() == 0) {
-        level0FilesCountAfterCompact++;
-      } else {
-        nonlevel0FilesCountAfterCompact++;
-        nonlevelOFiles.add(fileMetaData);
+    List<LiveFileMetaData> nonLevelOFiles = new ArrayList<>();
+    for (LiveFileMetaData fileMetaData : activeDbStore.getDb()
+        .getSstFileList()) {
+      if (fileMetaData.level() != 0) {
+        nonLevel0FilesCountAfterCompact++;
+        nonLevelOFiles.add(fileMetaData);
       }
     }
 
-    LOG.debug("Total files : {}", totalFileCountAfterCompact);
-    LOG.debug("Total L0 files: {}", level0FilesCountAfterCompact);
-    LOG.debug("Total non L0/compacted files: {}",
-        nonlevel0FilesCountAfterCompact);
-
-    Assert.assertTrue(nonlevel0FilesCountAfterCompact > 0);
+    assertTrue(nonLevel0FilesCountAfterCompact > 0);
 
-    createKeys(keyManager, "vol1", "buck2", keyCount, 1);
+    String bucketName2 = "buck2";
+    createVolumeAndBucket(volumeName, bucketName2);
+    createKeys(volumeName, bucketName2, keyCount);
 
-    store.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
+    activeDbStore.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
+    List<LiveFileMetaData> allFiles = activeDbStore.getDb().getSstFileList();
+    String snapshotName1 = "snapshot1";
+    writeClient.createSnapshot(volumeName, bucketName2, snapshotName1);
 
-    List<LiveFileMetaData> allFiles = store.getDb().getSstFileList();
+    with().atMost(Duration.ofSeconds(120))
+        .pollInterval(Duration.ofSeconds(1))
+        .await()
+        .until(() -> filteringService.getSnapshotFilteredCount().get() >= 1);
 
-    writeClient.createSnapshot("vol1", "buck2", "snapshot1");
+    assertEquals(1, filteringService.getSnapshotFilteredCount().get());
 
-    GenericTestUtils.waitFor(
-        () -> sstFilteringService.getSnapshotFilteredCount().get() >= 1, 1000,
-        10000);
-
-    Assert
-        .assertEquals(1, sstFilteringService.getSnapshotFilteredCount().get());
+    Set<String> keysFromActiveDb = getKeysFromDb(om.getMetadataManager(),
+        volumeName, bucketName2);
+    Set<String> keysFromSnapshot =
+        getKeysFromSnapshot(volumeName, bucketName2, snapshotName1);
+    assertEquals(keysFromActiveDb, keysFromSnapshot);
 
     SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable()
-        .get(SnapshotInfo.getTableKey("vol1", "buck2", "snapshot1"));
+        .get(SnapshotInfo.getTableKey(volumeName, bucketName2, snapshotName1));
 
     String dbSnapshots = rocksDbDir + OM_KEY_PREFIX + OM_SNAPSHOT_DIR;
     String snapshotDirName =
@@ -214,61 +216,61 @@ public class TestSstFilteringService {
     for (LiveFileMetaData file : allFiles) {
       File sstFile =
           new File(snapshotDirName + OM_KEY_PREFIX + file.fileName());
-      if (nonlevelOFiles.stream()
+      if (nonLevelOFiles.stream()
           .anyMatch(o -> file.fileName().equals(o.fileName()))) {
-        Assert.assertFalse(sstFile.exists());
+        assertFalse(sstFile.exists());
       } else {
-        Assert.assertTrue(sstFile.exists());
+        assertTrue(sstFile.exists());
       }
     }
 
     List<String> processedSnapshotIds = Files
         .readAllLines(Paths.get(dbSnapshots, OzoneConsts.FILTERED_SNAPSHOTS));
-    Assert.assertTrue(
+    assertTrue(
         
processedSnapshotIds.contains(snapshotInfo.getSnapshotId().toString()));
 
+    String snapshotName2 = "snapshot2";
     long count;
-    // Prevent the new snapshot from being filtered
     try (BootstrapStateHandler.Lock lock =
-             sstFilteringService.getBootstrapStateLock().lock()) {
-      count = sstFilteringService.getSnapshotFilteredCount().get();
-      writeClient.createSnapshot("vol1", "buck2", "snapshot2");
-
-      // Confirm that it is not filtered
-      assertThrows(TimeoutException.class, () -> GenericTestUtils.waitFor(
-          () -> sstFilteringService.getSnapshotFilteredCount().get() > count,
-          1000, 10000));
-      assertEquals(count, 
sstFilteringService.getSnapshotFilteredCount().get());
+             filteringService.getBootstrapStateLock().lock()) {
+      count = filteringService.getSnapshotFilteredCount().get();
+      writeClient.createSnapshot(volumeName, bucketName2, snapshotName2);
+
+      assertThrows(ConditionTimeoutException.class, () -> with()
+          .atMost(Duration.ofSeconds(10))
+          .pollInterval(Duration.ofSeconds(1))
+          .await()
+          .until(() ->
+              filteringService.getSnapshotFilteredCount().get() > count));
+
+      assertEquals(count, filteringService.getSnapshotFilteredCount().get());
     }
-    // Now allow filtering
-    GenericTestUtils.waitFor(
-        () -> sstFilteringService.getSnapshotFilteredCount().get() > count,
-        1000, 10000);
+
+    with().atMost(Duration.ofSeconds(10))
+        .pollInterval(Duration.ofSeconds(1))
+        .await()
+        .until(() -> filteringService.getSnapshotFilteredCount().get() > 
count);
+
+    Set<String> keysFromActiveDb2 = getKeysFromDb(om.getMetadataManager(),
+        volumeName, bucketName2);
+    Set<String> keysFromSnapshot2 =
+        getKeysFromSnapshot(volumeName, bucketName2, snapshotName2);
+    assertEquals(keysFromActiveDb2, keysFromSnapshot2);
   }
 
-  @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT")
-  private void createKeys(KeyManager keyManager, String volumeName,
-      String bucketName, int keyCount, int numBlocks) throws IOException {
+  private void createKeys(String volumeName,
+                          String bucketName,
+                          int keyCount)
+      throws IOException {
     for (int x = 0; x < keyCount; x++) {
-      String keyName =
-          String.format("key%s", RandomStringUtils.randomAlphanumeric(5));
-      // Create Volume and Bucket
-      createVolumeAndBucket(keyManager, volumeName, bucketName, false);
-
-      // Create the key
-      createAndCommitKey(writeClient, keyManager, volumeName, bucketName,
-              keyName, numBlocks);
+      String keyName = "key-" + RandomStringUtils.randomAlphanumeric(5);
+      createKey(writeClient, volumeName, bucketName, keyName);
     }
   }
 
-  private static void createVolumeAndBucket(KeyManager keyManager,
-                                            String volumeName,
-                                            String bucketName,
-                                            boolean isVersioningEnabled)
+  private void createVolumeAndBucket(String volumeName,
+                                     String bucketName)
       throws IOException {
-    // cheat here, just create a volume and bucket entry so that we can
-    // create the keys, we put the same data for key and value since the
-    // system does not decode the object
     OMRequestTestUtils.addVolumeToOM(keyManager.getMetadataManager(),
         OmVolumeArgs.newBuilder()
             .setOwnerName("o")
@@ -279,16 +281,14 @@ public class TestSstFilteringService {
     OMRequestTestUtils.addBucketToOM(keyManager.getMetadataManager(),
         OmBucketInfo.newBuilder().setVolumeName(volumeName)
             .setBucketName(bucketName)
-            .setIsVersionEnabled(isVersioningEnabled)
+            .setIsVersionEnabled(false)
             .build());
   }
 
-  private static OmKeyArgs createAndCommitKey(OzoneManagerProtocol writeClient,
-                                              KeyManager keyManager,
-                                              String volumeName,
-                                              String bucketName,
-                                              String keyName,
-                                              int numBlocks)
+  private void createKey(OzoneManagerProtocol managerProtocol,
+                         String volumeName,
+                         String bucketName,
+                         String keyName)
       throws IOException {
 
     OmKeyArgs keyArg =
@@ -302,36 +302,145 @@ public class TestSstFilteringService {
             .setLocationInfoList(new ArrayList<>())
             .build();
     //Open and Commit the Key in the Key Manager.
-    OpenKeySession session = writeClient.openKey(keyArg);
-    for (int i = 0; i < numBlocks; i++) {
-      keyArg.addLocationInfo(writeClient.allocateBlock(keyArg, session.getId(),
-          new ExcludeList()));
-    }
-    writeClient.commitKey(keyArg, session.getId());
-    return keyArg;
+    OpenKeySession session = managerProtocol.openKey(keyArg);
+    keyArg.addLocationInfo(managerProtocol.allocateBlock(keyArg,
+        session.getId(), new ExcludeList()));
+    managerProtocol.commitKey(keyArg, session.getId());
   }
 
   @Test
   public void testFilterFunction() {
-    Assert.assertTrue(SstFilteringService.FILTER_FUNCTION.apply(
+    assertTrue(SstFilteringService.FILTER_FUNCTION.apply(
         "/vol1/bucket1/key1",
         "/vol1/bucket1/key1",
         "/vol1/bucket1/"));
-    Assert.assertTrue(SstFilteringService.FILTER_FUNCTION.apply(
+    assertTrue(SstFilteringService.FILTER_FUNCTION.apply(
         "/vol1/bucket1/key1",
         "/vol1/bucket5/key1",
         "/vol1/bucket3/"));
-    Assert.assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
+    assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
         "/vol1/bucket1/key1",
         "/vol1/bucket4/key9",
         "/vol1/bucket5/"));
-    Assert.assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
+    assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
         "/vol1/bucket1/key1",
         "/vol1/bucket1/key1",
         "/vol1/bucket2/"));
-    Assert.assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
+    assertFalse(SstFilteringService.FILTER_FUNCTION.apply(
         "/vol1/bucket1/key1",
         "/vol1/bucket1/key1",
         "/vol1/bucket/"));
   }
+
+  /**
+   * Test to verify the data integrity after SST filtering service runs.
+   * This test creates 150 keys randomly in one of the three buckets. It also
+   * forces flush and compaction after every 50 keys written.
+   * Once key creation finishes, we create one snapshot per bucket. After that,
+   * it waits for SSTFilteringService to run for all three snapshots. Once run
+   * finishes, it validates that keys in active DB buckets are same as in
+   * snapshot bucket.
+   */
+  @Test
+  public void testSstFilteringService() throws IOException {
+    RDBStore activeDbStore = (RDBStore) om.getMetadataManager().getStore();
+    String volumeName = "volume";
+    List<String> bucketNames = Arrays.asList("bucket", "bucket1", "bucket2");
+
+    for (String bucketName : bucketNames) {
+      createVolumeAndBucket(volumeName, bucketName);
+    }
+
+    int keyCount = 150;
+    Set<String> keyInBucket = new HashSet<>();
+    Set<String> keyInBucket1 = new HashSet<>();
+    Set<String> keyInBucket2 = new HashSet<>();
+
+    Random random = new Random();
+    for (int i = 0; i < keyCount; i++) {
+      String keyName = "key-" + i;
+      String bucketName;
+      switch (random.nextInt(1000) % 3) {
+      case 0:
+        bucketName = bucketNames.get(0);
+        keyInBucket.add(keyName);
+        break;
+      case 1:
+        bucketName = bucketNames.get(1);
+        keyInBucket1.add(keyName);
+        break;
+      default:
+        bucketName = bucketNames.get(2);
+        keyInBucket2.add(keyName);
+      }
+      createKey(writeClient, volumeName, bucketName, keyName);
+      if (i % 50 == 0) {
+        activeDbStore.getDb().flush(OmMetadataManagerImpl.KEY_TABLE);
+        activeDbStore.getDb().compactRange(OmMetadataManagerImpl.KEY_TABLE);
+      }
+    }
+
+    List<String> snapshotNames = Arrays.asList("snap", "snap-1", "snap-2");
+
+    for (int i = 0; i < 3; i++) {
+      writeClient.createSnapshot(volumeName, bucketNames.get(i),
+          snapshotNames.get(i));
+    }
+
+    SstFilteringService sstFilteringService =
+        keyManager.getSnapshotSstFilteringService();
+
+    with().atMost(Duration.ofSeconds(10))
+        .pollInterval(Duration.ofSeconds(1))
+        .await()
+        .until(() -> sstFilteringService.getSnapshotFilteredCount().get() >= 
3);
+    assertEquals(3, sstFilteringService.getSnapshotFilteredCount().get());
+
+    Set<String> keyInBucketAfterFilteringRun =
+        getKeysFromSnapshot(volumeName, bucketNames.get(0),
+            snapshotNames.get(0));
+    Set<String> keyInBucket1AfterFilteringRun =
+        getKeysFromSnapshot(volumeName, bucketNames.get(1),
+            snapshotNames.get(1));
+    Set<String> keyInBucket2AfterFilteringRun =
+        getKeysFromSnapshot(volumeName, bucketNames.get(2),
+            snapshotNames.get(2));
+    assertEquals(keyInBucket, keyInBucketAfterFilteringRun);
+    assertEquals(keyInBucket1, keyInBucket1AfterFilteringRun);
+    assertEquals(keyInBucket2, keyInBucket2AfterFilteringRun);
+  }
+
+  private Set<String> getKeysFromDb(OMMetadataManager omMetadataReader,
+                                    String volume,
+                                    String bucket) throws IOException {
+    Set<String> allKeys = new HashSet<>();
+
+    String startKey = null;
+    while (true) {
+      List<OmKeyInfo> omKeyInfoList = omMetadataReader.listKeys(volume, bucket,
+          startKey, null, 1000);
+      if (omKeyInfoList.isEmpty()) {
+        break;
+      }
+      for (OmKeyInfo omKeyInfo : omKeyInfoList) {
+        allKeys.add(omKeyInfo.getKeyName());
+      }
+      startKey = omKeyInfoList.get(omKeyInfoList.size() - 1).getKeyName();
+    }
+    return allKeys;
+  }
+
+  private Set<String> getKeysFromSnapshot(String volume,
+                                          String bucket,
+                                          String snapshot) throws IOException {
+    SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable()
+        .get(SnapshotInfo.getTableKey(volume, bucket, snapshot));
+    try (ReferenceCounted<IOmMetadataReader, SnapshotCache>
+             snapshotMetadataReader = om.getOmSnapshotManager()
+        .getSnapshotCache()
+        .get(snapshotInfo.getTableKey())) {
+      OmSnapshot omSnapshot = (OmSnapshot) snapshotMetadataReader.get();
+      return getKeysFromDb(omSnapshot.getMetadataManager(), volume, bucket);
+    }
+  }
 }


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

Reply via email to