From 40205998a0de6b0345b6943d9a13cd26e3fd626a Mon Sep 17 00:00:00 2001 From: hongzezhang Date: Wed, 11 Apr 2018 10:51:44 +0800 Subject: [PATCH 1/2] Update to jetty 9.4; Enable request decompression; Add http compression config options --- docs/content/operations/http-compression.md | 13 +++++++ pom.xml | 2 +- .../server/initialization/ServerConfig.java | 33 ++++++++++++++++- .../jetty/JettyServerInitUtils.java | 6 +-- .../AsyncManagementForwardingServletTest.java | 2 +- .../AsyncQueryForwardingServletTest.java | 2 +- .../server/initialization/BaseJettyTest.java | 26 ++++++++++--- .../server/initialization/JettyTest.java | 37 ++++++++++++++++--- .../main/java/io/druid/cli/CliOverlord.java | 11 +++++- .../CoordinatorJettyServerInitializer.java | 11 +++++- .../MiddleManagerJettyServerInitializer.java | 19 +++++++--- .../cli/QueryJettyServerInitializer.java | 6 ++- .../cli/RouterJettyServerInitializer.java | 12 +++++- 13 files changed, 150 insertions(+), 30 deletions(-) create mode 100644 docs/content/operations/http-compression.md diff --git a/docs/content/operations/http-compression.md b/docs/content/operations/http-compression.md new file mode 100644 index 000000000000..bb6864409749 --- /dev/null +++ b/docs/content/operations/http-compression.md @@ -0,0 +1,13 @@ +--- +layout: doc_page +--- +# HTTP Compression + +Druid supports http request decompression and response compression, to use this, http request header `Content-Encoding:gzip` and `Accept-Encoding:gzip` is needed to be set. + +# General Configuration + +|Property|Description|Default| +|--------|-----------|-------| +|`druid.server.http.compressionLevel`|The compression level. Value should be between [-1,9], -1 for default level, 0 for no compression.|-1 (default compression level)| +|`druid.server.http.inflateBufferSize`|The buffer size used by gzip decoder. Set to 0 to disable request decompression.|4096| \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8fc12df9adc4..070faabacda3 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 8.1.0 16.0.1 4.1.0 - 9.3.19.v20170502 + 9.4.10.v20180503 1.19.3 2.6.7 diff --git a/server/src/main/java/io/druid/server/initialization/ServerConfig.java b/server/src/main/java/io/druid/server/initialization/ServerConfig.java index 8fa80d5e50b6..43ba7f812c7e 100644 --- a/server/src/main/java/io/druid/server/initialization/ServerConfig.java +++ b/server/src/main/java/io/druid/server/initialization/ServerConfig.java @@ -22,14 +22,19 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.joda.time.Period; +import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import java.util.Objects; +import java.util.zip.Deflater; /** */ public class ServerConfig { + + public static final int DEFAULT_GZIP_INFLATE_BUFFER_SIZE = 4096; + @JsonProperty @Min(1) private int numThreads = Math.max(10, (Runtime.getRuntime().availableProcessors() * 17) / 16 + 2) + 30; @@ -68,6 +73,15 @@ public class ServerConfig @NotNull private Period unannouncePropogationDelay = Period.ZERO; + @JsonProperty + @Min(0) + private int inflateBufferSize = DEFAULT_GZIP_INFLATE_BUFFER_SIZE; + + @JsonProperty + @Min(-1) + @Max(9) + private int compressionLevel = Deflater.DEFAULT_COMPRESSION; + public int getNumThreads() { return numThreads; @@ -118,6 +132,17 @@ public Period getUnannouncePropogationDelay() return unannouncePropogationDelay; } + public int getInflateBufferSize() + { + return inflateBufferSize; + } + + public int getCompressionLevel() + { + return compressionLevel; + } + + @Override public boolean equals(Object o) { @@ -135,6 +160,8 @@ public boolean equals(Object o) maxScatterGatherBytes == that.maxScatterGatherBytes && maxQueryTimeout == that.maxQueryTimeout && maxRequestHeaderSize == that.maxRequestHeaderSize && + inflateBufferSize == that.inflateBufferSize && + compressionLevel == that.compressionLevel && Objects.equals(maxIdleTime, that.maxIdleTime) && Objects.equals(gracefulShutdownTimeout, that.gracefulShutdownTimeout) && Objects.equals(unannouncePropogationDelay, that.unannouncePropogationDelay); @@ -154,7 +181,9 @@ public int hashCode() maxQueryTimeout, maxRequestHeaderSize, gracefulShutdownTimeout, - unannouncePropogationDelay + unannouncePropogationDelay, + inflateBufferSize, + compressionLevel ); } @@ -172,6 +201,8 @@ public String toString() ", maxRequestHeaderSize=" + maxRequestHeaderSize + ", gracefulShutdownTimeout=" + gracefulShutdownTimeout + ", unannouncePropogationDelay=" + unannouncePropogationDelay + + ", inflateBufferSize=" + inflateBufferSize + + ", compressionLevel=" + compressionLevel + '}'; } } diff --git a/server/src/main/java/io/druid/server/initialization/jetty/JettyServerInitUtils.java b/server/src/main/java/io/druid/server/initialization/jetty/JettyServerInitUtils.java index 0adc8c625b38..701e707ca102 100644 --- a/server/src/main/java/io/druid/server/initialization/jetty/JettyServerInitUtils.java +++ b/server/src/main/java/io/druid/server/initialization/jetty/JettyServerInitUtils.java @@ -22,9 +22,7 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.TypeLiteral; - import io.druid.java.util.common.ISE; - import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.handler.RequestLogHandler; import org.eclipse.jetty.server.handler.gzip.GzipHandler; @@ -38,11 +36,13 @@ public class JettyServerInitUtils { private static final String[] GZIP_METHODS = new String[]{HttpMethod.GET, HttpMethod.POST}; - public static GzipHandler wrapWithDefaultGzipHandler(final Handler handler) + public static GzipHandler wrapWithDefaultGzipHandler(final Handler handler, int inflateBufferSize, int compressionLevel) { GzipHandler gzipHandler = new GzipHandler(); gzipHandler.setMinGzipSize(0); gzipHandler.setIncludedMethods(GZIP_METHODS); + gzipHandler.setInflateBufferSize(inflateBufferSize); + gzipHandler.setCompressionLevel(compressionLevel); // We don't actually have any precomputed .gz resources, and checking for them inside jars is expensive. gzipHandler.setCheckGzExists(false); diff --git a/server/src/test/java/io/druid/server/AsyncManagementForwardingServletTest.java b/server/src/test/java/io/druid/server/AsyncManagementForwardingServletTest.java index 5821377e2bf0..208bd3f42e6f 100644 --- a/server/src/test/java/io/druid/server/AsyncManagementForwardingServletTest.java +++ b/server/src/test/java/io/druid/server/AsyncManagementForwardingServletTest.java @@ -436,7 +436,7 @@ public String getCurrentLeader() JettyServerInitUtils.addExtensionFilters(root, injector); final HandlerList handlerList = new HandlerList(); - handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root)}); + handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root, 4096, -1)}); server.setHandler(handlerList); } } diff --git a/server/src/test/java/io/druid/server/AsyncQueryForwardingServletTest.java b/server/src/test/java/io/druid/server/AsyncQueryForwardingServletTest.java index bd17d25acbea..4b5cf51fb2b7 100644 --- a/server/src/test/java/io/druid/server/AsyncQueryForwardingServletTest.java +++ b/server/src/test/java/io/druid/server/AsyncQueryForwardingServletTest.java @@ -364,7 +364,7 @@ protected URI rewriteURI(HttpServletRequest request, String scheme, String host) root.addFilter(GuiceFilter.class, "/exception/*", null); final HandlerList handlerList = new HandlerList(); - handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root)}); + handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root, 4096, -1)}); server.setHandler(handlerList); } } diff --git a/server/src/test/java/io/druid/server/initialization/BaseJettyTest.java b/server/src/test/java/io/druid/server/initialization/BaseJettyTest.java index 1471065ce425..6f7d52b4da0b 100644 --- a/server/src/test/java/io/druid/server/initialization/BaseJettyTest.java +++ b/server/src/test/java/io/druid/server/initialization/BaseJettyTest.java @@ -52,6 +52,7 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -66,6 +67,8 @@ public abstract class BaseJettyTest { + protected static final String DEFAULT_RESPONSE_CONTENT = "hello"; + protected Lifecycle lifecycle; protected HttpClient client; protected Server server; @@ -142,7 +145,7 @@ public void initialize(Server server, Injector injector) root.addFilter(GuiceFilter.class, "/*", null); final HandlerList handlerList = new HandlerList(); - handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root)}); + handlerList.setHandlers(new Handler[]{JettyServerInitUtils.wrapWithDefaultGzipHandler(root, 4096, -1)}); server.setHandler(handlerList); } @@ -165,33 +168,46 @@ public Response hello() catch (InterruptedException e) { // } - return Response.ok("hello").build(); + return Response.ok(DEFAULT_RESPONSE_CONTENT).build(); } } @Path("/default") public static class DefaultResource { + @DELETE @Path("{resource}") @Produces(MediaType.APPLICATION_JSON) public Response delete() { - return Response.ok("hello").build(); + return Response.ok(DEFAULT_RESPONSE_CONTENT).build(); } @GET @Produces(MediaType.APPLICATION_JSON) public Response get() { - return Response.ok("hello").build(); + return Response.ok(DEFAULT_RESPONSE_CONTENT).build(); } @POST @Produces(MediaType.APPLICATION_JSON) public Response post() { - return Response.ok("hello").build(); + return Response.ok(DEFAULT_RESPONSE_CONTENT).build(); + } + } + + @Path("/return") + public static class DirectlyReturnResource + { + @POST + @Consumes(MediaType.TEXT_PLAIN) + @Produces(MediaType.TEXT_PLAIN) + public Response postText(String text) + { + return Response.ok(text).build(); } } diff --git a/server/src/test/java/io/druid/server/initialization/JettyTest.java b/server/src/test/java/io/druid/server/initialization/JettyTest.java index ef0610fb58dc..a7e3c514ef25 100644 --- a/server/src/test/java/io/druid/server/initialization/JettyTest.java +++ b/server/src/test/java/io/druid/server/initialization/JettyTest.java @@ -27,10 +27,6 @@ import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.multibindings.Multibinder; -import io.druid.java.util.http.client.Request; -import io.druid.java.util.http.client.response.InputStreamResponseHandler; -import io.druid.java.util.http.client.response.StatusResponseHandler; -import io.druid.java.util.http.client.response.StatusResponseHolder; import io.druid.guice.GuiceInjectors; import io.druid.guice.Jerseys; import io.druid.guice.JsonConfigProvider; @@ -38,6 +34,10 @@ import io.druid.guice.LifecycleModule; import io.druid.guice.annotations.Self; import io.druid.initialization.Initialization; +import io.druid.java.util.http.client.Request; +import io.druid.java.util.http.client.response.InputStreamResponseHandler; +import io.druid.java.util.http.client.response.StatusResponseHandler; +import io.druid.java.util.http.client.response.StatusResponseHolder; import io.druid.server.DruidNode; import io.druid.server.initialization.jetty.JettyServerInitializer; import io.druid.server.initialization.jetty.ServletFilterHolder; @@ -53,12 +53,15 @@ import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.MediaType; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.EnumSet; import java.util.Locale; import java.util.Map; @@ -67,6 +70,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; public class JettyTest extends BaseJettyTest { @@ -129,6 +134,7 @@ public EnumSet getDispatcherType() Jerseys.addResource(binder, SlowResource.class); Jerseys.addResource(binder, ExceptionResource.class); Jerseys.addResource(binder, DefaultResource.class); + Jerseys.addResource(binder, DirectlyReturnResource.class); binder.bind(AuthorizerMapper.class).toInstance(AuthTestUtils.TEST_AUTHORIZER_MAPPER); LifecycleModule.register(binder, Server.class); } @@ -196,24 +202,28 @@ public void run() } @Test - public void testGzipCompression() throws Exception + public void testGzipResponseCompression() throws Exception { final URL url = new URL("http://localhost:" + port + "/default"); final HttpURLConnection get = (HttpURLConnection) url.openConnection(); get.setRequestProperty("Accept-Encoding", "gzip"); Assert.assertEquals("gzip", get.getContentEncoding()); + Assert.assertEquals(DEFAULT_RESPONSE_CONTENT, IOUtils.toString(new GZIPInputStream(get.getInputStream()), StandardCharsets.UTF_8)); final HttpURLConnection post = (HttpURLConnection) url.openConnection(); post.setRequestProperty("Accept-Encoding", "gzip"); post.setRequestMethod("POST"); Assert.assertEquals("gzip", post.getContentEncoding()); + Assert.assertEquals(DEFAULT_RESPONSE_CONTENT, IOUtils.toString(new GZIPInputStream(post.getInputStream()), StandardCharsets.UTF_8)); final HttpURLConnection getNoGzip = (HttpURLConnection) url.openConnection(); Assert.assertNotEquals("gzip", getNoGzip.getContentEncoding()); + Assert.assertEquals(DEFAULT_RESPONSE_CONTENT, IOUtils.toString(getNoGzip.getInputStream(), StandardCharsets.UTF_8)); final HttpURLConnection postNoGzip = (HttpURLConnection) url.openConnection(); postNoGzip.setRequestMethod("POST"); Assert.assertNotEquals("gzip", postNoGzip.getContentEncoding()); + Assert.assertEquals(DEFAULT_RESPONSE_CONTENT, IOUtils.toString(postNoGzip.getInputStream(), StandardCharsets.UTF_8)); } // Tests that threads are not stuck when partial chunk is not finalized @@ -283,4 +293,21 @@ public void testExtensionAuthFilter() throws Exception get.setRequestProperty(DummyAuthFilter.AUTH_HDR, "hacker"); Assert.assertEquals(HttpServletResponse.SC_UNAUTHORIZED, get.getResponseCode()); } + + @Test + public void testGzipRequestDecompression() throws Exception + { + String text = "hello"; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(out)) { + gzipOutputStream.write(text.getBytes(Charset.defaultCharset())); + } + Request request = new Request(HttpMethod.POST, new URL("http://localhost:" + port + "/return")); + request.setHeader("Content-Encoding", "gzip"); + request.setContent(MediaType.TEXT_PLAIN, out.toByteArray()); + Assert.assertEquals(text, new String(IOUtils.toByteArray(client.go( + request, + new InputStreamResponseHandler() + ).get()), Charset.defaultCharset())); + } } diff --git a/services/src/main/java/io/druid/cli/CliOverlord.java b/services/src/main/java/io/druid/cli/CliOverlord.java index 33f842c2e4e6..0a9c4b1d4d36 100644 --- a/services/src/main/java/io/druid/cli/CliOverlord.java +++ b/services/src/main/java/io/druid/cli/CliOverlord.java @@ -90,6 +90,7 @@ import io.druid.server.coordinator.CoordinatorOverlordServiceConfig; import io.druid.server.http.RedirectFilter; import io.druid.server.http.RedirectInfo; +import io.druid.server.initialization.ServerConfig; import io.druid.server.initialization.jetty.JettyServerInitUtils; import io.druid.server.initialization.jetty.JettyServerInitializer; import io.druid.server.security.AuthConfig; @@ -307,11 +308,13 @@ private void configureOverlordHelpers(Binder binder) private static class OverlordJettyServerInitializer implements JettyServerInitializer { private final AuthConfig authConfig; + private final ServerConfig serverConfig; @Inject - OverlordJettyServerInitializer(AuthConfig authConfig) + OverlordJettyServerInitializer(AuthConfig authConfig, ServerConfig serverConfig) { this.authConfig = authConfig; + this.serverConfig = serverConfig; } @Override @@ -373,7 +376,11 @@ public void initialize(Server server, Injector injector) handlerList.setHandlers( new Handler[]{ JettyServerInitUtils.getJettyRequestLogHandler(), - JettyServerInitUtils.wrapWithDefaultGzipHandler(root) + JettyServerInitUtils.wrapWithDefaultGzipHandler( + root, + serverConfig.getInflateBufferSize(), + serverConfig.getCompressionLevel() + ) } ); diff --git a/services/src/main/java/io/druid/cli/CoordinatorJettyServerInitializer.java b/services/src/main/java/io/druid/cli/CoordinatorJettyServerInitializer.java index c9bc725e5e95..0fe0928764b8 100644 --- a/services/src/main/java/io/druid/cli/CoordinatorJettyServerInitializer.java +++ b/services/src/main/java/io/druid/cli/CoordinatorJettyServerInitializer.java @@ -30,6 +30,7 @@ import io.druid.server.coordinator.DruidCoordinatorConfig; import io.druid.server.http.OverlordProxyServlet; import io.druid.server.http.RedirectFilter; +import io.druid.server.initialization.ServerConfig; import io.druid.server.initialization.jetty.JettyServerInitUtils; import io.druid.server.initialization.jetty.JettyServerInitializer; import io.druid.server.security.AuthConfig; @@ -72,13 +73,15 @@ class CoordinatorJettyServerInitializer implements JettyServerInitializer private final DruidCoordinatorConfig config; private final boolean beOverlord; private final AuthConfig authConfig; + private final ServerConfig serverConfig; @Inject - CoordinatorJettyServerInitializer(DruidCoordinatorConfig config, Properties properties, AuthConfig authConfig) + CoordinatorJettyServerInitializer(DruidCoordinatorConfig config, Properties properties, AuthConfig authConfig, ServerConfig serverConfig) { this.config = config; this.beOverlord = CliCoordinator.isOverlord(properties); this.authConfig = authConfig; + this.serverConfig = serverConfig; } @Override @@ -165,7 +168,11 @@ public void initialize(Server server, Injector injector) handlerList.setHandlers( new Handler[]{ JettyServerInitUtils.getJettyRequestLogHandler(), - JettyServerInitUtils.wrapWithDefaultGzipHandler(root) + JettyServerInitUtils.wrapWithDefaultGzipHandler( + root, + serverConfig.getInflateBufferSize(), + serverConfig.getCompressionLevel() + ) } ); diff --git a/services/src/main/java/io/druid/cli/MiddleManagerJettyServerInitializer.java b/services/src/main/java/io/druid/cli/MiddleManagerJettyServerInitializer.java index 9408acc588bf..96aaf5a319f5 100644 --- a/services/src/main/java/io/druid/cli/MiddleManagerJettyServerInitializer.java +++ b/services/src/main/java/io/druid/cli/MiddleManagerJettyServerInitializer.java @@ -27,6 +27,7 @@ import com.google.inject.servlet.GuiceFilter; import io.druid.guice.annotations.Json; import io.druid.java.util.common.logger.Logger; +import io.druid.server.initialization.ServerConfig; import io.druid.server.initialization.jetty.JettyServerInitUtils; import io.druid.server.initialization.jetty.JettyServerInitializer; import io.druid.server.security.AuthConfig; @@ -49,18 +50,20 @@ class MiddleManagerJettyServerInitializer implements JettyServerInitializer { private static Logger log = new Logger(MiddleManagerJettyServerInitializer.class); - private static List UNSECURED_PATHS = Lists.newArrayList( - "/status/health" - ); - + private final ServerConfig serverConfig; private final AuthConfig authConfig; @Inject - public MiddleManagerJettyServerInitializer(AuthConfig authConfig) + public MiddleManagerJettyServerInitializer(ServerConfig serverConfig, AuthConfig authConfig) { + this.serverConfig = serverConfig; this.authConfig = authConfig; } + private static List UNSECURED_PATHS = Lists.newArrayList( + "/status/health" + ); + @Override public void initialize(Server server, Injector injector) { @@ -97,7 +100,11 @@ public void initialize(Server server, Injector injector) handlerList.setHandlers( new Handler[]{ JettyServerInitUtils.getJettyRequestLogHandler(), - JettyServerInitUtils.wrapWithDefaultGzipHandler(root), + JettyServerInitUtils.wrapWithDefaultGzipHandler( + root, + serverConfig.getInflateBufferSize(), + serverConfig.getCompressionLevel() + ), new DefaultHandler() } ); diff --git a/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java b/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java index b079041b2ad9..fec92da4965e 100644 --- a/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java +++ b/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java @@ -130,7 +130,11 @@ public void initialize(Server server, Injector injector) } // Add Gzip handler at the very end - handlerList.addHandler(JettyServerInitUtils.wrapWithDefaultGzipHandler(root)); + handlerList.addHandler(JettyServerInitUtils.wrapWithDefaultGzipHandler( + root, + serverConfig.getInflateBufferSize(), + serverConfig.getCompressionLevel() + )); final StatisticsHandler statisticsHandler = new StatisticsHandler(); statisticsHandler.setHandler(handlerList); diff --git a/services/src/main/java/io/druid/cli/RouterJettyServerInitializer.java b/services/src/main/java/io/druid/cli/RouterJettyServerInitializer.java index ec0ca471dfef..6eb763a272e7 100644 --- a/services/src/main/java/io/druid/cli/RouterJettyServerInitializer.java +++ b/services/src/main/java/io/druid/cli/RouterJettyServerInitializer.java @@ -30,6 +30,7 @@ import io.druid.guice.http.DruidHttpClientConfig; import io.druid.server.AsyncManagementForwardingServlet; import io.druid.server.AsyncQueryForwardingServlet; +import io.druid.server.initialization.ServerConfig; import io.druid.server.initialization.jetty.JettyServerInitUtils; import io.druid.server.initialization.jetty.JettyServerInitializer; import io.druid.server.router.ManagementProxyConfig; @@ -65,6 +66,7 @@ public class RouterJettyServerInitializer implements JettyServerInitializer private final AsyncQueryForwardingServlet asyncQueryForwardingServlet; private final AsyncManagementForwardingServlet asyncManagementForwardingServlet; private final AuthConfig authConfig; + private final ServerConfig serverConfig; @Inject public RouterJettyServerInitializer( @@ -73,7 +75,8 @@ public RouterJettyServerInitializer( ManagementProxyConfig managementProxyConfig, AsyncQueryForwardingServlet asyncQueryForwardingServlet, AsyncManagementForwardingServlet asyncManagementForwardingServlet, - AuthConfig authConfig + AuthConfig authConfig, + ServerConfig serverConfig ) { this.routerHttpClientConfig = routerHttpClientConfig; @@ -82,6 +85,7 @@ public RouterJettyServerInitializer( this.asyncQueryForwardingServlet = asyncQueryForwardingServlet; this.asyncManagementForwardingServlet = asyncManagementForwardingServlet; this.authConfig = authConfig; + this.serverConfig = serverConfig; } @Override @@ -132,7 +136,11 @@ public void initialize(Server server, Injector injector) handlerList.setHandlers( new Handler[]{ JettyServerInitUtils.getJettyRequestLogHandler(), - JettyServerInitUtils.wrapWithDefaultGzipHandler(root) + JettyServerInitUtils.wrapWithDefaultGzipHandler( + root, + serverConfig.getInflateBufferSize(), + serverConfig.getCompressionLevel() + ) } ); server.setHandler(handlerList); From 0c1b0e78ad508b037f38dd8cbe0ecb2ae1240a8a Mon Sep 17 00:00:00 2001 From: hongzezhang Date: Fri, 25 May 2018 15:38:31 +0800 Subject: [PATCH 2/2] Fix BadMessageException from jetty server at HttpGenerator.generateHeaders(...) --- .../java/io/druid/server/AsyncQueryForwardingServlet.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java b/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java index d10880fe83e5..0a4862213887 100644 --- a/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java +++ b/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java @@ -51,6 +51,7 @@ import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; import org.eclipse.jetty.client.util.BytesContentProvider; +import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.proxy.AsyncProxyServlet; @@ -300,7 +301,9 @@ protected void sendProxyRequest( if (query != null) { final ObjectMapper objectMapper = (ObjectMapper) clientRequest.getAttribute(OBJECTMAPPER_ATTRIBUTE); try { - proxyRequest.content(new BytesContentProvider(objectMapper.writeValueAsBytes(query))); + byte[] bytes = objectMapper.writeValueAsBytes(query); + proxyRequest.content(new BytesContentProvider(bytes)); + proxyRequest.getHeaders().put(HttpHeader.CONTENT_LENGTH, String.valueOf(bytes.length)); } catch (JsonProcessingException e) { Throwables.propagate(e);