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]