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 5949a1cb71c5fc16e405c5516c10ea572d6092ca Author: Murtadha Hubail <[email protected]> AuthorDate: Tue Apr 14 01:47:30 2020 +0300 [NO ISSUE][STO] Account For Pages With Multiple Pages in LAFWriter - user model changes: no - storage format changes: no - interface changes: no Details: - Always ensure that the LAFWriter entry pages are allocated for the main page as well as any extra pages. - Account for null pages during backload failures to avoid NPEs. Change-Id: Ib9a7a04fe97e4031001925134f7bfc14a97a6078 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/5764 Reviewed-by: Michael Blow <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> --- .../storage/am/common/impls/AbstractTreeIndex.java | 12 +++++++---- .../storage/common/compression/file/LAFWriter.java | 23 +++++++++++----------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java index 3158b79..df70d99 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java @@ -288,13 +288,17 @@ public abstract class AbstractTreeIndex implements ITreeIndex { // Unlatch and unpin pages that weren't in the queue to avoid leaking memory. compressedPageWriter.abort(); for (NodeFrontier nodeFrontier : nodeFrontiers) { - ICachedPage frontierPage = nodeFrontier.page; - if (frontierPage.confiscated()) { - bufferCache.returnPage(frontierPage, false); + if (nodeFrontier != null && nodeFrontier.page != null) { + ICachedPage frontierPage = nodeFrontier.page; + if (frontierPage.confiscated()) { + bufferCache.returnPage(frontierPage, false); + } } } for (ICachedPage pageToDiscard : pagesToWrite) { - bufferCache.returnPage(pageToDiscard, false); + if (pageToDiscard != null) { + bufferCache.returnPage(pageToDiscard, false); + } } releasedLatches = true; } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/compression/file/LAFWriter.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/compression/file/LAFWriter.java index 9217415..3226786 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/compression/file/LAFWriter.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/compression/file/LAFWriter.java @@ -83,22 +83,21 @@ class LAFWriter implements ICompressedPageWriter { public void prepareWrite(ICachedPage cPage) throws HyracksDataException { final ICachedPageInternal internalPage = (ICachedPageInternal) cPage; final int entryPageId = getLAFEntryPageId(BufferedFileHandle.getPageId(internalPage.getDiskPageId())); - - if (!cachedFrames.containsKey(entryPageId)) { - try { - //Writing new page(s). Confiscate the page(s) from the buffer cache. - prepareFrames(entryPageId, internalPage); - } catch (HyracksDataException e) { - abort(); - throw e; - } + try { + //Writing new page(s). Confiscate the page(s) from the buffer cache. + prepareFrames(entryPageId, internalPage); + } catch (HyracksDataException e) { + abort(); + throw e; } } private void prepareFrames(int entryPageId, ICachedPageInternal cPage) throws HyracksDataException { - //Confiscate the first page - confiscatePage(entryPageId); - //check if extra pages spans to the next entry page + // check if we need to confiscate a page for the main page + if (!cachedFrames.containsKey(entryPageId)) { + confiscatePage(entryPageId); + } + // check if extra pages span to the next entry page for (int i = 0; i < cPage.getFrameSizeMultiplier() - 1; i++) { final int extraEntryPageId = getLAFEntryPageId(cPage.getExtraBlockPageId() + i); if (!cachedFrames.containsKey(extraEntryPageId)) {
