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]

Reply via email to