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

nanda 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 a3c9c0e040 HDDS-12443. Intermittent failure in 
TestContainerBalancerSubCommand (#7989)
a3c9c0e040 is described below

commit a3c9c0e04021faf494a0b714e7b747e192112b09
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Sun Mar 2 18:10:04 2025 +0100

    HDDS-12443. Intermittent failure in TestContainerBalancerSubCommand (#7989)
---
 hadoop-hdds/tools/pom.xml                          |   5 +
 .../scm/cli/ContainerBalancerStatusSubcommand.java |   5 +-
 .../datanode/TestContainerBalancerSubCommand.java  | 210 +++++++--------------
 3 files changed, 78 insertions(+), 142 deletions(-)

diff --git a/hadoop-hdds/tools/pom.xml b/hadoop-hdds/tools/pom.xml
index 071e972f66..7f37a36b65 100644
--- a/hadoop-hdds/tools/pom.xml
+++ b/hadoop-hdds/tools/pom.xml
@@ -140,6 +140,11 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.ozone</groupId>
+      <artifactId>hdds-test-utils</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java
index 8abc7a2dd5..7edecd7822 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java
@@ -26,6 +26,7 @@
 import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
@@ -69,7 +70,9 @@ public void execute(ScmClient scmClient) throws IOException {
       System.out.println("ContainerBalancer is Running.");
 
       if (verbose) {
-        System.out.printf("Started at: %s %s%n", dateTime.toLocalDate(), 
dateTime.toLocalTime());
+        System.out.printf("Started at: %s %s%n",
+            dateTime.toLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE),
+            dateTime.toLocalTime().format(DateTimeFormatter.ISO_LOCAL_TIME));
         Duration balancingDuration = Duration.between(startedAtInstant, 
OffsetDateTime.now());
         System.out.printf("Balancing duration: %s%n%n", 
getPrettyDuration(balancingDuration));
         
System.out.println(getConfigurationPrettyString(balancerStatusInfo.getConfiguration()));
diff --git 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
index 0594ae38ab..30919d525f 100644
--- 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
+++ 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
@@ -18,19 +18,13 @@
 package org.apache.hadoop.hdds.scm.cli.datanode;
 
 import static org.apache.hadoop.ozone.OzoneConsts.GB;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
 import java.time.OffsetDateTime;
 import java.util.Arrays;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoProto;
@@ -40,6 +34,8 @@
 import org.apache.hadoop.hdds.scm.cli.ContainerBalancerStopSubcommand;
 import org.apache.hadoop.hdds.scm.client.ScmClient;
 import 
org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancerConfiguration;
+import org.apache.hadoop.hdds.utils.IOUtils;
+import org.apache.ozone.test.GenericTestUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -51,14 +47,44 @@
  */
 class TestContainerBalancerSubCommand {
 
-  private static final String DEFAULT_ENCODING = StandardCharsets.UTF_8.name();
-  private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
-  private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
-  private final PrintStream originalOut = System.out;
-  private final PrintStream originalErr = System.err;
+  private static final Pattern DURATION = Pattern.compile(
+      "^Balancing duration: \\d{1}s$", Pattern.MULTILINE);
+  private static final Pattern FAILED_TO_START = Pattern.compile(
+      "^Failed\\sto\\sstart\\sContainer\\sBalancer.");
+  private static final Pattern IS_NOT_RUNNING = Pattern.compile(
+      "^ContainerBalancer\\sis\\sNot\\sRunning.");
+  private static final Pattern IS_RUNNING = Pattern.compile(
+      "^ContainerBalancer\\sis\\sRunning.$", Pattern.MULTILINE);
+  private static final Pattern STARTED_AT = Pattern.compile(
+      "^Started at: (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})$", 
Pattern.MULTILINE);
+  private static final Pattern STARTED_SUCCESSFULLY = Pattern.compile(
+      "^Container\\sBalancer\\sstarted\\ssuccessfully.");
+  private static final Pattern WAITING_TO_STOP = Pattern.compile(
+      
"^Sending\\sstop\\scommand.\\sWaiting\\sfor\\sContainer\\sBalancer\\sto\\sstop...\\n"
 +
+      "Container\\sBalancer\\sstopped.");
+
+  private static final String BALANCER_CONFIG_OUTPUT = "Container Balancer 
Configuration values:\n" +
+      "Key                                                Value\n" +
+      "Threshold                                          10.0\n" +
+      "Max Datanodes to Involve per Iteration(percent)    20\n" +
+      "Max Size to Move per Iteration                     0GB\n" +
+      "Max Size Entering Target per Iteration             26GB\n" +
+      "Max Size Leaving Source per Iteration              26GB\n" +
+      "Number of Iterations                               3\n" +
+      "Time Limit for Single Container's Movement         65min\n" +
+      "Time Limit for Single Container's Replication      50min\n" +
+      "Interval between each Iteration                    0min\n" +
+      "Whether to Enable Network Topology                 false\n" +
+      "Whether to Trigger Refresh Datanode Usage Info     false\n" +
+      "Container IDs to Exclude from Balancing            None\n" +
+      "Datanodes Specified to be Balanced                 None\n" +
+      "Datanodes Excluded from Balancing                  None";
+
   private ContainerBalancerStopSubcommand stopCmd;
   private ContainerBalancerStartSubcommand startCmd;
   private ContainerBalancerStatusSubcommand statusCmd;
+  private GenericTestUtils.PrintStreamCapturer out;
+  private GenericTestUtils.PrintStreamCapturer err;
 
   private static ContainerBalancerStatusInfoResponseProto 
getContainerBalancerStatusInfoResponseProto(
       ContainerBalancerConfiguration config) {
@@ -203,18 +229,17 @@ private static ContainerBalancerConfiguration 
getContainerBalancerConfiguration(
   }
 
   @BeforeEach
-  public void setup() throws UnsupportedEncodingException {
+  void setup() {
     stopCmd = new ContainerBalancerStopSubcommand();
     startCmd = new ContainerBalancerStartSubcommand();
     statusCmd = new ContainerBalancerStatusSubcommand();
-    System.setOut(new PrintStream(outContent, false, DEFAULT_ENCODING));
-    System.setErr(new PrintStream(errContent, false, DEFAULT_ENCODING));
+    out = GenericTestUtils.captureOut();
+    err = GenericTestUtils.captureErr();
   }
 
   @AfterEach
-  public void tearDown() {
-    System.setOut(originalOut);
-    System.setErr(originalErr);
+  void tearDown() {
+    IOUtils.closeQuietly(out, err);
   }
 
   @Test
@@ -230,30 +255,6 @@ void 
testContainerBalancerStatusInfoSubcommandRunningWithoutFlags()
     //test status is running
     
when(scmClient.getContainerBalancerStatusInfo()).thenReturn(statusInfoResponseProto);
     statusCmd.execute(scmClient);
-    Pattern p = Pattern.compile(
-        "^ContainerBalancer\\sis\\sRunning.");
-    String output = outContent.toString(DEFAULT_ENCODING);
-    Matcher m = p.matcher(output);
-    assertTrue(m.find());
-
-    String balancerConfigOutput =
-        "Container Balancer Configuration values:\n" +
-        "Key                                                Value\n" +
-        "Threshold                                          10.0\n" +
-        "Max Datanodes to Involve per Iteration(percent)    20\n" +
-        "Max Size to Move per Iteration                     0GB\n" +
-        "Max Size Entering Target per Iteration             26GB\n" +
-        "Max Size Leaving Source per Iteration              26GB\n" +
-        "Number of Iterations                               3\n" +
-        "Time Limit for Single Container's Movement         65min\n" +
-        "Time Limit for Single Container's Replication      50min\n" +
-        "Interval between each Iteration                    0min\n" +
-        "Whether to Enable Network Topology                 false\n" +
-        "Whether to Trigger Refresh Datanode Usage Info     false\n" +
-        "Container IDs to Exclude from Balancing            None\n" +
-        "Datanodes Specified to be Balanced                 None\n" +
-        "Datanodes Excluded from Balancing                  None";
-    assertFalse(output.contains(balancerConfigOutput));
 
     String currentIterationOutput =
         "Current iteration info:\n" +
@@ -273,9 +274,11 @@ void 
testContainerBalancerStatusInfoSubcommandRunningWithoutFlags()
         "Exited data from nodes                             \n" +
         "b8b9c511-c30f-4933-8938-2f272e307070 -> 30 GB\n" +
         "7bd99815-47e7-4015-bc61-ca6ef6dfd130 -> 18 GB";
-    assertFalse(output.contains(currentIterationOutput));
 
-    assertFalse(output.contains("Iteration history list:"));
+    assertThat(out.get()).containsPattern(IS_RUNNING)
+        .doesNotContain(BALANCER_CONFIG_OUTPUT)
+        .doesNotContain(currentIterationOutput)
+        .doesNotContain("Iteration history list:");
   }
 
   @Test
@@ -293,42 +296,7 @@ void 
testContainerBalancerStatusInfoSubcommandVerboseHistory()
     CommandLine c = new CommandLine(statusCmd);
     c.parseArgs("--verbose", "--history");
     statusCmd.execute(scmClient);
-    String output = outContent.toString(DEFAULT_ENCODING);
-    Pattern p = Pattern.compile(
-        "^ContainerBalancer\\sis\\sRunning.$", Pattern.MULTILINE);
-    Matcher m = p.matcher(output);
-    assertTrue(m.find());
-
-    p = Pattern.compile(
-        "^Started at: (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})$", 
Pattern.MULTILINE);
-    m = p.matcher(output);
-    assertTrue(m.find());
-
-    p = Pattern.compile(
-        "^Balancing duration: \\d{1}s$", Pattern.MULTILINE);
-    m = p.matcher(output);
-    assertTrue(m.find());
-
-    String balancerConfigOutput =
-        "Container Balancer Configuration values:\n" +
-        "Key                                                Value\n" +
-        "Threshold                                          10.0\n" +
-        "Max Datanodes to Involve per Iteration(percent)    20\n" +
-        "Max Size to Move per Iteration                     0GB\n" +
-        "Max Size Entering Target per Iteration             26GB\n" +
-        "Max Size Leaving Source per Iteration              26GB\n" +
-        "Number of Iterations                               3\n" +
-        "Time Limit for Single Container's Movement         65min\n" +
-        "Time Limit for Single Container's Replication      50min\n" +
-        "Interval between each Iteration                    0min\n" +
-        "Whether to Enable Network Topology                 false\n" +
-        "Whether to Trigger Refresh Datanode Usage Info     false\n" +
-        "Container IDs to Exclude from Balancing            None\n" +
-        "Datanodes Specified to be Balanced                 None\n" +
-        "Datanodes Excluded from Balancing                  None";
-    assertTrue(output.contains(balancerConfigOutput));
-
-    assertTrue(output.contains("Iteration history list:"));
+
     String firstHistoryIterationOutput =
         "Key                                                Value\n" +
         "Iteration number                                   3\n" +
@@ -346,7 +314,6 @@ void 
testContainerBalancerStatusInfoSubcommandVerboseHistory()
         "Exited data from nodes                             \n" +
         "b8b9c511-c30f-4933-8938-2f272e307070 -> 30 GB\n" +
         "7bd99815-47e7-4015-bc61-ca6ef6dfd130 -> 18 GB";
-    assertTrue(output.contains(firstHistoryIterationOutput));
 
     String secondHistoryIterationOutput =
         "Key                                                Value\n" +
@@ -365,7 +332,15 @@ void 
testContainerBalancerStatusInfoSubcommandVerboseHistory()
         "Exited data from nodes                             \n" +
         "b8b9c511-c30f-4933-8938-2f272e307070 -> 15 GB\n" +
         "7bd99815-47e7-4015-bc61-ca6ef6dfd130 -> 15 GB";
-    assertTrue(output.contains(secondHistoryIterationOutput));
+
+    assertThat(out.get())
+        .containsPattern(IS_RUNNING)
+        .containsPattern(STARTED_AT)
+        .containsPattern(DURATION)
+        .contains(BALANCER_CONFIG_OUTPUT)
+        .contains("Iteration history list:")
+        .contains(firstHistoryIterationOutput)
+        .contains(secondHistoryIterationOutput);
   }
 
   @Test
@@ -383,40 +358,6 @@ void testContainerBalancerStatusInfoSubcommandVerbose()
     CommandLine c = new CommandLine(statusCmd);
     c.parseArgs("--verbose");
     statusCmd.execute(scmClient);
-    String output = outContent.toString(DEFAULT_ENCODING);
-    Pattern p = Pattern.compile(
-        "^ContainerBalancer\\sis\\sRunning.$", Pattern.MULTILINE);
-    Matcher m = p.matcher(output);
-    assertTrue(m.find());
-
-    p = Pattern.compile(
-        "^Started at: (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})$", 
Pattern.MULTILINE);
-    m = p.matcher(output);
-    assertTrue(m.find());
-
-    p = Pattern.compile(
-        "^Balancing duration: \\d{1}s$", Pattern.MULTILINE);
-    m = p.matcher(output);
-    assertTrue(m.find());
-
-    String balancerConfigOutput =
-        "Container Balancer Configuration values:\n" +
-        "Key                                                Value\n" +
-        "Threshold                                          10.0\n" +
-        "Max Datanodes to Involve per Iteration(percent)    20\n" +
-        "Max Size to Move per Iteration                     0GB\n" +
-        "Max Size Entering Target per Iteration             26GB\n" +
-        "Max Size Leaving Source per Iteration              26GB\n" +
-        "Number of Iterations                               3\n" +
-        "Time Limit for Single Container's Movement         65min\n" +
-        "Time Limit for Single Container's Replication      50min\n" +
-        "Interval between each Iteration                    0min\n" +
-        "Whether to Enable Network Topology                 false\n" +
-        "Whether to Trigger Refresh Datanode Usage Info     false\n" +
-        "Container IDs to Exclude from Balancing            None\n" +
-        "Datanodes Specified to be Balanced                 None\n" +
-        "Datanodes Excluded from Balancing                  None";
-    assertTrue(output.contains(balancerConfigOutput));
 
     String currentIterationOutput =
         "Current iteration info:\n" +
@@ -436,9 +377,14 @@ void testContainerBalancerStatusInfoSubcommandVerbose()
         "Exited data from nodes                             \n" +
         "b8b9c511-c30f-4933-8938-2f272e307070 -> 30 GB\n" +
         "7bd99815-47e7-4015-bc61-ca6ef6dfd130 -> 18 GB";
-    assertTrue(output.contains(currentIterationOutput));
 
-    assertFalse(output.contains("Iteration history list:"));
+    assertThat(out.get())
+        .containsPattern(IS_RUNNING)
+        .containsPattern(STARTED_AT)
+        .containsPattern(DURATION)
+        .contains(BALANCER_CONFIG_OUTPUT)
+        .contains(currentIterationOutput)
+        .doesNotContain("Iteration history list:");
   }
 
   @Test
@@ -453,10 +399,7 @@ void 
testContainerBalancerStatusInfoSubcommandRunningOnStoppedBalancer()
             .build());
 
     statusCmd.execute(scmClient);
-    Pattern p = Pattern.compile(
-        "^ContainerBalancer\\sis\\sNot\\sRunning.");
-    Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+    assertThat(out.get()).containsPattern(IS_NOT_RUNNING);
   }
 
   @Test
@@ -471,10 +414,7 @@ void testContainerBalancerStatusSubcommandNotRunning()
 
     statusCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile(
-        "^ContainerBalancer\\sis\\sNot\\sRunning.");
-    Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+    assertThat(out.get()).containsPattern(IS_NOT_RUNNING);
   }
 
   @Test
@@ -482,12 +422,7 @@ public void testContainerBalancerStopSubcommand() throws 
IOException {
     ScmClient scmClient = mock(ScmClient.class);
     stopCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile("^Sending\\sstop\\scommand." +
-        "\\sWaiting\\sfor\\sContainer\\sBalancer\\sto\\sstop...\\n" +
-        "Container\\sBalancer\\sstopped.");
-
-    Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+    assertThat(out.get()).containsPattern(WAITING_TO_STOP);
   }
 
   @Test
@@ -503,10 +438,7 @@ public void 
testContainerBalancerStartSubcommandWhenBalancerIsNotRunning()
                 .build());
     startCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile("^Container\\sBalancer\\sstarted" +
-        "\\ssuccessfully.");
-    Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+    assertThat(out.get()).containsPattern(STARTED_SUCCESSFULLY);
   }
 
   @Test
@@ -522,11 +454,7 @@ public void 
testContainerBalancerStartSubcommandWhenBalancerIsRunning()
             .build());
     startCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile("^Failed\\sto\\sstart\\sContainer" +
-        "\\sBalancer.");
-
-    Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+    assertThat(out.get()).containsPattern(FAILED_TO_START);
   }
 
 }


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

Reply via email to