Murtadha Hubail has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2132

Change subject: [ASTERIXDB-2130][TX] Prevent Dropping Index Pending Txn 
Completion
......................................................................

[ASTERIXDB-2130][TX] Prevent Dropping Index Pending Txn Completion

- user model changes: no
- storage format changes: no
- interface changes: yes
  Added resource id to ITransactionOperationTracker
  before/after txn operations.

Details:
 - Currently, an index could be evicted/dropped while a transaction
   waiting for its completion (commit/rollback). This change prevents
   that by incrementing the reference counter of the indexes registered
   in the transaction.
 - Add test case.

Change-Id: If6a938cbb5a9c3b7f5cc59505c07ae45b3425223
---
M 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
4 files changed, 73 insertions(+), 8 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/32/2132/1

diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index 2bac49e..37b35bb 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -30,17 +30,28 @@
 
 import org.apache.asterix.app.bootstrap.TestNodeController;
 import org.apache.asterix.common.config.DatasetConfig;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.test.runtime.ExecutionTestUtil;
+import org.apache.asterix.testframework.context.TestCaseContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileSplit;
+import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorNodePushable;
@@ -64,6 +75,7 @@
     private static final String DATA_TYPE_NAME = "DUMMY";
     private static final String NODE_GROUP_NAME = "DEFAULT";
     private final AtomicBoolean dropFailed = new AtomicBoolean(false);
+    private final TestExecutor testExecutor = new TestExecutor();
 
     @Before
     public void setUp() throws Exception {
@@ -77,6 +89,12 @@
         TestHelper.deleteExistingInstanceFiles();
     }
 
+    /**
+     * Tests dropping a dataset with using different
+     * drop options
+     *
+     * @throws Exception
+     */
     @Test
     public void dropOptionsTest() throws Exception {
         TestNodeController nc = new TestNodeController(null, false);
@@ -107,6 +125,47 @@
         }
     }
 
+    /**
+     * Tests dropping an index whose dataset has no active
+     * operations
+     *
+     * @throws Exception
+     */
+    @Test
+    public void dropIndexInUseTest() throws Exception {
+        TestNodeController nc = new TestNodeController(null, false);
+        try {
+            nc.init();
+            String datasetName = "ds";
+            String indexName = "valueIdx";
+            // create dataset and index
+            final TestCaseContext.OutputFormat format = 
TestCaseContext.OutputFormat.CLEAN_JSON;
+            testExecutor.executeSqlppUpdateOrDdl("CREATE TYPE KeyType AS { id: 
int, foo: int };", format);
+            testExecutor.executeSqlppUpdateOrDdl("CREATE DATASET " + 
datasetName + "(KeyType) PRIMARY KEY id;", format);
+            testExecutor.executeSqlppUpdateOrDdl("CREATE INDEX " + indexName + 
" on " + datasetName + "(foo)", format);
+            final MetadataTransactionContext mdTxn = 
MetadataManager.INSTANCE.beginTransaction();
+            ICcApplicationContext appCtx =
+                    (ICcApplicationContext) 
ExecutionTestUtil.integrationUtil.getClusterControllerService()
+                            .getApplicationContext();
+            MetadataProvider metadataProver = new MetadataProvider(appCtx, 
null);
+            metadataProver.setMetadataTxnContext(mdTxn);
+            final String defaultDv = 
MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDataverseName();
+            final Dataset dataset = MetadataManager.INSTANCE.getDataset(mdTxn, 
defaultDv, datasetName);
+            MetadataManager.INSTANCE.commitTransaction(mdTxn);
+            FileSplit[] splits = SplitsAndConstraintsUtil
+                    .getIndexSplits(appCtx.getClusterStateManager(), dataset, 
indexName, Arrays.asList("asterix_nc1"));
+            final ConstantFileSplitProvider constantFileSplitProvider =
+                    new ConstantFileSplitProvider(Arrays.copyOfRange(splits, 
0, 1));
+            IndexDataflowHelperFactory helperFactory =
+                    new IndexDataflowHelperFactory(nc.getStorageManager(), 
constantFileSplitProvider);
+            IHyracksTaskContext ctx = nc.createTestContext(true);
+            IIndexDataflowHelper dataflowHelper = 
helperFactory.create(ctx.getJobletContext().getServiceContext(), 0);
+            dropInUse(ctx, helperFactory, dataflowHelper);
+        } finally {
+            nc.deInit();
+        }
+    }
+
     private void dropInUse(IHyracksTaskContext ctx, IndexDataflowHelperFactory 
helperFactory,
             IIndexDataflowHelper dataflowHelper) throws Exception {
         dropFailed.set(false);
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
index 2068192..4f91b25 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
@@ -63,12 +63,12 @@
     }
 
     @Override
-    public void beforeTransaction() {
-        dsInfo.touch();
+    public void beforeTransaction(long resourceId) {
+        dsInfo.getIndexes().get(resourceId).touch();
     }
 
     @Override
-    public void afterTransaction() {
-        dsInfo.untouch();
+    public void afterTransaction(long resourceId) {
+        dsInfo.getIndexes().get(resourceId).untouch();
     }
 }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
index e6aeec5..301801b 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
@@ -25,12 +25,18 @@
     /**
      * Called before a transaction performs any operations on
      * {@link org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex}
+     * with resource id {@code resourceId}
+     *
+     * @param resourceId
      */
-    void beforeTransaction();
+    void beforeTransaction(long resourceId);
 
     /**
      * Called after a transaction completes its operations on
      * {@link org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex}
+     * with resource id {@code resourceId}
+     *
+     * @param resourceId
      */
-    void afterTransaction();
+    void afterTransaction(long resourceId);
 }
diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
index 4846b6e..3159e6b 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
@@ -122,7 +122,7 @@
                 final ITransactionOperationTracker txnOpTracker =
                         (ITransactionOperationTracker) 
index.getOperationTracker();
                 indexMap.put(resourceId, txnOpTracker);
-                txnOpTracker.beforeTransaction();
+                txnOpTracker.beforeTransaction(resourceId);
             }
         }
     }
@@ -258,7 +258,7 @@
             }
         } finally {
             synchronized (indexMap) {
-                
indexMap.values().forEach(ITransactionOperationTracker::afterTransaction);
+                indexMap.forEach((resource, opTracker) -> 
opTracker.afterTransaction(resource));
             }
         }
     }

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2132
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If6a938cbb5a9c3b7f5cc59505c07ae45b3425223
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Murtadha Hubail <[email protected]>

Reply via email to