You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mh...@apache.org on 2020/11/04 22:40:14 UTC

[asterixdb] branch master updated: [NO ISSUE][OTH] Avoid Allocating Buffers on Chunked OutputStream

This is an automated email from the ASF dual-hosted git repository.

mhubail pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new ae69730  [NO ISSUE][OTH] Avoid Allocating Buffers on Chunked OutputStream
ae69730 is described below

commit ae697303481da685452c3b919168cd8bfb059224
Author: Murtadha Hubail <mh...@apache.org>
AuthorDate: Wed Nov 4 01:24:20 2020 +0300

    [NO ISSUE][OTH] Avoid Allocating Buffers on Chunked OutputStream
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    - Avoid allocating additional buffers when reporting
      errors to ChunkedResponse.
    
    Change-Id: I36cbbb157b2e4013582e7161852b1a32286e709a
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/8723
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
---
 .../http/server/ChunkedNettyOutputStream.java       |  4 +---
 .../apache/hyracks/http/server/ChunkedResponse.java | 21 +++++++++++----------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
index 36da9ab..9a940b1 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
@@ -112,9 +112,7 @@ public class ChunkedNettyOutputStream extends OutputStream {
                 buffer = null;
                 buffer = ctx.alloc().buffer(size);
             } else {
-                ByteBuf aBuffer = ctx.alloc().buffer(buffer.readableBytes());
-                aBuffer.writeBytes(buffer);
-                response.error(aBuffer);
+                response.error(buffer);
                 buffer.clear();
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
index 40cbd9b..e00c519 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
@@ -71,7 +71,7 @@ public class ChunkedResponse implements IServletResponse {
     private PrintWriter writer;
     private DefaultHttpResponse response;
     private boolean headerSent;
-    private ByteBuf error;
+    private ByteBuf errorBuf;
     private ChannelFuture future;
     private boolean done;
 
@@ -119,7 +119,7 @@ public class ChunkedResponse implements IServletResponse {
         } else {
             outputStream.close();
         }
-        if (error == null && response.status() == HttpResponseStatus.OK) {
+        if (errorBuf == null && response.status() == HttpResponseStatus.OK) {
             if (!done) {
                 respond(LastHttpContent.EMPTY_LAST_CONTENT);
             }
@@ -127,14 +127,14 @@ public class ChunkedResponse implements IServletResponse {
             // There was an error
             if (headerSent) {
                 LOGGER.log(Level.WARN, "Error after header write of chunked response");
-                if (error != null) {
-                    error.release();
+                if (errorBuf != null) {
+                    errorBuf.release();
                 }
                 future = ctx.channel().close().addListener(handler);
             } else {
                 // we didn't send anything to the user, we need to send an non-chunked error response
                 fullResponse(response.protocolVersion(), response.status(),
-                        error == null ? ctx.alloc().buffer(0, 0) : error, response.headers());
+                        errorBuf == null ? ctx.alloc().buffer(0, 0) : errorBuf, response.headers());
             }
         }
         done = true;
@@ -152,12 +152,13 @@ public class ChunkedResponse implements IServletResponse {
     }
 
     public void error(ByteBuf error) {
-        if (this.error == null) {
-            this.error = error;
-        } else {
-            this.error.capacity(this.error.capacity() + error.capacity());
-            this.error.writeBytes(error);
+        if (errorBuf == null) {
+            errorBuf = ctx.alloc().buffer(error.readableBytes());
+        }
+        if (errorBuf.capacity() < this.errorBuf.capacity() + error.capacity()) {
+            errorBuf.capacity(this.errorBuf.capacity() + error.capacity());
         }
+        errorBuf.writeBytes(error);
     }
 
     @Override