public void destroyQueue() { poisoned.set(true); if (writerThread == null) { synchronized (this) { if (writerThread == null) { return; } } } //Dummy cached page to act as poison pill CachedPage poisonPill = new CachedPage(); poisonPill.setQueueInfo(new QueueInfo(true, true)); try { synchronized (poisonPill) { queue.put(poisonPill); while (queue.contains(poisonPill)) { poisonPill.wait(); } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }
private void readExtraPages(CachedPage cPage) throws HyracksDataException { final int totalPages = cPage.getFrameSizeMultiplier(); if (totalPages > 1) { pageReplacementStrategy.fixupCapacityOnLargeRead(cPage); cPage.getBuffer().position(bufferCache.getPageSize()); cPage.getBuffer().limit(totalPages * bufferCache.getPageSize()); readToBuffer(cPage.getBuffer(), getExtraPageOffset(cPage)); } }
@Override protected long getFirstPageOffset(CachedPage cPage) { return cPage.getCompressedPageOffset(); }
private void setPageInfo(CachedPage cPage) { buf.putInt(FRAME_MULTIPLIER_OFF, cPage.getFrameSizeMultiplier()); buf.putInt(EXTRA_BLOCK_PAGE_ID_OFF, cPage.getExtraBlockPageId()); }
private ICachedPageInternal allocatePage(int multiplier) { Integer cpId = cpIdFreeList.poll(); if (cpId == null) { cpId = cpIdCounter.getAndIncrement(); } CachedPage cPage = new CachedPage(cpId, allocator.allocate(pageSize * multiplier, 1)[0], this); cPage.setFrameSizeMultiplier(multiplier); bufferCache.addPage(cPage); numPages.getAndAdd(multiplier); return cPage; }
private void readExtraPages(CachedPage cPage, ByteBuffer cBuffer) throws HyracksDataException { final ByteBuffer uBuffer = cPage.getBuffer(); final int totalPages = cPage.getFrameSizeMultiplier(); for (int i = 1; i < totalPages; i++) { fixBufferPointers(uBuffer, i); compressedFileManager.setExtraCompressedPageInfo(cPage, i - 1); if (cPage.getCompressedPageSize() < bufferCache.getPageSize()) { cBuffer.position(0); cBuffer.limit(cPage.getCompressedPageSize()); readToBuffer(cBuffer, getExtraPageOffset(cPage)); cBuffer.flip(); uncompressToPageBuffer(cBuffer, cPage.getBuffer()); } else { readToBuffer(uBuffer, getExtraPageOffset(cPage)); } } }
@Override protected void write(CachedPage cPage, BufferCacheHeaderHelper header, int totalPages, int extraBlockPageId) throws HyracksDataException { final ByteBuffer buf = cPage.getBuffer(); final boolean contiguousLargePages = getPageId(cPage.getDiskPageId()) + 1 == extraBlockPageId; long bytesWritten; try { buf.limit(contiguousLargePages ? bufferCache.getPageSize() * totalPages : bufferCache.getPageSize()); buf.position(0); bytesWritten = writeToFile(header.prepareWrite(cPage), getFirstPageOffset(cPage)); } finally { returnHeaderHelper(header); } if (totalPages > 1 && !contiguousLargePages) { buf.limit(totalPages * bufferCache.getPageSize()); bytesWritten += writeToFile(buf, getExtraPageOffset(cPage)); } final int expectedWritten = bufferCache.getPageSizeWithHeader() + bufferCache.getPageSize() * (totalPages - 1); verifyBytesWritten(expectedWritten, bytesWritten); }
cPage.reset(cPage.dpid); cPage.valid = true; cPage.next = bucket.cachedPage; cPage.invalidate(); cPage.pinCount.decrementAndGet(); if (DEBUG) {
@Override protected long getFirstPageOffset(CachedPage cPage) { return getPageOffset(getPageId(cPage.getDiskPageId())); }
public void invalidate() { reset(-1); }
private void writeExtraCompressedPages(CachedPage cPage, ByteBuffer cBuffer, int totalPages, int extraBlockPageId) throws HyracksDataException { final ByteBuffer uBuffer = cPage.getBuffer(); long expectedBytesWritten = 0; long bytesWritten = 0; for (int i = 1; i < totalPages; i++) { fixBufferPointers(uBuffer, i); cBuffer.position(0); final ByteBuffer writeBuffer; if (compressToWriteBuffer(uBuffer, cBuffer) < bufferCache.getPageSize()) { writeBuffer = cBuffer; } else { writeBuffer = uBuffer; } final int length = writeBuffer.remaining(); final long offset = compressedFileManager.writeExtraPageInfo(extraBlockPageId, length, i - 1); expectedBytesWritten += length; bytesWritten += writeToFile(writeBuffer, offset); } verifyBytesWritten(expectedBytesWritten, bytesWritten); }
@Override protected long getExtraPageOffset(CachedPage cPage) { return getPageOffset(cPage.getExtraBlockPageId()); }
private boolean invalidateIfFileIdMatch(int fileId, CachedPage cPage, boolean flushDirtyPages) throws HyracksDataException { if (BufferedFileHandle.getFileId(cPage.dpid) == fileId) { int pinCount; if (cPage.dirty.get()) { if (flushDirtyPages) { write(cPage); } cPage.dirty.set(false); pinCount = cPage.pinCount.decrementAndGet(); } else { pinCount = cPage.pinCount.get(); } if (pinCount > 0) { throw new IllegalStateException("Page " + BufferedFileHandle.getFileId(cPage.dpid) + ":" + BufferedFileHandle.getPageId(cPage.dpid) + " is pinned and file is being closed. Pincount is: " + pinCount + " Page is confiscated: " + cPage.confiscated); } cPage.invalidate(); return true; } return false; }
@Override public boolean isClean() { List<Long> reachableDpids = new LinkedList<>(); synchronized (cachedPages) { for (ICachedPageInternal internalPage : cachedPages) { CachedPage c = (CachedPage) internalPage; if (c.confiscated() || c.latch.getReadLockCount() != 0 || c.latch.getWriteHoldCount() != 0) { return false; } if (c.valid) { reachableDpids.add(c.dpid); } } } for (Long l : reachableDpids) { if (!canFindValidCachedPage(l)) { return false; } } return true; }
@Override public void read(CachedPage cPage) throws HyracksDataException { final BufferCacheHeaderHelper header = checkoutHeaderHelper(); try { compressedFileManager.setCompressedPageInfo(cPage); long bytesRead = readToBuffer(header.prepareRead(cPage.getCompressedPageSize()), getFirstPageOffset(cPage)); if (!verifyBytesRead(cPage.getCompressedPageSize(), bytesRead)) { return; } final ByteBuffer cBuffer = header.processHeader(cPage); final ByteBuffer uBuffer = cPage.getBuffer(); fixBufferPointers(uBuffer, 0); if (cPage.getCompressedPageSize() < bufferCache.getPageSizeWithHeader()) { uncompressToPageBuffer(cBuffer, uBuffer); } else { cPage.getBuffer().put(cBuffer); } final int totalPages = cPage.getFrameSizeMultiplier(); if (totalPages > 1) { pageReplacementStrategy.fixupCapacityOnLargeRead(cPage); readExtraPages(cPage, cBuffer); } } finally { returnHeaderHelper(header); } }
/** * Write the CachedPage into disk * * @param cPage * CachedPage in {@link BufferCache} * @throws HyracksDataException */ public void write(CachedPage cPage) throws HyracksDataException { final int totalPages = cPage.getFrameSizeMultiplier(); final int extraBlockPageId = cPage.getExtraBlockPageId(); final BufferCacheHeaderHelper header = checkoutHeaderHelper(); write(cPage, header, totalPages, extraBlockPageId); }
try { final ByteBuffer cBuffer = header.prepareWrite(cPage, getRequiredBufferSize()); final ByteBuffer uBuffer = cPage.getBuffer(); final long pageId = cPage.getDiskPageId();
} else { int pageHash = hash(victim.getDiskPageId()); CacheBucket bucket = pageMap[pageHash]; bucket.bucketLock.lock();
@Override public void read(CachedPage cPage) throws HyracksDataException { final BufferCacheHeaderHelper header = checkoutHeaderHelper(); try { long bytesRead = readToBuffer(header.prepareRead(bufferCache.getPageSizeWithHeader()), getFirstPageOffset(cPage)); if (!verifyBytesRead(bufferCache.getPageSizeWithHeader(), bytesRead)) { return; } final ByteBuffer buf = header.processHeader(cPage); cPage.getBuffer().put(buf); } finally { returnHeaderHelper(header); } readExtraPages(cPage); }