private static BlockMgr track(String label, BlockMgr blkMgr) { return new BlockTracker(label, blkMgr) ; }
private void writeTracker(Block block) { synchronized (this) { checkUpdate(Write) ; Long id = block.getId() ; add(Write, id) ; if ( !activeWriteBlocks.contains(id) ) error(Write, id + " is not an active write block") ; } }
@Override public void endUpdate() { synchronized (this) { if ( inUpdate == 0 ) error(EndUpdate, "endUpdate but not in update") ; if ( inRead > 0 ) error(EndUpdate, "endUpdate when in read") ; checkEmpty("Outstanding read blocks at end of update operations", activeReadBlocks) ; checkEmpty("Outstanding write blocks at end of update operations", activeWriteBlocks) ; inUpdate-- ; clearBlockTracking() ; } blockMgr.endUpdate() ; }
@Override public void beginUpdate() { synchronized (this) { if ( inRead > 0 ) error(BeginUpdate, "beginUpdate when already in read") ; if ( inUpdate > 0 ) error(BeginUpdate, "beginUpdate when already in update") ; inUpdate++ ; clearBlockTracking(); } blockMgr.beginUpdate() ; }
@Override public void free(Block block) { synchronized (this) { checkUpdate(Free) ; Long id = block.getId() ; add(Free, id) ; if ( activeReadBlocks.contains(id) ) warn(Free, id + " is a read block") ; if ( !activeWriteBlocks.contains(id) ) error(Free, id + " is not a write block") ; activeWriteBlocks.remove(id) ; if ( activeWriteBlocks.count(id) != 0 ) warn(Free, id + " has "+activeWriteBlocks.count(id)+" outstanding write registrations") ; } blockMgr.free(block) ; }
@Override public Block getWrite(long id) { synchronized (this) { checkUpdate(GetWrite) ; Long x = id ; add(GetWrite, x) ; activeWriteBlocks.add(x) ; } return blockMgr.getWrite(id) ; }
@Override public void write(Block block) { if ( logger.isInfoEnabled() && block.getId() == 2 ) debugPoint(); writeTracker(block) ; blockMgr.write(block) ; }
private void checkUpdate(Action action) { if ( inUpdate == 0 ) error(action, "called outside update") ; }
private void history() { info("History") ; for ( Pair<Action, Long> p : actions ) { if ( p.getRight() != NoId ) log.info(String.format("%s: %-12s %d", label, p.getLeft(), p.getRight())) ; else log.info(String.format("%s: %-12s", label, p.getLeft())) ; } }
public void clearAll() { clearBlockTracking() ; }
@Override public void release(Block block) { synchronized (this) { Long id = block.getId() ; add(Release, id) ; // Iterator blocks are not released. // if ( !activeReadBlocks.contains(id) && !activeWriteBlocks.contains(id) ) // error(Release, id + " is not an active block") ; // May have been promoted. if ( activeWriteBlocks.contains(id) ) activeWriteBlocks.remove(id) ; else activeReadBlocks.remove(block.getId()) ; } blockMgr.release(block) ; }
@Override public void free(Block block) { synchronized (this) { checkUpdate(Free) ; Long id = block.getId() ; add(Free, id) ; if ( activeReadBlocks.contains(id) ) warn(Free, id + " is a read block") ; if ( !activeWriteBlocks.contains(id) ) error(Free, id + " is not a write block") ; activeWriteBlocks.remove(id) ; if ( activeWriteBlocks.count(id) != 0 ) warn(Free, id + " has "+activeWriteBlocks.count(id)+" outstanding write registrations") ; } blockMgr.free(block) ; }
@Override public Block getWrite(long id) { synchronized (this) { checkUpdate(GetWrite) ; Long x = id ; add(GetWrite, x) ; activeWriteBlocks.add(x) ; } return blockMgr.getWrite(id) ; }
@Override public void beginUpdate() { synchronized (this) { if ( inRead > 0 ) error(BeginUpdate, "beginUpdate when already in read") ; if ( inUpdate > 0 ) error(BeginUpdate, "beginUpdate when already in update") ; inUpdate++ ; clearBlockTracking(); } blockMgr.beginUpdate() ; }
@Override public void write(Block block) { if ( logger.isInfoEnabled() && block.getId() == 2 ) debugPoint(); writeTracker(block) ; blockMgr.write(block) ; }