protected ICachedPage acquirePage(int pageId) throws HyracksDataException { ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId), false); if (exclusiveLatchNodes) { nextPage.acquireWriteLatch(); } else { nextPage.acquireReadLatch(); } return nextPage; } }
@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; }
private final boolean acquireLatch(ICachedPage node, BTreeOpContext ctx, boolean isLeaf) { if (!isLeaf || (ctx.getOperation() == IndexOperation.SEARCH && !ctx.getCursor().isExclusiveLatchNodes())) { node.acquireReadLatch(); return true; } else { node.acquireWriteLatch(); return false; } }
@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 init(ITreeIndexFrameFactory interiorFrameFactory, ITreeIndexFrameFactory leafFrameFactory) throws HyracksDataException { currentPageId.set(1); ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, 0), true); page.acquireWriteLatch(); page.releaseWriteLatch(false); bufferCache.unpin(page); page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, currentPageId.get()), true); if (leafFrameFactory != null) { page.acquireWriteLatch(); ITreeIndexFrame leafFrame = leafFrameFactory.createFrame(); leafFrame.setPage(page); leafFrame.initBuffer((byte) 0); page.releaseWriteLatch(true); } bufferCache.unpin(page); }
@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 takePage(ITreeIndexMetadataFrame metaFrame) throws HyracksDataException { confiscatedPage.acquireWriteLatch(); int freePage = IBufferCache.INVALID_PAGEID; try { if (nextPage > 0) { // sibling may have free pages ICachedPage nextNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextPage), false); nextNode.acquireWriteLatch();
@Override public void releasePage(ITreeIndexMetadataFrame metaFrame, int freePageNum) throws HyracksDataException { ICachedPage metaPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage); newNode.acquireWriteLatch(); try { int metaMaxPage = metaFrame.getMaxPage();
metaPage.acquireWriteLatch(); try { metaFrame.setPage(metaPage); newNode.acquireWriteLatch();
@Override public int takePage(ITreeIndexMetadataFrame metaFrame) throws HyracksDataException { ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false); metaNode.acquireWriteLatch(); int freePage = IBufferCache.INVALID_PAGEID; try { ICachedPage nextNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextPage), false); nextNode.acquireWriteLatch();
private void fetchNextLeafPage(int nextLeafPage) throws HyracksDataException { do { ICachedPage nextLeaf = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeafPage), false); if (exclusiveLatchNodes) { nextLeaf.acquireWriteLatch(); page.releaseWriteLatch(isPageDirty); } else { nextLeaf.acquireReadLatch(); page.releaseReadLatch(); } bufferCache.unpin(page); page = nextLeaf; isPageDirty = false; frame.setPage(page); nextLeafPage = frame.getNextLeaf(); } while (frame.getTupleCount() == 0 && nextLeafPage > 0); }
@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; } }
private void unsetSmPages(BTreeOpContext ctx) throws HyracksDataException { ICachedPage originalPage = ctx.getInteriorFrame().getPage(); for (int i = 0; i < ctx.getSmPages().size(); i++) { int pageId = ctx.getSmPages().get(i); ICachedPage smPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), pageId), false); smPage.acquireWriteLatch(); try { ctx.getInteriorFrame().setPage(smPage); ctx.getInteriorFrame().setSmFlag(false); } finally { smPage.releaseWriteLatch(true); bufferCache.unpin(smPage); } } if (ctx.getSmPages().size() > 0) { if (ctx.getSmoCount() == Integer.MAX_VALUE) { smoCounter.set(0); } else { smoCounter.incrementAndGet(); } treeLatch.writeLock().unlock(); ctx.getSmPages().clear(); } ctx.getInteriorFrame().setPage(originalPage); }
metaNode.acquireWriteLatch(); try { metaFrame.setPage(metaNode); rootNode.acquireWriteLatch(); try { ITreeIndexFrame leafFrame = leafFrameFactory.createFrame();
rightNode.acquireWriteLatch(); try { IBTreeLeafFrame rightFrame = ctx.createLeafFrame();
leftNode.acquireWriteLatch(); try { int newLeftId = freePageManager.takePage(ctx.getMetaFrame()); ICachedPage newLeftNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), newLeftId), true); newLeftNode.acquireWriteLatch(); try { boolean largePage = false;
@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; }
int parentId = ctx.getPathList().getLastPageId(); ICachedPage parentNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), parentId), false); parentNode.acquireWriteLatch(); writeLatched = true; ctx.getInteriorFrame().setPage(parentNode); parentNode.acquireWriteLatch(); writeLatched = true; ctx.getInteriorFrame().setPage(parentNode);
ICachedPage rightNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), rightPageId), true); rightNode.acquireWriteLatch(); try { IBTreeFrame rightFrame = ctx.createInteriorFrame();
node.acquireWriteLatch(); writeLatched = true; ctx.getLeafFrame().setPage(node);