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 360a23c0a1 HDDS-8057. Handle unchecked exception in KeyValueHandler 
more gracefully (#4334)
360a23c0a1 is described below

commit 360a23c0a1b69f5e748bfe78d47773724625e428
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Sat Mar 4 20:33:31 2023 +0100

    HDDS-8057. Handle unchecked exception in KeyValueHandler more gracefully 
(#4334)
---
 .../ozone/container/keyvalue/KeyValueHandler.java  | 12 ++++++++---
 .../TestKeyValueHandlerWithUnhealthyContainer.java | 24 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
index 7a4cc5807e..1c60109431 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
@@ -215,9 +215,15 @@ public class KeyValueHandler extends Handler {
       ContainerCommandRequestProto request, Container container,
       DispatcherContext dispatcherContext) {
 
-    return KeyValueHandler
-        .dispatchRequest(this, request, (KeyValueContainer) container,
-            dispatcherContext);
+    try {
+      return KeyValueHandler
+          .dispatchRequest(this, request, (KeyValueContainer) container,
+              dispatcherContext);
+    } catch (RuntimeException e) {
+      return ContainerUtils.logAndReturnError(LOG,
+          new StorageContainerException(e, CONTAINER_INTERNAL_ERROR),
+          request);
+    }
   }
 
   @VisibleForTesting
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandlerWithUnhealthyContainer.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandlerWithUnhealthyContainer.java
index d9779471d5..e14c67c0d6 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandlerWithUnhealthyContainer.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandlerWithUnhealthyContainer.java
@@ -18,9 +18,11 @@
 
 package org.apache.hadoop.ozone.container.keyvalue;
 
+import org.apache.hadoop.hdds.client.BlockID;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
+import org.apache.hadoop.hdds.scm.pipeline.MockPipeline;
 import org.apache.hadoop.ozone.container.common.helpers.ContainerMetrics;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import org.apache.hadoop.ozone.container.common.impl.TestHddsDispatcher;
@@ -34,10 +36,14 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.UUID;
 
+import static 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.CONTAINER_INTERNAL_ERROR;
 import static 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.SUCCESS;
 import static 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.UNKNOWN_BCSID;
 import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.DATANODE_UUID;
 import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.getDummyCommandRequestProto;
+import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.getPutBlockRequest;
+import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.getTestBlockID;
+import static 
org.apache.hadoop.ozone.container.ContainerTestHelper.getWriteChunkRequest;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -113,6 +119,24 @@ public class TestKeyValueHandlerWithUnhealthyContainer {
     assertEquals(UNKNOWN_BCSID, response.getResult());
   }
 
+  @Test
+  void testNPEFromPutBlock() throws IOException {
+    KeyValueContainer container = new KeyValueContainer(
+        mock(KeyValueContainerData.class),
+        new OzoneConfiguration());
+    KeyValueHandler subject = getDummyHandler();
+
+    BlockID blockID = getTestBlockID(1);
+    ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
+        getWriteChunkRequest(MockPipeline.createSingleNodePipeline(),
+            blockID, 123);
+    ContainerProtos.ContainerCommandResponseProto response =
+        subject.handle(
+            getPutBlockRequest(writeChunkRequest),
+            container, null);
+    assertEquals(CONTAINER_INTERNAL_ERROR, response.getResult());
+  }
+
   // -- Helper methods below.
 
   private KeyValueHandler getDummyHandler() throws IOException {


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

Reply via email to