abdullah alamoudi has submitted this change and it was merged. Change subject: [ASTERIXDB-1869][MTD][TX] Control Lock size ......................................................................
[ASTERIXDB-1869][MTD][TX] Control Lock size - user model changes: no - storage format changes: no - interface changes: no details: - Previously, each lock call to the metadata lock manager increment the lock counter and create a new Pair<Lock,Mode> object. After this change, the lock manager checks if the lock was obtained previously. Change-Id: Icc884949a824d64fcf27e26c350a2bc0fa496141 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1854 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> BAD: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Murtadha Hubail <hubail...@gmail.com> --- M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/IMetadataLock.java M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/LockList.java M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLock.java M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java 5 files changed, 147 insertions(+), 59 deletions(-) Approvals: Murtadha Hubail: Looks good to me, approved Jenkins: Verified; No violations found; No violations found; Verified 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 ffcff78..542dd72 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 @@ -18,18 +18,20 @@ */ package org.apache.asterix.metadata.lock; +import java.util.Objects; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.apache.asterix.metadata.lock.IMetadataLock.Mode; import org.apache.asterix.om.base.AMutableInt32; public class DatasetLock implements IMetadataLock { - private ReentrantReadWriteLock dsLock; - private ReentrantReadWriteLock dsModifyLock; - private AMutableInt32 indexBuildCounter; + private final String key; + private final ReentrantReadWriteLock dsLock; + private final ReentrantReadWriteLock dsModifyLock; + private final AMutableInt32 indexBuildCounter; - public DatasetLock() { + public DatasetLock(String key) { + this.key = key; dsLock = new ReentrantReadWriteLock(true); dsModifyLock = new ReentrantReadWriteLock(true); indexBuildCounter = new AMutableInt32(0); @@ -154,4 +156,25 @@ break; } } + + @Override + public String getKey() { + return key; + } + + @Override + public int hashCode() { + return key.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DatasetLock)) { + return false; + } + if (o == this) { + return true; + } + return Objects.equals(key, ((DatasetLock) o).key); + } } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/IMetadataLock.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/IMetadataLock.java index 8af29ba..4d7fa93 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/IMetadataLock.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/IMetadataLock.java @@ -47,4 +47,11 @@ * lock mode */ void release(IMetadataLock.Mode mode); + + /** + * Get the lock's key + * + * @return the key identiying the lock + */ + String getKey(); } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/LockList.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/LockList.java index bb708db..c5c9fe9 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/LockList.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/LockList.java @@ -19,7 +19,9 @@ package org.apache.asterix.metadata.lock; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.asterix.common.exceptions.AsterixException; import org.apache.asterix.common.exceptions.ErrorCode; @@ -29,7 +31,8 @@ * The LockList is used for two phase locking. */ public class LockList { - private List<Pair<IMetadataLock.Mode, IMetadataLock>> locks = new ArrayList<>(); + private final List<Pair<IMetadataLock.Mode, IMetadataLock>> locks = new ArrayList<>(); + private final Set<String> lockSet = new HashSet<>(); private boolean lockPhase = true; /** @@ -44,8 +47,12 @@ if (!lockPhase) { throw new AsterixException(ErrorCode.COMPILATION_TWO_PHASE_LOCKING_VIOLATION); } + if (lockSet.contains(lock.getKey())) { + return; + } lock.acquire(mode); locks.add(Pair.of(mode, lock)); + lockSet.add(lock.getKey()); } /** @@ -58,6 +65,7 @@ pair.getRight().release(pair.getLeft()); } locks.clear(); + lockSet.clear(); lockPhase = false; } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLock.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLock.java index c8fd64f..6c20e9f 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLock.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLock.java @@ -18,12 +18,16 @@ */ package org.apache.asterix.metadata.lock; +import java.util.Objects; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.apache.asterix.metadata.lock.IMetadataLock.Mode; - public class MetadataLock implements IMetadataLock { + private final String key; private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); + + public MetadataLock(String key) { + this.key = key; + } @Override public void acquire(IMetadataLock.Mode mode) { @@ -48,4 +52,25 @@ break; } } + + @Override + public String getKey() { + return key; + } + + @Override + public int hashCode() { + return key.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof MetadataLock)) { + return false; + } + if (o == this) { + return true; + } + return Objects.equals(key, ((MetadataLock) o).key); + } } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java index 9815f6f..43d72e3 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java @@ -29,131 +29,156 @@ public class MetadataLockManager { public static final MetadataLockManager INSTANCE = new MetadataLockManager(); - private static final Function<String, MetadataLock> LOCK_FUNCTION = key -> new MetadataLock(); - private static final Function<String, DatasetLock> DATASET_LOCK_FUNCTION = key -> new DatasetLock(); + private static final Function<String, MetadataLock> LOCK_FUNCTION = MetadataLock::new; + private static final Function<String, DatasetLock> DATASET_LOCK_FUNCTION = DatasetLock::new; - private final ConcurrentHashMap<String, MetadataLock> dataversesLocks; - private final ConcurrentHashMap<String, DatasetLock> datasetsLocks; - private final ConcurrentHashMap<String, MetadataLock> functionsLocks; - private final ConcurrentHashMap<String, MetadataLock> nodeGroupsLocks; - private final ConcurrentHashMap<String, MetadataLock> feedsLocks; - private final ConcurrentHashMap<String, MetadataLock> feedPolicyLocks; - private final ConcurrentHashMap<String, MetadataLock> compactionPolicyLocks; - private final ConcurrentHashMap<String, MetadataLock> dataTypeLocks; - private final ConcurrentHashMap<String, MetadataLock> extensionLocks; + private final ConcurrentHashMap<String, IMetadataLock> mdlocks; + + private static final String DATAVERSE_PREFIX = "Dataverse:"; + private static final String DATASET_PREFIX = "Dataset:"; + private static final String FUNCTION_PREFIX = "Function:"; + private static final String NODE_GROUP_PREFIX = "NodeGroup:"; + private static final String FEED_PREFIX = "Feed:"; + private static final String FEED_POLICY_PREFIX = "FeedPolicy:"; + private static final String MERGE_POLICY_PREFIX = "MergePolicy:"; + private static final String DATATYPE_PREFIX = "DataType:"; + private static final String EXTENSION_PREFIX = "Extension:"; private MetadataLockManager() { - dataversesLocks = new ConcurrentHashMap<>(); - datasetsLocks = new ConcurrentHashMap<>(); - functionsLocks = new ConcurrentHashMap<>(); - nodeGroupsLocks = new ConcurrentHashMap<>(); - feedsLocks = new ConcurrentHashMap<>(); - feedPolicyLocks = new ConcurrentHashMap<>(); - compactionPolicyLocks = new ConcurrentHashMap<>(); - dataTypeLocks = new ConcurrentHashMap<>(); - extensionLocks = new ConcurrentHashMap<>(); + mdlocks = new ConcurrentHashMap<>(); } // Dataverse public void acquireDataverseReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = dataversesLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + String key = DATAVERSE_PREFIX + dataverseName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } public void acquireDataverseWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = dataversesLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + String key = DATAVERSE_PREFIX + dataverseName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } // Dataset public void acquireDatasetReadLock(LockList locks, String datasetName) throws AsterixException { - DatasetLock lock = datasetsLocks.computeIfAbsent(datasetName, DATASET_LOCK_FUNCTION); + String key = DATASET_PREFIX + datasetName; + DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } public void acquireDatasetWriteLock(LockList locks, String datasetName) throws AsterixException { - DatasetLock lock = datasetsLocks.computeIfAbsent(datasetName, DATASET_LOCK_FUNCTION); + String key = DATASET_PREFIX + datasetName; + DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } public void acquireDatasetModifyLock(LockList locks, String datasetName) throws AsterixException { - DatasetLock lock = datasetsLocks.computeIfAbsent(datasetName, DATASET_LOCK_FUNCTION); + String key = DATASET_PREFIX + datasetName; + DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION); locks.add(IMetadataLock.Mode.MODIFY, lock); } public void acquireDatasetCreateIndexLock(LockList locks, String datasetName) throws AsterixException { - DatasetLock lock = datasetsLocks.computeIfAbsent(datasetName, DATASET_LOCK_FUNCTION); + String key = DATASET_PREFIX + datasetName; + DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION); locks.add(IMetadataLock.Mode.INDEX_BUILD, lock); } public void acquireExternalDatasetRefreshLock(LockList locks, String datasetName) throws AsterixException { - DatasetLock lock = datasetsLocks.computeIfAbsent(datasetName, DATASET_LOCK_FUNCTION); + String key = DATASET_PREFIX + datasetName; + DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION); locks.add(IMetadataLock.Mode.INDEX_BUILD, lock); } // Function - public void acquireFunctionReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = functionsLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireFunctionReadLock(LockList locks, String functionName) throws AsterixException { + String key = FUNCTION_PREFIX + functionName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } - public void acquireFunctionWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = functionsLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireFunctionWriteLock(LockList locks, String functionName) throws AsterixException { + String key = FUNCTION_PREFIX + functionName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } // Node Group - public void acquireNodeGroupReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = nodeGroupsLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireNodeGroupReadLock(LockList locks, String nodeGroupName) throws AsterixException { + String key = NODE_GROUP_PREFIX + nodeGroupName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } public void acquireNodeGroupWriteLock(LockList locks, String nodeGroupName) throws AsterixException { - MetadataLock lock = nodeGroupsLocks.computeIfAbsent(nodeGroupName, LOCK_FUNCTION); + String key = NODE_GROUP_PREFIX + nodeGroupName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } // Feeds - public void acquireFeedReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = feedsLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireFeedReadLock(LockList locks, String feedName) throws AsterixException { + String key = FEED_PREFIX + feedName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } - public void acquireFeedWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = feedsLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireFeedWriteLock(LockList locks, String feedName) throws AsterixException { + String key = FEED_PREFIX + feedName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } - public void acquireFeedPolicyWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = feedPolicyLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireFeedPolicyWriteLock(LockList locks, String feedPolicyName) throws AsterixException { + String key = FEED_POLICY_PREFIX + feedPolicyName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); + } + + public void acquireFeedPolicyReadLock(LockList locks, String feedPolicyName) throws AsterixException { + String key = FEED_POLICY_PREFIX + feedPolicyName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); + locks.add(IMetadataLock.Mode.READ, lock); } // CompactionPolicy - public void acquireCompactionPolicyReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = compactionPolicyLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireMergePolicyReadLock(LockList locks, String mergePolicyName) throws AsterixException { + String key = MERGE_POLICY_PREFIX + mergePolicyName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); + } + + public void acquireMergePolicyWriteLock(LockList locks, String mergePolicyName) throws AsterixException { + String key = MERGE_POLICY_PREFIX + mergePolicyName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); + locks.add(IMetadataLock.Mode.WRITE, lock); } // DataType - public void acquireDataTypeReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = dataTypeLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireDataTypeReadLock(LockList locks, String datatypeName) throws AsterixException { + String key = DATATYPE_PREFIX + datatypeName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } - public void acquireDataTypeWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = dataTypeLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireDataTypeWriteLock(LockList locks, String datatypeName) throws AsterixException { + String key = DATATYPE_PREFIX + datatypeName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } // Extensions - public void acquireExtensionReadLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = extensionLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireExtensionReadLock(LockList locks, String extensionName) throws AsterixException { + String key = EXTENSION_PREFIX + extensionName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.READ, lock); } - public void acquireExtensionWriteLock(LockList locks, String dataverseName) throws AsterixException { - MetadataLock lock = extensionLocks.computeIfAbsent(dataverseName, LOCK_FUNCTION); + public void acquireExtensionWriteLock(LockList locks, String extensionName) throws AsterixException { + String key = EXTENSION_PREFIX + extensionName; + IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION); locks.add(IMetadataLock.Mode.WRITE, lock); } @@ -178,7 +203,7 @@ acquireNodeGroupReadLock(locks, nodeGroupName); } if (!isDefaultCompactionPolicy) { - acquireCompactionPolicyReadLock(locks, compactionPolicyName); + acquireMergePolicyReadLock(locks, compactionPolicyName); } acquireDatasetWriteLock(locks, datasetFullyQualifiedName); } -- To view, visit https://asterix-gerrit.ics.uci.edu/1854 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Icc884949a824d64fcf27e26c350a2bc0fa496141 Gerrit-PatchSet: 4 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Murtadha Hubail <hubail...@gmail.com> Gerrit-Reviewer: Yingyi Bu <buyin...@gmail.com> Gerrit-Reviewer: abdullah alamoudi <bamou...@gmail.com>