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 968d62f0dd5a..461bd35f413c 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 @@ 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.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 @@ default File getDBLocation(ConfigurationSource conf) { getLocationConfigKey(), getName()); } + static List getColumnFamilyNames(Iterable> columnFamilies) { + return Collections.unmodifiableList(StreamSupport.stream(columnFamilies.spliterator(), false) + .map(DBColumnFamilyDefinition::getName) + .collect(Collectors.toList())); + } + + default List getColumnFamilyNames() { + return getColumnFamilyNames(getColumnFamilies()); + } + /** * @return The column families present in the DB. */ @@ -109,9 +123,17 @@ interface WithMapInterface extends DBDefinition { */ abstract class WithMap implements WithMapInterface { private final Map> map; + private final Supplier> columnFamilyNames; protected WithMap(Map> map) { this.map = map; + this.columnFamilyNames = MemoizedSupplier.valueOf( + () -> DBDefinition.getColumnFamilyNames(getColumnFamilies())); + } + + @Override + public final List 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 de567447ae36..d48b413a2ae6 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 @@ /** * 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 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 753088183b50..42ae90b91819 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 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 @@ private void addCleanupEntry(Entry entry, Map> cleanupEpochs) if (cleanupTableInfo != null) { final List 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 5a1612e021a3..226a54753256 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 static Status exceptionToResponseStatus(Exception exception) { */ 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 36245dc8741d..9ae85b0fcb62 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 void testDBDefinition() throws Exception { 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> columnFamilyDefinitions - = dbDef.getColumnFamilies(); + = OMDBDefinition.get().getColumnFamilies(); final int countOmDefTables = columnFamilyDefinitions.size(); ArrayList 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 41e6bf962a7e..d1f98c49bdcf 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 omdbUpdateEvents = new ArrayList<>(); private Map> 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 3831f03bfd89..f4f0bfe9acdd 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 0adb44e87ca7..7da98acb38f0 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 @@ 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 a163cda25021..98cb69d60ac7 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 @@ 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 dbMap; - - private static String dnDBSchemaVersion; + private static final AtomicReference DATANODE_DB_SCHEMA_VERSION = new AtomicReference<>(); + private static final Map DB_MAP; static { - dbMap = new HashMap<>(); - Arrays.asList( - new SCMDBDefinition(), - new OMDBDefinition(), - new ReconSCMDBDefinition() - ).forEach(dbDefinition -> dbMap.put(dbDefinition.getName(), dbDefinition)); + final Map 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 static DBDefinition getDefinition(String dbName) { 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 static DBDefinition getDefinition(Path dbPath, } 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 @@ private static DBDefinition getReconDBDefinition(String dbName) { 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 5e2590129342..9152e357cef8 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 void testGetDefinition() { 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); } }