Taewoo Kim has uploaded a new change for review.

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

Change subject: Index-Only Plan Patch Set 4: modifies SearchOpCallBack
......................................................................

Index-Only Plan Patch Set 4: modifies SearchOpCallBack

 - Modifies the SearchOperationCallBack classes to support the canceling
   of the proceed() function. When executing an index-only plan, there
   may be a case that we need to cancel the effect of proceed() function.
   Current implementation only has cancelReconcile().

Change-Id: I16992b3bdc1bfc739417d11366d6bafc59294a0b
---
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallback.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
M 
hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
M 
hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
M 
hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
12 files changed, 83 insertions(+), 19 deletions(-)


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

diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
index 4592fd6..a338fc3 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
@@ -69,7 +69,11 @@
     }
 
     @Override
-    public void cancel(ITupleReference tuple) throws HyracksDataException {
+    public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException {
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
     }
 
     @Override
@@ -129,4 +133,5 @@
     public void release() throws ACIDException {
         lockManager.unlock(datasetId, pkHash, LockMode.X, txnCtx);
     }
+
 }
diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
index 890823c..20985da 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
@@ -31,6 +31,7 @@
 
 /**
  * Assumes LSM-BTrees as primary indexes. Implements try/locking and unlocking 
on primary keys.
+ * This Callback method acquires/releases a record level instant lock.
  */
 public class PrimaryIndexInstantSearchOperationCallback extends 
AbstractOperationCallback
         implements ISearchOperationCallback {
@@ -60,9 +61,24 @@
         }
     }
 
+    /**
+     * Cancels the reconcile() operation. Since reconcile() gets a lock, this 
lock
+     * needs to be unlocked.
+     */
     @Override
-    public void cancel(ITupleReference tuple) throws HyracksDataException {
-        //no op
+    public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException {
+        int pkHash = computePrimaryKeyHashValue(tuple, primaryKeyFields);
+        try {
+            lockManager.unlock(datasetId, pkHash, LockMode.S, txnCtx);
+        } catch (ACIDException e) {
+            throw new HyracksDataException(e);
+        }
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
+        // Do nothing since proceed() is the instantTryLock().
+        // Nothing was kept in the lockManager.
     }
 
     @Override
diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
index 4f255e0..3f1c64d 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
@@ -31,6 +31,7 @@
 
 /**
  * Assumes LSM-BTrees as primary indexes. Implements try/locking and unlocking 
on primary keys.
+ * This Callback method acquires/releases a record level lock.
  */
 public class PrimaryIndexSearchOperationCallback extends 
AbstractOperationCallback implements ISearchOperationCallback {
 
@@ -46,8 +47,9 @@
 
     @Override
     public boolean proceed(ITupleReference tuple) throws HyracksDataException {
+        int pkHash = computePrimaryKeyHashValue(tuple, primaryKeyFields);
         try {
-            return lockManager.tryLock(datasetId, -1, LockMode.S, txnCtx);
+            return lockManager.tryLock(datasetId, pkHash, LockMode.S, txnCtx);
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
         }
@@ -55,20 +57,26 @@
 
     @Override
     public void reconcile(ITupleReference tuple) throws HyracksDataException {
+        int pkHash = computePrimaryKeyHashValue(tuple, primaryKeyFields);
         try {
-            lockManager.lock(datasetId, -1, LockMode.S, txnCtx);
+            lockManager.lock(datasetId, pkHash, LockMode.S, txnCtx);
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
         }
     }
 
     @Override
-    public void cancel(ITupleReference tuple) throws HyracksDataException {
-        //no op
+    public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException {
+        //no op - lock will be released in CommitOp
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
+        //no op - lock will be released in CommitOp
     }
 
     @Override
     public void complete(ITupleReference tuple) throws HyracksDataException {
-        //no op
+        //no op - lock will be released in CommitOp
     }
 }
diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
index 6905033..35a4020 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
@@ -51,7 +51,12 @@
     }
 
     @Override
-    public void cancel(ITupleReference tuple) throws HyracksDataException {
+    public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException {
+        // Do nothing.
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
         // Do nothing.
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
index b4fdd9e..63c90fc 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
@@ -198,7 +198,7 @@
                 if (originalKeyCmp.compare(reconciliationTuple, frameTuple) == 
0) {
                     return true;
                 } else {
-                    searchCb.cancel(reconciliationTuple);
+                    searchCb.cancelReconcile(reconciliationTuple);
                 }
             }
         }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallback.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallback.java
index 9b1cd47..1b0d3c8 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallback.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallback.java
@@ -66,12 +66,23 @@
      * @param tuple
      *            the tuple that was previously reconciled
      */
-    public void cancel(ITupleReference tuple) throws HyracksDataException;
+    public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException;
+
+    /**
+     * This method is called on a tuple that was proceeded on to cancel any 
actions
+     * that were taken in proceed(). This method allows an opportunity to 
cancel some
+     * action that was taken in {@link #proceed(ITupleReference))}.
+     *
+     * @param tuple
+     *            the tuple that was previously proceeded
+     */
+    public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException;
 
     /**
      * This method is only called on a tuple that was reconciled on, and found 
after
      * retraversing. This method allows an opportunity to do some subsequent 
action that was
      * taken in {@link #reconcile(ITupleReference))}.
+     * 
      * @param tuple
      *            the tuple that was previously reconciled
      */
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
index 511d166..414aee5 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
@@ -51,7 +51,12 @@
     }
 
     @Override
-    public void cancel(ITupleReference tuple) {
+    public void cancelReconcile(ITupleReference tuple) {
+        // Do nothing.
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) {
         // Do nothing.
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
index 2fb96c3..a493d9d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
@@ -78,7 +78,7 @@
                 if (reconciled || 
searchCallback.proceed(predicate.getLowKey())) {
                     // if proceed is successful, then there's no need for 
doing the "unlatch dance"
                     if (((ILSMTreeTupleReference) 
rangeCursors[i].getTuple()).isAntimatter()) {
-                        searchCallback.cancel(predicate.getLowKey());
+                        searchCallback.cancelReconcile(predicate.getLowKey());
                         rangeCursors[i].close();
                         return false;
                     } else {
@@ -99,7 +99,7 @@
                     if (rangeCursors[i].hasNext()) {
                         rangeCursors[i].next();
                         if (((ILSMTreeTupleReference) 
rangeCursors[i].getTuple()).isAntimatter()) {
-                            searchCallback.cancel(predicate.getLowKey());
+                            
searchCallback.cancelReconcile(predicate.getLowKey());
                             rangeCursors[i].close();
                             return false;
                         } else {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
index d6c12e2..227dfae 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
@@ -119,7 +119,7 @@
                             if (checkElement.getCursorIndex() == 0) {
                                 if (!isNotExhaustedCursor || 
cmp.compare(copyTuple, mutableElement.getTuple()) != 0) {
                                     searchCallback.complete(copyTuple);
-                                    searchCallback.cancel(copyTuple);
+                                    searchCallback.cancelReconcile(copyTuple);
                                     continue;
                                 }
                                 searchCallback.complete(copyTuple);
@@ -139,7 +139,7 @@
                         // We cannot push immediately because the tuple may be
                         // modified if hasNext() is called
                         outputElement = outputPriorityQueue.poll();
-                        searchCallback.cancel(checkElement.getTuple());
+                        
searchCallback.cancelReconcile(checkElement.getTuple());
                         needPush = true;
                         proceed = false;
                     } else {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
index 2bb357a..b2f10de 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
@@ -181,7 +181,7 @@
             }
 
             @Override
-            public void cancel(ITupleReference tuple) {
+            public void cancelReconcile(ITupleReference tuple) {
                 try {
                     TupleUtils.createIntegerTuple(builder, 
SearchTask.this.tuple, blockingValue);
                     Assert.assertEquals(0, cmp.compare(tuple, 
SearchTask.this.tuple));
@@ -192,6 +192,11 @@
             }
 
             @Override
+            public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
+
+            }
+
+            @Override
             public void complete(ITupleReference tuple) throws 
HyracksDataException {
             }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
index 664d9d6..0573fbf 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
@@ -57,7 +57,12 @@
     }
 
     @Override
-    public void cancel(ITupleReference tuple) {
+    public void cancelReconcile(ITupleReference tuple) {
+        // Do nothing.
+    }
+
+    @Override
+    public void cancelProceed(ITupleReference tuple) {
         // Do nothing.
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
 
b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
index f408bb9..3f3a528 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
@@ -188,7 +188,7 @@
             }
 
             @Override
-            public void cancel(ITupleReference tuple) throws 
HyracksDataException {
+            public void cancelReconcile(ITupleReference tuple) throws 
HyracksDataException {
                 boolean found = false;
                 for (int i : deleteSet) {
                     
TupleUtils.createIntegerTuple(expectedTupleToBeCanceledBuilder, 
expectedTupleToBeCanceled, i);
@@ -201,6 +201,10 @@
             }
 
             @Override
+            public void cancelProceed(ITupleReference tuple) throws 
HyracksDataException {
+            }
+
+            @Override
             public void complete(ITupleReference tuple) throws 
HyracksDataException {
                 Assert.assertEquals(0, 
cmp.compare(SearchTask.this.expectedTupleToBeLocked, tuple));
                 expectedTupleToBeLockedValue++;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I16992b3bdc1bfc739417d11366d6bafc59294a0b
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Taewoo Kim <wangs...@gmail.com>

Reply via email to