fixed bug in lsm search cursors: reset properly resets the cursors
git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1739 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
index 8333a95..f7e3aae 100644
--- a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
+++ b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
@@ -63,7 +63,7 @@
rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
}
includeMemComponent = lsmInitialState.getIncludeMemComponent();
- searcherfRefCount = lsmInitialState.getSearcherRefCount();
+ searcherRefCount = lsmInitialState.getSearcherRefCount();
lsmHarness = lsmInitialState.getLSMHarness();
setPriorityQueueComparator();
}
diff --git a/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java b/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
index a8e0873..f622d87 100644
--- a/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
+++ b/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
@@ -35,7 +35,7 @@
protected PriorityQueueElement reusedElement;
protected boolean needPush;
protected boolean includeMemComponent;
- protected AtomicInteger searcherfRefCount;
+ protected AtomicInteger searcherRefCount;
protected LSMHarness lsmHarness;
public LSMTreeSearchCursor() {
@@ -48,9 +48,24 @@
}
@Override
- public void reset() {
+ public void reset() throws HyracksDataException {
outputElement = null;
needPush = false;
+
+ if (outputPriorityQueue != null) {
+ outputPriorityQueue.clear();
+ }
+
+ if (rangeCursors != null) {
+ for (int i = 0; i < rangeCursors.length; i++) {
+ rangeCursors[i].reset();
+ }
+ }
+ rangeCursors = null;
+
+ if (searcherRefCount != null) {
+ lsmHarness.closeSearchCursor(searcherRefCount, includeMemComponent);
+ }
}
@Override
@@ -85,7 +100,7 @@
}
rangeCursors = null;
} finally {
- lsmHarness.closeSearchCursor(searcherfRefCount, includeMemComponent);
+ lsmHarness.closeSearchCursor(searcherRefCount, includeMemComponent);
}
}
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
index 93834f9..969031e 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
@@ -29,6 +29,7 @@
public abstract void reset() throws HyracksDataException;
+ protected boolean open = false;
protected BTreeRangeSearchCursor[] btreeCursors;
protected ITreeIndexAccessor[] diskRTreeAccessors;
protected ITreeIndexAccessor[] diskBTreeAccessors;
@@ -37,9 +38,9 @@
protected SearchPredicate rtreeSearchPredicate;
protected RangePredicate btreeRangePredicate;
protected ITupleReference frameTuple;
- private AtomicInteger searcherRefCount;
- private boolean includeMemRTree;
- private LSMHarness lsmHarness;
+ protected AtomicInteger searcherRefCount;
+ protected boolean includeMemRTree;
+ protected LSMHarness lsmHarness;
protected boolean foundNext;
public LSMRTreeAbstractCursor() {
@@ -73,6 +74,8 @@
}
rtreeSearchPredicate = (SearchPredicate) searchPred;
btreeRangePredicate = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);
+
+ open = true;
}
public ICachedPage getPage() {
@@ -81,16 +84,24 @@
}
public void close() throws HyracksDataException {
+ if (!open) {
+ return;
+ }
+
try {
- for (int i = 0; i < numberOfTrees; i++) {
- rtreeCursors[i].close();
- btreeCursors[i].close();
+ if (rtreeCursors != null && btreeCursors != null) {
+ for (int i = 0; i < numberOfTrees; i++) {
+ rtreeCursors[i].close();
+ btreeCursors[i].close();
+ }
}
rtreeCursors = null;
btreeCursors = null;
} finally {
lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);
}
+
+ open = false;
}
public void setBufferCache(IBufferCache bufferCache) {
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
index c578902..ca5c9e7 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
@@ -18,7 +18,6 @@
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
import edu.uci.ics.hyracks.storage.am.common.api.ICursorInitialState;
-import edu.uci.ics.hyracks.storage.am.common.api.ISearchOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.api.ISearchPredicate;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
import edu.uci.ics.hyracks.storage.am.common.api.IndexException;
@@ -26,16 +25,29 @@
public class LSMRTreeSearchCursor extends LSMRTreeAbstractCursor implements ITreeIndexCursor {
private int currentCursror;
- private ISearchOperationCallback searchCallback;
public LSMRTreeSearchCursor() {
currentCursror = 0;
}
@Override
- public void reset() {
+ public void reset() throws HyracksDataException {
+ if (!open) {
+ return;
+ }
+
currentCursror = 0;
foundNext = false;
+ try {
+ for (int i = 0; i < numberOfTrees; i++) {
+ rtreeCursors[i].close();
+ btreeCursors[i].close();
+ }
+ rtreeCursors = null;
+ btreeCursors = null;
+ } finally {
+ lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);
+ }
}
private void searchNextCursor() throws HyracksDataException {
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
index 1e0916a..2859d04 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
@@ -37,6 +37,10 @@
@Override
public void reset() throws HyracksDataException {
+ if (!open) {
+ return;
+ }
+
depletedRtreeCursors = new boolean[numberOfTrees];
foundNext = false;
for (int i = 0; i < numberOfTrees; i++) {
@@ -52,6 +56,8 @@
depletedRtreeCursors[i] = true;
}
}
+
+ lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);
}
@Override
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
index 9556230..1dddfb7 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
@@ -80,7 +80,7 @@
memBTreeAccessor = lsmInitialState.getBTreeAccessors()[0];
btreeRangePredicate = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);
}
- searcherfRefCount = lsmInitialState.getSearcherRefCount();
+ searcherRefCount = lsmInitialState.getSearcherRefCount();
lsmHarness = lsmInitialState.getLSMHarness();
comparatorFields = lsmInitialState.getComparatorFields();
setPriorityQueueComparator();