From fa45a9f3a498daf32af1cd471a00f5cc70d18f2a Mon Sep 17 00:00:00 2001 From: Bertrand Renuart Date: Mon, 9 Jan 2017 20:38:45 +0100 Subject: [PATCH] Use a fixed size buffer for the copy operation (#1538) Set the default buffer size to 8192 to match Tomcat and Jetty defaults Use a buffer per worker thread and use it for subsequent requests --- .../zuul/filters/post/SendResponseFilter.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java index 1bc1d54e..15ed4289 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java @@ -48,7 +48,7 @@ public class SendResponseFilter extends ZuulFilter { private static DynamicIntProperty INITIAL_STREAM_BUFFER_SIZE = DynamicPropertyFactory .getInstance() - .getIntProperty(ZuulConstants.ZUUL_INITIAL_STREAM_BUFFER_SIZE, 1024); + .getIntProperty(ZuulConstants.ZUUL_INITIAL_STREAM_BUFFER_SIZE, 8192); private static DynamicBooleanProperty SET_CONTENT_LENGTH = DynamicPropertyFactory .getInstance() @@ -65,6 +65,13 @@ public class SendResponseFilter extends ZuulFilter { } } + private ThreadLocal buffers = new ThreadLocal() { + @Override + protected byte[] initialValue() { + return new byte[INITIAL_STREAM_BUFFER_SIZE.get()]; + } + }; + @Override public String filterType() { return "post"; @@ -177,21 +184,16 @@ public class SendResponseFilter extends ZuulFilter { } private void writeResponse(InputStream zin, OutputStream out) throws Exception { - byte[] bytes = new byte[INITIAL_STREAM_BUFFER_SIZE.get()]; - int bytesRead = -1; - while ((bytesRead = zin.read(bytes)) != -1) { - try { + try { + byte[] bytes = buffers.get(); + int bytesRead = -1; + while ((bytesRead = zin.read(bytes)) != -1) { out.write(bytes, 0, bytesRead); - out.flush(); - } - catch (IOException ex) { - // ignore - } - // doubles buffer size if previous read filled it - if (bytesRead == bytes.length) { - bytes = new byte[bytes.length * 2]; } } + catch(IOException ioe) { + log.warn("Error while sending response to client: "+ioe.getMessage()); + } } private void addResponseHeaders() {