commit | 8f49dc5ac39a9ec3577d096c5bd3f722f0d75fad | [log] [tgz] |
---|---|---|
author | Wail Alkowaileet <wael.y.k@gmail.com> | Wed Jul 03 03:32:48 2024 -0700 |
committer | Wail Alkowaileet <wael.y.k@gmail.com> | Wed Jul 03 18:12:34 2024 +0000 |
tree | 729bf1b31282b28a7c63db57a51e1db99974e1c4 | |
parent | 25edb259ce11afc2a30c1da39fb01524a4541d68 [diff] |
[ASTERIXDB-3451][STO] Avoid unlocking twice when pin fails - user model changes: no - storage format changes: no - interface changes: no Details: readLock().unlock() could be called twice if pin fails while pinning the next mega-leaf node. Pin should be called first to avoid releasing the read lock twice. Change-Id: Ib590716f5018c4b6b79b9cb22992d32994b75a67 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18424 Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu> Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com> Reviewed-by: Ian Maxon <imaxon@apache.org>
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java index 4cb717a..8d64eec 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java
@@ -117,10 +117,15 @@ int nextLeaf = leafFrame.getNextLeaf(); // Release the previous pages release(bufferCache); + /* + * First pin the next page0. This has to be called before the unpin below to avoid doing + * readLock().unlock() twice. If unpin called first and pin fails, then the method onUnpin will be + * called twice on the same pageZero, once when unpin called within this method and another one when the + * cursor is closed due to the pin failure. + */ + ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeaf), this); // Release page0 bufferCache.unpin(leafFrame.getPage(), this); - // pin the next page0 - ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeaf), this); leafFrame.setPage(nextPage); return nextPage; }