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>