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-unsubscr...@hadoop.apache.org For additional commands, e-mail: hdfs-commits-h...@hadoop.apache.org