You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by AsterixDB Code Review <do...@asterix-gerrit.ics.uci.edu> on 2023/05/27 21:02:31 UTC
Change in asterixdb[master]: WIP: Prevent concurrent metadata catalog modification
From Murtadha Hubail <mh...@apache.org>:
Murtadha Hubail has uploaded this change for review. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17562 )
Change subject: WIP: Prevent concurrent metadata catalog modification
......................................................................
WIP: Prevent concurrent metadata catalog modification
Change-Id: I7933c2defe5b83b51d1965bd8eca51217fbc1cbf
---
M asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
3 files changed, 38 insertions(+), 3 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/62/17562/1
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
index 940535f..047de9b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.common.transactions;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -101,6 +103,8 @@
*/
void setLastLSN(long newValue);
+ void setWriteTxn(boolean isWriteTxn);
+
/**
* Tests if this is a write transaction.
*
@@ -111,9 +115,9 @@
/**
* Sets a flag indication that this is a write transaction.
*
- * @param isWriterTxn
+ * @param lock
*/
- void setWriteTxn(boolean isWriterTxn);
+ void acquireExclusiveWriteLock(ReentrantLock lock);
/**
* Called before an operation is performed on index
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 2195f88..2248d64 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -28,6 +28,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import org.apache.asterix.common.api.IDatasetLifecycleManager;
@@ -161,6 +162,7 @@
private transient MetadataTupleTranslatorProvider tupleTranslatorProvider;
// extension only
private Map<ExtensionMetadataDatasetId, ExtensionMetadataDataset<?>> extensionDatasets;
+ private final ReentrantLock metadataModificationLock = new ReentrantLock(true);
public static final MetadataNode INSTANCE = new MetadataNode();
@@ -612,7 +614,7 @@
IModificationOperationCallback modCallback = createIndexModificationCallback(op, txnCtx, metadataIndex);
IIndexAccessParameters iap = new IndexAccessParameters(modCallback, NoOpOperationCallback.INSTANCE);
ILSMIndexAccessor indexAccessor = lsmIndex.createAccessor(iap);
- txnCtx.setWriteTxn(true);
+ txnCtx.acquireExclusiveWriteLock(metadataModificationLock);
txnCtx.register(metadataIndex.getResourceId(),
StoragePathUtil.getPartitionNumFromRelativePath(resourceName), lsmIndex, modCallback,
metadataIndex.isPrimaryIndex());
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
index 104f9a7..29dc749 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
@@ -23,6 +23,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.asterix.common.context.ITransactionOperationTracker;
import org.apache.asterix.common.transactions.ITransactionContext;
@@ -42,6 +43,7 @@
private final AtomicInteger txnState;
private final AtomicBoolean isWriteTxn;
private volatile boolean isTimeout;
+ private ReentrantLock lock;
protected AbstractTransactionContext(TxnId txnId) {
this.txnId = txnId;
@@ -90,6 +92,21 @@
}
@Override
+ public void acquireExclusiveWriteLock(ReentrantLock lock) {
+ if (isWriteTxn.get()) {
+ return;
+ }
+ try {
+ lock.lockInterruptibly();
+ this.lock = lock;
+ setWriteTxn(true);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
public void setWriteTxn(boolean isWriteTxn) {
this.isWriteTxn.set(isWriteTxn);
}
@@ -114,6 +131,9 @@
synchronized (txnOpTrackers) {
txnOpTrackers.forEach((resource, opTracker) -> opTracker.afterTransaction(resource));
}
+ if (lock != null) {
+ lock.unlock();
+ }
}
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17562
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: I7933c2defe5b83b51d1965bd8eca51217fbc1cbf
Gerrit-Change-Number: 17562
Gerrit-PatchSet: 1
Gerrit-Owner: Murtadha Hubail <mh...@apache.org>
Gerrit-MessageType: newchange