protected final BufferCacheHeaderHelper checkoutHeaderHelper() { BufferCacheHeaderHelper helper = headerPageCache.poll(); if (helper == null) { helper = new BufferCacheHeaderHelper(bufferCache.getPageSize()); } return helper; }
public ByteBuffer prepareWrite(CachedPage cPage, int requiredSize) { ensureBufferCapacity(requiredSize); setPageInfo(cPage); buf.position(RESERVED_HEADER_BYTES); buf.limit(buf.capacity()); return buf; }
@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); }
throws HyracksDataException { try { final ByteBuffer cBuffer = header.prepareWrite(cPage, getRequiredBufferSize()); final ByteBuffer uBuffer = cPage.getBuffer(); final long pageId = cPage.getDiskPageId(); } else { final ByteBuffer[] buffers = header.prepareWrite(cPage); final long offset = compressedFileManager.writePageInfo(pageId, bufferCache.getPageSizeWithHeader()); expectedBytesWritten = buffers[0].limit() + (long) buffers[1].limit();
public ByteBuffer[] prepareWrite(CachedPage cPage) { setPageInfo(cPage); buf.position(0); buf.limit(RESERVED_HEADER_BYTES); array[1] = cPage.buffer; return array; }
@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); } }
@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); }