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

prashantpogde 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 7a19afa714 HDDS-8938. [Snapshot] SstFilteringService should use 
SnapshotCache (#5008)
7a19afa714 is described below

commit 7a19afa71401e356cd86a99648e94278ea2850c8
Author: Swaminathan Balachandran <[email protected]>
AuthorDate: Sat Jul 15 20:47:48 2023 -0700

    HDDS-8938. [Snapshot] SstFilteringService should use SnapshotCache (#5008)
---
 .../org/apache/hadoop/hdds/utils/db/RDBStore.java  |  2 -
 .../apache/hadoop/hdds/utils/db/RocksDatabase.java |  8 ++-
 .../org/apache/ozone/rocksdb/util/RdbUtil.java     | 40 ++++++------
 .../apache/ozone/rocksdiff/DifferSnapshotInfo.java | 11 +++-
 .../ozone/rocksdiff/RocksDBCheckpointDiffer.java   | 71 ++++++----------------
 .../rocksdiff/TestRocksDBCheckpointDiffer.java     | 59 +++++++++++++++---
 .../hadoop/ozone/freon/TestOMSnapshotDAG.java      | 67 +++++++++++++++++---
 .../hadoop/ozone/om/TestOMRatisSnapshots.java      |  6 +-
 .../hadoop/ozone/om/SstFilteringService.java       | 33 ++++++----
 .../ozone/om/snapshot/SnapshotDiffManager.java     | 22 +++----
 .../ozone/om/snapshot/TestSnapshotDiffManager.java | 15 +++--
 11 files changed, 204 insertions(+), 130 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java
index f27ab5e430..5536cdddd2 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java
@@ -41,7 +41,6 @@ import 
org.apache.hadoop.hdds.utils.db.managed.ManagedTransactionLogIterator;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedWriteOptions;
 import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import 
org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer.RocksDBCheckpointDifferHolder;
 import org.rocksdb.RocksDBException;
@@ -442,7 +441,6 @@ public class RDBStore implements DBStore {
     return db.isClosed();
   }
 
-  @VisibleForTesting
   public RocksDatabase getDb() {
     return db;
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDatabase.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDatabase.java
index eb724d764b..8ff4317b05 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDatabase.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDatabase.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.hdds.utils.db;
 
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hadoop.hdds.StringUtils;
 import org.apache.hadoop.hdds.utils.BooleanTriFunction;
 import org.apache.hadoop.hdds.utils.HddsServerUtil;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedCheckpoint;
@@ -984,7 +985,8 @@ public final class RocksDatabase implements Closeable {
         if (!isKeyWithPrefixPresent) {
           LOG.info("Deleting sst file {} corresponding to column family"
                   + " {} from db: {}", liveFileMetaData.fileName(),
-              liveFileMetaData.columnFamilyName(), db.get().getName());
+              StringUtils.bytes2String(liveFileMetaData.columnFamilyName()),
+              db.get().getName());
           db.deleteFile(liveFileMetaData);
         }
       }
@@ -1008,4 +1010,8 @@ public final class RocksDatabase implements Closeable {
     }
     super.finalize();
   }
+
+  public ManagedRocksDB getManagedRocksDb() {
+    return db;
+  }
 }
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java
index ac17856cd8..4e7efc75fe 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java
@@ -18,15 +18,12 @@
 
 package org.apache.ozone.rocksdb.util;
 
-import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
+import com.google.common.collect.Sets;
+import org.apache.hadoop.hdds.StringUtils;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
-import org.rocksdb.ColumnFamilyDescriptor;
-import org.rocksdb.ColumnFamilyHandle;
-import org.rocksdb.RocksDBException;
+import org.rocksdb.LiveFileMetaData;
 
 import java.io.File;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -40,22 +37,19 @@ public final class RdbUtil {
 
   private RdbUtil() { }
 
-  public static Set<String> getSSTFilesForComparison(final String dbLocation,
-      List<String> cfs) throws RocksDBException {
-    final List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();
-    final List<ColumnFamilyDescriptor> cfd = new ArrayList<>();
-    for (String columnFamily : cfs) {
-      cfd.add(new ColumnFamilyDescriptor(
-          columnFamily.getBytes(StandardCharsets.UTF_8)));
-    }
-    cfd.add(
-        new 
ColumnFamilyDescriptor("default".getBytes(StandardCharsets.UTF_8)));
-    try (ManagedDBOptions options = new ManagedDBOptions();
-         ManagedRocksDB rocksDB = ManagedRocksDB.openReadOnly(options,
-             dbLocation, cfd, columnFamilyHandles)) {
-      return rocksDB.get().getLiveFilesMetaData().stream()
-          .map(lfm -> new File(lfm.path(), lfm.fileName()).getPath())
-          .collect(Collectors.toCollection(HashSet::new));
-    }
+  public static List<LiveFileMetaData> getLiveSSTFilesForCFs(
+      final ManagedRocksDB rocksDB, List<String> cfs) {
+    final Set<String> cfSet = Sets.newHashSet(cfs);
+    return rocksDB.get().getLiveFilesMetaData().stream()
+        .filter(lfm -> cfSet.contains(
+            StringUtils.bytes2String(lfm.columnFamilyName())))
+        .collect(Collectors.toList());
+  }
+
+  public static Set<String> getSSTFilesForComparison(
+      final ManagedRocksDB rocksDB, List<String> cfs) {
+    return getLiveSSTFilesForCFs(rocksDB, cfs).stream()
+        .map(lfm -> new File(lfm.path(), lfm.fileName()).getPath())
+        .collect(Collectors.toCollection(HashSet::new));
   }
 }
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
index a9f2f23bc8..4781df63b6 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
@@ -17,6 +17,8 @@
  */
 package org.apache.ozone.rocksdiff;
 
+import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
+
 import java.util.Map;
 import java.util.UUID;
 
@@ -30,12 +32,16 @@ public class DifferSnapshotInfo {
 
   private final Map<String, String> tablePrefixes;
 
+  private final ManagedRocksDB rocksDB;
+
   public DifferSnapshotInfo(String db, UUID id, long gen,
-                            Map<String, String> prefixes) {
+                            Map<String, String> prefixes,
+                            ManagedRocksDB rocksDB) {
     dbPath = db;
     snapshotId = id;
     snapshotGeneration = gen;
     tablePrefixes = prefixes;
+    this.rocksDB = rocksDB;
   }
 
   public String getDbPath() {
@@ -61,4 +67,7 @@ public class DifferSnapshotInfo {
         dbPath, snapshotId, snapshotGeneration, tablePrefixes.size());
   }
 
+  public ManagedRocksDB getRocksDB() {
+    return rocksDB;
+  }
 }
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
index 653556c4eb..3388d86cba 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
@@ -22,6 +22,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.graph.GraphBuilder;
 import com.google.common.graph.MutableGraph;
 import java.io.FileNotFoundException;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.Executors;
@@ -34,12 +35,10 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksIterator;
-import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
+import org.apache.ozone.rocksdb.util.RdbUtil;
 import org.rocksdb.AbstractEventListener;
-import org.rocksdb.ColumnFamilyDescriptor;
 import org.rocksdb.ColumnFamilyHandle;
-import org.rocksdb.ColumnFamilyOptions;
 import org.rocksdb.CompactionJobInfo;
 import org.rocksdb.DBOptions;
 import org.rocksdb.LiveFileMetaData;
@@ -700,59 +699,28 @@ public class RocksDBCheckpointDiffer implements 
AutoCloseable,
         filename.length() - SST_FILE_EXTENSION_LENGTH);
   }
 
-  /**
-   * Get a list of relevant column family descriptors.
-   * @param cfOpts ColumnFamilyOptions
-   * @return List of ColumnFamilyDescriptor
-   */
-  @VisibleForTesting
-  static List<ColumnFamilyDescriptor> getCFDescriptorList(
-      ColumnFamilyOptions cfOpts) {
-    return asList(
-        new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, cfOpts),
-        new ColumnFamilyDescriptor("keyTable".getBytes(UTF_8), cfOpts),
-        new ColumnFamilyDescriptor("directoryTable".getBytes(UTF_8), cfOpts),
-        new ColumnFamilyDescriptor("fileTable".getBytes(UTF_8), cfOpts)
-    );
-  }
-
   /**
    * Read the current Live manifest for a given RocksDB instance (Active or
    * Checkpoint).
-   * @param dbPathArg path to a RocksDB directory
+   * @param rocksDB open rocksDB instance.
    * @return a list of SST files (without extension) in the DB.
    */
-  public HashSet<String> readRocksDBLiveFiles(String dbPathArg) {
-    ManagedRocksDB rocksDB = null;
+  public HashSet<String> readRocksDBLiveFiles(ManagedRocksDB rocksDB) {
     HashSet<String> liveFiles = new HashSet<>();
 
-    final ColumnFamilyOptions cfOpts = new ColumnFamilyOptions();
-    final List<ColumnFamilyDescriptor> cfDescriptors =
-        getCFDescriptorList(cfOpts);
-    final List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();
-
-    try (ManagedDBOptions managedDBOptions = new ManagedDBOptions()) {
-      managedDBOptions.setParanoidChecks(true);
-      rocksDB = ManagedRocksDB.openReadOnly(managedDBOptions, dbPathArg,
-          cfDescriptors, columnFamilyHandles);
-      // Note it retrieves only the selected column families by the descriptor
-      // i.e. keyTable, directoryTable, fileTable
-      List<LiveFileMetaData> liveFileMetaDataList =
-          rocksDB.get().getLiveFilesMetaData();
-      LOG.debug("SST File Metadata for DB: " + dbPathArg);
-      for (LiveFileMetaData m : liveFileMetaDataList) {
-        LOG.debug("File: {}, Level: {}", m.fileName(), m.level());
-        final String trimmedFilename = trimSSTFilename(m.fileName());
-        liveFiles.add(trimmedFilename);
-      }
-    } catch (RocksDBException e) {
-      LOG.error("Error during RocksDB operation: {}", e.getMessage());
-      e.printStackTrace();
-    } finally {
-      if (rocksDB != null) {
-        rocksDB.close();
-      }
-      cfOpts.close();
+    final List<String> cfs = Arrays.asList(
+        org.apache.hadoop.hdds.StringUtils.bytes2String(
+            RocksDB.DEFAULT_COLUMN_FAMILY), "keyTable", "directoryTable",
+        "fileTable");
+    // Note it retrieves only the selected column families by the descriptor
+    // i.e. keyTable, directoryTable, fileTable
+    List<LiveFileMetaData> liveFileMetaDataList =
+        RdbUtil.getLiveSSTFilesForCFs(rocksDB, cfs);
+    LOG.debug("SST File Metadata for DB: " + rocksDB.get().getName());
+    for (LiveFileMetaData m : liveFileMetaDataList) {
+      LOG.debug("File: {}, Level: {}", m.fileName(), m.level());
+      final String trimmedFilename = trimSSTFilename(m.fileName());
+      liveFiles.add(trimmedFilename);
     }
     return liveFiles;
   }
@@ -925,9 +893,8 @@ public class RocksDBCheckpointDiffer implements 
AutoCloseable,
 
     // TODO: Reject or swap if dest is taken after src, once snapshot chain
     //  integration is done.
-
-    HashSet<String> srcSnapFiles = readRocksDBLiveFiles(src.getDbPath());
-    HashSet<String> destSnapFiles = readRocksDBLiveFiles(dest.getDbPath());
+    HashSet<String> srcSnapFiles = readRocksDBLiveFiles(src.getRocksDB());
+    HashSet<String> destSnapFiles = readRocksDBLiveFiles(dest.getRocksDB());
 
     HashSet<String> fwdDAGSameFiles = new HashSet<>();
     HashSet<String> fwdDAGDifferentFiles = new HashSet<>();
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
index 100aef0a8d..d7022dde89 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
@@ -20,6 +20,7 @@ package org.apache.ozone.rocksdiff;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Arrays.asList;
 import static java.util.concurrent.TimeUnit.MINUTES;
+
 import com.google.common.graph.GraphBuilder;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -48,7 +49,9 @@ import java.util.stream.Stream;
 
 import com.google.common.graph.MutableGraph;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.hadoop.hdds.StringUtils;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
+import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
 import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
 import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer.NodeComparator;
 import org.apache.ozone.test.GenericTestUtils;
@@ -106,6 +109,8 @@ public class TestRocksDBCheckpointDiffer {
   private static final String CP_PATH_PREFIX = "rocksdb-cp-";
   private final List<DifferSnapshotInfo> snapshots = new ArrayList<>();
 
+  private final List<List<ColumnFamilyHandle>> colHandles = new ArrayList<>();
+
   private final String activeDbDirName = "./rocksdb-data";
   private final String metadataDirName = "./metadata";
   private final String compactionLogDirName = "compaction-log";
@@ -175,13 +180,13 @@ public class TestRocksDBCheckpointDiffer {
   private static Stream<Arguments> casesGetSSTDiffListWithoutDB() {
 
     DifferSnapshotInfo snapshotInfo1 = new DifferSnapshotInfo(
-        "/path/to/dbcp1", UUID.randomUUID(), 3008L, null);
+        "/path/to/dbcp1", UUID.randomUUID(), 3008L, null, null);
     DifferSnapshotInfo snapshotInfo2 = new DifferSnapshotInfo(
-        "/path/to/dbcp2", UUID.randomUUID(), 14980L, null);
+        "/path/to/dbcp2", UUID.randomUUID(), 14980L, null, null);
     DifferSnapshotInfo snapshotInfo3 = new DifferSnapshotInfo(
-        "/path/to/dbcp3", UUID.randomUUID(), 17975L, null);
+        "/path/to/dbcp3", UUID.randomUUID(), 17975L, null, null);
     DifferSnapshotInfo snapshotInfo4 = new DifferSnapshotInfo(
-        "/path/to/dbcp4", UUID.randomUUID(), 18000L, null);
+        "/path/to/dbcp4", UUID.randomUUID(), 18000L, null, null);
 
     Set<String> snapshotSstFiles1 = new HashSet<>(asList(
         "000059", "000053"));
@@ -349,7 +354,6 @@ public class TestRocksDBCheckpointDiffer {
             compactionLogDirName,
             activeDbDirName,
             config);
-
     RocksDB rocksDB =
         createRocksDBInstanceAndWriteKeys(activeDbDirName, differ);
     readRocksDBInstance(activeDbDirName, rocksDB, null, differ);
@@ -378,6 +382,24 @@ public class TestRocksDBCheckpointDiffer {
     }
 
     rocksDB.close();
+    cleanUp();
+  }
+
+  public void cleanup() {
+    for (DifferSnapshotInfo snap : snapshots) {
+      snap.getRocksDB().close();
+    }
+    for (List<ColumnFamilyHandle> colHandle : colHandles) {
+      for (ColumnFamilyHandle handle : colHandle) {
+        handle.close();
+      }
+    }
+  }
+
+  private static List<ColumnFamilyDescriptor> getColumnFamilyDescriptors() {
+    return Stream.of("fileTable", "directoryTable", "keyTable", "default")
+        .map(StringUtils::string2Bytes)
+        .map(ColumnFamilyDescriptor::new).collect(Collectors.toList());
   }
 
   /**
@@ -404,7 +426,7 @@ public class TestRocksDBCheckpointDiffer {
     for (DifferSnapshotInfo snap : snapshots) {
       // Returns a list of SST files to be fed into RocksDiff
       List<String> sstDiffList = differ.getSSTDiffList(src, snap);
-      LOG.debug("SST diff list from '{}' to '{}': {}",
+      LOG.info("SST diff list from '{}' to '{}': {}",
           src.getDbPath(), snap.getDbPath(), sstDiffList);
 
       Assertions.assertEquals(expectedDifferResult.get(index), sstDiffList);
@@ -416,7 +438,7 @@ public class TestRocksDBCheckpointDiffer {
    * Helper function that creates an RDB checkpoint (= Ozone snapshot).
    */
   private void createCheckpoint(RocksDBCheckpointDiffer differ,
-      RocksDB rocksDB) {
+      RocksDB rocksDB) throws RocksDBException {
 
     LOG.trace("Current time: " + System.currentTimeMillis());
     long t1 = System.currentTimeMillis();
@@ -434,8 +456,12 @@ public class TestRocksDBCheckpointDiffer {
 
     createCheckPoint(activeDbDirName, cpPath, rocksDB);
     final UUID snapshotId = UUID.randomUUID();
+    List<ColumnFamilyHandle> colHandle = new ArrayList<>();
+    colHandles.add(colHandle);
     final DifferSnapshotInfo currentSnapshot =
-        new DifferSnapshotInfo(cpPath, snapshotId, snapshotGeneration, null);
+        new DifferSnapshotInfo(cpPath, snapshotId, snapshotGeneration, null,
+            ManagedRocksDB.openReadOnly(cpPath, getColumnFamilyDescriptors(),
+                colHandle));
     this.snapshots.add(currentSnapshot);
 
     // Same as what OmSnapshotManager#createOmSnapshotCheckpoint would do
@@ -469,6 +495,21 @@ public class TestRocksDBCheckpointDiffer {
     }
   }
 
+  /**
+   * Get a list of relevant column family descriptors.
+   * @param cfOpts ColumnFamilyOptions
+   * @return List of ColumnFamilyDescriptor
+   */
+  static List<ColumnFamilyDescriptor> getCFDescriptorList(
+      ColumnFamilyOptions cfOpts) {
+    return asList(
+        new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, cfOpts),
+        new ColumnFamilyDescriptor("keyTable".getBytes(UTF_8), cfOpts),
+        new ColumnFamilyDescriptor("directoryTable".getBytes(UTF_8), cfOpts),
+        new ColumnFamilyDescriptor("fileTable".getBytes(UTF_8), cfOpts)
+    );
+  }
+
   // Test Code to create sample RocksDB instance.
   private RocksDB createRocksDBInstanceAndWriteKeys(String dbPathArg,
       RocksDBCheckpointDiffer differ) throws RocksDBException {
@@ -484,7 +525,7 @@ public class TestRocksDBCheckpointDiffer {
     final ColumnFamilyOptions cfOpts = new ColumnFamilyOptions()
         .optimizeUniversalStyleCompaction();
     final List<ColumnFamilyDescriptor> cfDescriptors =
-        RocksDBCheckpointDiffer.getCFDescriptorList(cfOpts);
+        getCFDescriptorList(cfOpts);
     List<ColumnFamilyHandle> cfHandles = new ArrayList<>();
 
     // Create a RocksDB instance with compaction tracking
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
index 7ed6eace55..d21fdb3958 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
@@ -22,20 +22,25 @@ import 
org.apache.hadoop.hdds.conf.DatanodeRatisServerConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.ratis.conf.RatisClientConfig;
 import org.apache.hadoop.hdds.utils.db.RDBStore;
+import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.om.IOmMetadataReader;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
+import org.apache.hadoop.ozone.om.OmSnapshot;
 import org.apache.hadoop.ozone.om.OmSnapshotManager;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
+import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted;
+import org.apache.hadoop.ozone.om.snapshot.SnapshotCache;
 import org.apache.ozone.rocksdiff.DifferSnapshotInfo;
 import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer;
 import org.apache.ozone.test.GenericTestUtils;
@@ -141,7 +146,7 @@ public class TestOMSnapshotDAG {
 
   private DifferSnapshotInfo getDifferSnapshotInfo(
       OMMetadataManager omMetadataManager, String volumeName, String 
bucketName,
-      String snapshotName) throws IOException {
+      String snapshotName, ManagedRocksDB snapshotDB) throws IOException {
 
     final String dbKey = getSnapshotDBKey(volumeName, bucketName, 
snapshotName);
     final SnapshotInfo snapshotInfo =
@@ -152,7 +157,8 @@ public class TestOMSnapshotDAG {
     // persisted at the time of snapshot creation, as the snapshot generation
     return new DifferSnapshotInfo(checkpointPath, snapshotInfo.getSnapshotId(),
         snapshotInfo.getDbTxSequenceNumber(),
-        getTablePrefixes(omMetadataManager, volumeName, bucketName));
+        getTablePrefixes(omMetadataManager, volumeName, bucketName),
+        snapshotDB);
   }
 
   private Map<String, String> getTablePrefixes(
@@ -224,13 +230,23 @@ public class TestOMSnapshotDAG {
     OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager();
     RDBStore rdbStore = (RDBStore) omMetadataManager.getStore();
     RocksDBCheckpointDiffer differ = rdbStore.getRocksDBCheckpointDiffer();
-
+    ReferenceCounted<IOmMetadataReader, SnapshotCache>
+        snapDB1 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap1"));
+    ReferenceCounted<IOmMetadataReader, SnapshotCache>
+        snapDB2 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap2"));
     DifferSnapshotInfo snap1 = getDifferSnapshotInfo(omMetadataManager,
-        volumeName, bucketName, "snap1");
+        volumeName, bucketName, "snap1",
+        ((RDBStore)((OmSnapshot)snapDB1.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
     DifferSnapshotInfo snap2 = getDifferSnapshotInfo(omMetadataManager,
-        volumeName, bucketName, "snap2");
+        volumeName, bucketName, "snap2", ((RDBStore)((OmSnapshot)snapDB2.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
 
-    // RocksDB does checkpointing in a separate thread, wait for it
+      // RocksDB does checkpointing in a separate thread, wait for it
     final File checkpointSnap1 = new File(snap1.getDbPath());
     GenericTestUtils.waitFor(checkpointSnap1::exists, 2000, 20000);
     final File checkpointSnap2 = new File(snap2.getDbPath());
@@ -246,9 +262,14 @@ public class TestOMSnapshotDAG {
 
     resp = store.createSnapshot(volumeName, bucketName, "snap3");
     LOG.debug("Snapshot created: {}", resp);
-
+    ReferenceCounted<IOmMetadataReader, SnapshotCache>
+        snapDB3 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap3"));
     DifferSnapshotInfo snap3 = getDifferSnapshotInfo(omMetadataManager,
-        volumeName, bucketName, "snap3");
+        volumeName, bucketName, "snap3",
+        ((RDBStore)((OmSnapshot)snapDB3.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
     final File checkpointSnap3 = new File(snap3.getDbPath());
     GenericTestUtils.waitFor(checkpointSnap3::exists, 2000, 20000);
 
@@ -260,10 +281,33 @@ public class TestOMSnapshotDAG {
     // Same snapshot. Result should be empty list
     List<String> sstDiffList22 = differ.getSSTDiffList(snap2, snap2);
     Assertions.assertTrue(sstDiffList22.isEmpty());
-
+    snapDB1.close();
+    snapDB2.close();
+    snapDB3.close();
     // Test DAG reconstruction by restarting OM. Then do the same diffs again
     cluster.restartOzoneManager();
-
+    ozoneManager = cluster.getOzoneManager();
+    omMetadataManager = ozoneManager.getMetadataManager();
+    snapDB1 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap1"));
+    snapDB2 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap2"));
+    snap1 = getDifferSnapshotInfo(omMetadataManager,
+        volumeName, bucketName, "snap1",
+        ((RDBStore)((OmSnapshot)snapDB1.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
+    snap2 = getDifferSnapshotInfo(omMetadataManager,
+        volumeName, bucketName, "snap2", ((RDBStore)((OmSnapshot)snapDB2.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
+    snapDB3 = ozoneManager.getOmSnapshotManager()
+        .getSnapshotCache().get(
+            SnapshotInfo.getTableKey(volumeName, bucketName, "snap3"));
+    snap3 = getDifferSnapshotInfo(omMetadataManager,
+        volumeName, bucketName, "snap3",
+        ((RDBStore)((OmSnapshot)snapDB3.get())
+            .getMetadataManager().getStore()).getDb().getManagedRocksDb());
     List<String> sstDiffList21Run2 = differ.getSSTDiffList(snap2, snap1);
     Assertions.assertEquals(sstDiffList21, sstDiffList21Run2);
 
@@ -272,6 +316,9 @@ public class TestOMSnapshotDAG {
 
     List<String> sstDiffList31Run2 = differ.getSSTDiffList(snap3, snap1);
     Assertions.assertEquals(sstDiffList31, sstDiffList31Run2);
+    snapDB1.close();
+    snapDB2.close();
+    snapDB3.close();
   }
 
   @Test
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
index 6d9cc199b5..2fe3365093 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
@@ -90,6 +90,7 @@ import java.util.stream.Stream;
 
 import static org.apache.hadoop.ozone.OzoneConsts.OM_DB_NAME;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_RATIS_SNAPSHOT_MAX_TOTAL_SST_SIZE_KEY;
+import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_SST_FILTERING_SERVICE_INTERVAL;
 import static org.apache.hadoop.ozone.om.OmSnapshotManager.OM_HARDLINK_FILE;
 import static org.apache.hadoop.ozone.om.OmSnapshotManager.getSnapshotPath;
 import static org.apache.hadoop.ozone.om.TestOzoneManagerHAWithData.createKey;
@@ -401,7 +402,9 @@ public class TestOMRatisSnapshots {
         80);
 
     SnapshotInfo snapshotInfo2 = createOzoneSnapshot(leaderOM, "snap80");
-
+    followerOM.getConfiguration().setInt(
+        OZONE_SNAPSHOT_SST_FILTERING_SERVICE_INTERVAL,
+        KeyManagerImpl.DISABLE_VALUE);
     // Start the inactive OM. Checkpoint installation will happen 
spontaneously.
     cluster.startInactiveOM(followerNodeId);
 
@@ -436,7 +439,6 @@ public class TestOMRatisSnapshots {
     }, 1000, 30000);
 
     assertEquals(3, followerOM.getOmSnapshotProvider().getNumDownloaded());
-
     // Verify that the follower OM's DB contains the transactions which were
     // made while it was inactive.
     OMMetadataManager followerOMMetaMngr = followerOM.getMetadataManager();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
index 419db2f645..36d436e9f7 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
@@ -32,6 +32,8 @@ import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TableIterator;
 import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
 import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
+import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted;
+import org.apache.hadoop.ozone.om.snapshot.SnapshotCache;
 import org.apache.ozone.rocksdiff.RocksDiffUtils;
 import org.rocksdb.RocksDBException;
 import org.slf4j.Logger;
@@ -53,9 +55,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
 import static org.apache.hadoop.ozone.OzoneConsts.FILTERED_SNAPSHOTS;
-import static org.apache.hadoop.ozone.OzoneConsts.OM_DB_NAME;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
-import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_CHECKPOINT_DIR;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_DIR;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK_DEFAULT;
@@ -123,8 +123,16 @@ public class SstFilteringService extends BackgroundService
     @Override
     public BackgroundTaskResult call() throws Exception {
 
+      Optional<SnapshotCache> snapshotCache = Optional.ofNullable(ozoneManager)
+          .map(OzoneManager::getOmSnapshotManager)
+          .map(OmSnapshotManager::getSnapshotCache);
+      if (!snapshotCache.isPresent()) {
+        return BackgroundTaskResult.EmptyTaskResult.newResult();
+      }
       Table<String, SnapshotInfo> snapshotInfoTable =
           ozoneManager.getMetadataManager().getSnapshotInfoTable();
+
+
       try (
           TableIterator<String, ? extends Table.KeyValue
               <String, SnapshotInfo>> iterator = snapshotInfoTable
@@ -161,15 +169,12 @@ public class SstFilteringService extends BackgroundService
           List<Pair<String, String>> prefixPairs =
               constructPrefixPairs(snapshotInfo);
 
-          String dbName = OM_DB_NAME + snapshotInfo.getCheckpointDirName();
-
-          String snapshotCheckpointDir = omMetadataDir + OM_KEY_PREFIX +
-              OM_SNAPSHOT_CHECKPOINT_DIR;
-          try (RDBStore rdbStore = (RDBStore) OmMetadataManagerImpl
-              .loadDB(ozoneManager.getConfiguration(),
-                      new File(snapshotCheckpointDir),
-                      dbName, true, Optional.of(Boolean.TRUE),
-                      Optional.empty(), false, false)) {
+          try (ReferenceCounted<IOmMetadataReader, SnapshotCache>
+                   snapshotMetadataReader = snapshotCache.get()
+              .get(snapshotInfo.getTableKey())) {
+            OmSnapshot omSnapshot = (OmSnapshot) snapshotMetadataReader.get();
+            RDBStore rdbStore = (RDBStore) omSnapshot.getMetadataManager()
+                .getStore();
             RocksDatabase db = rdbStore.getDb();
             try (BootstrapStateHandler.Lock lock =
                 getBootstrapStateLock().lock()) {
@@ -209,10 +214,12 @@ public class SstFilteringService extends BackgroundService
           ozoneManager.getMetadataManager().getBucketId(volumeName, 
bucketName);
 
       String filterPrefix =
-          OM_KEY_PREFIX + volumeName + OM_KEY_PREFIX + bucketName;
+          OM_KEY_PREFIX + volumeName + OM_KEY_PREFIX + bucketName
+              + OM_KEY_PREFIX;
 
       String filterPrefixFSO =
-          OM_KEY_PREFIX + volumeId + OM_KEY_PREFIX + bucketId;
+          OM_KEY_PREFIX + volumeId + OM_KEY_PREFIX + bucketId
+              + OM_KEY_PREFIX;
 
       List<Pair<String, String>> prefixPairs = new ArrayList<>();
       prefixPairs
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
index 59f9e0cc7a..7ed8fa46e8 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
@@ -400,16 +400,16 @@ public class SnapshotDiffManager implements AutoCloseable 
{
         checkpointPath,
         snapshotId,
         dbTxSequenceNumber,
-        getTablePrefixes(snapshotOMMM, volumeName, bucketName));
+        getTablePrefixes(snapshotOMMM, volumeName, bucketName),
+        ((RDBStore)snapshotOMMM.getStore()).getDb().getManagedRocksDb());
   }
 
   @VisibleForTesting
   protected Set<String> getSSTFileListForSnapshot(OmSnapshot snapshot,
-                                                  List<String> tablesToLookUp)
-      throws RocksDBException {
-    return RdbUtil.getSSTFilesForComparison(snapshot
-        .getMetadataManager().getStore().getDbLocation()
-        .getPath(), tablesToLookUp);
+                                                  List<String> tablesToLookUp) 
{
+    return RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot
+        .getMetadataManager().getStore()).getDb().getManagedRocksDb(),
+        tablesToLookUp);
   }
 
   /**
@@ -1217,7 +1217,7 @@ public class SnapshotDiffManager implements AutoCloseable 
{
                             boolean useFullDiff,
                             Map<String, String> tablePrefixes,
                             String diffDir)
-      throws RocksDBException, IOException {
+      throws IOException {
     // TODO: [SNAPSHOT] Refactor the parameter list
     final Set<String> deltaFiles = new HashSet<>();
 
@@ -1252,13 +1252,13 @@ public class SnapshotDiffManager implements 
AutoCloseable {
 
       Set<String> fromSnapshotFiles =
           RdbUtil.getSSTFilesForComparison(
-              fromSnapshot.getMetadataManager().getStore()
-                  .getDbLocation().getPath(),
+              ((RDBStore)fromSnapshot.getMetadataManager().getStore())
+                  .getDb().getManagedRocksDb(),
               tablesToLookUp);
       Set<String> toSnapshotFiles =
           RdbUtil.getSSTFilesForComparison(
-              toSnapshot.getMetadataManager().getStore()
-                  .getDbLocation().getPath(),
+              ((RDBStore)toSnapshot.getMetadataManager().getStore()).getDb()
+                  .getManagedRocksDb(),
               tablesToLookUp);
 
       deltaFiles.addAll(fromSnapshotFiles);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java
index 0bf7390576..3fa2e9d0a5 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.hdds.utils.IOUtils;
 import org.apache.hadoop.hdds.utils.NativeLibraryNotLoadedException;
 import org.apache.hadoop.hdds.utils.db.CodecRegistry;
 import org.apache.hadoop.hdds.utils.db.RDBStore;
+import org.apache.hadoop.hdds.utils.db.RocksDatabase;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedColumnFamilyOptions;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
@@ -352,9 +353,12 @@ public class TestSnapshotDiffManager {
 
     when(snapshotInfoTable.get(getTableKey(VOLUME_NAME, BUCKET_NAME,
         baseSnapshotName))).thenReturn(snapshotInfo);
+    RocksDatabase rocksDatabase = Mockito.mock(RocksDatabase.class);
 
+    when(rocksDatabase.getManagedRocksDb()).thenReturn(db);
     when(dbStore.getDbLocation()).thenReturn(dbDir);
     when(dbStore.getSnapshotMetadataDir()).thenReturn(dbDir.getAbsolutePath());
+    when(dbStore.getDb()).thenReturn(rocksDatabase);
     when(omBucketInfo.getBucketLayout()).thenReturn(LEGACY);
     when(bucketInfoTable.get(bucketTableKey)).thenReturn(omBucketInfo);
     when(omMetadataManager.getStore()).thenReturn(dbStore);
@@ -414,8 +418,7 @@ public class TestSnapshotDiffManager {
 
   @ParameterizedTest
   @ValueSource(ints = {1, 2, 5, 10, 100, 1000, 10000})
-  public void testGetDeltaFilesWithDag(int numberOfFiles)
-      throws ExecutionException, RocksDBException, IOException {
+  public void testGetDeltaFilesWithDag(int numberOfFiles) throws IOException {
     UUID snap1 = UUID.randomUUID();
     UUID snap2 = UUID.randomUUID();
 
@@ -458,7 +461,7 @@ public class TestSnapshotDiffManager {
       "10,false", "100,false", "1000,false", "10000,false"})
   public void testGetDeltaFilesWithFullDiff(int numberOfFiles,
                                             boolean useFullDiff)
-      throws ExecutionException, RocksDBException, IOException {
+      throws IOException {
     try (MockedStatic<RdbUtil> mockedRdbUtil =
              Mockito.mockStatic(RdbUtil.class);
          MockedStatic<RocksDiffUtils> mockedRocksDiffUtils =
@@ -466,7 +469,7 @@ public class TestSnapshotDiffManager {
       Set<String> deltaStrings = new HashSet<>();
 
       mockedRdbUtil.when(
-              () -> RdbUtil.getSSTFilesForComparison(anyString(), anyList()))
+              () -> RdbUtil.getSSTFilesForComparison(any(), anyList()))
           .thenAnswer((Answer<Set<String>>) invocation -> {
             Set<String> retVal = IntStream.range(0, numberOfFiles)
                 .mapToObj(i -> RandomStringUtils.randomAlphabetic(10))
@@ -523,7 +526,7 @@ public class TestSnapshotDiffManager {
   @ParameterizedTest
   @ValueSource(ints = {0, 1, 2, 5, 10, 100, 1000, 10000})
   public void testGetDeltaFilesWithDifferThrowException(int numberOfFiles)
-      throws ExecutionException, RocksDBException, IOException {
+      throws IOException {
     try (MockedStatic<RdbUtil> mockedRdbUtil =
              Mockito.mockStatic(RdbUtil.class);
          MockedStatic<RocksDiffUtils> mockedRocksDiffUtils =
@@ -531,7 +534,7 @@ public class TestSnapshotDiffManager {
       Set<String> deltaStrings = new HashSet<>();
 
       mockedRdbUtil.when(
-              () -> RdbUtil.getSSTFilesForComparison(anyString(), anyList()))
+              () -> RdbUtil.getSSTFilesForComparison(any(), anyList()))
           .thenAnswer((Answer<Set<String>>) invocation -> {
             Set<String> retVal = IntStream.range(0, numberOfFiles)
                 .mapToObj(i -> RandomStringUtils.randomAlphabetic(10))


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


Reply via email to