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 b8e3c30043 HDDS-9129. Add SSTFiltered flag in SnapshotInfo table.
(#5158)
b8e3c30043 is described below
commit b8e3c30043eb01dc4b34a1e6098d1190f882791e
Author: Swaminathan Balachandran <[email protected]>
AuthorDate: Tue Aug 8 00:47:46 2023 -0700
HDDS-9129. Add SSTFiltered flag in SnapshotInfo table. (#5158)
---
.../java/org/apache/hadoop/ozone/OzoneConsts.java | 2 -
.../hadoop/ozone/om/helpers/SnapshotInfo.java | 34 +++++++++--
.../ozone/om/helpers/TestOmSnapshotInfo.java | 1 +
.../src/main/proto/OmClientProtocol.proto | 1 +
.../hadoop/ozone/om/SstFilteringService.java | 69 ++++++++++++----------
.../apache/hadoop/ozone/om/TestSnapshotInfo.java | 13 ++++
.../hadoop/ozone/om/TestSstFilteringService.java | 17 ++----
7 files changed, 87 insertions(+), 50 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
index fd519bfd43..4d123e9c0d 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
@@ -584,8 +584,6 @@ public final class OzoneConsts {
public static final String OM_SNAPSHOT_INDICATOR = ".snapshot";
public static final String OM_SNAPSHOT_DIFF_DB_NAME = "db.snapdiff";
- public static final String FILTERED_SNAPSHOTS = "filtered-snapshots";
-
/**
* Name of the SST file backup directory placed under metadata dir.
* Can be made configurable later.
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
index 756c397655..fcd28ce329 100644
---
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
@@ -127,6 +127,8 @@ public final class SnapshotInfo implements Auditable {
private long dbTxSequenceNumber;
private boolean deepClean;
+ private boolean sstFiltered;
+
/**
* Private constructor, constructed via builder.
* @param snapshotId - Snapshot UUID.
@@ -157,7 +159,8 @@ public final class SnapshotInfo implements Auditable {
String snapshotPath,
String checkpointDir,
long dbTxSequenceNumber,
- boolean deepCleaned) {
+ boolean deepCleaned,
+ boolean sstFiltered) {
this.snapshotId = snapshotId;
this.name = name;
this.volumeName = volumeName;
@@ -171,6 +174,7 @@ public final class SnapshotInfo implements Auditable {
this.checkpointDir = checkpointDir;
this.dbTxSequenceNumber = dbTxSequenceNumber;
this.deepClean = deepCleaned;
+ this.sstFiltered = sstFiltered;
}
public void setName(String name) {
@@ -261,6 +265,14 @@ public final class SnapshotInfo implements Auditable {
return checkpointDir;
}
+ public boolean isSstFiltered() {
+ return sstFiltered;
+ }
+
+ public void setSstFiltered(boolean sstFiltered) {
+ this.sstFiltered = sstFiltered;
+ }
+
public static org.apache.hadoop.ozone.om.helpers.SnapshotInfo.Builder
newBuilder() {
return new org.apache.hadoop.ozone.om.helpers.SnapshotInfo.Builder();
@@ -279,7 +291,8 @@ public final class SnapshotInfo implements Auditable {
.setGlobalPreviousSnapshotId(globalPreviousSnapshotId)
.setSnapshotPath(snapshotPath)
.setCheckpointDir(checkpointDir)
- .setDeepClean(deepClean);
+ .setDeepClean(deepClean)
+ .setSstFiltered(sstFiltered);
}
/**
@@ -300,6 +313,8 @@ public final class SnapshotInfo implements Auditable {
private long dbTxSequenceNumber;
private boolean deepClean;
+ private boolean sstFiltered;
+
public Builder() {
// default values
this.snapshotStatus = SnapshotStatus.DEFAULT;
@@ -370,6 +385,11 @@ public final class SnapshotInfo implements Auditable {
return this;
}
+ public Builder setSstFiltered(boolean sstFiltered) {
+ this.sstFiltered = sstFiltered;
+ return this;
+ }
+
public SnapshotInfo build() {
Preconditions.checkNotNull(name);
return new SnapshotInfo(
@@ -385,7 +405,8 @@ public final class SnapshotInfo implements Auditable {
snapshotPath,
checkpointDir,
dbTxSequenceNumber,
- deepClean
+ deepClean,
+ sstFiltered
);
}
}
@@ -402,7 +423,8 @@ public final class SnapshotInfo implements Auditable {
.setBucketName(bucketName)
.setSnapshotStatus(snapshotStatus.toProto())
.setCreationTime(creationTime)
- .setDeletionTime(deletionTime);
+ .setDeletionTime(deletionTime)
+ .setSstFiltered(sstFiltered);
if (pathPreviousSnapshotId != null) {
sib.setPathPreviousSnapshotID(toProtobuf(pathPreviousSnapshotId));
@@ -451,6 +473,10 @@ public final class SnapshotInfo implements Auditable {
osib.setDeepClean(snapshotInfoProto.getDeepClean());
}
+ if (snapshotInfoProto.hasSstFiltered()) {
+ osib.setSstFiltered(snapshotInfoProto.getSstFiltered());
+ }
+
osib.setSnapshotPath(snapshotInfoProto.getSnapshotPath())
.setCheckpointDir(snapshotInfoProto.getCheckpointDir())
.setDbTxSequenceNumber(snapshotInfoProto.getDbTxSequenceNumber());
diff --git
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
index 2c99c992af..c2224b3f08 100644
---
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
+++
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
@@ -85,6 +85,7 @@ public class TestOmSnapshotInfo {
.setCheckpointDir(CHECKPOINT_DIR)
.setDbTxSequenceNumber(DB_TX_SEQUENCE_NUMBER)
.setDeepClean(true)
+ .setSstFiltered(false)
.build();
}
diff --git
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index d63f858310..2d7adffaa3 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -819,6 +819,7 @@ message SnapshotInfo {
optional string checkpointDir = 11;
optional int64 dbTxSequenceNumber = 12;
optional bool deepClean = 13;
+ optional bool sstFiltered = 14;
}
message SnapshotDiffJobProto {
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 6a75624c6b..24a4eddd3a 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
@@ -39,26 +39,18 @@ import org.rocksdb.RocksDBException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
-import java.util.UUID;
import java.util.concurrent.TimeUnit;
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_KEY_PREFIX;
-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;
+import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK;
/**
* When snapshots are taken, an entire snapshot of the
@@ -124,6 +116,36 @@ public class SstFilteringService extends BackgroundService
private class SstFilteringTask implements BackgroundTask {
+
+ /**
+ * Marks the SSTFiltered flag corresponding to the snapshot.
+ * @param volume Volume name of the snapshot
+ * @param bucket Bucket name of the snapshot
+ * @param snapshotName Snapshot name
+ * @throws IOException
+ */
+ private void markSSTFilteredFlagForSnapshot(String volume, String bucket,
+ String snapshotName) throws IOException {
+ boolean acquiredSnapshotLock =
ozoneManager.getMetadataManager().getLock()
+ .acquireWriteLock(SNAPSHOT_LOCK, volume, bucket, snapshotName);
+ if (acquiredSnapshotLock) {
+ Table<String, SnapshotInfo> snapshotInfoTable =
+ ozoneManager.getMetadataManager().getSnapshotInfoTable();
+ try {
+ // mark the snapshot as filtered by writing to the file
+ String snapshotTableKey = SnapshotInfo.getTableKey(volume, bucket,
+ snapshotName);
+ SnapshotInfo snapshotInfo = snapshotInfoTable.get(snapshotTableKey);
+
+ snapshotInfo.setSstFiltered(true);
+ snapshotInfoTable.put(snapshotTableKey, snapshotInfo);
+ } finally {
+ ozoneManager.getMetadataManager().getLock()
+ .releaseWriteLock(SNAPSHOT_LOCK, volume, bucket, snapshotName);
+ }
+ }
+ }
+
@Override
public BackgroundTaskResult call() throws Exception {
@@ -137,8 +159,7 @@ public class SstFilteringService extends BackgroundService
ozoneManager.getMetadataManager().getSnapshotInfoTable();
- try (
- TableIterator<String, ? extends Table.KeyValue
+ try (TableIterator<String, ? extends Table.KeyValue
<String, SnapshotInfo>> iterator = snapshotInfoTable
.iterator()) {
iterator.seekToFirst();
@@ -149,22 +170,9 @@ public class SstFilteringService extends BackgroundService
Table.KeyValue<String, SnapshotInfo> keyValue = iterator.next();
String snapShotTableKey = keyValue.getKey();
SnapshotInfo snapshotInfo = keyValue.getValue();
- UUID snapshotId = snapshotInfo.getSnapshotId();
-
- File omMetadataDir =
- OMStorage.getOmDbDir(ozoneManager.getConfiguration());
- String snapshotDir = omMetadataDir + OM_KEY_PREFIX + OM_SNAPSHOT_DIR;
- Path filePath =
- Paths.get(snapshotDir + OM_KEY_PREFIX + FILTERED_SNAPSHOTS);
-
- // If entry for the snapshotID is present in this file,
- // it has already undergone filtering.
- if (Files.exists(filePath)) {
- List<String> processedSnapshotIds = Files.readAllLines(filePath);
- if (snapshotId != null &&
- processedSnapshotIds.contains(snapshotId.toString())) {
- continue;
- }
+
+ if (snapshotInfo.isSstFiltered()) {
+ continue;
}
LOG.debug("Processing snapshot {} to filter relevant SST Files",
@@ -185,11 +193,8 @@ public class SstFilteringService extends BackgroundService
db.deleteFilesNotMatchingPrefix(prefixPairs, FILTER_FUNCTION);
}
}
-
- // mark the snapshot as filtered by writing to the file
- String content = snapshotInfo.getSnapshotId() + "\n";
- Files.write(filePath, content.getBytes(StandardCharsets.UTF_8),
- StandardOpenOption.CREATE, StandardOpenOption.APPEND);
+ markSSTFilteredFlagForSnapshot(snapshotInfo.getVolumeName(),
+ snapshotInfo.getBucketName(), snapshotInfo.getName());
snapshotLimit--;
snapshotFilteredCount.getAndIncrement();
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
index a1abd9a4be..cbb1cc2846 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
@@ -97,4 +97,17 @@ public class TestSnapshotInfo {
snapshotInfo.delete(EXPECTED_SNAPSHOT_KEY);
Assert.assertFalse(snapshotInfo.isExist(EXPECTED_SNAPSHOT_KEY));
}
+
+ @Test
+ public void testSnapshotSSTFilteredFlag() throws Exception {
+ Table<String, SnapshotInfo> snapshotInfo =
+ omMetadataManager.getSnapshotInfoTable();
+ SnapshotInfo info = createSnapshotInfo();
+ info.setSstFiltered(false);
+ snapshotInfo.put(EXPECTED_SNAPSHOT_KEY, info);
+
Assert.assertFalse(snapshotInfo.get(EXPECTED_SNAPSHOT_KEY).isSstFiltered());
+ info.setSstFiltered(true);
+ snapshotInfo.put(EXPECTED_SNAPSHOT_KEY, info);
+ Assert.assertTrue(snapshotInfo.get(EXPECTED_SNAPSHOT_KEY).isSstFiltered());
+ }
}
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 64c3e36599..ee3794fbad 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
@@ -25,7 +25,6 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
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;
@@ -49,8 +48,6 @@ import org.rocksdb.LiveFileMetaData;
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;
@@ -65,7 +62,6 @@ import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_CONTAINER_REPORT_INTERV
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.awaitility.Awaitility.with;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -142,7 +138,6 @@ public class TestSstFilteringService {
RDBStore activeDbStore = (RDBStore) om.getMetadataManager().getStore();
SstFilteringService filteringService =
keyManager.getSnapshotSstFilteringService();
- String rocksDbDir = om.getRocksDbDirectory();
final int keyCount = 100;
String volumeName = "vol1";
@@ -192,7 +187,9 @@ public class TestSstFilteringService {
List<LiveFileMetaData> allFiles = activeDbStore.getDb().getSstFileList();
String snapshotName1 = "snapshot1";
writeClient.createSnapshot(volumeName, bucketName2, snapshotName1);
-
+ SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable()
+ .get(SnapshotInfo.getTableKey(volumeName, bucketName2, snapshotName1));
+ assertFalse(snapshotInfo.isSstFiltered());
with().atMost(Duration.ofSeconds(120))
.pollInterval(Duration.ofSeconds(1))
.await()
@@ -206,10 +203,9 @@ public class TestSstFilteringService {
getKeysFromSnapshot(volumeName, bucketName2, snapshotName1);
assertEquals(keysFromActiveDb, keysFromSnapshot);
- SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable()
+ snapshotInfo = om.getMetadataManager().getSnapshotInfoTable()
.get(SnapshotInfo.getTableKey(volumeName, bucketName2, snapshotName1));
- String dbSnapshots = rocksDbDir + OM_KEY_PREFIX + OM_SNAPSHOT_DIR;
String snapshotDirName =
OmSnapshotManager.getSnapshotPath(conf, snapshotInfo);
@@ -224,10 +220,7 @@ public class TestSstFilteringService {
}
}
- List<String> processedSnapshotIds = Files
- .readAllLines(Paths.get(dbSnapshots, OzoneConsts.FILTERED_SNAPSHOTS));
- assertTrue(
-
processedSnapshotIds.contains(snapshotInfo.getSnapshotId().toString()));
+ assertTrue(snapshotInfo.isSstFiltered());
String snapshotName2 = "snapshot2";
long count;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]