private void fixBufferPointers(ByteBuffer uBuffer, int i) { //Fix the uncompressed buffer to point at the i^th extra page uBuffer.position(bufferCache.getPageSize() * i); //Similarly, fix the limit to a page-worth of data from the i^th page uBuffer.limit(uBuffer.position() + bufferCache.getPageSize()); }
@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); }
if (compressToWriteBuffer(uBuffer, cBuffer) < bufferCache.getPageSize()) { cBuffer.position(0); final long offset = compressedFileManager.writePageInfo(pageId, cBuffer.remaining());
protected final BufferCacheHeaderHelper checkoutHeaderHelper() { BufferCacheHeaderHelper helper = headerPageCache.poll(); if (helper == null) { helper = new BufferCacheHeaderHelper(bufferCache.getPageSize()); } return helper; }
private int getRequiredBufferSize() { final ICompressorDecompressor compDecomp = compressedFileManager.getCompressorDecompressor(); return compDecomp.computeCompressedBufferSize(bufferCache.getPageSize()); }
private void uncompressToPageBuffer(ByteBuffer cBuffer, ByteBuffer uBuffer) throws HyracksDataException { final ICompressorDecompressor compDecomp = compressedFileManager.getCompressorDecompressor(); compDecomp.uncompress(cBuffer, uBuffer); verifyUncompressionSize(bufferCache.getPageSize(), uBuffer.remaining()); }
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)); } }
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); }
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)); } } }