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 4710ac91c7c HDDS-13866. Use component-specific default directory for
Ratis (#9318)
4710ac91c7c is described below
commit 4710ac91c7c375ef8657aa81d1a47623caa75374
Author: Gargi Jaiswal <[email protected]>
AuthorDate: Mon Dec 15 16:05:34 2025 +0530
HDDS-13866. Use component-specific default directory for Ratis (#9318)
---
.../org/apache/hadoop/hdds/scm/ha/SCMHAUtils.java | 29 +---
.../org/apache/hadoop/hdds/server/ServerUtils.java | 132 +++++++++++++++-
.../apache/hadoop/hdds/utils/HddsServerUtil.java | 3 +-
.../apache/hadoop/hdds/server/TestServerUtils.java | 176 +++++++++++++++++++++
.../org/apache/hadoop/hdds/scm/ha/RatisUtil.java | 2 +-
.../dist/src/main/smoketest/omha/testOMHA.robot | 2 +-
.../hdds/scm/TestStorageContainerManager.java | 2 +-
.../ozone/parser/TestOzoneHARatisLogParser.java | 9 +-
.../org/apache/hadoop/ozone/om/OzoneManager.java | 12 +-
.../om/ratis/utils/OzoneManagerRatisUtils.java | 15 +-
10 files changed, 331 insertions(+), 51 deletions(-)
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAUtils.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAUtils.java
index daa25648f32..939777bebd1 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAUtils.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAUtils.java
@@ -17,19 +17,15 @@
package org.apache.hadoop.hdds.scm.ha;
-import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
-import static org.apache.hadoop.ozone.OzoneConsts.OZONE_RATIS_SNAPSHOT_DIR;
-
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
-import java.io.File;
import java.io.IOException;
-import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.hdds.HddsUtils;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
import org.apache.hadoop.hdds.ratis.ServerNotLeaderException;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException;
@@ -46,15 +42,11 @@
import org.apache.ratis.protocol.exceptions.ReconfigurationTimeoutException;
import org.apache.ratis.protocol.exceptions.ResourceUnavailableException;
import org.apache.ratis.protocol.exceptions.StateMachineException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Utility class used by SCM HA.
*/
public final class SCMHAUtils {
- private static final Logger LOG =
- LoggerFactory.getLogger(SCMHAUtils.class);
private static final ImmutableList<Class<? extends Exception>>
RETRIABLE_WITH_NO_FAILOVER_EXCEPTION_LIST =
@@ -97,31 +89,18 @@ public static String
getSCMRatisDirectory(ConfigurationSource conf) {
conf.get(ScmConfigKeys.OZONE_SCM_HA_RATIS_STORAGE_DIR);
if (Strings.isNullOrEmpty(scmRatisDirectory)) {
- scmRatisDirectory = ServerUtils.getDefaultRatisDirectory(conf);
+ scmRatisDirectory = ServerUtils.getDefaultRatisDirectory(conf,
NodeType.SCM);
}
return scmRatisDirectory;
}
- public static String getRatisStorageDir(final ConfigurationSource conf) {
- String storageDir = conf.get(ScmConfigKeys.OZONE_SCM_HA_RATIS_STORAGE_DIR);
- if (Strings.isNullOrEmpty(storageDir)) {
- File metaDirPath = ServerUtils.getOzoneMetaDirPath(conf);
- storageDir = (new File(metaDirPath, "scm-ha")).getPath();
- }
- return storageDir;
- }
-
public static String getSCMRatisSnapshotDirectory(ConfigurationSource conf) {
String snapshotDir =
conf.get(ScmConfigKeys.OZONE_SCM_HA_RATIS_SNAPSHOT_DIR);
- // If ratis snapshot directory is not set, fall back to ozone.metadata.dir.
+ // If ratis snapshot directory is not set, fall back to ozone.metadata.dir
with component-specific location.
if (Strings.isNullOrEmpty(snapshotDir)) {
- LOG.warn("SCM snapshot dir is not configured. Falling back to {} config",
- OZONE_METADATA_DIRS);
- File metaDirPath = ServerUtils.getOzoneMetaDirPath(conf);
- snapshotDir =
- Paths.get(metaDirPath.getPath(),
OZONE_RATIS_SNAPSHOT_DIR).toString();
+ snapshotDir = ServerUtils.getDefaultRatisSnapshotDirectory(conf,
NodeType.SCM);
}
return snapshotDir;
}
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/ServerUtils.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/ServerUtils.java
index 01f271b26ef..d6864d4f15d 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/ServerUtils.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/ServerUtils.java
@@ -21,17 +21,20 @@
import java.net.InetSocketAddress;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Collection;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
import org.apache.hadoop.hdds.recon.ReconConfigKeys;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.ipc_.RPC;
import org.apache.hadoop.ipc_.Server;
import org.apache.hadoop.ozone.OzoneConfigKeys;
+import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.security.UserGroupInformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -300,11 +303,136 @@ public static String getRemoteUserName() {
return remoteUser != null ? remoteUser.getUserName() : null;
}
- public static String getDefaultRatisDirectory(ConfigurationSource conf) {
+ /**
+ * Get the default Ratis directory for a component when the specific
+ * configuration is not set. This creates a component-specific subdirectory
+ * under ozone.metadata.dirs to avoid conflicts when multiple components
+ * are colocated on the same host.
+ *
+ * <p>For backward compatibility during upgrades, this method checks for
+ * existing Ratis data in old locations before using the new
component-specific
+ * location. See {@link #findExistingRatisDirectory} for details on old
locations.
+ *
+ * @param conf Configuration source
+ * @param nodeType Type of the node component
+ * @return Path to the component-specific ratis directory
+ */
+ public static String getDefaultRatisDirectory(ConfigurationSource conf,
+ NodeType nodeType) {
LOG.warn("Storage directory for Ratis is not configured. It is a good " +
"idea to map this to an SSD disk. Falling back to {}",
HddsConfigKeys.OZONE_METADATA_DIRS);
File metaDirPath = ServerUtils.getOzoneMetaDirPath(conf);
- return (new File(metaDirPath, "ratis")).getPath();
+
+ // Check for existing Ratis data from old versions for backward
compatibility
+ String existingDir = findExistingRatisDirectory(metaDirPath, nodeType);
+ if (existingDir != null) {
+ return existingDir;
+ }
+
+ // Use new component-specific location for new installations
+ String componentName = getComponentName(nodeType);
+ return Paths.get(metaDirPath.getPath(), componentName +
".ratis").toString();
+ }
+
+ /**
+ * Checks for existing Ratis directories from previous versions for backward
+ * compatibility during upgrades.
+ *
+ * <p>Older versions of Ozone used different directory structures:
+ * <ul>
+ * <li>Versions up to 2.0.0: Shared {@code <ozone.metadata.dirs>/ratis}
for all components</li>
+ * <li>Some SCM versions: Used {@code <ozone.metadata.dirs>/scm-ha}</li>
+ * </ul>
+ *
+ * @param metaDirPath The ozone metadata directory path
+ * @param nodeType Type of the node component
+ * @return Path to existing old Ratis directory if found, null otherwise
+ */
+ private static String findExistingRatisDirectory(File metaDirPath,
+ NodeType nodeType) {
+ // Check component-specific old location (SCM used scm-ha in some versions)
+ if ("scm".equals(getComponentName(nodeType))) {
+ File oldScmRatisDir = new File(metaDirPath, "scm-ha");
+ if (isNonEmptyDirectory(oldScmRatisDir)) {
+ LOG.info("Found existing SCM Ratis directory at old location: {}. " +
+ "Using it for backward compatibility during upgrade.",
+ oldScmRatisDir.getPath());
+ return oldScmRatisDir.getPath();
+ }
+ }
+
+ // Check old shared Ratis location (used by version 2.0.0 and earlier)
+ // All components (OM, SCM) shared /data/metadata/ratis
+ File oldSharedRatisDir = new File(metaDirPath, "ratis");
+ if (isNonEmptyDirectory(oldSharedRatisDir)) {
+ LOG.info("Found existing Ratis directory at old shared location: {}. " +
+ "Using it for backward compatibility during upgrade.",
+ oldSharedRatisDir.getPath());
+ return oldSharedRatisDir.getPath();
+ }
+
+ return null;
+ }
+
+ /**
+ * Converts NodeType enum to the component name string used for directory
naming.
+ *
+ * @param nodeType Type of the node component
+ * @return Component name string (e.g., "om", "scm", "dn", "recon")
+ */
+ private static String getComponentName(NodeType nodeType) {
+ switch (nodeType) {
+ case OM:
+ return "om";
+ case SCM:
+ return "scm";
+ case DATANODE:
+ return "dn";
+ case RECON:
+ return "recon";
+ default:
+ throw new IllegalArgumentException("Unknown NodeType: " + nodeType);
+ }
+ }
+
+ /**
+ * Get the default Ratis snapshot directory for a component when the specific
+ * configuration is not set. This creates a component-specific subdirectory
+ * under ozone.metadata.dirs to avoid conflicts when multiple components
+ * are colocated on the same host.
+ *
+ * New path format: {ozone.metadata.dirs}/{NodeType}.ratis.snapshot
+ * eg: /data/metadata/om.ratis.snapshot
+ * /data/metadata/scm.ratis.snapshot
+ *
+ * @param conf Configuration source
+ * @param nodeType Type of the node component
+ * @return Path to the component-specific ratis snapshot directory
+ */
+ public static String getDefaultRatisSnapshotDirectory(ConfigurationSource
conf,
+ NodeType nodeType) {
+ LOG.warn("Snapshot directory for Ratis is not configured. Falling back to
{}",
+ HddsConfigKeys.OZONE_METADATA_DIRS);
+ File metaDirPath = ServerUtils.getOzoneMetaDirPath(conf);
+
+ // Use component-specific location
+ String componentName = getComponentName(nodeType);
+ return Paths.get(metaDirPath.getPath(),
+ componentName + ".ratis." +
OzoneConsts.OZONE_RATIS_SNAPSHOT_DIR).toString();
+ }
+
+ /**
+ * Checks if a directory exists and is non-empty.
+ *
+ * @param dir Directory to check
+ * @return true if directory exists and contains at least one file
+ */
+ private static boolean isNonEmptyDirectory(File dir) {
+ if (dir != null && dir.exists() && dir.isDirectory()) {
+ File[] files = dir.listFiles();
+ return files != null && files.length > 0;
+ }
+ return false;
}
}
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java
index ad37bc7531e..df4c31077aa 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java
@@ -76,6 +76,7 @@
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.SCMSecurityProtocol;
import org.apache.hadoop.hdds.protocol.SecretKeyProtocolScm;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
import
org.apache.hadoop.hdds.protocolPB.SCMSecurityProtocolClientSideTranslatorPB;
import
org.apache.hadoop.hdds.protocolPB.SecretKeyProtocolClientSideTranslatorPB;
import org.apache.hadoop.hdds.protocolPB.SecretKeyProtocolDatanodePB;
@@ -424,7 +425,7 @@ public static Collection<String>
getOzoneDatanodeRatisDirectory(
if (rawLocations.isEmpty()) {
rawLocations = new ArrayList<>(1);
- rawLocations.add(ServerUtils.getDefaultRatisDirectory(conf));
+ rawLocations.add(ServerUtils.getDefaultRatisDirectory(conf,
NodeType.DATANODE));
}
return rawLocations;
}
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/TestServerUtils.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/TestServerUtils.java
index a7bbeccbd19..1eb633f455e 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/TestServerUtils.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/TestServerUtils.java
@@ -17,8 +17,12 @@
package org.apache.hadoop.hdds.server;
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType.DATANODE;
+import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType.OM;
+import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType.SCM;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -28,6 +32,7 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
@@ -263,4 +268,175 @@ public void ozoneMetadataDirRejectsList() {
() -> ServerUtils.getOzoneMetaDirPath(conf));
}
+ /**
+ * Test that SCM, OM, and Datanode colocated on the same host with only
+ * ozone.metadata.dirs configured don't conflict with Ratis directories.
+ */
+ @Test
+ public void testColocatedComponentsWithSharedMetadataDir() {
+ final File metaDir = new File(folder.toFile(), "sharedMetaDir");
+ final OzoneConfiguration conf = new OzoneConfiguration();
+
+ // Only configure ozone.metadata.dirs (the fallback config)
+ conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDir.getPath());
+
+ try {
+ assertFalse(metaDir.exists());
+
+ // Test Ratis directories - each component should get its own with flat
naming
+ String scmRatisDir = ServerUtils.getDefaultRatisDirectory(conf, SCM);
+ String omRatisDir = ServerUtils.getDefaultRatisDirectory(conf, OM);
+ String dnRatisDir = ServerUtils.getDefaultRatisDirectory(conf, DATANODE);
+
+ // Verify Ratis directories use flat naming pattern (component.ratis)
+ assertEquals(new File(metaDir, "scm.ratis").getPath(), scmRatisDir);
+ assertEquals(new File(metaDir, "om.ratis").getPath(), omRatisDir);
+ assertEquals(new File(metaDir, "dn.ratis").getPath(), dnRatisDir);
+
+ // Verify all Ratis directories are different
+ assertNotEquals(scmRatisDir, omRatisDir);
+ assertNotEquals(scmRatisDir, dnRatisDir);
+ assertNotEquals(omRatisDir, dnRatisDir);
+
+ // Verify the base metadata dir exists
+ assertTrue(metaDir.exists());
+
+ } finally {
+ FileUtils.deleteQuietly(metaDir);
+ }
+ }
+
+ @Test
+ public void testEmptyOldSharedRatisIgnored() throws IOException {
+ final File metaDir = new File(folder.toFile(), "upgradeMetaDir");
+ final File oldSharedRatisDir = new File(metaDir, "ratis");
+ final OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDir.getPath());
+
+ try {
+ // Create old Ratis directory (empty)
+ assertTrue(oldSharedRatisDir.mkdirs());
+
+ // SCM should use new SCM path
+ String scmRatisDir = ServerUtils.getDefaultRatisDirectory(conf, SCM);
+ assertEquals(Paths.get(metaDir.getPath(), "scm.ratis").toString(),
scmRatisDir);
+
+ // OM should use new OM path
+ String omRatisDir = ServerUtils.getDefaultRatisDirectory(conf, OM);
+ assertEquals(Paths.get(metaDir.getPath(), "om.ratis").toString(),
omRatisDir);
+
+ } finally {
+ FileUtils.deleteQuietly(metaDir);
+ }
+ }
+
+ /**
+ * Test backward compatibility: old shared /ratis directory should be used
+ * when it exists and is non-empty (simulating upgrade from version 2.0.0).
+ */
+ @Test
+ public void testBackwardCompatibilityWithOldSharedRatisDir() throws
IOException {
+ final File metaDir = new File(folder.toFile(), "upgradeMetaDir");
+ final File oldSharedRatisDir = new File(metaDir, "ratis");
+ final OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDir.getPath());
+
+ try {
+ // Create old shared ratis directory with some files (simulating
existing data)
+ assertTrue(oldSharedRatisDir.mkdirs());
+ File testFile = new File(oldSharedRatisDir, "test-file");
+ assertTrue(testFile.createNewFile());
+
+ // Test that all components use the old shared location
+ String scmRatisDir = ServerUtils.getDefaultRatisDirectory(conf, SCM);
+ String omRatisDir = ServerUtils.getDefaultRatisDirectory(conf, OM);
+ String dnRatisDir = ServerUtils.getDefaultRatisDirectory(conf, DATANODE);
+
+ // All should use the old shared location
+ assertEquals(oldSharedRatisDir.getPath(), scmRatisDir);
+ assertEquals(oldSharedRatisDir.getPath(), omRatisDir);
+ assertEquals(oldSharedRatisDir.getPath(), dnRatisDir);
+
+ } finally {
+ FileUtils.deleteQuietly(metaDir);
+ }
+ }
+
+ /**
+ * Test backward compatibility: SCM-specific /scm-ha directory should be
preferred
+ * over shared /ratis directory when both exist and are non-empty.
+ * OM and DATANODE should continue using /ratis even when /scm-ha exists.
+ */
+ @Test
+ public void testBackwardCompatibilityWithScmHaDirectory() throws IOException
{
+ final File metaDir = new File(folder.toFile(), "upgradeMetaDir");
+ final File oldScmHaDir = new File(metaDir, "scm-ha");
+ final File oldSharedRatisDir = new File(metaDir, "ratis");
+ final OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDir.getPath());
+
+ try {
+ // Create both scm-ha and ratis directories with files
+ assertTrue(oldScmHaDir.mkdirs());
+ File scmHaTestFile = new File(oldScmHaDir, "scm-ha-file");
+ assertTrue(scmHaTestFile.createNewFile());
+
+ assertTrue(oldSharedRatisDir.mkdirs());
+ File ratisTestFile = new File(oldSharedRatisDir, "ratis-file");
+ assertTrue(ratisTestFile.createNewFile());
+
+ // SCM should prefer scm-ha over ratis
+ String scmRatisDir = ServerUtils.getDefaultRatisDirectory(conf, SCM);
+ assertEquals(oldScmHaDir.getPath(), scmRatisDir);
+ assertNotEquals(oldSharedRatisDir.getPath(), scmRatisDir);
+
+ // OM and DATANODE should still use ratis even when scm-ha exists
+ String omRatisDir = ServerUtils.getDefaultRatisDirectory(conf, OM);
+ String dnRatisDir = ServerUtils.getDefaultRatisDirectory(conf, DATANODE);
+ assertEquals(oldSharedRatisDir.getPath(), omRatisDir);
+ assertEquals(oldSharedRatisDir.getPath(), dnRatisDir);
+
+ // Test that empty scm-ha directory is ignored (SCM should fall back to
ratis)
+ FileUtils.deleteQuietly(scmHaTestFile);
+ String scmRatisDirWithEmptyScmHa =
ServerUtils.getDefaultRatisDirectory(conf, SCM);
+ assertEquals(oldSharedRatisDir.getPath(), scmRatisDirWithEmptyScmHa);
+
+ } finally {
+ FileUtils.deleteQuietly(metaDir);
+ }
+ }
+
+ /**
+ * Test that SCM and OM colocated on the same host with only
+ * ozone.metadata.dirs configured get separate Ratis snapshot directories.
+ */
+ @Test
+ public void testColocatedComponentsWithSharedMetadataDirForSnapshots() {
+ final File metaDir = new File(folder.toFile(), "sharedMetaDir");
+ final OzoneConfiguration conf = new OzoneConfiguration();
+
+ // Only configure ozone.metadata.dirs (the fallback config)
+ conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDir.getPath());
+
+ try {
+ assertFalse(metaDir.exists());
+
+ // Test Ratis snapshot directories - OM and SCM should get their own
+ String scmSnapshotDir =
ServerUtils.getDefaultRatisSnapshotDirectory(conf, SCM);
+ String omSnapshotDir =
ServerUtils.getDefaultRatisSnapshotDirectory(conf, OM);
+
+ // Verify snapshot directories use:
<ozone.metadata.dirs>/<component>.ratis.snapshot
+ assertEquals(new File(metaDir, "scm.ratis.snapshot").getPath(),
scmSnapshotDir);
+ assertEquals(new File(metaDir, "om.ratis.snapshot").getPath(),
omSnapshotDir);
+
+ // Verify snapshot directories are different
+ assertNotEquals(scmSnapshotDir, omSnapshotDir);
+
+ // Verify the base metadata dir exists
+ assertTrue(metaDir.exists());
+
+ } finally {
+ FileUtils.deleteQuietly(metaDir);
+ }
+ }
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java
index 5860d2523d4..f2900e38f40 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java
@@ -90,7 +90,7 @@ public static RaftProperties newRaftProperties(
public static void setRaftStorageDir(final RaftProperties properties,
final ConfigurationSource conf) {
RaftServerConfigKeys.setStorageDir(properties, Collections
- .singletonList(new File(SCMHAUtils.getRatisStorageDir(conf))));
+ .singletonList(new File(SCMHAUtils.getSCMRatisDirectory(conf))));
}
/**
diff --git a/hadoop-ozone/dist/src/main/smoketest/omha/testOMHA.robot
b/hadoop-ozone/dist/src/main/smoketest/omha/testOMHA.robot
index 70fc66a228f..df7c914273e 100644
--- a/hadoop-ozone/dist/src/main/smoketest/omha/testOMHA.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/omha/testOMHA.robot
@@ -28,7 +28,7 @@ ${USERNAME} hadoop
${PUBLIC_KEY} /opt/.ssh/id_rsa
${OM_SERVICE_ID} %{OM_SERVICE_ID}
${OZONE_LOG_DIR} /ozone/logs/
-${RATIS_DIR} /data/metadata/ratis
+${RATIS_DIR} /data/metadata/om.ratis
${VOLUME} volume1
${BUCKET} bucket1
${TEST_FILE} NOTICE.txt
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManager.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManager.java
index 7276dc871ea..8af00a8b0ed 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManager.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManager.java
@@ -183,7 +183,7 @@ void test(@TempDir Path tempDir) throws Exception {
StorageContainerManager scm = cluster.getStorageContainerManager();
List<File> directories = Arrays.asList(
- new File(SCMHAUtils.getRatisStorageDir(scm.getConfiguration())),
+ new File(SCMHAUtils.getSCMRatisDirectory(scm.getConfiguration())),
scm.getScmMetadataStore().getStore().getDbLocation(),
new File(scm.getScmStorageConfig().getStorageDir())
);
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/parser/TestOzoneHARatisLogParser.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/parser/TestOzoneHARatisLogParser.java
index c3c9b08d996..02f518c65e8 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/parser/TestOzoneHARatisLogParser.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/parser/TestOzoneHARatisLogParser.java
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.parser;
import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -40,6 +39,7 @@
import org.apache.hadoop.ozone.client.OzoneClientFactory;
import org.apache.hadoop.ozone.debug.ratis.parse.RatisLogParser;
import org.apache.hadoop.ozone.om.helpers.OMRatisHelper;
+import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ozone.test.tag.Flaky;
import org.junit.jupiter.api.AfterEach;
@@ -105,8 +105,9 @@ void testRatisLogParsing() throws Exception {
cluster.stop();
- File omMetaDir = new File(ozoneConfiguration.get(OZONE_METADATA_DIRS),
- "ratis");
+ // Get the OM Ratis directory using the proper utility method
+ File omMetaDir = new File(
+ OzoneManagerRatisUtils.getOMRatisDirectory(ozoneConfiguration));
assertThat(omMetaDir).isDirectory();
String[] ratisDirs = omMetaDir.list();
@@ -134,7 +135,7 @@ void testRatisLogParsing() throws Exception {
// Now check for SCM.
File scmMetadataDir =
- new File(SCMHAUtils.getRatisStorageDir(leaderSCMConfig));
+ new File(SCMHAUtils.getSCMRatisDirectory(leaderSCMConfig));
assertThat(scmMetadataDir).isDirectory();
ratisDirs = scmMetadataDir.list();
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 343c46158dc..a51a0b56ecd 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
@@ -184,7 +184,6 @@
import org.apache.hadoop.hdds.scm.ScmInfo;
import org.apache.hadoop.hdds.scm.client.HddsClientUtils;
import org.apache.hadoop.hdds.scm.client.ScmTopologyClient;
-import org.apache.hadoop.hdds.scm.ha.SCMHAUtils;
import org.apache.hadoop.hdds.scm.ha.SCMNodeInfo;
import org.apache.hadoop.hdds.scm.net.NetworkTopology;
import org.apache.hadoop.hdds.scm.protocol.ScmBlockLocationProtocol;
@@ -1607,10 +1606,13 @@ private void initializeRatisDirs(OzoneConfiguration
conf) throws IOException {
}
OmUtils.createOMDir(omRatisDirectory);
- String scmStorageDir = SCMHAUtils.getRatisStorageDir(conf);
- if (!Strings.isNullOrEmpty(omRatisDirectory) && !Strings
- .isNullOrEmpty(scmStorageDir) && omRatisDirectory
- .equals(scmStorageDir)) {
+ String omRatisConfigured =
conf.get(OMConfigKeys.OZONE_OM_RATIS_STORAGE_DIR);
+ String scmRatisConfigured =
conf.get(ScmConfigKeys.OZONE_SCM_HA_RATIS_STORAGE_DIR);
+
+ // Only check co-location if BOTH are explicitly configured
+ if (!Strings.isNullOrEmpty(omRatisConfigured) &&
+ !Strings.isNullOrEmpty(scmRatisConfigured) &&
+ omRatisConfigured.equals(scmRatisConfigured)) {
throw new IOException(
"Path of " + OMConfigKeys.OZONE_OM_RATIS_STORAGE_DIR + " and "
+ ScmConfigKeys.OZONE_SCM_HA_RATIS_STORAGE_DIR
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 5548be7bd8b..1778de3520d 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
@@ -17,21 +17,18 @@
package org.apache.hadoop.ozone.om.ratis.utils;
-import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
-import static org.apache.hadoop.ozone.OzoneConsts.OZONE_RATIS_SNAPSHOT_DIR;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_RATIS_SNAPSHOT_DIR;
import static org.apache.hadoop.ozone.om.OzoneManagerUtils.getBucketLayout;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.protobuf.ServiceException;
-import java.io.File;
import java.io.IOException;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
-import java.nio.file.Paths;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
import org.apache.hadoop.hdds.security.SecurityConfig;
import
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
import org.apache.hadoop.hdds.server.ServerUtils;
@@ -472,7 +469,7 @@ public static String
getOMRatisDirectory(ConfigurationSource conf) {
String storageDir = conf.get(OMConfigKeys.OZONE_OM_RATIS_STORAGE_DIR);
if (Strings.isNullOrEmpty(storageDir)) {
- storageDir = ServerUtils.getDefaultRatisDirectory(conf);
+ storageDir = ServerUtils.getDefaultRatisDirectory(conf, NodeType.OM);
}
return storageDir;
}
@@ -483,13 +480,9 @@ public static String
getOMRatisDirectory(ConfigurationSource conf) {
public static String getOMRatisSnapshotDirectory(ConfigurationSource conf) {
String snapshotDir = conf.get(OZONE_OM_RATIS_SNAPSHOT_DIR);
- // If ratis snapshot directory is not set, fall back to ozone.metadata.dir.
+ // If ratis snapshot directory is not set, fall back to default
component-specific location.
if (Strings.isNullOrEmpty(snapshotDir)) {
- LOG.warn("{} is not configured. Falling back to {} config",
- OZONE_OM_RATIS_SNAPSHOT_DIR, OZONE_METADATA_DIRS);
- File metaDirPath = ServerUtils.getOzoneMetaDirPath(conf);
- snapshotDir = Paths.get(metaDirPath.getPath(),
- OZONE_RATIS_SNAPSHOT_DIR).toString();
+ snapshotDir = ServerUtils.getDefaultRatisSnapshotDirectory(conf,
NodeType.OM);
}
return snapshotDir;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]