@Override public Block allocate(int blkSize) { if ( blkSize > 0 && blkSize != this.blockSize ) throw new FileException("Fixed blocksize only: request= "+blkSize+"fixed size="+this.blockSize) ; int id = allocateId() ; ByteBuffer bb = getByteBuffer(id) ; bb.position(0) ; Block block = new Block(id, bb) ; return block ; }
private void write(Block block, CopyContents copyContents) { check(block) ; checkIfClosed() ; int id = block.getId().intValue() ; if ( copyContents == CopyContents.Overwrite ) { ByteBuffer bbDst = getByteBuffer(id) ; bbDst.position(0) ; ByteBuffer bbSrc = block.getByteBuffer() ; bbSrc.rewind() ; bbDst.put(bbSrc) ; } // Assumed MRSW - no need to sync as we are the only Writer segmentDirty[segment(id)] = true ; writeNotification(block) ; }
@Override protected void force() { flushDirtySegments() ; super.force() ; }
@Override public void sync() { checkIfClosed() ; force() ; }
@Override public Block read(long id) { check(id) ; checkIfClosed() ; ByteBuffer bb = getByteBuffer(id) ; bb.position(0) ; Block block = new Block(id, bb) ; return block ; }
int seg = segment(id) ; // Segment. int segOff = byteOffset(id) ; // Byte offset in segment if ( getLog().isTraceEnabled() ) getLog().trace(format("%d => [%d, %d]", id, seg, segOff)) ; ByteBuffer segBuffer = allocSegment(seg) ;
/** Create a NIO Block Manager */ public static BlockMgr createMMapFile(String filename, int blockSize) { BlockAccess file = new BlockAccessMapped(filename, blockSize) ; BlockMgr blockMgr = wrapFileAccess(file, blockSize) ; return track(blockMgr) ; }
getLog().error("Segment negative: "+seg) ; throw new FileException("Negative segment: "+seg) ; long offset = fileLocation(seg) ; getLog().error("Segment offset gone negative: "+seg) ; throw new FileException("Negative segment offset: "+seg) ; if ( getLog().isDebugEnabled() ) getLog().debug(format("Segment: %d", seg)) ; segments[seg] = segBuffer ; } catch (IOException ex)
@Override protected void _close() { force() ; // There is no unmap operation for MappedByteBuffers. // Sun Bug id bug_id=4724038 // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724038 Arrays.fill(segments, null) ; Arrays.fill(segmentDirty, false) ; segmentDirtyCount = 0 ; }
@Override protected BlockAccess make() { String fn = filename + "-"+(counter++) ; FileOps.deleteSilent(fn) ; return new BlockAccessMapped(fn, BlockSize) ; } }
@Override protected BlockAccess make() { String fn = filename + "-"+(counter++) ; FileOps.deleteSilent(fn) ; return new BlockAccessMapped(fn, BlockSize) ; } }
@Override protected BlockMgr make() { clearBlockMgr() ; BlockAccess file = new BlockAccessMapped(filename, BlkSize) ; return new BlockMgrFileAccess(file, BlkSize) ; } }
@Override protected BlockMgr make() { clearBlockMgr() ; BlockAccess file = new BlockAccessMapped(filename, BlkSize) ; return new BlockMgrFileAccess(file, BlkSize) ; } }