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

adoroszlai 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 2c578c3ae7 HDDS-8980. RocksDB crash in 
RocksDBStoreMetrics.computeSstFileStat (#5034)
2c578c3ae7 is described below

commit 2c578c3ae73417d2fd2f24ab356632ddb5c427fb
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Jul 11 14:24:37 2023 +0200

    HDDS-8980. RocksDB crash in RocksDBStoreMetrics.computeSstFileStat (#5034)
---
 .../hadoop/hdds/utils/RocksDBStoreMetrics.java     | 27 ++++++++++++++-------
 .../org/apache/hadoop/hdds/utils/db/DBStore.java   | 11 ++-------
 .../org/apache/hadoop/hdds/utils/db/RDBStore.java  |  6 ++---
 .../apache/hadoop/hdds/utils/db/RocksDatabase.java | 28 ++++++++++++++--------
 .../org/apache/hadoop/ozone/om/TestOmSnapshot.java |  3 ++-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  2 +-
 .../protocolPB/OzoneManagerRequestHandler.java     |  3 +--
 .../recon/recovery/ReconOmMetadataManagerImpl.java |  6 ++++-
 8 files changed, 50 insertions(+), 36 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/RocksDBStoreMetrics.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/RocksDBStoreMetrics.java
index 8e16556b6e..479e88ed3e 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/RocksDBStoreMetrics.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/RocksDBStoreMetrics.java
@@ -230,17 +230,22 @@ public class RocksDBStoreMetrics implements MetricsSource 
{
           cfPros[index][0], e);
     }
 
-    // Calculate number of files per level and size per level
-    Map<String, Map<Integer, Map<String, Long>>> data = computeSstFileStat();
+    try {
+      // Calculate number of files per level and size per level
+      Map<String, Map<Integer, Map<String, Long>>> data = computeSstFileStat();
 
-    // Export file number
-    exportSstFileStat(rb, data.get(NUM_FILES_AT_LEVEL), NUM_FILES_AT_LEVEL);
+      // Export file number
+      exportSstFileStat(rb, data.get(NUM_FILES_AT_LEVEL), NUM_FILES_AT_LEVEL);
 
-    // Export file total size
-    exportSstFileStat(rb, data.get(SIZE_AT_LEVEL), SIZE_AT_LEVEL);
+      // Export file total size
+      exportSstFileStat(rb, data.get(SIZE_AT_LEVEL), SIZE_AT_LEVEL);
+    } catch (IOException e) {
+      LOG.error("Failed to compute sst file stat", e);
+    }
   }
 
-  private Map<String, Map<Integer, Map<String, Long>>> computeSstFileStat() {
+  private Map<String, Map<Integer, Map<String, Long>>> computeSstFileStat()
+      throws IOException {
     // Calculate number of files per level and size per level
     List<LiveFileMetaData> liveFileMetaDataList =
         rocksDB.getLiveFilesMetaData();
@@ -292,7 +297,11 @@ public class RocksDBStoreMetrics implements MetricsSource {
   }
 
   private void getLatestSequenceNumber(MetricsRecordBuilder rb) {
-    rb.addCounter(Interns.info(LAST_SEQUENCE_NUMBER, "RocksDBStat"),
-        rocksDB.getLatestSequenceNumber());
+    try {
+      rb.addCounter(Interns.info(LAST_SEQUENCE_NUMBER, "RocksDBStat"),
+          rocksDB.getLatestSequenceNumber());
+    } catch (IOException e) {
+      LOG.error("Failed to get latest sequence number", e);
+    }
   }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStore.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStore.java
index f4b740a255..1985562523 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStore.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStore.java
@@ -182,22 +182,15 @@ public interface DBStore extends Closeable, 
BatchOperationHandler {
 
   /**
    * Get data written to DB since a specific sequence number.
-   * @param sequenceNumber
-   * @return
-   * @throws SequenceNumberNotFoundException
    */
   DBUpdatesWrapper getUpdatesSince(long sequenceNumber)
-      throws SequenceNumberNotFoundException;
+      throws IOException;
 
   /**
    * Get limited data written to DB since a specific sequence number.
-   * @param sequenceNumber
-   * @param limitCount
-   * @return
-   * @throws SequenceNumberNotFoundException
    */
   DBUpdatesWrapper getUpdatesSince(long sequenceNumber, long limitCount)
-      throws SequenceNumberNotFoundException;
+      throws IOException;
 
   /**
    * Return if the underlying DB is closed. This call is thread safe.
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 d20fa13dda..f27ab5e430 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
@@ -347,13 +347,13 @@ public class RDBStore implements DBStore {
 
   @Override
   public DBUpdatesWrapper getUpdatesSince(long sequenceNumber)
-      throws SequenceNumberNotFoundException {
+      throws IOException {
     return getUpdatesSince(sequenceNumber, Long.MAX_VALUE);
   }
 
   @Override
   public DBUpdatesWrapper getUpdatesSince(long sequenceNumber, long limitCount)
-      throws SequenceNumberNotFoundException {
+      throws IOException {
     if (limitCount <= 0) {
       throw new IllegalArgumentException("Illegal count for getUpdatesSince.");
     }
@@ -413,6 +413,7 @@ public class RDBStore implements DBStore {
         }
         logIterator.get().next();
       }
+      dbUpdatesWrapper.setLatestSequenceNumber(db.getLatestSequenceNumber());
     } catch (SequenceNumberNotFoundException e) {
       LOG.warn("Unable to get delta updates since sequenceNumber {}. "
               + "This exception will be thrown to the client",
@@ -433,7 +434,6 @@ public class RDBStore implements DBStore {
             dbUpdatesWrapper.getCurrentSequenceNumber() - sequenceNumber);
       }
     }
-    dbUpdatesWrapper.setLatestSequenceNumber(db.getLatestSequenceNumber());
     return dbUpdatesWrapper;
   }
 
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 0d4850027d..2a507b8b53 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
@@ -243,7 +243,7 @@ public final class RocksDatabase implements Closeable {
       }
     }
 
-    public long getLatestSequenceNumber() {
+    public long getLatestSequenceNumber() throws IOException {
       return RocksDatabase.this.getLatestSequenceNumber();
     }
 
@@ -508,9 +508,9 @@ public final class RocksDatabase implements Closeable {
 
   /**
    * @param cfName columnFamily on which flush will run.
-   * @throws IOException
    */
   public void flush(String cfName) throws IOException {
+    assertClose();
     ColumnFamilyHandle handle = getColumnFamilyHandle(cfName);
     try (ManagedFlushOptions options = new ManagedFlushOptions()) {
       options.setWaitForFlush(true);
@@ -555,6 +555,7 @@ public final class RocksDatabase implements Closeable {
 
   public void compactRangeDefault(final ManagedCompactRangeOptions options)
       throws IOException {
+    assertClose();
     try {
       counter.incrementAndGet();
       db.get().compactRange(null, null, null, options);
@@ -567,13 +568,15 @@ public final class RocksDatabase implements Closeable {
   }
 
   public void compactDB(ManagedCompactRangeOptions options) throws IOException 
{
+    assertClose();
     compactRangeDefault(options);
     for (RocksDatabase.ColumnFamily columnFamily : getExtraColumnFamilies()) {
       compactRange(columnFamily, null, null, options);
     }
   }
 
-  public int getLiveFilesMetaDataSize() {
+  public int getLiveFilesMetaDataSize() throws IOException {
+    assertClose();
     try {
       counter.incrementAndGet();
       return db.get().getLiveFilesMetaData().size();
@@ -584,9 +587,9 @@ public final class RocksDatabase implements Closeable {
 
   /**
    * @param cfName columnFamily on which compaction will run.
-   * @throws IOException
    */
   public void compactRange(String cfName) throws IOException {
+    assertClose();
     ColumnFamilyHandle handle = getColumnFamilyHandle(cfName);
     try {
       if (handle != null) {
@@ -604,6 +607,7 @@ public final class RocksDatabase implements Closeable {
 
   private ColumnFamilyHandle getColumnFamilyHandle(String cfName)
       throws IOException {
+    assertClose();
     for (ColumnFamilyHandle cf : getCfHandleMap().get(db.get().getName())) {
       try {
         String table = new String(cf.getName(), StandardCharsets.UTF_8);
@@ -621,6 +625,7 @@ public final class RocksDatabase implements Closeable {
   public void compactRange(ColumnFamily family, final byte[] begin,
       final byte[] end, final ManagedCompactRangeOptions options)
       throws IOException {
+    assertClose();
     try {
       counter.incrementAndGet();
       db.get().compactRange(family.getHandle(), begin, end, options);
@@ -632,7 +637,8 @@ public final class RocksDatabase implements Closeable {
     }
   }
 
-  public List<LiveFileMetaData> getLiveFilesMetaData() {
+  public List<LiveFileMetaData> getLiveFilesMetaData() throws IOException {
+    assertClose();
     try {
       counter.incrementAndGet();
       return db.get().getLiveFilesMetaData();
@@ -823,7 +829,8 @@ public final class RocksDatabase implements Closeable {
     }
   }
 
-  public long getLatestSequenceNumber() {
+  public long getLatestSequenceNumber() throws IOException {
+    assertClose();
     try {
       counter.incrementAndGet();
       return db.get().getLatestSequenceNumber();
@@ -924,7 +931,8 @@ public final class RocksDatabase implements Closeable {
   }
 
   @VisibleForTesting
-  public List<LiveFileMetaData> getSstFileList() {
+  public List<LiveFileMetaData> getSstFileList() throws IOException {
+    assertClose();
     return db.get().getLiveFilesMetaData();
   }
 
@@ -932,7 +940,7 @@ public final class RocksDatabase implements Closeable {
    * return the max compaction level of sst files in the db.
    * @return level
    */
-  private int getLastLevel() {
+  private int getLastLevel() throws IOException {
     return getSstFileList().stream()
         .max(Comparator.comparing(LiveFileMetaData::level)).get().level();
   }
@@ -941,12 +949,12 @@ public final class RocksDatabase implements Closeable {
    * Deletes sst files which do not correspond to prefix
    * for given table.
    * @param prefixPairs, a list of pair (TableName,prefixUsed).
-   * @throws RocksDBException
    */
   public void deleteFilesNotMatchingPrefix(
       List<Pair<String, String>> prefixPairs,
       BooleanTriFunction<String, String, String, Boolean> filterFunction)
-      throws RocksDBException {
+      throws IOException, RocksDBException {
+    assertClose();
     for (LiveFileMetaData liveFileMetaData : getSstFileList()) {
       String sstFileColumnFamily =
           new String(liveFileMetaData.columnFamilyName(),
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
index 4ae27046c9..de0f8f1f79 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
@@ -1797,7 +1797,8 @@ public class TestOmSnapshot {
   }
 
   @NotNull
-  private static List<LiveFileMetaData> getKeyTableSstFiles() {
+  private static List<LiveFileMetaData> getKeyTableSstFiles()
+      throws IOException {
     if (!bucketLayout.isFileSystemOptimized()) {
       return rdbStore.getDb().getSstFileList().stream().filter(
           x -> new String(x.columnFamilyName(), UTF_8).equals(
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 92a0d4adaf..3c0ffbdb7b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -4039,7 +4039,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
   @Override
   public DBUpdates getDBUpdates(
       DBUpdatesRequest dbUpdatesRequest)
-      throws SequenceNumberNotFoundException {
+      throws IOException {
     long limitCount = Long.MAX_VALUE;
     if (dbUpdatesRequest.hasLimitCount()) {
       limitCount = dbUpdatesRequest.getLimitCount();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
index 3177c3f4c4..fd099d395e 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
@@ -37,7 +37,6 @@ import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.TransferLeadershipReques
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.TransferLeadershipResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
-import org.apache.hadoop.hdds.utils.db.SequenceNumberNotFoundException;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.OzoneManagerPrepareState;
@@ -376,7 +375,7 @@ public class OzoneManagerRequestHandler implements 
RequestHandler {
 
   private DBUpdatesResponse getOMDBUpdates(
       DBUpdatesRequest dbUpdatesRequest)
-      throws SequenceNumberNotFoundException {
+      throws IOException {
 
     DBUpdatesResponse.Builder builder = DBUpdatesResponse
         .newBuilder();
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java
index 88b6cf61c4..ff0c8145f6 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java
@@ -131,7 +131,11 @@ public class ReconOmMetadataManagerImpl extends 
OmMetadataManagerImpl
     if (null == rocksDBStore) {
       return 0;
     } else {
-      return rocksDBStore.getDb().getLatestSequenceNumber();
+      try {
+        return rocksDBStore.getDb().getLatestSequenceNumber();
+      } catch (IOException e) {
+        return 0;
+      }
     }
   }
 


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

Reply via email to