This is an automated email from the ASF dual-hosted git repository.
wyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new c4b27ad5e5 [ASTERIXDB-3416][STO] Fix BC lock leaks on read failure
c4b27ad5e5 is described below
commit c4b27ad5e56c3efdf1b5a801d29f4e4f9a963ecf
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Mon Jun 3 10:33:40 2024 -0700
[ASTERIXDB-3416][STO] Fix BC lock leaks on read failure
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Read locks could be held indefinitely on page read failure
Change-Id: I8708d2681370252f2a45f409be1a571515c2026f
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18337
Integration-Tests: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
Tested-by: Jenkins <[email protected]>
---
.../column/cloud/buffercache/read/CloudColumnReadContext.java | 11 +++++++----
.../cloud/buffercache/read/DefaultColumnReadContext.java | 3 ++-
.../hyracks/storage/common/buffercache/BufferCache.java | 2 +-
3 files changed, 10 insertions(+), 6 deletions(-)
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 af69fe5f8d..2d6b2fdf00 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
@@ -112,10 +112,13 @@ public final class CloudColumnReadContext implements
IColumnReadContext {
@Override
public ICachedPage pinNext(ColumnBTreeReadLeafFrame leafFrame,
IBufferCache bufferCache, int fileId)
throws HyracksDataException {
- // TODO do we support prefetching?
- ICachedPage nextPage =
bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId,
leafFrame.getNextLeaf()), this);
+ int nextLeaf = leafFrame.getNextLeaf();
+ // Release the previous pages (including page0)
release(bufferCache);
bufferCache.unpin(leafFrame.getPage(), this);
+
+ // pin the next page0
+ ICachedPage nextPage =
bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeaf), this);
leafFrame.setPage(nextPage);
return nextPage;
}
@@ -127,8 +130,8 @@ public final class CloudColumnReadContext implements
IColumnReadContext {
return;
}
- // TODO handle prefetch if supported
-
+ // TODO What if every other page is requested. That would do N/2
request, where N is the number of pages.
+ // TODO This should be optimized in a way that minimizes the number of
requests
columnRanges.reset(leafFrame, projectedColumns, plan,
cloudOnlyColumns);
int pageZeroId = leafFrame.getPageId();
int[] columnsOrders = columnRanges.getColumnsOrder();
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/DefaultColumnReadContext.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/DefaultColumnReadContext.java
index 591df4aeaa..0e6f858248 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/DefaultColumnReadContext.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/DefaultColumnReadContext.java
@@ -67,8 +67,9 @@ public final class DefaultColumnReadContext implements
IColumnReadContext {
@Override
public ICachedPage pinNext(ColumnBTreeReadLeafFrame leafFrame,
IBufferCache bufferCache, int fileId)
throws HyracksDataException {
- ICachedPage nextPage =
bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId,
leafFrame.getNextLeaf()));
+ int nextLeaf = leafFrame.getNextLeaf();
bufferCache.unpin(leafFrame.getPage());
+ ICachedPage nextPage =
bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeaf));
leafFrame.setPage(nextPage);
return nextPage;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
index 53e27a987e..ab375320dd 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
@@ -219,7 +219,7 @@ public class BufferCache implements IBufferCacheInternal,
ILifeCycleComponent, I
throw e;
} finally {
if (!cPage.valid) {
- unpin(cPage);
+ unpin(cPage, context);
}
}
}