>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