abdullah alamoudi has uploaded a new change for review.

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

Change subject: [ASTERIXDB-2205][STO] Maintain includeMutableComponent correctly
......................................................................

[ASTERIXDB-2205][STO] Maintain includeMutableComponent correctly

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- This change fixes ASTERIXDB-2205. The root cause
  for ASTERIXDB-2205 was that the value of
  includeMutableComponent is not maintained correctly.

Change-Id: Ic08a9372c608d6de960e1419899530aa55aa72e0
---
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.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-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
5 files changed, 43 insertions(+), 34 deletions(-)


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

diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
index 2f77504..7cd309a 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
@@ -68,7 +68,7 @@
         cmp = lsmInitialState.getOriginalKeyComparator();
         operationalComponents = lsmInitialState.getOperationalComponents();
         lsmHarness = lsmInitialState.getLSMHarness();
-        includeMutableComponent = false;
+        setIncludeMutableComponent(false);
         int numBTrees = operationalComponents.size();
         rangeCursors = new IIndexCursor[numBTrees];
         btreeAccessors = new BTreeAccessor[numBTrees];
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 3e14fb9..54e9ea4 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
@@ -108,7 +108,7 @@
                 if (canCallProceed) {
                     // if there are no memory components. no need to lock at 
all
                     // since whatever the search reads will never changes
-                    if (includeMutableComponent) {
+                    if (isIncludeMutableComponent()) {
                         if (!searchCallback.proceed(queueHead.getTuple())) {
                             // In case proceed() fails and there is an 
in-memory component,
                             // we can't simply use this element since there 
might be a change.
@@ -127,8 +127,7 @@
                                 // Re-traverses the index.
                                 reusablePred.setLowKey(copyTuple, true);
                                 btreeAccessors[0].search(rangeCursors[0], 
reusablePred);
-                                //------
-                                includeMutableComponent = 
pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
+                                
pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
                                 // now that we have completed the search and 
we have latches over the pages,
                                 // it is safe to complete the operation.. but 
as per the API of the callback
                                 // we only complete if we're producing this 
tuple
@@ -149,7 +148,7 @@
                             } else {
                                 // There are no more elements in the memory 
component.. can safely skip locking for the
                                 // remaining operations
-                                includeMutableComponent = false;
+                                setIncludeMutableComponent(false);
                             }
                         }
                     }
@@ -217,19 +216,21 @@
         
opCtx.getIndex().getHarness().replaceMemoryComponentsWithDiskComponents(getOpCtx(),
 replaceFrom);
         // redo the search on the new component
         for (int i = replaceFrom; i < switchRequest.length; i++) {
-            if (switchRequest[i] && switchedElements[i] != null) {
-                
copyTuple.reset(switchComponentTupleBuilders[i].getFieldEndOffsets(),
-                        switchComponentTupleBuilders[i].getByteArray());
-                reusablePred.setLowKey(copyTuple, true);
-                rangeCursors[i].reset();
+            if (switchRequest[i]) {
                 ILSMComponent component = operationalComponents.get(i);
                 BTree btree = (BTree) component.getIndex();
                 if (i == 0 && component.getType() != LSMComponentType.MEMORY) {
-                    includeMutableComponent = false;
+                    setIncludeMutableComponent(false);
                 }
-                btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
-                btreeAccessors[i].search(rangeCursors[i], reusablePred);
-                
pushIntoQueueFromCursorAndReplaceThisElement(switchedElements[i]);
+                if (switchedElements[i] != null) {
+                    
copyTuple.reset(switchComponentTupleBuilders[i].getFieldEndOffsets(),
+                            switchComponentTupleBuilders[i].getByteArray());
+                    reusablePred.setLowKey(copyTuple, true);
+                    rangeCursors[i].close();
+                    btreeAccessors[i].reset(btree, 
NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                    btreeAccessors[i].search(rangeCursors[i], reusablePred);
+                    
pushIntoQueueFromCursorAndReplaceThisElement(switchedElements[i]);
+                }
             }
             switchRequest[i] = false;
             // any failed switch makes further switches pointless
@@ -283,7 +284,7 @@
     }
 
     private void redoMemoryComponentSearchIfNeeded() throws 
HyracksDataException {
-        if (!includeMutableComponent) {
+        if (!isIncludeMutableComponent()) {
             return;
         }
         // if the last n records, none were from memory and there are writers 
inside the component,
@@ -305,7 +306,7 @@
                 // Re-traverses the index.
                 reusablePred.setLowKey(copyTuple, true);
                 btreeAccessors[0].search(rangeCursors[0], reusablePred);
-                includeMutableComponent = 
pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
+                pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
             }
         }
         tupleFromMemoryComponentCount = 0;
@@ -335,7 +336,7 @@
         reusablePred.setLowKeyComparator(cmp);
         reusablePred.setHighKey(predicate.getHighKey(), 
predicate.isHighKeyInclusive());
         reusablePred.setHighKeyComparator(predicate.getHighKeyComparator());
-        includeMutableComponent = false;
+        setIncludeMutableComponent(false);
 
         int numBTrees = operationalComponents.size();
         if (rangeCursors == null || rangeCursors.length != numBTrees) {
@@ -354,13 +355,11 @@
                 // re-use
                 rangeCursors[i].reset();
             }
-            if (component.getType() == LSMComponentType.MEMORY) {
-                includeMutableComponent = true;
-                btree = (BTree) component.getIndex();
-            } else {
-                btree = (BTree) component.getIndex();
-            }
 
+            if (component.getType() == LSMComponentType.MEMORY) {
+                setIncludeMutableComponent(true);
+            }
+            btree = (BTree) component.getIndex();
             if (btreeAccessors[i] == null) {
                 btreeAccessors[i] = 
btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             } else {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
index 17c681c..3d9e216 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
@@ -50,7 +50,7 @@
     protected PriorityQueueComparator pqCmp;
     protected MultiComparator cmp;
     protected boolean needPushElementIntoQueue;
-    protected boolean includeMutableComponent;
+    private boolean includeMutableComponent;
     protected ILSMHarness lsmHarness;
     protected boolean switchPossible = true;
     protected int hasNextCallCount = 0;
@@ -194,16 +194,18 @@
         return filter == null ? null : filter.getMaxTuple();
     }
 
-    protected boolean 
pushIntoQueueFromCursorAndReplaceThisElement(PriorityQueueElement e) throws 
HyracksDataException {
+    protected void 
pushIntoQueueFromCursorAndReplaceThisElement(PriorityQueueElement e) throws 
HyracksDataException {
         int cursorIndex = e.getCursorIndex();
         if (rangeCursors[cursorIndex].hasNext()) {
             rangeCursors[cursorIndex].next();
             e.reset(rangeCursors[cursorIndex].getTuple());
             outputPriorityQueue.offer(e);
-            return true;
+            return;
         }
         rangeCursors[cursorIndex].close();
-        return false;
+        if (cursorIndex == 0) {
+            setIncludeMutableComponent(false);
+        }
     }
 
     protected boolean isDeleted(PriorityQueueElement checkElement) throws 
HyracksDataException {
@@ -325,4 +327,12 @@
         return cmp.compare(tupleA, tupleB);
     }
 
+    protected boolean isIncludeMutableComponent() {
+        return includeMutableComponent;
+    }
+
+    protected void setIncludeMutableComponent(boolean includeMutableComponent) 
{
+        this.includeMutableComponent = includeMutableComponent;
+    }
+
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
index d565b9a..b30f0f5 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
@@ -69,7 +69,7 @@
         }
         lsmHarness = lsmInitState.getLSMHarness();
         operationalComponents = lsmInitState.getOperationalComponents();
-        includeMutableComponent = lsmInitState.getIncludeMemComponent();
+        setIncludeMutableComponent(lsmInitState.getIncludeMemComponent());
 
         // For searching the deleted-keys BTrees.
         this.keysOnlyTuple = lsmInitState.getKeysOnlyTuple();
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
index 2520eac..678d4bc 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
@@ -80,18 +80,18 @@
         rtreeSearchPredicate = (SearchPredicate) searchPred;
         searchCallback = lsmInitialState.getSearchOperationCallback();
 
-        includeMutableComponent = false;
+        setIncludeMutableComponent(false);
         numMutableComponents = 0;
         int numImmutableComponents = 0;
         for (ILSMComponent component : operationalComponents) {
             if (component.getType() == LSMComponentType.MEMORY) {
-                includeMutableComponent = true;
+                setIncludeMutableComponent(true);
                 numMutableComponents++;
             } else {
                 numImmutableComponents++;
             }
         }
-        if (includeMutableComponent) {
+        if (isIncludeMutableComponent()) {
             btreeRangePredicate = new RangePredicate(null, null, true, true, 
btreeCmp, btreeCmp);
         }
 
@@ -140,7 +140,7 @@
 
     @Override
     public boolean hasNext() throws HyracksDataException {
-        if (includeMutableComponent) {
+        if (isIncludeMutableComponent()) {
             if (foundNext) {
                 return true;
             }
@@ -234,7 +234,7 @@
         }
         currentCursor = 0;
         foundNext = false;
-        if (includeMutableComponent) {
+        if (isIncludeMutableComponent()) {
             for (int i = 0; i < numMutableComponents; i++) {
                 mutableRTreeCursors[i].reset();
                 btreeCursors[i].reset();
@@ -248,7 +248,7 @@
         if (!open) {
             return;
         }
-        if (includeMutableComponent) {
+        if (isIncludeMutableComponent()) {
             for (int i = 0; i < numMutableComponents; i++) {
                 mutableRTreeCursors[i].close();
                 btreeCursors[i].close();

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic08a9372c608d6de960e1419899530aa55aa72e0
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com>

Reply via email to