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 7f2e0e37de HDDS-11554. OMDBDefinition should be singleton. (#7292)
7f2e0e37de is described below

commit 7f2e0e37de53baccc9764f9feac2f73ff540acd8
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Wed Oct 9 22:57:12 2024 -0700

    HDDS-11554. OMDBDefinition should be singleton. (#7292)
---
 .../apache/hadoop/hdds/utils/db/DBDefinition.java  | 22 ++++++++++++++++
 .../hadoop/ozone/om/codec/OMDBDefinition.java      | 10 ++++++--
 .../ozone/om/ratis/OzoneManagerDoubleBuffer.java   |  6 +----
 .../om/ratis/utils/OzoneManagerRatisUtils.java     |  3 +--
 .../apache/hadoop/ozone/om/TestOMDBDefinition.java |  3 +--
 .../ozone/recon/tasks/OMDBUpdatesHandler.java      |  6 ++---
 .../ozone/recon/tasks/TestOMDBUpdatesHandler.java  |  2 +-
 .../recon/tasks/TestOmUpdateEventValidator.java    |  5 ++--
 .../hadoop/ozone/debug/DBDefinitionFactory.java    | 30 ++++++++++------------
 .../ozone/debug/TestDBDefinitionFactory.java       | 21 ++++++++-------
 10 files changed, 62 insertions(+), 46 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBDefinition.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBDefinition.java
index 968d62f0dd..461bd35f41 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBDefinition.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBDefinition.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hdds.utils.db;
 
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.server.ServerUtils;
+import org.apache.ratis.util.MemoizedSupplier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,6 +29,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 
 /**
  * Simple interface to provide information to create a DBStore..
@@ -55,6 +59,16 @@ public interface DBDefinition {
             getLocationConfigKey(), getName());
   }
 
+  static List<String> 
getColumnFamilyNames(Iterable<DBColumnFamilyDefinition<?, ?>> columnFamilies) {
+    return 
Collections.unmodifiableList(StreamSupport.stream(columnFamilies.spliterator(), 
false)
+        .map(DBColumnFamilyDefinition::getName)
+        .collect(Collectors.toList()));
+  }
+
+  default List<String> getColumnFamilyNames() {
+    return getColumnFamilyNames(getColumnFamilies());
+  }
+
   /**
    * @return The column families present in the DB.
    */
@@ -109,9 +123,17 @@ public interface DBDefinition {
    */
   abstract class WithMap implements WithMapInterface {
     private final Map<String, DBColumnFamilyDefinition<?, ?>> map;
+    private final Supplier<List<String>> columnFamilyNames;
 
     protected WithMap(Map<String, DBColumnFamilyDefinition<?, ?>> map) {
       this.map = map;
+      this.columnFamilyNames = MemoizedSupplier.valueOf(
+          () -> DBDefinition.getColumnFamilyNames(getColumnFamilies()));
+    }
+
+    @Override
+    public final List<String> getColumnFamilyNames() {
+      return columnFamilyNames.get();
     }
 
     @Override
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
index de567447ae..d48b413a2a 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
@@ -50,7 +50,7 @@ import java.util.Map;
 /**
  * Class defines the structure and types of the om.db.
  */
-public class OMDBDefinition extends DBDefinition.WithMap {
+public final class OMDBDefinition extends DBDefinition.WithMap {
 
   public static final DBColumnFamilyDefinition<String, RepeatedOmKeyInfo>
             DELETED_TABLE =
@@ -284,7 +284,13 @@ public class OMDBDefinition extends DBDefinition.WithMap {
           USER_TABLE,
           VOLUME_TABLE);
 
-  public OMDBDefinition() {
+  private static final OMDBDefinition INSTANCE = new OMDBDefinition();
+
+  public static OMDBDefinition get() {
+    return INSTANCE;
+  }
+
+  private OMDBDefinition() {
     super(COLUMN_FAMILIES);
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
index 753088183b..42ae90b918 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
@@ -40,7 +40,6 @@ import java.util.stream.Collectors;
 import org.apache.hadoop.hdds.tracing.TracingUtil;
 import org.apache.hadoop.hdds.utils.TransactionInfo;
 import org.apache.hadoop.hdds.utils.db.BatchOperation;
-import org.apache.hadoop.hdds.utils.db.DBColumnFamilyDefinition;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.S3SecretManager;
 import org.apache.hadoop.ozone.om.codec.OMDBDefinition;
@@ -478,10 +477,7 @@ public final class OzoneManagerDoubleBuffer {
     if (cleanupTableInfo != null) {
       final List<String> cleanupTables;
       if (cleanupTableInfo.cleanupAll()) {
-        cleanupTables = new OMDBDefinition().getColumnFamilies()
-            .stream()
-            .map(DBColumnFamilyDefinition::getName)
-            .collect(Collectors.toList());
+        cleanupTables = OMDBDefinition.get().getColumnFamilyNames();
       } else {
         cleanupTables = Arrays.asList(cleanupTableInfo.cleanupTables());
       }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
index 5a1612e021..226a547532 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
@@ -439,8 +439,7 @@ public final class OzoneManagerRatisUtils {
    */
   public static TransactionInfo getTrxnInfoFromCheckpoint(
       OzoneConfiguration conf, Path dbPath) throws Exception {
-    return HAUtils
-        .getTrxnInfoFromCheckpoint(conf, dbPath, new OMDBDefinition());
+    return HAUtils.getTrxnInfoFromCheckpoint(conf, dbPath, 
OMDBDefinition.get());
   }
 
   /**
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 36245dc874..9ae85b0fcb 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
@@ -45,11 +45,10 @@ public class TestOMDBDefinition {
     OzoneConfiguration configuration = new OzoneConfiguration();
     File metaDir = folder.toFile();
     DBStore store = OmMetadataManagerImpl.loadDB(configuration, metaDir);
-    OMDBDefinition dbDef = new OMDBDefinition();
 
     // Get list of tables from DB Definitions
     final Collection<DBColumnFamilyDefinition<?, ?>> columnFamilyDefinitions
-        = dbDef.getColumnFamilies();
+        = OMDBDefinition.get().getColumnFamilies();
     final int countOmDefTables = columnFamilyDefinitions.size();
     ArrayList<String> missingDBDefTables = new ArrayList<>();
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java
index 41e6bf962a..d1f98c49bd 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java
@@ -49,14 +49,12 @@ public class OMDBUpdatesHandler extends 
ManagedWriteBatch.Handler {
   private OMMetadataManager omMetadataManager;
   private List<OMDBUpdateEvent> omdbUpdateEvents = new ArrayList<>();
   private Map<String, Map<Object, OMDBUpdateEvent>> omdbLatestUpdateEvents = 
new HashMap<>();
-  private OMDBDefinition omdbDefinition;
-  private OmUpdateEventValidator omUpdateEventValidator;
+  private final OMDBDefinition omdbDefinition = OMDBDefinition.get();
+  private final OmUpdateEventValidator omUpdateEventValidator = new 
OmUpdateEventValidator(omdbDefinition);
 
   public OMDBUpdatesHandler(OMMetadataManager metadataManager) {
     omMetadataManager = metadataManager;
     tablesNames = metadataManager.getStore().getTableNames();
-    omdbDefinition = new OMDBDefinition();
-    omUpdateEventValidator = new OmUpdateEventValidator(omdbDefinition);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOMDBUpdatesHandler.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOMDBUpdatesHandler.java
index 3831f03bfd..f4f0bfe9ac 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOMDBUpdatesHandler.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOMDBUpdatesHandler.java
@@ -68,7 +68,7 @@ public class TestOMDBUpdatesHandler {
 
   private OMMetadataManager omMetadataManager;
   private OMMetadataManager reconOmMetadataManager;
-  private OMDBDefinition omdbDefinition = new OMDBDefinition();
+  private final OMDBDefinition omdbDefinition = OMDBDefinition.get();
   private Random random = new Random();
 
   private OzoneConfiguration createNewTestPath(String folderName)
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmUpdateEventValidator.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmUpdateEventValidator.java
index 0adb44e87c..7da98acb38 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmUpdateEventValidator.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmUpdateEventValidator.java
@@ -53,7 +53,7 @@ import static org.mockito.Mockito.times;
 public class TestOmUpdateEventValidator {
 
   private OmUpdateEventValidator eventValidator;
-  private OMDBDefinition omdbDefinition;
+  private final OMDBDefinition omdbDefinition = OMDBDefinition.get();
   private OMMetadataManager omMetadataManager;
   private Logger logger;
   @TempDir
@@ -63,11 +63,10 @@ public class TestOmUpdateEventValidator {
   public void setUp() throws IOException {
     omMetadataManager = initializeNewOmMetadataManager(
         temporaryFolder.toFile());
-    omdbDefinition = new OMDBDefinition();
     eventValidator = new OmUpdateEventValidator(omdbDefinition);
     // Create a mock logger
     logger = mock(Logger.class);
-    eventValidator.setLogger(logger);
+    OmUpdateEventValidator.setLogger(logger);
   }
 
   @Test
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/DBDefinitionFactory.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/DBDefinitionFactory.java
index a163cda250..98cb69d60a 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/DBDefinitionFactory.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/DBDefinitionFactory.java
@@ -20,7 +20,10 @@ package org.apache.hadoop.ozone.debug;
 
 import java.nio.file.Path;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.scm.metadata.SCMDBDefinition;
@@ -48,17 +51,14 @@ public final class DBDefinitionFactory {
   private DBDefinitionFactory() {
   }
 
-  private static HashMap<String, DBDefinition> dbMap;
-
-  private static String dnDBSchemaVersion;
+  private static final AtomicReference<String> DATANODE_DB_SCHEMA_VERSION = 
new AtomicReference<>();
+  private static final Map<String, DBDefinition> DB_MAP;
 
   static {
-    dbMap = new HashMap<>();
-    Arrays.asList(
-      new SCMDBDefinition(),
-        new OMDBDefinition(),
-        new ReconSCMDBDefinition()
-    ).forEach(dbDefinition -> dbMap.put(dbDefinition.getName(), dbDefinition));
+    final Map<String, DBDefinition> map = new HashMap<>();
+    Arrays.asList(new SCMDBDefinition(), OMDBDefinition.get(), new 
ReconSCMDBDefinition())
+        .forEach(dbDefinition -> map.put(dbDefinition.getName(), 
dbDefinition));
+    DB_MAP = Collections.unmodifiableMap(map);
   }
 
   public static DBDefinition getDefinition(String dbName) {
@@ -66,10 +66,8 @@ public final class DBDefinitionFactory {
     if (!dbName.equals(OM_DB_NAME) && dbName.startsWith(OM_DB_NAME)) {
       dbName = OM_DB_NAME;
     }
-    if (dbMap.containsKey(dbName)) {
-      return dbMap.get(dbName);
-    }
-    return getReconDBDefinition(dbName);
+    final DBDefinition definition = DB_MAP.get(dbName);
+    return definition != null ? definition : getReconDBDefinition(dbName);
   }
 
   public static DBDefinition getDefinition(Path dbPath,
@@ -83,7 +81,7 @@ public final class DBDefinitionFactory {
     }
     String dbName = fileName.toString();
     if (dbName.endsWith(OzoneConsts.CONTAINER_DB_SUFFIX)) {
-      switch (dnDBSchemaVersion) {
+      switch (DATANODE_DB_SCHEMA_VERSION.get()) {
       case "V1":
         return new DatanodeSchemaOneDBDefinition(
             dbPath.toAbsolutePath().toString(), config);
@@ -102,12 +100,12 @@ public final class DBDefinitionFactory {
     if (dbName.startsWith(RECON_CONTAINER_KEY_DB)) {
       return new ReconDBDefinition(dbName);
     } else if (dbName.startsWith(RECON_OM_SNAPSHOT_DB)) {
-      return new OMDBDefinition();
+      return OMDBDefinition.get();
     }
     return null;
   }
 
   public static void setDnDBSchemaVersion(String dnDBSchemaVersion) {
-    DBDefinitionFactory.dnDBSchemaVersion = dnDBSchemaVersion;
+    DATANODE_DB_SCHEMA_VERSION.set(dnDBSchemaVersion);
   }
 }
diff --git 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/debug/TestDBDefinitionFactory.java
 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/debug/TestDBDefinitionFactory.java
index 5e25901293..9152e357ce 100644
--- 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/debug/TestDBDefinitionFactory.java
+++ 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/debug/TestDBDefinitionFactory.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.ozone.debug;
 
+import java.nio.file.Path;
 import java.nio.file.Paths;
 
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -43,8 +44,7 @@ public class TestDBDefinitionFactory {
 
   @Test
   public void testGetDefinition() {
-    DBDefinition definition =
-        DBDefinitionFactory.getDefinition(new OMDBDefinition().getName());
+    DBDefinition definition = 
DBDefinitionFactory.getDefinition(OMDBDefinition.get().getName());
     assertInstanceOf(OMDBDefinition.class, definition);
 
     definition = DBDefinitionFactory.getDefinition(
@@ -62,20 +62,19 @@ public class TestDBDefinitionFactory {
     definition = DBDefinitionFactory.getDefinition(
         RECON_CONTAINER_KEY_DB + "_1");
     assertInstanceOf(ReconDBDefinition.class, definition);
+
     DBDefinitionFactory.setDnDBSchemaVersion("V2");
-    definition =
-        DBDefinitionFactory.getDefinition(Paths.get("/tmp/test-container.db"),
-            new OzoneConfiguration());
+    final Path dbPath = Paths.get("/tmp/test-container.db");
+    final OzoneConfiguration conf = new OzoneConfiguration();
+    definition = DBDefinitionFactory.getDefinition(dbPath, conf);
     assertInstanceOf(DatanodeSchemaTwoDBDefinition.class, definition);
+
     DBDefinitionFactory.setDnDBSchemaVersion("V1");
-    definition =
-        DBDefinitionFactory.getDefinition(Paths.get("/tmp/test-container.db"),
-            new OzoneConfiguration());
+    definition = DBDefinitionFactory.getDefinition(dbPath, conf);
     assertInstanceOf(DatanodeSchemaOneDBDefinition.class, definition);
+
     DBDefinitionFactory.setDnDBSchemaVersion("V3");
-    definition =
-        DBDefinitionFactory.getDefinition(Paths.get("/tmp/test-container.db"),
-            new OzoneConfiguration());
+    definition = DBDefinitionFactory.getDefinition(dbPath, conf);
     assertInstanceOf(DatanodeSchemaThreeDBDefinition.class, definition);
   }
 }


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

Reply via email to