This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 8cfb837ffa001000a02a618b999417c166a651aa Author: Wail Alkowaileet <[email protected]> AuthorDate: Wed May 17 16:10:43 2023 -0700 [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 <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- .../storage/common/buffercache/BufferCache.java | 4 +++- .../hyracks/storage/common/BufferCacheTest.java | 24 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) 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 f1fe86fb3c..ea108cbfbb 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 @@ public class BufferCache implements IBufferCacheInternal, ILifeCycleComponent, I } 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 593b00d90d..6ed4a09d6a 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 @@ public class BufferCacheTest { 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 @@ public class BufferCacheTest { 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) {
