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>

Reply via email to