@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 takeBlock(ITreeIndexMetadataFrame metaFrame, int count) throws HyracksDataException { int maxPage = metaFrame.getMaxPage(); metaFrame.setMaxPage(maxPage + count); return maxPage + 1; }
@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); } }
metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage); if (metaFrame.getSpace() > Integer.BYTES) { metaFrame.addFreePage(freePageNum); } else { int newPageNum = metaFrame.getFreePage(); if (newPageNum < 0) { throw new HyracksDataException( newNode.acquireWriteLatch(); try { int metaMaxPage = metaFrame.getMaxPage(); System.arraycopy(metaPage.getBuffer().array(), 0, newNode.getBuffer().array(), 0, metaPage.getBuffer().capacity()); metaFrame.init(); metaFrame.setNextMetadataPage(newPageNum); metaFrame.setMaxPage(metaMaxPage); metaFrame.addFreePage(freePageNum); } finally { newNode.releaseWriteLatch(true);
int freePage = IBufferCache.INVALID_PAGEID; try { metaFrame.setPage(confiscatedPage); freePage = metaFrame.getFreePage(); if (freePage < 0) { // no free page entry on this page int nextPage = metaFrame.getNextMetadataPage(); if (nextPage > 0) { // sibling may have free pages ICachedPage nextNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextPage), false); int maxPage = metaFrame.getMaxPage(); nextNode.getBuffer().capacity()); metaFrame.setMaxPage(maxPage); freePage = metaFrame.getFreePage(); freePage = nextPage; } else { metaFrame.addFreePage(nextPage); freePage = metaFrame.getMaxPage(); freePage++; metaFrame.setMaxPage(freePage);
metaNode.acquireWriteLatch(); try { metaFrame.setPage(metaNode); metaFrame.init(); metaFrame.setRootPageId(1); metaFrame.setMaxPage(1); } finally { metaNode.releaseWriteLatch(true);
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(); } }
@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 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 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 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; } }
page.acquireReadLatch(); try { metaFrame.setPage(page); leafFrame.setPage(page); interiorFrame.setPage(page);
metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage); if (metaFrame.getSpace() > Integer.BYTES) { metaFrame.addFreePage(freePageNum); } else { int newPageNum = metaFrame.getFreePage(); if (newPageNum < 0) { throw new HyracksDataException( int metaMaxPage = metaFrame.getMaxPage(); metaPage.getBuffer().capacity()); metaFrame.init(); metaFrame.setNextMetadataPage(newPageNum); metaFrame.setMaxPage(metaMaxPage); metaFrame.addFreePage(freePageNum); } finally { newNode.releaseWriteLatch(true);
int freePage = IBufferCache.INVALID_PAGEID; try { metaFrame.setPage(metaNode); freePage = metaFrame.getFreePage(); if (freePage < 0) { // no free page entry on this page int nextPage = metaFrame.getNextMetadataPage(); if (nextPage > 0) { // sibling may have free pages ICachedPage nextNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextPage), false); int maxPage = metaFrame.getMaxPage(); metaFrame.setMaxPage(maxPage); freePage = metaFrame.getFreePage(); freePage = nextPage; } else { metaFrame.addFreePage(nextPage); freePage = metaFrame.getMaxPage(); freePage++; metaFrame.setMaxPage(freePage);
@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; 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 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 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; } }