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

weichiu 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 acb49b97f7 HDDS-10820. Freon tool DN-Echo to support GRPC and Ratis 
read/write mode (#6647)
acb49b97f7 is described below

commit acb49b97f71457327a830153c79a5c46e5f31a92
Author: Wei-Chiu Chuang <[email protected]>
AuthorDate: Wed May 8 11:09:19 2024 -0700

    HDDS-10820. Freon tool DN-Echo to support GRPC and Ratis read/write mode 
(#6647)
---
 .../java/org/apache/hadoop/hdds/HddsUtils.java     |  4 ++-
 .../hdds/scm/storage/ContainerProtocolCalls.java   |  4 ++-
 .../src/main/proto/DatanodeClientProtocol.proto    |  1 +
 .../hadoop/hdds/scm/TestContainerSmallFile.java    |  2 +-
 .../hadoop/ozone/freon/TestDNRPCLoadGenerator.java | 35 ++++++++++++++++++----
 .../hadoop/ozone/freon/DNRPCLoadGenerator.java     | 31 +++++++++++++++++--
 6 files changed, 67 insertions(+), 10 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
index 26f6be44e5..ff0bdd65f1 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
@@ -424,7 +424,6 @@ public final class HddsUtils {
     case ListContainer:
     case ListChunk:
     case GetCommittedBlockLength:
-    case Echo:
       return true;
     case CloseContainer:
     case WriteChunk:
@@ -438,6 +437,9 @@ public final class HddsUtils {
     case PutSmallFile:
     case StreamInit:
     case StreamWrite:
+      return false;
+    case Echo:
+      return proto.getEcho().hasReadOnly() && proto.getEcho().getReadOnly();
     default:
       return false;
     }
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
index 4ded07c3c3..6bb87654c0 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/storage/ContainerProtocolCalls.java
@@ -692,13 +692,15 @@ public final class ContainerProtocolCalls  {
    * @return EchoResponseProto
    */
   public static EchoResponseProto echo(XceiverClientSpi client, String 
encodedContainerID,
-      long containerID, ByteString payloadReqBytes, int payloadRespSizeKB, int 
sleepTimeMs) throws IOException {
+      long containerID, ByteString payloadReqBytes, int payloadRespSizeKB, int 
sleepTimeMs, boolean readOnly)
+      throws IOException {
     ContainerProtos.EchoRequestProto getEcho =
         EchoRequestProto
             .newBuilder()
             .setPayload(payloadReqBytes)
             .setPayloadSizeResp(payloadRespSizeKB)
             .setSleepTimeMs(sleepTimeMs)
+            .setReadOnly(readOnly)
             .build();
     String id = client.getPipeline().getClosestNode().getUuidString();
 
diff --git 
a/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto 
b/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
index 1b22412506..7755b993ca 100644
--- a/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/DatanodeClientProtocol.proto
@@ -380,6 +380,7 @@ message  EchoRequestProto {
   optional bytes payload = 1;
   optional int32 payloadSizeResp = 2;
   optional int32 sleepTimeMs = 3;
+  optional bool readOnly = 4;
 }
 
 message  EchoResponseProto {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
index 5dab271d9e..87728f6ce1 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestContainerSmallFile.java
@@ -203,7 +203,7 @@ public class TestContainerSmallFile {
         container.getContainerInfo().getContainerID(), null);
     ByteString byteString = UnsafeByteOperations.unsafeWrap(new byte[0]);
     ContainerProtos.EchoResponseProto response =
-        ContainerProtocolCalls.echo(client, "", 
container.getContainerInfo().getContainerID(), byteString, 1, 0);
+        ContainerProtocolCalls.echo(client, "", 
container.getContainerInfo().getContainerID(), byteString, 1, 0, true);
     assertEquals(1, response.getPayload().size());
     xceiverClientManager.releaseClient(client, false);
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestDNRPCLoadGenerator.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestDNRPCLoadGenerator.java
index d049a7e320..753e3685dc 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestDNRPCLoadGenerator.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestDNRPCLoadGenerator.java
@@ -32,10 +32,16 @@ import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.container.common.SCMTestUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 import picocli.CommandLine;
 
 import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -97,15 +103,34 @@ public class TestDNRPCLoadGenerator {
     shutdownCluster();
   }
 
-  @Test
-  public void test() {
+  private static Stream<Arguments> provideParameters() {
+    return Stream.of(
+        Arguments.of(true, true),
+        Arguments.of(true, false),
+        Arguments.of(false, true),
+        Arguments.of(false, false)
+    );
+  }
+
+  @ParameterizedTest
+  @MethodSource("provideParameters")
+  public void test(boolean readOnly, boolean ratis) {
     DNRPCLoadGenerator randomKeyGenerator =
         new DNRPCLoadGenerator(cluster.getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
-    int exitCode = cmd.execute(
+    List<String> cmdArgs = new ArrayList<>(Arrays.asList(
         "--container-id", 
Long.toString(container.getContainerInfo().getContainerID()),
         "--clients", "5",
-        "-t", "10");
+        "-t", "10"));
+
+    if (readOnly) {
+      cmdArgs.add("--read-only");
+    }
+    if (ratis) {
+      cmdArgs.add("--ratis");
+    }
+
+    int exitCode = cmd.execute(cmdArgs.toArray(new String[0]));
     assertEquals(0, exitCode);
   }
 }
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java
index 75e4fe53d8..5d3d3af9e1 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.ozone.freon;
 import com.codahale.metrics.Timer;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
 import org.apache.hadoop.hdds.scm.client.ClientTrustManager;
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CACertificateProvider;
 import org.apache.hadoop.hdds.utils.HAUtils;
@@ -36,6 +37,8 @@ import 
org.apache.hadoop.hdds.scm.cli.ContainerOperationClient;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.storage.ContainerProtocolCalls;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
@@ -44,6 +47,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
+import static org.apache.hadoop.hdds.client.ReplicationConfig.getLegacyFactor;
+
 /**
  * Utility to generate RPC request to DN.
  */
@@ -56,7 +61,8 @@ import java.util.concurrent.Callable;
         showDefaultValues = true)
 public class DNRPCLoadGenerator extends BaseFreonGenerator
         implements Callable<Void> {
-
+  private static final Logger LOG =
+      LoggerFactory.getLogger(DNRPCLoadGenerator.class);
   private static final int RPC_PAYLOAD_MULTIPLICATION_FACTOR = 1024;
   private static final int MAX_SIZE_KB = 2097151;
   private Timer timer;
@@ -91,6 +97,16 @@ public class DNRPCLoadGenerator extends BaseFreonGenerator
       defaultValue = "1")
   private int numClients = 1;
 
+  @Option(names = {"--read-only"},
+      description = "if Ratis, read only or not",
+      defaultValue = "false")
+  private boolean readOnly = false;
+
+  @Option(names = {"--ratis"},
+      description = "if Ratis or grpc",
+      defaultValue = "false")
+  private boolean ratis = false;
+
   @CommandLine.ParentCommand
   private Freon freon;
 
@@ -121,6 +137,17 @@ public class DNRPCLoadGenerator extends BaseFreonGenerator
         .filter(p -> p.getId().equals(containerInfo.getPipelineID()))
         .findFirst()
         .orElse(null);
+    // If GRPC, use STANDALONE pipeline
+    if (!ratis) {
+      if (!readOnly) {
+        LOG.warn("Read only is not set to true for GRPC, setting it to true");
+        readOnly = true;
+      }
+      pipeline = Pipeline.newBuilder(pipeline)
+          .setReplicationConfig(StandaloneReplicationConfig.getInstance(
+              getLegacyFactor(pipeline.getReplicationConfig())))
+          .build();
+    }
     encodedContainerToken = scmClient.getEncodedContainerToken(containerID);
     XceiverClientFactory xceiverClientManager;
     if (OzoneSecurityUtil.isSecurityEnabled(configuration)) {
@@ -171,7 +198,7 @@ public class DNRPCLoadGenerator extends BaseFreonGenerator
       int clientIndex = (numClients == 1) ? 0 : (int)l % numClients;
       ContainerProtos.EchoResponseProto response =
           ContainerProtocolCalls.echo(clients.get(clientIndex), 
encodedContainerToken,
-              containerID, payloadReqBytes, payloadRespSize, sleepTimeMs);
+              containerID, payloadReqBytes, payloadRespSize, sleepTimeMs, 
readOnly);
       return null;
     });
   }


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

Reply via email to