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 7440e9fc278 HDDS-15806. Replace sleep with waitFor in scm.node tests
(#10704)
7440e9fc278 is described below
commit 7440e9fc2782bcf8c493600bb4b9cc5bd4e0b55a
Author: Siyao Meng <[email protected]>
AuthorDate: Sat Jul 11 08:14:33 2026 -0700
HDDS-15806. Replace sleep with waitFor in scm.node tests (#10704)
---
.../hdds/scm/node/TestContainerPlacement.java | 10 +++--
.../hadoop/hdds/scm/node/TestSCMNodeManager.java | 51 +++++++++++-----------
.../hadoop/hdds/scm/node/TestSCMNodeMetrics.java | 5 ++-
3 files changed, 34 insertions(+), 32 deletions(-)
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
index 681344531fa..ef43ca856e0 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
@@ -37,6 +37,7 @@
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.TimeoutException;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
@@ -80,6 +81,7 @@
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.container.common.SCMTestUtils;
import org.apache.hadoop.test.PathUtils;
+import org.apache.ozone.test.GenericTestUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -176,10 +178,11 @@ ContainerManager createContainerManager()
*
* @throws IOException
* @throws InterruptedException
+ * @throws TimeoutException
*/
@Test
public void testContainerPlacementCapacity() throws IOException,
- InterruptedException {
+ InterruptedException, TimeoutException {
final int nodeCount = 4;
final long capacity = 10L * OzoneConsts.GB;
final long used = 2L * OzoneConsts.GB;
@@ -216,9 +219,8 @@ public void testContainerPlacementCapacity() throws
IOException,
scmNodeManager.processHeartbeat(datanodeDetails);
}
- //TODO: wait for heartbeat to be processed
- Thread.sleep(4 * 1000);
- assertEquals(nodeCount, scmNodeManager.getNodeCount(null, HEALTHY));
+ GenericTestUtils.waitFor(
+ () -> scmNodeManager.getNodeCount(null, HEALTHY) == nodeCount, 100,
5000);
assertEquals(capacity * nodeCount,
(long) scmNodeManager.getStats().getCapacity().get());
assertEquals(used * nodeCount,
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
index 59a4938e8d7..a0f1c1bf362 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
@@ -39,6 +39,8 @@
import static
org.apache.hadoop.hdds.scm.events.SCMEvents.DATANODE_COMMAND_COUNT_UPDATED;
import static org.apache.hadoop.hdds.scm.events.SCMEvents.NEW_NODE;
import static
org.apache.hadoop.ozone.container.upgrade.UpgradeUtils.toLayoutVersionProto;
+import static org.apache.ozone.test.MetricsAsserts.getLongCounter;
+import static org.apache.ozone.test.MetricsAsserts.getMetrics;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -213,15 +215,16 @@ SCMNodeManager createNodeManager(OzoneConfiguration
config)
* safe Mode.
*
* @throws IOException
- * @throws InterruptedException
- * @throws TimeoutException
+ * @throws AuthenticationException
*/
@Test
public void testScmHeartbeat()
- throws IOException, InterruptedException, AuthenticationException {
+ throws IOException, AuthenticationException {
try (SCMNodeManager nodeManager = createNodeManager(getConf())) {
int registeredNodes = 5;
+ long hbProcessedBefore =
+ getLongCounter("NumHBProcessed",
getMetrics(SCMNodeMetrics.SOURCE_NAME));
// Send some heartbeats from different nodes.
for (int x = 0; x < registeredNodes; x++) {
DatanodeDetails datanodeDetails = HddsTestUtils
@@ -229,10 +232,10 @@ public void testScmHeartbeat()
nodeManager.processHeartbeat(datanodeDetails);
}
- //TODO: wait for heartbeat to be processed
- Thread.sleep(4 * 1000);
- assertEquals(nodeManager.getAllNodes().size(), registeredNodes,
- "Heartbeat thread should have picked up the scheduled heartbeats.");
+ // Each heartbeat above is processed synchronously by the node manager.
+ assertEquals(hbProcessedBefore + registeredNodes,
+ getLongCounter("NumHBProcessed",
getMetrics(SCMNodeMetrics.SOURCE_NAME)),
+ "All scheduled heartbeats should have been processed.");
}
}
@@ -587,7 +590,7 @@ public void testScmShutdown()
*/
@Test
public void testScmHealthyNodeCount()
- throws IOException, InterruptedException, AuthenticationException {
+ throws IOException, InterruptedException, TimeoutException,
AuthenticationException {
OzoneConfiguration conf = getConf();
final int count = 10;
@@ -597,9 +600,8 @@ public void testScmHealthyNodeCount()
.createRandomDatanodeAndRegister(nodeManager);
nodeManager.processHeartbeat(datanodeDetails);
}
- //TODO: wait for heartbeat to be processed
- Thread.sleep(4 * 1000);
- assertEquals(count,
nodeManager.getNodeCount(NodeStatus.inServiceHealthy()));
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) ==
count, 100, 4000);
Map<String, Map<String, Integer>> nodeCounts =
nodeManager.getNodeCount();
assertEquals(count,
@@ -812,13 +814,12 @@ void testScmHandleJvmPause() throws Exception {
nodeManager.processHeartbeat(node1);
nodeManager.processHeartbeat(node2);
- // Sleep so that heartbeat processing thread gets to run.
- Thread.sleep(1000);
+ // Wait for the heartbeat processing thread to mark both nodes healthy.
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) == 2,
100, 5000);
//Assert all nodes are healthy.
assertEquals(2, nodeManager.getAllNodes().size());
- assertEquals(2,
- nodeManager.getNodeCount(NodeStatus.inServiceHealthy()));
/**
* Simulate a JVM Pause and subsequent handling in following steps:
* Step 1 : stop heartbeat check process for stale node interval
@@ -1802,7 +1803,7 @@ public void testHandlingSCMCommandEvent()
*/
@Test
public void testScmRegisterNodeWith4LayerNetworkTopology()
- throws IOException, InterruptedException, AuthenticationException {
+ throws IOException, InterruptedException, TimeoutException,
AuthenticationException {
OzoneConfiguration conf = getConf();
conf.setTimeDuration(OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL, 1000,
MILLISECONDS);
@@ -1829,9 +1830,9 @@ public void testScmRegisterNodeWith4LayerNetworkTopology()
}
// verify network topology cluster has all the registered nodes
- Thread.sleep(4 * 1000);
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) ==
nodeCount, 100, 5000);
NetworkTopology clusterMap = scm.getClusterMap();
- assertEquals(nodeCount,
nodeManager.getNodeCount(NodeStatus.inServiceHealthy()));
assertEquals(nodeCount, clusterMap.getNumOfLeafNode(""));
assertEquals(4, clusterMap.getMaxLevel());
final List<DatanodeInfo> nodeList = nodeManager.getAllNodes();
@@ -1844,7 +1845,7 @@ public void testScmRegisterNodeWith4LayerNetworkTopology()
@ParameterizedTest
@ValueSource(booleans = {true, false})
void testScmRegisterNodeWithNetworkTopology(boolean useHostname)
- throws IOException, InterruptedException, AuthenticationException {
+ throws IOException, InterruptedException, TimeoutException,
AuthenticationException {
OzoneConfiguration conf = getConf();
conf.setTimeDuration(OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL, 1000,
MILLISECONDS);
@@ -1872,10 +1873,9 @@ void testScmRegisterNodeWithNetworkTopology(boolean
useHostname)
}
// verify network topology cluster has all the registered nodes
- Thread.sleep(4 * 1000);
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) ==
nodeCount, 100, 5000);
NetworkTopology clusterMap = scm.getClusterMap();
- assertEquals(nodeCount,
- nodeManager.getNodeCount(NodeStatus.inServiceHealthy()));
assertEquals(nodeCount, clusterMap.getNumOfLeafNode(""));
assertEquals(3, clusterMap.getMaxLevel());
final List<DatanodeInfo> nodeList = nodeManager.getAllNodes();
@@ -2037,7 +2037,7 @@ void testGetNodesByAddress(boolean useHostname)
*/
@Test
public void testScmRegisterNodeWithUpdatedIpAndHostname()
- throws IOException, InterruptedException, AuthenticationException {
+ throws IOException, InterruptedException, TimeoutException,
AuthenticationException {
OzoneConfiguration conf = getConf();
conf.setTimeDuration(OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL, 1000,
MILLISECONDS);
@@ -2061,10 +2061,9 @@ public void testScmRegisterNodeWithUpdatedIpAndHostname()
nodeManager.register(node, null, null);
// verify network topology cluster has all the registered nodes
- Thread.sleep(2 * 1000);
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) == 1,
100, 5000);
NetworkTopology clusterMap = scm.getClusterMap();
- assertEquals(1,
- nodeManager.getNodeCount(NodeStatus.inServiceHealthy()));
assertEquals(1, clusterMap.getNumOfLeafNode(""));
assertEquals(4, clusterMap.getMaxLevel());
final List<DatanodeInfo> nodeList = nodeManager.getAllNodes();
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
index ac2c1e4c51e..2db0df2db61 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
@@ -17,7 +17,6 @@
package org.apache.hadoop.hdds.scm.node;
-import static java.lang.Thread.sleep;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
import static org.apache.ozone.test.MetricsAsserts.assertGauge;
import static org.apache.ozone.test.MetricsAsserts.getLongCounter;
@@ -43,6 +42,7 @@
import org.apache.hadoop.hdds.server.events.EventQueue;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
+import org.apache.ozone.test.GenericTestUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -244,7 +244,8 @@ public void testNodeCountAndInfoMetricsReported() throws
Exception {
assertGauge("TotalFilesystemAvailable", 150L,
getMetrics(SCMNodeMetrics.class.getSimpleName()));
nodeManager.processHeartbeat(registeredDatanode);
- sleep(4000);
+ GenericTestUtils.waitFor(
+ () -> nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) == 1,
100, 5000);
metricsSource = getMetrics(SCMNodeMetrics.SOURCE_NAME);
assertGauge("InServiceHealthyReadonlyNodes", 0, metricsSource);
assertGauge("InServiceHealthyNodes", 1, metricsSource);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]