You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by el...@apache.org on 2019/10/13 06:50:15 UTC

[hadoop-ozone] 01/01: HDDS-2206. Separate handling for OMException and IOException in the Ozone Manager.

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

elek pushed a commit to branch HDDS-2206
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git

commit db69f54fa28fe32658ca373a844bb737b4a2a9ac
Author: sdeka <sd...@hortonworks.com>
AuthorDate: Thu Oct 10 15:28:17 2019 +0530

    HDDS-2206. Separate handling for OMException and IOException in the Ozone Manager.
---
 .../common/src/main/resources/ozone-default.xml    | 14 +++++++++
 .../org/apache/hadoop/ozone/om/OMConfigKeys.java   |  7 +++++
 .../org/apache/hadoop/ozone/om/OzoneManager.java   | 16 ++++------
 ...OzoneManagerProtocolServerSideTranslatorPB.java | 35 ++++++++++++++++++----
 4 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index 31bc652..96acb3b 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -1642,6 +1642,20 @@
   </property>
 
   <property>
+    <name>ozone.om.exception.stacktrace.propagate</name>
+    <value>true</value>
+    <tag>OZONE, OM, DEBUG</tag>
+    <description>
+      If true, propagate full stacktrace for system exceptions to the client.
+      If false, propagate summary message only and log stacktrace on server.
+      Full stacktrace on the client is useful for developers to debug
+      unexpected system errors encountered on the server while handling a
+      request.
+      This setting is not applicable for business exceptions.
+    </description>
+  </property>
+
+  <property>
     <name>ozone.om.ratis.client.request.timeout.duration</name>
     <value>3s</value>
     <tag>OZONE, OM, RATIS, MANAGEMENT</tag>
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
index dcb9b5c..100c955 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
@@ -151,6 +151,13 @@ public final class OMConfigKeys {
   public static final TimeDuration OZONE_OM_RATIS_MINIMUM_TIMEOUT_DEFAULT
       = TimeDuration.valueOf(1, TimeUnit.SECONDS);
 
+  // Propagate stack trace for System Exceptions to the client.
+  public static final String OZONE_OM_PROPAGATE_SYSTEM_EXCEPTION_STACKTRACE
+      = "ozone.om.exception.stacktrace.propagate";
+  public static final boolean
+      OZONE_OM_PROPAGATE_SYSTEM_EXCEPTION_STACKTRACE_DEFAULT
+      = true;
+
   // OM Ratis client configurations
   public static final String OZONE_OM_RATIS_CLIENT_REQUEST_TIMEOUT_DURATION_KEY
       = "ozone.om.ratis.client.request.timeout.duration";
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index a6503d7..76a940b 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -200,15 +200,7 @@ import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAU
 import static org.apache.hadoop.ozone.OzoneConsts.OM_METRICS_FILE;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_METRICS_TEMP_FILE;
 import static org.apache.hadoop.ozone.OzoneConsts.RPC_PORT;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HANDLER_COUNT_DEFAULT;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HANDLER_COUNT_KEY;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_METRICS_SAVE_INTERVAL;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_METRICS_SAVE_INTERVAL_DEFAULT;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_USER_MAX_VOLUME;
-import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_USER_MAX_VOLUME_DEFAULT;
+import static org.apache.hadoop.ozone.om.OMConfigKeys.*;
 import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_AUTH_METHOD;
 import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_REQUEST;
 import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
@@ -1193,8 +1185,12 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
         OZONE_OM_HANDLER_COUNT_DEFAULT);
     RPC.setProtocolEngine(configuration, OzoneManagerProtocolPB.class,
         ProtobufRpcEngine.class);
+    final boolean propagateExceptionStack =
+        conf.getBoolean(OZONE_OM_PROPAGATE_SYSTEM_EXCEPTION_STACKTRACE,
+            OZONE_OM_PROPAGATE_SYSTEM_EXCEPTION_STACKTRACE_DEFAULT);
     this.omServerProtocol = new OzoneManagerProtocolServerSideTranslatorPB(
-        this, omRatisServer, omClientProtocolMetrics, isRatisEnabled);
+        this, omRatisServer, omClientProtocolMetrics, isRatisEnabled,
+        propagateExceptionStack);
 
     BlockingService omService = newReflectiveBlockingService(omServerProtocol);
 
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 d4c029b..cccae42 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
@@ -22,6 +22,7 @@ import org.apache.hadoop.hdds.server.OzoneProtocolMessageDispatcher;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.NotLeaderException;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB;
 import org.apache.hadoop.ozone.om.ratis.OzoneManagerDoubleBuffer;
 import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
@@ -56,6 +57,7 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
   private final OzoneManagerRatisServer omRatisServer;
   private final RequestHandler handler;
   private final boolean isRatisEnabled;
+  private final boolean propagateExceptionStack;
   private final OzoneManager ozoneManager;
   private final OzoneManagerDoubleBuffer ozoneManagerDoubleBuffer;
   private final AtomicLong transactionIndex = new AtomicLong(0L);
@@ -71,11 +73,13 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
       OzoneManager impl,
       OzoneManagerRatisServer ratisServer,
       ProtocolMessageMetrics metrics,
-      boolean enableRatis) {
+      boolean enableRatis,
+      boolean propagateExceptionStack) {
     this.ozoneManager = impl;
     handler = new OzoneManagerRequestHandler(impl);
     this.omRatisServer = ratisServer;
     this.isRatisEnabled = enableRatis;
+    this.propagateExceptionStack = propagateExceptionStack;
     this.ozoneManagerDoubleBuffer =
         new OzoneManagerDoubleBuffer(ozoneManager.getMetadataManager(), (i) -> {
           // Do nothing.
@@ -118,7 +122,7 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
             request = omClientRequest.preExecute(ozoneManager);
           } catch (IOException ex) {
             // As some of the preExecute returns error. So handle here.
-            return createErrorResponse(request, ex);
+            return failRequestWithException(request, ex);
           }
           return submitRequestToRatis(request);
         } else {
@@ -131,7 +135,27 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
         }
       }
     } else {
-      return submitRequestDirectlyToOM(request);
+      try {
+        OMResponse response = submitRequestDirectlyToOM(request);
+        return response;
+      } catch (IOException ex) {
+        return failRequestWithException(request, ex);
+      }
+    }
+  }
+
+  private OMResponse failRequestWithException(OMRequest request, IOException e)
+      throws ServiceException {
+    // send summary error response for business exceptions.
+    if (e instanceof OMException) {
+      return createErrorResponse(request, e);
+    }
+    // propagate full stack trace for System Exceptions?
+    if (propagateExceptionStack) {
+      throw new ServiceException(e.getMessage(), e);
+    } else {
+      LOG.error(e.getMessage(), e);
+      return createErrorResponse(request, e);
     }
   }
 
@@ -202,7 +226,8 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
   /**
    * Submits request directly to OM.
    */
-  private OMResponse submitRequestDirectlyToOM(OMRequest request) {
+  private OMResponse submitRequestDirectlyToOM(OMRequest request)
+      throws IOException {
     OMClientResponse omClientResponse = null;
     long index = 0L;
     try {
@@ -219,7 +244,7 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements
         omClientResponse = omClientRequest.validateAndUpdateCache(
             ozoneManager, index, ozoneManagerDoubleBuffer::add);
       }
-    } catch(IOException ex) {
+    } catch(OMException ex) {
       // As some of the preExecute returns error. So handle here.
       return createErrorResponse(request, ex);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: hdfs-commits-help@hadoop.apache.org