[ASTERIXDB-3187][STO] Clear ByteBuffer position/limit of confiscated pages
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Confiscated pages could have posititon/limit different
from 0/capacity(), respectively. This patch ensures
the ByteBuffers of confiscated pages are cleared
before returned to LSM bulk loaders
Change-Id: I41081562479412096f812b330111a40e8e6c43a9
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17540
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
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 f1fe86f..ea108cb 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
@@ -1139,7 +1139,9 @@
}
private ICachedPage confiscatePage(long dpid, int multiplier) throws HyracksDataException {
- return getPageLoop(dpid, multiplier, true);
+ ICachedPage page = getPageLoop(dpid, multiplier, true);
+ page.getBuffer().clear();
+ return page;
}
private ICachedPage confiscateInner(long dpid, int multiplier) {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
index 593b00d..6ed4a09 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
@@ -63,7 +63,7 @@
private static final int NUM_PAGES = 10;
private static final int MAX_OPEN_FILES = 20;
private static final int HYRACKS_FRAME_SIZE = PAGE_SIZE;
- private IHyracksTaskContext ctx = TestUtils.create(HYRACKS_FRAME_SIZE);
+ private final IHyracksTaskContext ctx = TestUtils.create(HYRACKS_FRAME_SIZE);
private static final Random rnd = new Random(50);
@@ -443,6 +443,28 @@
bufferCache.closeFile(fileId);
}
+ @Test
+ public void testClearingConfiscatedPages() throws HyracksDataException {
+ TestStorageManagerComponentHolder.init(PAGE_SIZE, 1, MAX_OPEN_FILES);
+ IBufferCache bufferCache =
+ TestStorageManagerComponentHolder.getBufferCache(ctx.getJobletContext().getServiceContext());
+ String fileName = getFileName();
+ IIOManager ioManager = TestStorageManagerComponentHolder.getIOManager();
+ FileReference file = ioManager.resolve(fileName);
+ int fileId = bufferCache.createFile(file);
+ int testPageId = 0;
+ bufferCache.openFile(fileId);
+ ICachedPage aPage = bufferCache.confiscatePage(BufferedFileHandle.getDiskPageId(fileId, testPageId));
+ Assert.assertEquals(PAGE_SIZE, aPage.getBuffer().limit());
+ Assert.assertEquals(0, aPage.getBuffer().position());
+ aPage.getBuffer().limit(5);
+ aPage.getBuffer().position(1);
+ bufferCache.returnPage(aPage);
+ aPage = bufferCache.confiscatePage(BufferedFileHandle.getDiskPageId(fileId, testPageId));
+ Assert.assertEquals(PAGE_SIZE, aPage.getBuffer().limit());
+ Assert.assertEquals(0, aPage.getBuffer().position());
+ }
+
@AfterClass
public static void cleanup() throws Exception {
for (String s : openedFiles) {