This is an automated email from the ASF dual-hosted git repository. sewen pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
commit 584d8908c3e3209d05b227df8b2894d0448d2f9b Author: Steven Wu <[email protected]> AuthorDate: Fri Jun 7 15:26:20 2019 -0700 [FLINK-12781][REST] Include the whole stack trace in error response payload This closes #8665 --- .../flink/runtime/rest/handler/AbstractHandler.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/AbstractHandler.java b/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/AbstractHandler.java index 1d2aa0f..08eb07f 100644 --- a/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/AbstractHandler.java +++ b/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/AbstractHandler.java @@ -21,6 +21,7 @@ package org.apache.flink.runtime.rest.handler; import org.apache.flink.api.common.time.Time; import org.apache.flink.runtime.concurrent.FutureUtils; import org.apache.flink.runtime.rest.FileUploadHandler; +import org.apache.flink.runtime.rest.FlinkHttpObjectAggregator; import org.apache.flink.runtime.rest.handler.router.RoutedRequest; import org.apache.flink.runtime.rest.handler.util.HandlerUtils; import org.apache.flink.runtime.rest.messages.ErrorResponseBody; @@ -34,6 +35,7 @@ import org.apache.flink.util.AutoCloseableAsync; import org.apache.flink.util.ExceptionUtils; import org.apache.flink.util.Preconditions; +import org.apache.flink.shaded.guava18.com.google.common.base.Ascii; import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonParseException; import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.JsonMappingException; import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectMapper; @@ -71,6 +73,12 @@ public abstract class AbstractHandler<T extends RestfulGateway, R extends Reques protected static final ObjectMapper MAPPER = RestMapperUtils.getStrictObjectMapper(); + /** + * Other response payload overhead (in bytes). + * If we truncate response payload, we should leave enough buffer for this overhead. + */ + private static final int OTHER_RESP_PAYLOAD_OVERHEAD = 1024; + private final UntypedResponseMessageHeaders<R, M> untypedResponseMessageHeaders; /** @@ -180,8 +188,12 @@ public abstract class AbstractHandler<T extends RestfulGateway, R extends Reques } private CompletableFuture<Void> handleException(Throwable throwable, ChannelHandlerContext ctx, HttpRequest httpRequest) { + FlinkHttpObjectAggregator flinkHttpObjectAggregator = ctx.pipeline().get(FlinkHttpObjectAggregator.class); + int maxLength = flinkHttpObjectAggregator.maxContentLength() - OTHER_RESP_PAYLOAD_OVERHEAD; if (throwable instanceof RestHandlerException) { RestHandlerException rhe = (RestHandlerException) throwable; + String stackTrace = ExceptionUtils.stringifyException(rhe); + String truncatedStackTrace = Ascii.truncate(stackTrace, maxLength, "..."); if (log.isDebugEnabled()) { log.error("Exception occurred in REST handler.", rhe); } else { @@ -190,17 +202,18 @@ public abstract class AbstractHandler<T extends RestfulGateway, R extends Reques return HandlerUtils.sendErrorResponse( ctx, httpRequest, - new ErrorResponseBody(rhe.getMessage()), + new ErrorResponseBody(truncatedStackTrace), rhe.getHttpResponseStatus(), responseHeaders); } else { log.error("Unhandled exception.", throwable); String stackTrace = String.format("<Exception on server side:%n%s%nEnd of exception on server side>", ExceptionUtils.stringifyException(throwable)); + String truncatedStackTrace = Ascii.truncate(stackTrace, maxLength, "..."); return HandlerUtils.sendErrorResponse( ctx, httpRequest, - new ErrorResponseBody(Arrays.asList("Internal server error.", stackTrace)), + new ErrorResponseBody(Arrays.asList("Internal server error.", truncatedStackTrace)), HttpResponseStatus.INTERNAL_SERVER_ERROR, responseHeaders); }
