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

szetszwo 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 0c98e3ab1e HDDS-10107. Remove the static dbNameToCfHandleMap from 
RocksDatabase. (#5976)
0c98e3ab1e is described below

commit 0c98e3ab1e5dbb6fe6c7d5424e98f43c885524a1
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Tue Jan 16 15:28:12 2024 -0800

    HDDS-10107. Remove the static dbNameToCfHandleMap from RocksDatabase. 
(#5976)
---
 .../hadoop/hdds/utils/db/StringCodecBase.java      |   3 +-
 .../org/apache/hadoop/hdds/utils/db/RDBStore.java  |   9 +-
 .../apache/hadoop/hdds/utils/db/RocksDatabase.java | 106 +++++++++------------
 .../apache/hadoop/ozone/om/TestOMDBDefinition.java |   3 +-
 4 files changed, 46 insertions(+), 75 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/StringCodecBase.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/StringCodecBase.java
index 58d2edec76..f92c57c378 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/StringCodecBase.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/StringCodecBase.java
@@ -177,8 +177,7 @@ abstract class StringCodecBase implements Codec<String> {
   }
 
   @Override
-  public String fromCodecBuffer(@Nonnull CodecBuffer buffer)
-      throws IOException {
+  public String fromCodecBuffer(@Nonnull CodecBuffer buffer) {
     return decode(buffer.asReadOnlyByteBuffer());
   }
 
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 71cd3716e5..cfd5e4e394 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
@@ -26,7 +26,6 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -344,13 +343,7 @@ public class RDBStore implements DBStore {
 
   @Override
   public Map<Integer, String> getTableNames() {
-    Map<Integer, String> tableNames = new HashMap<>();
-    StringCodec stringCodec = StringCodec.get();
-
-    for (ColumnFamily columnFamily : getColumnFamilies()) {
-      tableNames.put(columnFamily.getID(), columnFamily.getName(stringCodec));
-    }
-    return tableNames;
+    return db.getColumnFamilyNames();
   }
 
   public Collection<ColumnFamily> getColumnFamilies() {
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 4dd1042fde..19f60d914f 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
@@ -36,6 +36,7 @@ import 
org.apache.hadoop.hdds.utils.db.managed.ManagedWriteBatch;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedWriteOptions;
 import org.apache.ozone.rocksdiff.RocksDiffUtils;
 import org.apache.ratis.util.UncheckedAutoCloseable;
+import org.apache.ratis.util.MemoizedSupplier;
 import org.rocksdb.ColumnFamilyDescriptor;
 import org.rocksdb.ColumnFamilyHandle;
 import org.rocksdb.Holder;
@@ -51,7 +52,6 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -66,7 +66,6 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.hadoop.hdds.StringUtils.bytes2String;
 import static 
org.apache.hadoop.hdds.utils.db.managed.ManagedColumnFamilyOptions.closeDeeply;
 import static 
org.apache.hadoop.hdds.utils.db.managed.ManagedRocksIterator.managed;
 import static 
org.apache.hadoop.hdds.utils.db.managed.ManagedTransactionLogIterator.managed;
@@ -86,10 +85,14 @@ public final class RocksDatabase implements Closeable {
   }
   private static final ManagedReadOptions DEFAULT_READ_OPTION =
       new ManagedReadOptions();
-  private static Map<String, List<ColumnFamilyHandle>> dbNameToCfHandleMap =
-      new HashMap<>();
 
-  private final StackTraceElement[] stackTrace;
+  static String bytes2String(byte[] bytes) {
+    return StringCodec.get().fromPersistedFormat(bytes);
+  }
+
+  static String bytes2String(ByteBuffer bytes) {
+    return StringCodec.get().decode(bytes);
+  }
 
   static IOException toIOException(Object name, String op, RocksDBException e) 
{
     return HddsServerUtil.toIOException(name + ": Failed to " + op, e);
@@ -158,15 +161,7 @@ public final class RocksDatabase implements Closeable {
         db = ManagedRocksDB.open(dbOptions, dbFile.getAbsolutePath(),
             descriptors, handles);
       }
-      dbNameToCfHandleMap.put(db.get().getName(), handles);
-      // init a column family map.
-      AtomicLong counter = new AtomicLong(0);
-      for (ColumnFamilyHandle h : handles) {
-        final ColumnFamily f = new ColumnFamily(h, counter);
-        columnFamilies.put(f.getName(), f);
-      }
-      return new RocksDatabase(dbFile, db, dbOptions, writeOptions,
-          descriptors, Collections.unmodifiableMap(columnFamilies), counter);
+      return new RocksDatabase(dbFile, db, dbOptions, writeOptions, 
descriptors, handles);
     } catch (RocksDBException e) {
       close(columnFamilies, db, descriptors, writeOptions, dbOptions);
       throw toIOException(RocksDatabase.class, "open " + dbFile, e);
@@ -260,17 +255,13 @@ public final class RocksDatabase implements Closeable {
    *
    * @see ColumnFamilyHandle
    */
-  public static final class ColumnFamily {
+  public final class ColumnFamily {
     private final byte[] nameBytes;
-    private AtomicLong counter;
     private final String name;
     private final ColumnFamilyHandle handle;
-    private AtomicBoolean isClosed = new AtomicBoolean(false);
 
-    public ColumnFamily(ColumnFamilyHandle handle, AtomicLong counter)
-        throws RocksDBException {
+    private ColumnFamily(ColumnFamilyHandle handle) throws RocksDBException {
       this.nameBytes = handle.getName();
-      this.counter = counter;
       this.name = bytes2String(nameBytes);
       this.handle = handle;
       LOG.debug("new ColumnFamily for {}", name);
@@ -289,10 +280,6 @@ public final class RocksDatabase implements Closeable {
       return handle;
     }
 
-    public int getID() {
-      return getHandle().getID();
-    }
-
     public void batchDelete(ManagedWriteBatch writeBatch, byte[] key)
         throws IOException {
       try (UncheckedAutoCloseable ignored = acquire()) {
@@ -331,10 +318,6 @@ public final class RocksDatabase implements Closeable {
       }
     }
 
-    public void markClosed() {
-      isClosed.set(true);
-    }
-
     private UncheckedAutoCloseable acquire() throws IOException {
       if (isClosed.get()) {
         throw new IOException("Rocks Database is closed");
@@ -353,27 +336,49 @@ public final class RocksDatabase implements Closeable {
   }
 
   private final String name;
+  private final Throwable creationStackTrace = new Throwable("Object creation 
stack trace");
+
   private final ManagedRocksDB db;
   private final ManagedDBOptions dbOptions;
   private final ManagedWriteOptions writeOptions;
   private final List<ColumnFamilyDescriptor> descriptors;
+  /** column family names -> {@link ColumnFamily}. */
   private final Map<String, ColumnFamily> columnFamilies;
+  /** {@link ColumnFamilyHandle#getID()} -> column family names. */
+  private final Supplier<Map<Integer, String>> columnFamilyNames;
 
   private final AtomicBoolean isClosed = new AtomicBoolean();
-  private final AtomicLong counter;
+  /** Count the number of operations running concurrently. */
+  private final AtomicLong counter = new AtomicLong();
 
   private RocksDatabase(File dbFile, ManagedRocksDB db,
       ManagedDBOptions dbOptions, ManagedWriteOptions writeOptions,
-      List<ColumnFamilyDescriptor> descriptors,
-      Map<String, ColumnFamily> columnFamilies, AtomicLong counter) {
+      List<ColumnFamilyDescriptor> descriptors, List<ColumnFamilyHandle> 
handles) throws RocksDBException {
     this.name = getClass().getSimpleName() + "[" + dbFile + "]";
     this.db = db;
     this.dbOptions = dbOptions;
     this.writeOptions = writeOptions;
     this.descriptors = descriptors;
-    this.columnFamilies = columnFamilies;
-    this.counter = counter;
-    this.stackTrace = Thread.currentThread().getStackTrace();
+    this.columnFamilies = toColumnFamilyMap(handles);
+    this.columnFamilyNames = MemoizedSupplier.valueOf(() -> 
toColumnFamilyNameMap(columnFamilies.values()));
+  }
+
+  private Map<String, ColumnFamily> toColumnFamilyMap(List<ColumnFamilyHandle> 
handles) throws RocksDBException {
+    final Map<String, ColumnFamily> map = new HashMap<>();
+    for (ColumnFamilyHandle h : handles) {
+      final ColumnFamily f = new ColumnFamily(h);
+      map.put(f.getName(), f);
+    }
+    return Collections.unmodifiableMap(map);
+  }
+
+  private static Map<Integer, String> 
toColumnFamilyNameMap(Collection<ColumnFamily> families) {
+    return Collections.unmodifiableMap(families.stream()
+        .collect(Collectors.toMap(f -> f.getHandle().getID(), 
ColumnFamily::getName)));
+  }
+
+  Map<Integer, String> getColumnFamilyNames() {
+    return columnFamilyNames.get();
   }
 
   @Override
@@ -389,10 +394,6 @@ public final class RocksDatabase implements Closeable {
       // Then close all attached listeners
       dbOptions.listeners().forEach(listener -> listener.close());
 
-      if (columnFamilies != null) {
-        columnFamilies.values().stream().forEach(f -> f.markClosed());
-      }
-
       if (isSync) {
         waitAndClose();
         return;
@@ -579,20 +580,9 @@ public final class RocksDatabase implements Closeable {
     }
   }
 
-  private ColumnFamilyHandle getColumnFamilyHandle(String cfName)
-      throws IOException {
-    for (ColumnFamilyHandle cf : getCfHandleMap().get(db.get().getName())) {
-      try {
-        String table = new String(cf.getName(), UTF_8);
-        if (cfName.equals(table)) {
-          return cf;
-        }
-      } catch (RocksDBException e) {
-        closeOnError(e);
-        throw toIOException(this, "columnFamilyHandle.getName", e);
-      }
-    }
-    return null;
+  private ColumnFamilyHandle getColumnFamilyHandle(String columnFamilyName) {
+    final ColumnFamily columnFamily = getColumnFamily(columnFamilyName);
+    return columnFamily != null ? columnFamily.getHandle() : null;
   }
 
   public void compactRange(ColumnFamily family, final byte[] begin,
@@ -896,20 +886,10 @@ public final class RocksDatabase implements Closeable {
     }
   }
 
-  public static Map<String, List<ColumnFamilyHandle>> getCfHandleMap() {
-    return dbNameToCfHandleMap;
-  }
-
   @Override
   protected void finalize() throws Throwable {
     if (!isClosed()) {
-      String warning = "RocksDatabase is not closed properly.";
-      if (LOG.isDebugEnabled()) {
-        String debugMessage = String.format("%n StackTrace for unclosed " +
-            "RocksDatabase instance: %s", Arrays.toString(stackTrace));
-        warning = warning.concat(debugMessage);
-      }
-      LOG.warn(warning);
+      LOG.warn("RocksDatabase {} is not closed properly.", name, 
creationStackTrace);
     }
     super.finalize();
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMDBDefinition.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMDBDefinition.java
index f9c78ee63b..36245dc874 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMDBDefinition.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMDBDefinition.java
@@ -54,8 +54,7 @@ public class TestOMDBDefinition {
     ArrayList<String> missingDBDefTables = new ArrayList<>();
 
     // Get list of tables from the RocksDB Store
-    Collection<String> missingOmDBTables =
-        store.getTableNames().values();
+    final Collection<String> missingOmDBTables = new 
ArrayList<>(store.getTableNames().values());
     missingOmDBTables.remove("default");
     int countOmDBTables = missingOmDBTables.size();
     // Remove the file if it is found in both the datastructures


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

Reply via email to