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