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);
                }

Reply via email to