This is an automated email from the ASF dual-hosted git repository. mhubail pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push: new c5c6ec4 [NO ISSUE][RT] Introduce query compilation lock c5c6ec4 is described below commit c5c6ec478aa2a37134271240d1530c38513b2342 Author: Murtadha Hubail <murtadha.hub...@couchbase.com> AuthorDate: Wed Aug 4 02:48:34 2021 +0300 [NO ISSUE][RT] Introduce query compilation lock - user model changes: no - storage format changes: no - interface changes: yes Details: - Add query compilation lock that can be used to ensure no queries are currently running in the cluster. Change-Id: I663458df62040c0c01a13afde36b5cf765e57929 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/12645 Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Murtadha Hubail <mhub...@apache.org> Reviewed-by: Murtadha Hubail <mhub...@apache.org> Reviewed-by: Ian Maxon <ima...@uci.edu> --- .../java/org/apache/asterix/app/translator/QueryTranslator.java | 7 +++++++ .../apache/asterix/common/dataflow/ICcApplicationContext.java | 9 +++++++++ .../org/apache/asterix/runtime/utils/CcApplicationContext.java | 7 +++++++ 3 files changed, 23 insertions(+) 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 267bd76..e79a4fd 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 @@ -42,6 +42,7 @@ import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.concurrent.ExecutorService; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import org.apache.asterix.active.ActivityState; @@ -283,6 +284,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen protected final IMetadataLockUtil lockUtil; protected final IResponsePrinter responsePrinter; protected final WarningCollector warningCollector; + protected final ReentrantReadWriteLock compilationLock; public QueryTranslator(ICcApplicationContext appCtx, List<Statement> statements, SessionOutput output, ILangCompilationProvider compilationProvider, ExecutorService executorService, @@ -301,6 +303,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen this.executorService = executorService; this.responsePrinter = responsePrinter; this.warningCollector = new WarningCollector(); + this.compilationLock = appCtx.getCompilationLock(); if (appCtx.getServiceContext().getAppConfig().getBoolean(CCConfig.Option.ENFORCE_FRAME_WRITER_PROTOCOL)) { this.jobFlags.add(JobFlag.ENFORCE_CONTRACT); } @@ -3392,12 +3395,14 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen final IMetadataLocker locker = new IMetadataLocker() { @Override public void lock() throws AlgebricksException { + compilationLock.readLock().lock(); lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), dataverseName, datasetName); } @Override public void unlock() { metadataProvider.getLocks().unlock(); + compilationLock.readLock().unlock(); } }; final IStatementCompiler compiler = () -> { @@ -3987,6 +3992,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen final IMetadataLocker locker = new IMetadataLocker() { @Override public void lock() { + compilationLock.readLock().lock(); } @Override @@ -3994,6 +4000,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen metadataProvider.getLocks().unlock(); // release external datasets' locks acquired during compilation of the query ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider); + compilationLock.readLock().unlock(); } }; final IStatementCompiler compiler = () -> { diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java index ad90814..c22ac4c 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java @@ -18,6 +18,8 @@ */ package org.apache.asterix.common.dataflow; +import java.util.concurrent.locks.ReentrantReadWriteLock; + import org.apache.asterix.common.api.IApplicationContext; import org.apache.asterix.common.api.ICoordinationService; import org.apache.asterix.common.api.IMetadataLockManager; @@ -149,4 +151,11 @@ public interface ICcApplicationContext extends IApplicationContext { * @return the adapter factory service */ IAdapterFactoryService getAdapterFactoryService(); + + /** + * Gets the cluster query compilation lock + * + * @return the cluster query compilation lock + */ + ReentrantReadWriteLock getCompilationLock(); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java index 9099c88..66f0e73 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java @@ -19,6 +19,7 @@ package org.apache.asterix.runtime.utils; import java.io.IOException; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Supplier; import org.apache.asterix.common.api.IConfigValidator; @@ -100,6 +101,7 @@ public class CcApplicationContext implements ICcApplicationContext { private final IRequestTracker requestTracker; private final IConfigValidator configValidator; private final IAdapterFactoryService adapterFactoryService; + private final ReentrantReadWriteLock compilationLock = new ReentrantReadWriteLock(true); public CcApplicationContext(ICCServiceContext ccServiceCtx, IHyracksClientConnection hcc, Supplier<IMetadataBootstrap> metadataBootstrapSupplier, IGlobalRecoveryManager globalRecoveryManager, @@ -314,4 +316,9 @@ public class CcApplicationContext implements ICcApplicationContext { public IAdapterFactoryService getAdapterFactoryService() { return adapterFactoryService; } + + @Override + public ReentrantReadWriteLock getCompilationLock() { + return compilationLock; + } }