abdullah alamoudi has submitted this change and it was merged.

Change subject: [NO ISSUE][HTTP] Fix buffer leak in HttpServer
......................................................................


[NO ISSUE][HTTP] Fix buffer leak in HttpServer

- user model changes: no
- storage format changes: no
- interface changes: yes

Details:
- Prior to this change, cancelled requests before
  they start leak request and response buffers.
- After this change, we distinguish between cancellation
  of requests before they start or after and release resources
  accordingly.

Change-Id: I9a34142e87158385152fa0a11be39abced307fcc
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2901
Reviewed-by: Michael Blow <mb...@apache.org>
Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
---
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletResponse.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
5 files changed, 41 insertions(+), 1 deletion(-)

Approvals:
  Anon. E. Moose #1000171: 
  Jenkins: Verified; No violations found; ; Verified
  Michael Blow: Looks good to me, approved



diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletResponse.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletResponse.java
index 38f2d23..95f8f27 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletResponse.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletResponse.java
@@ -86,4 +86,9 @@
      * Notifies the response that the channel has become inactive.
      */
     void notifyChannelInactive();
+
+    /**
+     * Called on a created request that is cancelled before it is started
+     */
+    void cancel();
 }
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 891cc2a..adea133 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
@@ -29,6 +29,7 @@
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.http.DefaultHttpContent;
 import io.netty.handler.codec.http.HttpResponseStatus;
+import io.netty.util.ReferenceCountUtil;
 import io.netty.util.internal.OutOfDirectMemoryError;
 
 public class ChunkedNettyOutputStream extends OutputStream {
@@ -137,4 +138,8 @@
     public synchronized void channelWritabilityChanged() {
         notifyAll();
     }
+
+    public void cancel() {
+        ReferenceCountUtil.release(buffer);
+    }
 }
\ No newline at end of file
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 cd746b1..f02654e 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
@@ -192,4 +192,9 @@
     public void notifyChannelInactive() {
         outputStream.channelWritabilityChanged();
     }
+
+    @Override
+    public void cancel() {
+        outputStream.cancel();
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
index 90e33b6..1d28472 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
@@ -111,4 +111,9 @@
         // Do nothing.
         // This response is sent as a single piece
     }
+
+    @Override
+    public void cancel() {
+        // Do nothing, as this response doesn't allocate buffers in constructor
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
index 72a8ea0..1c0801c 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
@@ -40,6 +40,8 @@
     private final IServlet servlet;
     private final IServletRequest request;
     private final IServletResponse response;
+    private boolean started = false;
+    private boolean cancelled = false;
 
     public HttpRequestHandler(ChannelHandlerContext ctx, IServlet servlet, 
IServletRequest request, int chunkSize) {
         this.ctx = ctx;
@@ -52,6 +54,13 @@
 
     @Override
     public Void call() throws Exception {
+        synchronized (this) {
+            if (cancelled) {
+                LOGGER.warn("Request cancelled before it is started");
+                return null;
+            }
+            started = true;
+        }
         try {
             ChannelFuture lastContentFuture = handle();
             if (!HttpUtil.isKeepAlive(request.getHttpRequest())) {
@@ -83,7 +92,18 @@
     }
 
     public void notifyChannelInactive() {
-        response.notifyChannelInactive();
+        synchronized (this) {
+            if (!started) {
+                cancelled = true;
+            }
+        }
+        if (cancelled) {
+            // release request and response
+            response.cancel();
+            request.getHttpRequest().release();
+        } else {
+            response.notifyChannelInactive();
+        }
     }
 
     public void reject() throws IOException {

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2901
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I9a34142e87158385152fa0a11be39abced307fcc
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com>
Gerrit-Reviewer: Anon. E. Moose #1000171
Gerrit-Reviewer: Ian Maxon <ima...@apache.org>
Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Michael Blow <mb...@apache.org>
Gerrit-Reviewer: Murtadha Hubail <mhub...@apache.org>
Gerrit-Reviewer: Till Westmann <ti...@apache.org>
Gerrit-Reviewer: abdullah alamoudi <bamou...@gmail.com>

Reply via email to