Taewoo Kim has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/2410
Change subject: [NO ISSUE][RT] Ensure a cursor.close()
......................................................................
[NO ISSUE][RT] Ensure a cursor.close()
- user model changes: no
- storage format changes: no
- interface changes: no
details:
- Ensure a cursor.close() is always executed.
Change-Id: I78c7908830be810b1d40abffffbd5f1978818869
---
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/AbstractTOccurrenceSearcher.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/InvertedListMerger.java
3 files changed, 33 insertions(+), 29 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/10/2410/1
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
index 085f8d5..6e8689b 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
@@ -172,6 +172,7 @@
btreePred.setHighKey(btreeSearchTuple, true);
try {
btreeAccessor.search(btreeCursor, btreePred);
+ cursorNeedsClose = true;
} catch (Exception e) {
btreeSearchTuple.removeLastTuple();
throw HyracksDataException.create(e);
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/AbstractTOccurrenceSearcher.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/AbstractTOccurrenceSearcher.java
index ff9a2f1..4e16d15 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/AbstractTOccurrenceSearcher.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/AbstractTOccurrenceSearcher.java
@@ -253,7 +253,7 @@
((BufferManagerBackedVSizeFrame) queryTokenFrame).destroy();
// Releases the frames of the cursor.
- if (isSingleInvertedList && singleInvListCursor != null) {
+ if (singleInvListCursor != null) {
singleInvListCursor.unloadPages();
singleInvListCursor.close();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/InvertedListMerger.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/InvertedListMerger.java
index 0bfc140..b24819a 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/InvertedListMerger.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/InvertedListMerger.java
@@ -126,41 +126,41 @@
isFinalList = true;
}
InvertedListCursor invListCursor = invListCursors.get(i);
- // Loads the inverted list (at least some part of it).
- invListCursor.prepareLoadPages();
- invListCursor.loadPages();
- if (i < numPrefixLists) {
- // Merges a prefix list.
- doneMerge = mergePrefixList(invListCursor, prevSearchResult,
result, isFinalList);
- } else {
- // Merge suffix list.
- int numInvListElements = invListCursor.size();
- int currentNumResults = prevSearchResult.getNumResults();
- // Should we binary search the next list or should we
sort-merge it?
- if (currentNumResults * Math.log(numInvListElements) <
currentNumResults + numInvListElements) {
- doneMerge = mergeSuffixListProbe(invListCursor,
prevSearchResult, result, i, numInvLists,
- occurrenceThreshold, isFinalList);
+ try {
+ // Loads the inverted list (at least some part of it).
+ invListCursor.prepareLoadPages();
+ invListCursor.loadPages();
+ if (i < numPrefixLists) {
+ // Merges a prefix list.
+ doneMerge = mergePrefixList(invListCursor,
prevSearchResult, result, isFinalList);
} else {
- doneMerge = mergeSuffixListScan(invListCursor,
prevSearchResult, result, i, numInvLists,
- occurrenceThreshold, isFinalList);
+ // Merge suffix list.
+ int numInvListElements = invListCursor.size();
+ int currentNumResults = prevSearchResult.getNumResults();
+ // Should we binary search the next list or should we
sort-merge it?
+ if (currentNumResults * Math.log(numInvListElements) <
currentNumResults + numInvListElements) {
+ doneMerge = mergeSuffixListProbe(invListCursor,
prevSearchResult, result, i, numInvLists,
+ occurrenceThreshold, isFinalList);
+ } else {
+ doneMerge = mergeSuffixListScan(invListCursor,
prevSearchResult, result, i, numInvLists,
+ occurrenceThreshold, isFinalList);
+ }
}
- }
-
- if (isFinalList) {
- // For the final list, the method unloadPages() should be
called only when traversing
- // the inverted list is finished.
- if (doneMerge) {
+ } finally {
+ // An intermediate inverted list should always be closed.
+ // The final inverted list should be closed only when
traversing the list is done.
+ if (!isFinalList || (isFinalList && doneMerge)) {
invListCursor.unloadPages();
invListCursor.close();
}
- // Needs to return the calculation result for the final list
only.
- // Otherwise, the process needs to be continued until this
method traverses the final inverted list
- // and either generates some output in the output buffer or
finishes traversing it.
- return doneMerge;
}
- invListCursor.unloadPages();
- invListCursor.close();
+ // Needs to return the calculation result for the final list only.
+ // Otherwise, the process needs to be continued until this method
traverses the final inverted list
+ // and either generates some output in the output buffer or
finishes traversing it.
+ if (isFinalList && doneMerge) {
+ return doneMerge;
+ }
}
// Control does not reach here.
@@ -555,6 +555,9 @@
public void close() throws HyracksDataException {
prevSearchResult.close();
newSearchResult.close();
+ if (finalInvListCursor != null) {
+ finalInvListCursor.close();
+ }
}
// Resets the variables.
--
To view, visit https://asterix-gerrit.ics.uci.edu/2410
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I78c7908830be810b1d40abffffbd5f1978818869
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Taewoo Kim <[email protected]>