[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;
     }