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