@Override public void persistBlock(IndexBlock block) throws JasDBStorageException { if(block.isModified()) { blockFactories.get(block.getType()).persistBlock(block); block.getDataBlock().flush(); } }
public IndexBlockEntry(BtreePlusBlockPersister persister, IndexBlock indexBlock) { this.persister = persister; this.indexBlock = indexBlock; this.blockPointer = indexBlock.getPosition(); }
@Override public long memorySize() { return indexBlock.memorySize(); }
private void handleBorrowRight(TreeBlock parentBlock, TreeBlock rightSibbling) throws JasDBStorageException { //we can borrow from right TreeNode rightFirstNode = rightSibbling.getNodes().first(); IndexBlock danglingBlock = persister.loadBlock(rightFirstNode.getLeft()); danglingBlock.setParentPointer(getPosition()); Key newKey = getMax(); rightSibbling.removeNodeInternal(rightFirstNode); TreeNode newNode = new TreeNode(newKey, treeNodes.last().getRight(), danglingBlock.getPosition()); treeNodes.put(newKey, newNode); Key parentKey = getMax(); parentBlock.updateBlockPointer(parentKey, getPosition(), rightSibbling.getPosition()); }
@Override public IndexBlock createBlock(BlockTypes blockType, long parentBlock) throws JasDBStorageException { StatRecord blockCreateTimer = StatisticsMonitor.createRecord("btreeplus:persister:createblock"); lock.lock(); try { IndexBlock block = blockFactories.get(blockType).createBlock(parentBlock, dataBlockFactory.getBlockWithSpace(false)); block.getDataBlock().getHeader().putInt(BLOCK_TYPE_HEADER_INDEX, blockType.getTypeDef()); IndexBlockEntry entry = new IndexBlockEntry(this, block); entry.requestToken(); memoryRegion.putEntry(block.getPosition(), entry); lockManager.registerBlockUsage(block); return block; } finally { lock.unlock(); blockCreateTimer.stop(); } }
public void acquireLock(LockIntent intent, IndexBlock block) { ReadWriteLock lockManager = block.getLockManager(); lockManager.readLock(); boolean shouldWriteLock = intent.requiresWriteLock(persister, block); if(shouldWriteLock) { lockManager.readUnlock(); lockManager.writeLock(); lockEntries.add(new LockEntry(block, LOCK_TYPE.WRITE)); } else { lockEntries.add(new LockEntry(block, LOCK_TYPE.READ)); } } }
protected Key getMax() throws JasDBStorageException { TreeNode node = treeNodes.last(); IndexBlock rightBlock = persister.loadBlock(node.getRight()); if(rightBlock instanceof TreeBlock) { return ((TreeBlock) rightBlock).getMax(); } else { return rightBlock.getLast(); } } }
protected Key getMin() throws JasDBStorageException { TreeNode node = treeNodes.first(); IndexBlock leftBlock = persister.loadBlock(node.getLeft()); if(leftBlock instanceof TreeBlock) { return ((TreeBlock)leftBlock).getMin(); } else { return leftBlock.getFirst(); } }
@Override public LeaveBlock findFirstLeaveBlock(LockIntentType intentType) throws JasDBStorageException { TreeNode firstNode = treeNodes.first(); IndexBlock block = persister.loadBlock(firstNode.getLeft()); persister.getLockManager().acquireLock(intentType, block); return block.findFirstLeaveBlock(intentType); }
@Override public LeaveBlock findLeaveBlock(LockIntentType intent, Key key) throws JasDBStorageException { TreeNode closestNode = treeNodes.getBefore(key); Key nodeKey = closestNode.getKey(); int compare = key.compareTo(nodeKey); long blockPointer; if(compare <= 0) { blockPointer = closestNode.getLeft(); } else { blockPointer = closestNode.getRight(); } IndexBlock block = persister.loadBlock(blockPointer); persister.getLockManager().acquireLock(intent, block); return block.findLeaveBlock(intent, key); }
private void handleBorrowLeft(TreeBlock parentBlock, TreeBlock leftSibbling) throws JasDBStorageException { //we can borrow from left TreeNode node = leftSibbling.getNodes().last(); //this block needs relinking IndexBlock danglingBlock = persister.loadBlock(node.getRight()); danglingBlock.setParentPointer(getPosition()); Key newKey = leftSibbling.getMax(); leftSibbling.removeNodeInternal(node); TreeNode newNode = new TreeNode(newKey, danglingBlock.getPosition(), treeNodes.first().getLeft()); treeNodes.put(newKey, newNode); parentBlock.updateBlockPointer(leftSibbling.getMax(), leftSibbling.getPosition(), getPosition()); }
public void release() { for(LockEntry entry : lockEntries) { ReadWriteLock lockManager = entry.getBlock().getLockManager(); if(entry.getType() == LOCK_TYPE.WRITE) { lockManager.writeUnlock(); } else { lockManager.readUnlock(); } } for(IndexBlock usedBlock : usedBlocks) { persister.releaseBlock(usedBlock); } }
@Override public void releaseBlock(IndexBlock block) { memoryRegion.getEntry(block.getPosition()).releaseToken(); }
public void flushAndCloseBlock(IndexBlock block) throws JasDBStorageException { persistBlock(block); memoryRegion.removeEntry(block.getPosition()); }
protected void insertBlock(Key key, IndexBlock leftChildBlock, IndexBlock rightChildBlock) throws JasDBStorageException { TreeNode node = new TreeNode(key, leftChildBlock.getPosition(), rightChildBlock.getPosition()); treeNodes.put(key, node); modified = true; /* let's relink all the blocks */ TreeNode previousNode = treeNodes.previous(key); TreeNode nextNode = treeNodes.next(key); if(previousNode != null && nextNode != null) { //we are adding in the middle previousNode.setRight(leftChildBlock.getPosition()); nextNode.setLeft(rightChildBlock.getPosition()); } else if(previousNode != null) { //we are adding in the end previousNode.setRight(leftChildBlock.getPosition()); } else { //we must be adding to the beginning nextNode.setLeft(rightChildBlock.getPosition()); } handleBlockOverflow(); }
TreeNode next = treeNodes.next(removeNode.getKey()); if(next != null && removeNode.getLeft() != removedBlock.getPosition()) { if(leftBlock.getPosition() != removedBlock.getPosition()) { targetBlock = leftBlock; } else if(rightBlock.getPosition() != removedBlock.getPosition()) { targetBlock = rightBlock; } else {
protected void removeBlockPointer(Key minBlockValue, IndexBlock removedBlock) throws JasDBStorageException { TreeNode removeNode = treeNodes.getBefore(minBlockValue); // LOG.info("Closest remove node: {} nodes: {}", removeNode, treeNodes.size()); TreeNode next = treeNodes.next(removeNode.getKey()); if(next != null && removeNode.getLeft() != removedBlock.getPosition()) { //we need to relink the next block next.setLeft(removeNode.getLeft()); } treeNodes.remove(removeNode.getKey()); modified = true; handleBlockUnderflow(); }