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

sumitagrawal 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 134d141263 HDDS-8856. Client sending an unknown request should not 
crash OM (#4978)
134d141263 is described below

commit 134d141263bbc7b9037ac995ee74f88efd7a9b71
Author: tanvipenumudy <[email protected]>
AuthorDate: Fri Jun 30 15:09:30 2023 +0530

    HDDS-8856. Client sending an unknown request should not crash OM (#4978)
---
 .../om/ratis/TestOzoneManagerRatisRequest.java     | 58 +++++++++++++++++++++-
 .../src/main/proto/OmClientProtocol.proto          |  1 +
 .../om/ratis/utils/OzoneManagerRatisUtils.java     |  4 +-
 ...OzoneManagerProtocolServerSideTranslatorPB.java |  4 +-
 .../om/ratis/TestOzoneManagerRatisServer.java      |  5 ++
 5 files changed, 68 insertions(+), 4 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisRequest.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisRequest.java
index 5fc251681d..ba24c113c7 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisRequest.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisRequest.java
@@ -17,7 +17,10 @@
  */
 package org.apache.hadoop.ozone.om.ratis;
 
+import com.google.protobuf.ProtocolMessageEnum;
+import com.google.protobuf.ServiceException;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
@@ -29,19 +32,23 @@ import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import 
org.apache.hadoop.ozone.protocolPB.OzoneManagerProtocolServerSideTranslatorPB;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
 import org.junit.rules.TemporaryFolder;
 import org.mockito.Mockito;
 
+import java.io.IOException;
 import java.util.ArrayList;
 
+import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.INVALID_REQUEST;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.when;
 
 /**
- * Test: Creating a client request for a bucket which doesn't exist.
+ * Test OM Ratis request handling.
  */
 public class TestOzoneManagerRatisRequest {
   @Rule public TemporaryFolder folder = new TemporaryFolder();
@@ -53,6 +60,7 @@ public class TestOzoneManagerRatisRequest {
   @Test(timeout = 300_000)
   public void testRequestWithNonExistentBucket()
       throws Exception {
+    // Test: Creating a client request for a bucket which doesn't exist.
     ozoneManager = Mockito.mock(OzoneManager.class);
     ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS,
         folder.newFolder().getAbsolutePath());
@@ -88,4 +96,52 @@ public class TestOzoneManagerRatisRequest {
           oe.getResult());
     }
   }
+
+  @Test
+  public void testUnknownRequestHandling() throws IOException,
+      ServiceException {
+    // Create an instance of OMRequest with an unknown command type.
+    OzoneManagerProtocolProtos.OMRequest omRequest =
+        OzoneManagerProtocolProtos.OMRequest.newBuilder()
+            .setCmdType(OzoneManagerProtocolProtos.Type.TestUnknownCommand)
+            .setClientId("test-client-id")
+            .build();
+
+    ozoneManager = Mockito.mock(OzoneManager.class);
+    ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS,
+        folder.newFolder().getAbsolutePath());
+    omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration,
+        ozoneManager);
+    when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
+    when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration);
+
+    OzoneManagerRatisServer ratisServer =
+        Mockito.mock(OzoneManagerRatisServer.class);
+    ProtocolMessageMetrics<ProtocolMessageEnum> protocolMessageMetrics =
+        Mockito.mock(ProtocolMessageMetrics.class);
+    long lastTransactionIndexForNonRatis = 100L;
+
+    OzoneManagerProtocolProtos.OMResponse expectedResponse =
+        OzoneManagerProtocolProtos.OMResponse.newBuilder()
+            .setStatus(INVALID_REQUEST)
+            .setCmdType(omRequest.getCmdType())
+            .setTraceID(omRequest.getTraceID())
+            .setSuccess(false)
+            .setMessage("Unrecognized write command type request " +
+                omRequest.getCmdType())
+            .build();
+
+    boolean[] enableRatisValues = {true, false};
+    for (boolean enableRatis : enableRatisValues) {
+      OzoneManagerProtocolServerSideTranslatorPB serverSideTranslatorPB =
+          new OzoneManagerProtocolServerSideTranslatorPB(ozoneManager,
+              ratisServer, protocolMessageMetrics, enableRatis,
+              lastTransactionIndexForNonRatis);
+
+      OzoneManagerProtocolProtos.OMResponse actualResponse =
+          serverSideTranslatorPB.processRequest(omRequest);
+
+      Assertions.assertEquals(expectedResponse, actualResponse);
+    }
+  }
 }
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index d1061838b2..8399d3ba85 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -138,6 +138,7 @@ enum Type {
   RefetchSecretKey = 121;
   ListSnapshotDiffJobs = 122;
   CancelSnapshotDiff = 123;
+  TestUnknownCommand = 124;
 }
 
 message OMRequest {
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 df2a730f1a..399b2cecc7 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
@@ -320,8 +320,8 @@ public final class OzoneManagerRatisUtils {
       bucketName = keyArgs.getBucketName();
       break;
     default:
-      throw new IllegalStateException("Unrecognized write command " +
-          "type request" + cmdType);
+      throw new OMException("Unrecognized write command type request "
+          + cmdType, OMException.ResultCodes.INVALID_REQUEST);
     }
 
     return BucketLayoutAwareOMKeyRequestFactory.createRequest(
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
index 71ba9569e5..17adbd13d0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.hdds.server.OzoneProtocolMessageDispatcher;
 import org.apache.hadoop.hdds.tracing.TracingUtil;
 import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics;
@@ -152,7 +153,8 @@ public class OzoneManagerProtocolServerSideTranslatorPB 
implements
     return requestValidations.validateResponse(request, response);
   }
 
-  private OMResponse processRequest(OMRequest request) throws ServiceException 
{
+  @VisibleForTesting
+  public OMResponse processRequest(OMRequest request) throws ServiceException {
     OMClientRequest omClientRequest = null;
     boolean s3Auth = false;
 
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
index c04e8fdcdf..fda8ebcd8a 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
@@ -200,6 +200,11 @@ public class TestOzoneManagerRatisServer {
         OzoneManagerProtocolProtos.Type.values();
 
     for (OzoneManagerProtocolProtos.Type cmdtype : cmdTypes) {
+      if (cmdtype == OzoneManagerProtocolProtos.Type.TestUnknownCommand) {
+        // Skip OzoneManagerProtocolProtos.Type.TestUnknownCommand, since this
+        // cmdType is reserved for testing purposes only.
+        continue;
+      }
       OMRequest request = OMRequest.newBuilder()
           .setCmdType(cmdtype)
           .setClientId(clientId)


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

Reply via email to