@Override public void setRootPageId(int rootPage) throws HyracksDataException { ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); confiscatedPage.acquireWriteLatch(); try { metaFrame.setPage(confiscatedPage); metaFrame.setRootPageId(rootPage); } finally { confiscatedPage.releaseWriteLatch(false); } ready = true; }
@Override public void put(ITreeIndexMetadataFrame frame, IValueReference key, IValueReference value) throws HyracksDataException { if (confiscatedPage == null) { throw HyracksDataException.create(ErrorCode.ILLEGAL_WRITE_AFTER_FLUSH_ATTEMPT); } confiscatedPage.acquireWriteLatch(); try { frame.setPage(confiscatedPage); frame.put(key, value); } finally { confiscatedPage.releaseWriteLatch(false); } }
@Override public void get(ITreeIndexMetadataFrame frame, IValueReference key, IPointable value) throws HyracksDataException { ICachedPage page = pinPage(); page.acquireReadLatch(); try { frame.setPage(page); frame.get(key, value); } finally { page.releaseReadLatch(); unpinPage(page); } }
@Override public void open(int fileId) throws HyracksDataException { this.fileId = fileId; // get the number of pages of the file int pages = bufferCache.getNumPagesOfFile(fileId); //if there are no pages in the file yet, we're just initializing if (pages == 0) { if (confiscatedPage != null) { throw new HyracksDataException("Metadata Page Manager is already initialized"); } ITreeIndexMetadataFrame metaFrame = createMetadataFrame(); ICachedPage metaNode = bufferCache.confiscatePage(BufferCache.INVALID_DPID); try { metaFrame.setPage(metaNode); metaFrame.init(); metaFrame.setMaxPage(-1); } finally { confiscatedPage = metaNode; } } }
@Override public int getMaxPageId(ITreeIndexMetadataFrame metaFrame) throws HyracksDataException { ICachedPage metaNode; int mdPage = getMetadataPageId(); if (mdPage < 0) { return IBufferCache.INVALID_PAGEID; } metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, mdPage), false); metaNode.acquireReadLatch(); int maxPage = -1; try { metaFrame.setPage(metaNode); maxPage = metaFrame.getMaxPage(); } finally { metaNode.releaseReadLatch(); bufferCache.unpin(metaNode); } return maxPage; }
@Override public void setRootPageId(int rootPage) throws HyracksDataException { ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); metaNode.acquireWriteLatch(); try { metaFrame.setPage(metaNode); metaFrame.setRootPageId(rootPage); } finally { metaNode.releaseWriteLatch(true); bufferCache.unpin(metaNode); ready = true; } }
@Override public int getRootPageId() throws HyracksDataException { ICachedPage metaNode; metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); metaNode.acquireReadLatch(); try { metaFrame.setPage(metaNode); return metaFrame.getRootPageId(); } finally { metaNode.releaseReadLatch(); bufferCache.unpin(metaNode); } }
@Override public long getFileOffset(ITreeIndexMetadataFrame frame, IValueReference key) throws HyracksDataException { int pageId = getMetadataPageId(); if (pageId != IBufferCache.INVALID_PAGEID) { ICachedPage page = pinPage(); page.acquireReadLatch(); try { frame.setPage(page); int inPageOffset = frame.getOffset(key); return inPageOffset >= 0 ? ((long) pageId * bufferCache.getPageSizeWithHeader()) + frame.getOffset(key) + IBufferCache.RESERVED_HEADER_BYTES : -1L; } finally { page.releaseReadLatch(); unpinPage(page); } } return -1L; } }
@Override public int getMaxPageId(ITreeIndexMetadataFrame metaFrame) throws HyracksDataException { ICachedPage metaNode; if (confiscatedPage == null) { int mdPage = getMetadataPageId(); if (mdPage < 0) { return IBufferCache.INVALID_PAGEID; } metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, mdPage), false); } else { metaNode = confiscatedPage; } metaNode.acquireReadLatch(); int maxPage = -1; try { metaFrame.setPage(metaNode); maxPage = metaFrame.getMaxPage(); } finally { metaNode.releaseReadLatch(); if (confiscatedPage == null) { bufferCache.unpin(metaNode); } } return maxPage; }
@Override public int getRootPageId() throws HyracksDataException { ICachedPage metaNode; if (confiscatedPage == null) { metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); } else { metaNode = confiscatedPage; } ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); metaNode.acquireReadLatch(); try { metaFrame.setPage(metaNode); return metaFrame.getRootPageId(); } finally { metaNode.releaseReadLatch(); if (confiscatedPage == null) { bufferCache.unpin(metaNode); } } }
@Override public long getFileOffset(ITreeIndexMetadataFrame frame, IValueReference key) throws HyracksDataException { int metadataPageNum = getMetadataPageId(); if (metadataPageNum != IBufferCache.INVALID_PAGEID) { ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); metaNode.acquireReadLatch(); try { frame.setPage(metaNode); return ((long) metadataPageNum * bufferCache.getPageSizeWithHeader()) + frame.getOffset(key); } finally { metaNode.releaseReadLatch(); bufferCache.unpin(metaNode); } } return -1; } }
@Override public void close(IPageWriteFailureCallback callback) throws HyracksDataException { if (ready) { ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); metaNode.acquireWriteLatch(); try { metaFrame.setPage(metaNode); metaFrame.setValid(true); } finally { metaNode.releaseWriteLatch(true); bufferCache.flush(metaNode); bufferCache.unpin(metaNode); ready = true; } ready = false; } }
int freePage = IBufferCache.INVALID_PAGEID; try { metaFrame.setPage(confiscatedPage); freePage = metaFrame.getFreePage(); if (freePage < 0) { // no free page entry on this page
metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage); if (metaFrame.getSpace() > Integer.BYTES) { metaFrame.addFreePage(freePageNum);
metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage);
int freePage = IBufferCache.INVALID_PAGEID; try { metaFrame.setPage(metaNode); freePage = metaFrame.getFreePage(); if (freePage < 0) { // no free page entry on this page
@Override public void close(IPageWriteFailureCallback callback) throws HyracksDataException { if (ready) { IFIFOPageQueue queue = bufferCache.createFIFOQueue(); ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame(); confiscatedPage.acquireWriteLatch(); try { metaFrame.setPage(confiscatedPage); metaFrame.setValid(true); } finally { confiscatedPage.releaseWriteLatch(false); } int finalMetaPage = getMaxPageId(metaFrame) + 1; confiscatedPage.setDiskPageId(BufferedFileHandle.getDiskPageId(fileId, finalMetaPage)); final ICompressedPageWriter compressedPageWriter = bufferCache.getCompressedPageWriter(fileId); compressedPageWriter.prepareWrite(confiscatedPage); // WARNING: flushing the metadata page should be done after releasing the write latch; otherwise, the page // won't be flushed to disk because it won't be dirty until the write latch has been released. queue.put(confiscatedPage, callback); bufferCache.finishQueue(); compressedPageWriter.endWriting(); metadataPage = getMetadataPageId(); ready = false; } else if (confiscatedPage != null) { bufferCache.returnPage(confiscatedPage, false); } confiscatedPage = null; }
protected TreeIndexState isValidTreeIndex(ITreeIndex treeIndex) throws HyracksDataException { IBufferCache bufferCache = treeIndex.getBufferCache(); treeIndex.activate(); try { int metadataPage = treeIndex.getPageManager().getMetadataPageId(); if (metadataPage < 0) { return TreeIndexState.INVALID; } ITreeIndexMetadataFrame metadataFrame = treeIndex.getPageManager().createMetadataFrame(); ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(treeIndex.getFileId(), metadataPage), false); page.acquireReadLatch(); try { metadataFrame.setPage(page); if (!metadataFrame.isValid()) { return TreeIndexState.INVALID; } else if (metadataFrame.getVersion() != ITreeIndexFrame.Constants.VERSION) { return TreeIndexState.VERSION_MISMATCH; } else { return TreeIndexState.VALID; } } finally { page.releaseReadLatch(); bufferCache.unpin(page); } } finally { treeIndex.deactivate(); } }
page.acquireReadLatch(); try { metaFrame.setPage(page); leafFrame.setPage(page); interiorFrame.setPage(page);
metaNode.acquireWriteLatch(); try { metaFrame.setPage(metaNode); metaFrame.init(); metaFrame.setRootPageId(1);