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]