>From Ali Alsuliman <[email protected]>:

Ali Alsuliman has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20509?usp=email )


Change subject: [ASTERIXDB-3485][OTH] improvements to client request 
cancellation
......................................................................

[ASTERIXDB-3485][OTH] improvements to client request cancellation

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

Ext-ref: MB-63174
Change-Id: Ic94f4a87e93636ed113ffc1ed3ce2ed742bb0276
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/BaseClientRequest.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveRequestsServlet.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClientRequest.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestTracker.java
M 
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/RequestTracker.java
6 files changed, 42 insertions(+), 18 deletions(-)



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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/BaseClientRequest.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/BaseClientRequest.java
index e03e330..21cbc72 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/BaseClientRequest.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/BaseClientRequest.java
@@ -50,15 +50,17 @@
     }

     @Override
-    public synchronized void cancel(ICcApplicationContext appCtx) throws 
HyracksDataException {
+    public synchronized boolean cancel(ICcApplicationContext appCtx) throws 
HyracksDataException {
         if (complete) {
-            return;
+            return true;
         }
         if (cancellable) {
             complete();
             state = State.CANCELLED;
             doCancel(appCtx);
+            return true;
         }
+        return false;
     }

     @Override
@@ -67,6 +69,15 @@
     }

     @Override
+    public synchronized boolean markUncancellable() {
+        if (state == State.CANCELLED) {
+            return false;
+        }
+        cancellable = false;
+        return true;
+    }
+
+    @Override
     public synchronized boolean isCancelled() {
         return state == State.CANCELLED;
     }
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveRequestsServlet.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveRequestsServlet.java
index 3f1845e..2b5d2cc 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveRequestsServlet.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveRequestsServlet.java
@@ -72,9 +72,12 @@
         }
         try {
             // Cancels the on-going job.
-            requestTracker.cancel(req.getId());
-            // response: OK
-            response.setStatus(HttpResponseStatus.OK);
+            if (requestTracker.cancel(req.getId())) {
+                // response: OK
+                response.setStatus(HttpResponseStatus.OK);
+            } else {
+                response.setStatus(HttpResponseStatus.FORBIDDEN);
+            }
         } catch (Exception e) {
             LOGGER.log(Level.WARN, "unexpected exception thrown from cancel", 
e);
             // response: INTERNAL SERVER ERROR
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
index 6570041..26277ca 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
@@ -61,8 +61,11 @@
             } else {
                 try {
                     requestId = req.getId();
-                    requestTracker.cancel(requestId);
-                    status = RequestStatus.SUCCESS;
+                    if (requestTracker.cancel(requestId)) {
+                        status = RequestStatus.SUCCESS;
+                    } else {
+                        status = RequestStatus.REJECTED;
+                    }
                 } catch (Exception e) {
                     LOGGER.log(Level.WARN, "unexpected exception thrown from 
cancel", e);
                     status = RequestStatus.FAILED;
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClientRequest.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClientRequest.java
index ee518dd..2d239c1 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClientRequest.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClientRequest.java
@@ -81,6 +81,13 @@
     void markCancellable();

     /**
+     * Mark the request as not cancellable if it has not been cancelled yet.
+     *
+     * @return true if the request was marked as not cancellable. Otherwise, 
false without changing anything.
+     */
+    boolean markUncancellable();
+
+    /**
      * @return true if the request can be cancelled. Otherwise false.
      */
     boolean isCancellable();
@@ -91,7 +98,7 @@
      * @param appCtx
      * @throws HyracksDataException
      */
-    void cancel(ICcApplicationContext appCtx) throws HyracksDataException;
+    boolean cancel(ICcApplicationContext appCtx) throws HyracksDataException;

     /**
      * @return A json string representation of this request
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestTracker.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestTracker.java
index dbae70e..b27a4e0 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestTracker.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestTracker.java
@@ -55,7 +55,7 @@
      * @param requestId
      * @throws HyracksDataException
      */
-    void cancel(String requestId) throws HyracksDataException;
+    boolean cancel(String requestId) throws HyracksDataException;

     /**
      * Completes the request with id {@code requestId}
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/RequestTracker.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/RequestTracker.java
index 24bbd06..1dbb6b2 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/RequestTracker.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/RequestTracker.java
@@ -101,15 +101,12 @@
     }

     @Override
-    public void cancel(String requestId) throws HyracksDataException {
+    public boolean cancel(String requestId) throws HyracksDataException {
         final IClientRequest request = runningRequests.get(requestId);
         if (request == null) {
-            return;
+            return false;
         }
-        if (!request.isCancellable()) {
-            throw new IllegalStateException("Request " + request.getId() + " 
cannot be cancelled");
-        }
-        cancel(request);
+        return cancel(request);
     }

     @Override
@@ -131,9 +128,12 @@
         return Collections.unmodifiableCollection(new 
ArrayList<>(completedRequests.values()));
     }

-    private void cancel(IClientRequest request) throws HyracksDataException {
-        request.cancel(ccAppCtx);
-        untrack(request);
+    private boolean cancel(IClientRequest request) throws HyracksDataException 
{
+        boolean cancelled = request.cancel(ccAppCtx);
+        if (cancelled) {
+            untrack(request);
+        }
+        return cancelled;
     }

     private void untrack(IClientRequest request) {

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20509?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: phoenix
Gerrit-Change-Id: Ic94f4a87e93636ed113ffc1ed3ce2ed742bb0276
Gerrit-Change-Number: 20509
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>

Reply via email to