abdullah alamoudi has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2901

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
---
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/FullResponse.java
M 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
4 files changed, 34 insertions(+), 1 deletion(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/01/2901/1

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/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..dfe27e2 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,16 @@
     }
 
     public void notifyChannelInactive() {
-        response.notifyChannelInactive();
+        synchronized (this) {
+            if (!started) {
+                cancelled = true;
+            }
+        }
+        if (cancelled) {
+            // release request and response
+        } 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: newchange
Gerrit-Change-Id: I9a34142e87158385152fa0a11be39abced307fcc
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <[email protected]>

Reply via email to