>From Murtadha Hubail <[email protected]>:

Murtadha Hubail has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17543 )


Change subject: [ASTERIXDB-3189][*DB] Allow queries to be canceled during 
compilation
......................................................................

[ASTERIXDB-3189][*DB] Allow queries to be canceled during compilation

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

Details:

- Allow queries to be canceled during compilation.
- Allow queries to be interrupted while waiting for
  dataset upgrade lock which could potentially by
  held by the rebalance.
- Log before and after rebalance acquires dataset
  upgrade lock.

Change-Id: I6031f36df583ed790a0ec89885071c27ae8efdb9
---
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLock.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/LockList.java
5 files changed, 59 insertions(+), 14 deletions(-)



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

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 98d93fd..1faf08d 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -4495,9 +4495,9 @@
     }

     private interface IMetadataLocker {
-        void lock() throws AlgebricksException;
+        void lock() throws HyracksDataException, AlgebricksException, 
InterruptedException;

-        void unlock() throws AlgebricksException;
+        void unlock() throws HyracksDataException, AlgebricksException;
     }

     private interface IResultPrinter {
@@ -4512,16 +4512,25 @@
             IResultSet resultSet, ResultDelivery resultDelivery, 
ResultMetadata outMetadata, Stats stats,
             IRequestParameters requestParameters, Map<String, IAObject> 
stmtParams, IStatementRewriter stmtRewriter)
             throws Exception {
+        final IRequestTracker requestTracker = appCtx.getRequestTracker();
+        final ClientRequest clientRequest =
+                (ClientRequest) 
requestTracker.get(requestParameters.getRequestReference().getUuid());
         final IMetadataLocker locker = new IMetadataLocker() {
             @Override
-            public void lock() {
-                compilationLock.readLock().lock();
+            public void lock() throws RuntimeDataException, 
InterruptedException {
+                try {
+                    compilationLock.writeLock().lockInterruptibly();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    ensureNotCancelled(clientRequest);
+                    throw e;
+                }
             }

             @Override
             public void unlock() {
                 metadataProvider.getLocks().unlock();
-                compilationLock.readLock().unlock();
+                compilationLock.writeLock().unlock();
             }
         };
         final IStatementCompiler compiler = () -> {
@@ -4668,18 +4677,20 @@
         final IRequestTracker requestTracker = appCtx.getRequestTracker();
         final ClientRequest clientRequest =
                 (ClientRequest) 
requestTracker.get(requestParameters.getRequestReference().getUuid());
+        if (cancellable) {
+            clientRequest.markCancellable();
+        }
         locker.lock();
         try {
             final JobSpecification jobSpec = compiler.compile();
             if (jobSpec == null) {
                 return;
             }
-            if (cancellable) {
-                clientRequest.markCancellable();
-            }
             final SchedulableClientRequest schedulableRequest =
                     SchedulableClientRequest.of(clientRequest, 
requestParameters, metadataProvider, jobSpec);
             appCtx.getReceptionist().ensureSchedulable(schedulableRequest);
+            // ensure request not cancelled before running job
+            ensureNotCancelled(clientRequest);
             final JobId jobId = JobUtils.runJob(hcc, jobSpec, jobFlags, false);
             clientRequest.setJobId(jobId);
             if (jId != null) {
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
index f315f18..200e357 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
@@ -242,8 +242,10 @@
         ActiveNotificationHandler activeNotificationHandler =
                 (ActiveNotificationHandler) 
appCtx.getActiveNotificationHandler();
         IMetadataLockManager lockManager = appCtx.getMetadataLockManager();
+        LOGGER.debug("attempting to acquire dataset {} upgrade lock", 
source.getDatasetName());
         lockManager.upgradeDatasetLockToWrite(metadataProvider.getLocks(), 
source.getDataverseName(),
                 source.getDatasetName());
+        LOGGER.debug("acquired dataset {} upgrade lock", 
source.getDatasetName());
         LOGGER.info("Updating dataset {} node group from {} to {}", 
source.getDatasetName(), source.getNodeGroupName(),
                 target.getNodeGroupName());
         try {
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLock.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLock.java
index 1f77aa0..d491ea4 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLock.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLock.java
@@ -63,7 +63,7 @@
      * @param mode
      *            lock mode
      */
-    void lock(IMetadataLock.Mode mode);
+    void lock(IMetadataLock.Mode mode) throws InterruptedException;

     /**
      * Release a lock
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/LockList.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/LockList.java
index 43a1849..06a317e 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/LockList.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/LockList.java
@@ -49,7 +49,12 @@
         if (isContained(mode, lock)) {
             return;
         }
-        lock.lock(mode);
+        try {
+            lock.lock(mode);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new AsterixException(e);
+        }
         indexes.put(lock.getKey(), locks.size());
         locks.add(MutablePair.of(lock, mode));
     }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
index e0a6725..e5fb414 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
@@ -79,8 +79,8 @@
         lock.writeLock().unlock();
     }

-    private void upgradeReadLock() {
-        upgradeLock.readLock().lock();
+    private void upgradeReadLock() throws InterruptedException {
+        upgradeLock.readLock().lockInterruptibly();
     }

     private void modifyReadLock() {
@@ -169,7 +169,12 @@
     @Override
     public void upgrade(IMetadataLock.Mode from, IMetadataLock.Mode to) throws 
AlgebricksException {
         if (from == IMetadataLock.Mode.EXCLUSIVE_MODIFY && to == 
IMetadataLock.Mode.UPGRADED_WRITE) {
-            upgradeLock.writeLock().lock();
+            try {
+                upgradeLock.writeLock().lockInterruptibly();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new AlgebricksException(e);
+            }
         } else {
             throw new 
MetadataException(ErrorCode.ILLEGAL_LOCK_UPGRADE_OPERATION, from, to);
         }
@@ -185,7 +190,7 @@
     }

     @Override
-    public void lock(IMetadataLock.Mode mode) {
+    public void lock(IMetadataLock.Mode mode) throws InterruptedException {
         switch (mode) {
             case INDEX_BUILD:
                 readLock();

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

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I6031f36df583ed790a0ec89885071c27ae8efdb9
Gerrit-Change-Number: 17543
Gerrit-PatchSet: 1
Gerrit-Owner: Murtadha Hubail <[email protected]>
Gerrit-MessageType: newchange

Reply via email to