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 <wangs...@gmail.com>