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

sammichen 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 6ed1e58dd5 HDDS-10230. Preventing V3 Schema from Creating Container DB 
in the Wrong Location (#6113)
6ed1e58dd5 is described below

commit 6ed1e58dd598e4dbc8948e1c23ae67dd1e55104c
Author: XiChen <[email protected]>
AuthorDate: Mon Apr 8 15:32:04 2024 +0800

    HDDS-10230. Preventing V3 Schema from Creating Container DB in the Wrong 
Location (#6113)
---
 .../ozone/container/common/volume/HddsVolume.java  | 21 ++++++++++++-
 .../container/common/volume/MutableVolumeSet.java  | 12 ++++++--
 .../helpers/KeyValueContainerLocationUtil.java     | 10 +++----
 .../container/common/impl/TestHddsDispatcher.java  |  9 ++++++
 .../container/common/utils/TestHddsVolumeUtil.java | 35 ++++++++++++++++++++++
 .../common/volume/TestVolumeSetDiskChecks.java     |  9 ++++++
 .../replication/TestGrpcReplicationService.java    |  3 ++
 .../upgrade/TestDatanodeUpgradeToScmHA.java        |  3 ++
 .../ozone/container/common/TestEndPoint.java       |  4 ++-
 .../container/metrics/TestContainerMetrics.java    |  6 ++++
 .../container/ozoneimpl/TestOzoneContainer.java    |  6 ++++
 .../ozoneimpl/TestOzoneContainerWithTLS.java       |  5 ++++
 .../ozoneimpl/TestSecureOzoneContainer.java        |  5 ++++
 .../container/server/TestContainerServer.java      |  9 +++++-
 .../server/TestSecureContainerServer.java          | 15 +++++++---
 15 files changed, 137 insertions(+), 15 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
index d8ba919cef..d4cdaf2cfe 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
@@ -92,6 +92,7 @@ public class HddsVolume extends StorageVolume {
   private File dbParentDir;
   private File deletedContainerDir;
   private AtomicBoolean dbLoaded = new AtomicBoolean(false);
+  private final AtomicBoolean dbLoadFailure = new AtomicBoolean(false);
 
   /**
    * Builder for HddsVolume.
@@ -257,6 +258,11 @@ public class HddsVolume extends StorageVolume {
     VolumeCheckResult result = super.check(unused);
 
     DatanodeConfiguration df = 
getConf().getObject(DatanodeConfiguration.class);
+    if (isDbLoadFailure()) {
+      LOG.warn("Volume {} failed to access RocksDB: RocksDB parent directory 
is null, " +
+          "the volume might not have been loaded properly.", getStorageDir());
+      return VolumeCheckResult.FAILED;
+    }
     if (result != VolumeCheckResult.HEALTHY ||
         !df.getContainerSchemaV3Enabled() || !isDbLoaded()) {
       return result;
@@ -313,6 +319,11 @@ public class HddsVolume extends StorageVolume {
     return this.dbParentDir;
   }
 
+  @VisibleForTesting
+  public void setDbParentDir(File dbParentDir) {
+    this.dbParentDir = dbParentDir;
+  }
+
   public File getDeletedContainerDir() {
     return this.deletedContainerDir;
   }
@@ -326,6 +337,10 @@ public class HddsVolume extends StorageVolume {
     return dbLoaded.get();
   }
 
+  public boolean isDbLoadFailure() {
+    return dbLoadFailure.get();
+  }
+
   public void loadDbStore(boolean readOnly) throws IOException {
     // DN startup for the first time, not registered yet,
     // so the DbVolume is not formatted.
@@ -363,7 +378,8 @@ public class HddsVolume extends StorageVolume {
     String containerDBPath = containerDBFile.getAbsolutePath();
     try {
       initPerDiskDBStore(containerDBPath, getConf(), readOnly);
-    } catch (IOException e) {
+    } catch (Throwable e) {
+      dbLoadFailure.set(true);
       throw new IOException("Can't init db instance under path "
           + containerDBPath + " for volume " + getStorageID(), e);
     }
@@ -417,9 +433,11 @@ public class HddsVolume extends StorageVolume {
     try {
       HddsVolumeUtil.initPerDiskDBStore(containerDBPath, getConf(), false);
       dbLoaded.set(true);
+      dbLoadFailure.set(false);
       LOG.info("SchemaV3 db is created and loaded at {} for volume {}",
           containerDBPath, getStorageID());
     } catch (IOException e) {
+      dbLoadFailure.set(true);
       String errMsg = "Can't create db instance under path "
           + containerDBPath + " for volume " + getStorageID();
       LOG.error(errMsg, e);
@@ -448,6 +466,7 @@ public class HddsVolume extends StorageVolume {
         .getAbsolutePath();
     DatanodeStoreCache.getInstance().removeDB(containerDBPath);
     dbLoaded.set(false);
+    dbLoadFailure.set(false);
     LOG.info("SchemaV3 db is stopped at {} for volume {}", containerDBPath,
         getStorageID());
   }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
index 3c0b6e618e..e195b127d4 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
@@ -442,12 +442,20 @@ public class MutableVolumeSet implements VolumeSet {
   public boolean hasEnoughVolumes() {
     // Max number of bad volumes allowed, should have at least
     // 1 good volume
+    boolean hasEnoughVolumes;
     if (maxVolumeFailuresTolerated ==
         StorageVolumeChecker.MAX_VOLUME_FAILURE_TOLERATED_LIMIT) {
-      return getVolumesList().size() >= 1;
+      hasEnoughVolumes = getVolumesList().size() >= 1;
     } else {
-      return getFailedVolumesList().size() <= maxVolumeFailuresTolerated;
+      hasEnoughVolumes = getFailedVolumesList().size() <= 
maxVolumeFailuresTolerated;
     }
+    if (!hasEnoughVolumes) {
+      LOG.error("Not enough volumes in MutableVolumeSet. DatanodeUUID: {}, 
VolumeType: {}, " +
+              "MaxVolumeFailuresTolerated: {}, ActiveVolumes: {}, 
FailedVolumes: {}",
+          datanodeUuid, volumeType, maxVolumeFailuresTolerated,
+          getVolumesList().size(), getFailedVolumesList().size());
+    }
+    return hasEnoughVolumes;
   }
 
   public StorageLocationReport[] getStorageReport() {
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerLocationUtil.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerLocationUtil.java
index a45055821a..e966a0bed8 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerLocationUtil.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerLocationUtil.java
@@ -124,15 +124,13 @@ public final class KeyValueContainerLocationUtil {
    */
   public static File getContainerDBFile(KeyValueContainerData containerData) {
     if (containerData.hasSchema(OzoneConsts.SCHEMA_V3)) {
+      Preconditions.checkNotNull(containerData.getVolume().getDbParentDir(), 
"Base Directory cannot be null");
       return new File(containerData.getVolume().getDbParentDir(),
           OzoneConsts.CONTAINER_DB_NAME);
     }
-    return getContainerDBFile(containerData.getMetadataPath(), containerData);
-  }
-
-  public static File getContainerDBFile(String baseDir,
-      KeyValueContainerData containerData) {
-    return new File(baseDir, containerData.getContainerID() +
+    Preconditions.checkNotNull(containerData.getMetadataPath(), "Metadata 
Directory cannot be null");
+    return new File(containerData.getMetadataPath(), 
containerData.getContainerID() +
         OzoneConsts.DN_CONTAINER_DB);
   }
+
 }
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
index eaf901c67a..e5f6dc7ede 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
@@ -55,6 +55,7 @@ import 
org.apache.hadoop.ozone.container.common.statemachine.StateContext;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext.Op;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext.WriteChunkStage;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import 
org.apache.hadoop.ozone.container.common.volume.RoundRobinVolumeChoosingPolicy;
@@ -73,6 +74,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.time.Duration;
 import java.util.Collections;
 import java.util.HashMap;
@@ -103,6 +105,9 @@ import static org.mockito.Mockito.when;
  * Test-cases to verify the functionality of HddsDispatcher.
  */
 public class TestHddsDispatcher {
+  @TempDir
+  private Path tempDir;
+
   private static final Logger LOG = LoggerFactory.getLogger(
       TestHddsDispatcher.class);
   @TempDir
@@ -133,6 +138,8 @@ public class TestHddsDispatcher {
           (long) StorageUnit.GB.toBytes(1), UUID.randomUUID().toString(),
           dd.getUuidString());
       Container container = new KeyValueContainer(containerData, conf);
+      StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+          .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
       container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
           scmId.toString());
       containerSet.addContainer(container);
@@ -267,6 +274,8 @@ public class TestHddsDispatcher {
           50, UUID.randomUUID().toString(),
           dd.getUuidString());
       Container container = new KeyValueContainer(containerData, conf);
+      StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+          .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
       container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
           scmId.toString());
       containerSet.addContainer(container);
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/utils/TestHddsVolumeUtil.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/utils/TestHddsVolumeUtil.java
index d05c127838..387997db73 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/utils/TestHddsVolumeUtil.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/utils/TestHddsVolumeUtil.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.container.common.utils;
 
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.hdfs.server.datanode.checker.VolumeCheckResult;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.ozone.container.common.ContainerTestUtils;
 import org.apache.hadoop.ozone.container.common.volume.DbVolume;
@@ -43,7 +44,13 @@ 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.assertThrowsExactly;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mockStatic;
+
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
 
 /**
  * Test for {@link HddsVolumeUtil}.
@@ -95,6 +102,34 @@ public class TestHddsVolumeUtil {
     dbVolumeSet.shutdown();
   }
 
+  @Test
+  public void testLoadHDDVolumeWithInitDBException()
+      throws Exception {
+    // Create db instances for all HDDsVolumes.
+    for (HddsVolume hddsVolume : StorageVolumeUtil.getHddsVolumesList(
+        hddsVolumeSet.getVolumesList())) {
+      hddsVolume.format(clusterId);
+      hddsVolume.createWorkingDir(clusterId, null);
+    }
+
+    try (MockedStatic<HddsVolumeUtil> mocked = 
mockStatic(HddsVolumeUtil.class, Mockito.CALLS_REAL_METHODS)) {
+      // Simulating the init DB Exception
+      mocked.when(() -> HddsVolumeUtil.initPerDiskDBStore(Mockito.anyString(), 
Mockito.any(), Mockito.anyBoolean()))
+          .thenThrow(new IOException("Mocked Exception"));
+
+      reinitVolumes();
+      for (HddsVolume hddsVolume : StorageVolumeUtil.getHddsVolumesList(
+          hddsVolumeSet.getVolumesList())) {
+        assertThrowsExactly(IOException.class, () -> 
hddsVolume.loadDbStore(true));
+        // If the Volume init DB is abnormal, the Volume should be recognized 
as a failed Volume
+        assertEquals(VolumeCheckResult.FAILED, hddsVolume.check(false));
+        assertTrue(hddsVolume.isDbLoadFailure());
+        assertFalse(hddsVolume.isDbLoaded());
+      }
+    }
+
+  }
+
   @Test
   public void testLoadAllHddsVolumeDbStoreWithoutDbVolumes()
       throws IOException {
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
index eb1f7979f8..55df5f43b6 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSetDiskChecks.java
@@ -21,6 +21,7 @@ package org.apache.hadoop.ozone.container.common.volume;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -45,6 +46,7 @@ import 
org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
 import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainer;
 import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
 import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
@@ -76,6 +78,9 @@ import static org.mockito.Mockito.when;
  */
 @Timeout(30)
 public class TestVolumeSetDiskChecks {
+  @TempDir
+  private Path tempDir;
+
   public static final Logger LOG = LoggerFactory.getLogger(
       TestVolumeSetDiskChecks.class);
   @TempDir
@@ -302,11 +307,15 @@ public class TestVolumeSetDiskChecks {
         dummyChecker);
 
     KeyValueContainer container = new KeyValueContainer(data, conf);
+    StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
     container.create(volumeSet,
         new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString());
     conSet.addContainer(container);
 
     KeyValueContainer container1 = new KeyValueContainer(data1, conf);
+    StorageVolumeUtil.getHddsVolumesList(volumeSet1.getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
     container1.create(volumeSet1,
         new RoundRobinVolumeChoosingPolicy(), UUID.randomUUID().toString());
     conSet.addContainer(container1);
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
index bad3e7ee81..03901b99be 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestGrpcReplicationService.java
@@ -29,6 +29,7 @@ import 
org.apache.hadoop.ozone.container.common.helpers.ContainerMetrics;
 import org.apache.hadoop.ozone.container.common.impl.ContainerLayoutVersion;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import org.apache.hadoop.ozone.container.common.interfaces.Handler;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import 
org.apache.hadoop.ozone.container.common.volume.RoundRobinVolumeChoosingPolicy;
@@ -143,6 +144,8 @@ class TestGrpcReplicationService {
         ContainerLayoutVersion.FILE_PER_BLOCK, GB, 
UUID.randomUUID().toString(),
         datanode.getUuidString());
     KeyValueContainer container = new KeyValueContainer(data, conf);
+    StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
     container.create(volumeSet, new RoundRobinVolumeChoosingPolicy(),
         "test-replication");
     containerSet.addContainer(container);
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeUpgradeToScmHA.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeUpgradeToScmHA.java
index 137214aa1c..59b88bcbea 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeUpgradeToScmHA.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeUpgradeToScmHA.java
@@ -38,6 +38,7 @@ import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachin
 import 
org.apache.hadoop.ozone.container.common.statemachine.EndpointStateMachine;
 import 
org.apache.hadoop.ozone.container.common.states.endpoint.VersionEndpointTask;
 import org.apache.hadoop.ozone.container.common.utils.HddsVolumeUtil;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
 import org.apache.hadoop.ozone.container.replication.ContainerImporter;
 import 
org.apache.hadoop.ozone.container.replication.ContainerReplicationSource;
@@ -532,6 +533,8 @@ public class TestDatanodeUpgradeToScmHA {
 
     // Start new datanode with the same configuration.
     dsm = new DatanodeStateMachine(dd, conf);
+    
StorageVolumeUtil.getHddsVolumesList(dsm.getContainer().getVolumeSet().getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempFolder.toFile()));
     int mlv = dsm.getLayoutVersionManager().getMetadataLayoutVersion();
     if (exactMatch) {
       assertEquals(expectedMlv, mlv);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/ozone/container/common/TestEndPoint.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/ozone/container/common/TestEndPoint.java
index c74e274d3d..6a4cebe9c7 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/ozone/container/common/TestEndPoint.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/ozone/container/common/TestEndPoint.java
@@ -184,9 +184,9 @@ public class TestEndPoint {
     ozoneConf.setBoolean(OzoneConfigKeys.HDDS_CONTAINER_RATIS_IPC_RANDOM_PORT,
         true);
     ozoneConf.setFromObject(new ReplicationConfig().setPort(0));
+    OzoneContainer ozoneContainer = createVolume(ozoneConf);
     try (EndpointStateMachine rpcEndPoint = createEndpoint(ozoneConf,
         serverAddress, 1000)) {
-      OzoneContainer ozoneContainer = createVolume(ozoneConf);
       HddsVolume hddsVolume = (HddsVolume) ozoneContainer.getVolumeSet()
           .getVolumesList().get(0);
       KeyValueContainer kvContainer = addContainer(ozoneConf, hddsVolume);
@@ -212,6 +212,8 @@ public class TestEndPoint {
           hddsVolume.getDeletedContainerDir().listFiles();
       assertNotNull(leftoverContainers);
       assertEquals(0, leftoverContainers.length);
+    } finally {
+      ozoneContainer.stop();
     }
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java
index 51943a2e8d..a4a5701f54 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.ozone.container.metrics;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -59,12 +60,15 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.api.io.TempDir;
 
 /**
  * Test for metrics published by storage containers.
  */
 @Timeout(300)
 public class TestContainerMetrics {
+  @TempDir
+  private Path tempDir;
 
   @Test
   public void testContainerMetrics() throws Exception {
@@ -105,6 +109,8 @@ public class TestContainerMetrics {
       }
       HddsDispatcher dispatcher = new HddsDispatcher(conf, containerSet,
           volumeSet, handlers, context, metrics, null);
+      StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+          .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
       dispatcher.setClusterId(UUID.randomUUID().toString());
 
       server = new XceiverServerGrpc(datanodeDetails, conf, dispatcher, null);
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
index 1b8bae0d03..1c5da04c0a 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
@@ -30,11 +30,13 @@ import org.apache.hadoop.hdds.scm.XceiverClientGrpc;
 import org.apache.hadoop.hdds.scm.XceiverClientSpi;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.ozone.container.common.ContainerTestUtils;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
 import org.junit.jupiter.api.io.TempDir;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -55,6 +57,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  */
 @Timeout(300)
 public class TestOzoneContainer {
+  @TempDir
+  private Path tempDir;
 
   @Test
   public void testCreateOzoneContainer(
@@ -75,6 +79,8 @@ public class TestOzoneContainer {
       DatanodeDetails datanodeDetails = randomDatanodeDetails();
       container = ContainerTestUtils
           .getOzoneContainer(datanodeDetails, conf);
+      
StorageVolumeUtil.getHddsVolumesList(container.getVolumeSet().getVolumesList())
+          .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
       //Set clusterId and manually start ozone container.
       container.start(UUID.randomUUID().toString());
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
index 73910ef00f..b05c547b62 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
@@ -38,6 +38,8 @@ import org.apache.hadoop.hdds.scm.XceiverClientSpi;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.ozone.container.common.ContainerTestUtils;
 import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
+import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.ozone.container.replication.SimpleContainerDownloader;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.Token;
@@ -303,6 +305,9 @@ public class TestOzoneContainerWithTLS {
       StateContext stateContext = ContainerTestUtils.getMockContext(dn, conf);
       container = new OzoneContainer(
           dn, conf, stateContext, caClient, keyClient);
+      MutableVolumeSet volumeSet = container.getVolumeSet();
+      StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+          .forEach(hddsVolume -> 
hddsVolume.setDbParentDir(tempFolder.toFile()));
       container.start(clusterID);
     } catch (Throwable e) {
       if (container != null) {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
index 4f24f8e6c3..5585696dfc 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestSecureOzoneContainer.java
@@ -38,6 +38,8 @@ import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.ozone.client.SecretKeyTestClient;
 import org.apache.hadoop.ozone.container.common.ContainerTestUtils;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
+import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.Token;
 import org.apache.ozone.test.GenericTestUtils;
@@ -137,6 +139,9 @@ class TestSecureOzoneContainer {
       DatanodeDetails dn = MockDatanodeDetails.randomDatanodeDetails();
       container = new OzoneContainer(dn, conf, ContainerTestUtils
           .getMockContext(dn, conf), caClient, secretKeyClient);
+      MutableVolumeSet volumeSet = container.getVolumeSet();
+      StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+          .forEach(hddsVolume -> 
hddsVolume.setDbParentDir(tempFolder.toFile()));
       //Set scmId and manually start ozone container.
       container.start(UUID.randomUUID().toString());
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestContainerServer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestContainerServer.java
index c05f55bd4a..630c4d3149 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestContainerServer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestContainerServer.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.ozone.container.server;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
@@ -57,6 +58,7 @@ import 
org.apache.hadoop.ozone.container.common.transport.server.XceiverServerGr
 import 
org.apache.hadoop.ozone.container.common.transport.server.XceiverServerSpi;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.XceiverServerRatis;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
 import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
@@ -69,6 +71,7 @@ import org.apache.ratis.util.function.CheckedBiFunction;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 
 import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
 import static 
org.apache.hadoop.hdds.protocol.MockDatanodeDetails.randomDatanodeDetails;
@@ -84,6 +87,8 @@ public class TestContainerServer {
       .getAbsolutePath() + File.separator;
   private static final OzoneConfiguration CONF = new OzoneConfiguration();
   private static CertificateClient caClient;
+  @TempDir
+  private Path tempDir;
 
   @BeforeAll
   public static void setup() {
@@ -182,7 +187,7 @@ public class TestContainerServer {
     }
   }
 
-  private static HddsDispatcher createDispatcher(DatanodeDetails dd, UUID 
scmId,
+  private HddsDispatcher createDispatcher(DatanodeDetails dd, UUID scmId,
                                                  OzoneConfiguration conf)
       throws IOException {
     ContainerSet containerSet = new ContainerSet(1000);
@@ -192,6 +197,8 @@ public class TestContainerServer {
     conf.set(OZONE_METADATA_DIRS, TEST_DIR);
     VolumeSet volumeSet = new MutableVolumeSet(dd.getUuidString(), conf, null,
         StorageVolume.VolumeType.DATA_VOLUME, null);
+    StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
     StateContext context = ContainerTestUtils.getMockContext(dd, conf);
     ContainerMetrics metrics = ContainerMetrics.create(conf);
     Map<ContainerProtos.ContainerType, Handler> handlers = Maps.newHashMap();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
index e0522ac6e9..8044685bb7 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.ozone.container.server;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.EnumSet;
@@ -65,6 +66,7 @@ import 
org.apache.hadoop.ozone.container.common.statemachine.StateContext;
 import 
org.apache.hadoop.ozone.container.common.transport.server.XceiverServerGrpc;
 import 
org.apache.hadoop.ozone.container.common.transport.server.XceiverServerSpi;
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.XceiverServerRatis;
+import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
 import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
@@ -103,6 +105,7 @@ import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 
 import static org.apache.ratis.rpc.SupportedRpcType.GRPC;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -115,6 +118,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
  * Test Container servers when security is enabled.
  */
 public class TestSecureContainerServer {
+  @TempDir
+  private Path tempDir;
   private static final String TEST_DIR
       = GenericTestUtils.getTestDir("dfs").getAbsolutePath() + File.separator;
   private static final OzoneConfiguration CONF = new OzoneConfiguration();
@@ -166,7 +171,7 @@ public class TestSecureContainerServer {
             hddsDispatcher, caClient), (dn, p) -> {  }, (p) -> { });
   }
 
-  private static HddsDispatcher createDispatcher(DatanodeDetails dd, UUID 
scmId,
+  private HddsDispatcher createDispatcher(DatanodeDetails dd, UUID scmId,
       OzoneConfiguration conf) throws IOException {
     ContainerSet containerSet = new ContainerSet(1000);
     conf.set(HDDS_DATANODE_DIR_KEY,
@@ -175,6 +180,8 @@ public class TestSecureContainerServer {
     conf.set(OZONE_METADATA_DIRS, TEST_DIR);
     VolumeSet volumeSet = new MutableVolumeSet(dd.getUuidString(), conf, null,
         StorageVolume.VolumeType.DATA_VOLUME, null);
+    StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList())
+        .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile()));
     StateContext context = ContainerTestUtils.getMockContext(dd, conf);
     ContainerMetrics metrics = ContainerMetrics.create(conf);
     Map<ContainerProtos.ContainerType, Handler> handlers = Maps.newHashMap();
@@ -199,7 +206,7 @@ public class TestSecureContainerServer {
     runTestClientServerRatis(GRPC, 3);
   }
 
-  static XceiverServerRatis newXceiverServerRatis(
+  XceiverServerRatis newXceiverServerRatis(
       DatanodeDetails dn, OzoneConfiguration conf) throws IOException {
     conf.setInt(OzoneConfigKeys.HDDS_CONTAINER_RATIS_IPC_PORT,
         dn.getPort(DatanodeDetails.Port.Name.RATIS).getValue());
@@ -216,12 +223,12 @@ public class TestSecureContainerServer {
         caClient, null);
   }
 
-  private static void runTestClientServerRatis(RpcType rpc, int numNodes)
+  private void runTestClientServerRatis(RpcType rpc, int numNodes)
       throws Exception {
     runTestClientServer(numNodes,
         (pipeline, conf) -> RatisTestHelper.initRatisConf(rpc, conf),
         XceiverClientRatis::newXceiverClientRatis,
-        TestSecureContainerServer::newXceiverServerRatis,
+        this::newXceiverServerRatis,
         (dn, p) -> RatisTestHelper.initXceiverServerRatis(rpc, dn, p),
         (p) -> { });
   }


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


Reply via email to