@Override public LeaveBlockProperties getProperties() { return new LeaveBlockProperties(getDataBlock(), -1, -1, -1); }
@Override public long getParentPointer() { return getPosition(); }
@Override public boolean requiresWriteLock(BlockPersister persister, IndexBlock block) { if(block instanceof RootBlock) { return ((RootBlock)block).isLeave(); } else { return block instanceof LeaveBlock; } } }
@Override protected void removeBlockPointer(Key minBlockValue, IndexBlock removedBlock) throws JasDBStorageException { modified = true; if(size() > 1) { TreeNode removeNode = treeNodes.getBefore(minBlockValue); LOG.debug("Removing from root: {}", removeNode); LeaveBlockImpl leaveBlock = (LeaveBlockImpl) targetBlock; isLeave = true; RootBlockFactory.writeHeader(getDataBlock(), true); for(Key key : leaveBlock.getValues()) { addKey(key); addNodes(treeBlock.getNodes().values(), null, getPosition());
@Override public void insertKey(Key key) throws JasDBStorageException { if(isLeave) { addKey(key); modified = true; if(treeNodes.size() > persister.getMaxKeys()) { List<TreeNode>[] leaveValues = treeNodes.split(); List<TreeNode> leftLeaves = leaveValues[0]; List<TreeNode> rightLeaves = leaveValues[1]; treeNodes.reset(); LeaveBlockImpl leftLeaveBlock = (LeaveBlockImpl) persister.createBlock(BlockTypes.LEAVEBLOCK, getPosition()); LeaveBlockImpl rightLeaveBlock = (LeaveBlockImpl) persister.createBlock(BlockTypes.LEAVEBLOCK, getPosition()); leftLeaveBlock.setNext(rightLeaveBlock.getPosition()); rightLeaveBlock.setPrevious(leftLeaveBlock.getPosition()); addKeys(leftLeaves, leftLeaveBlock); addKeys(rightLeaves, rightLeaveBlock); Key promoteKey = leftLeaves.get(leftLeaves.size() - 1).getKey(); TreeNode rootNode = new TreeNode(promoteKey, leftLeaveBlock.getPosition(), rightLeaveBlock.getPosition()); treeNodes.put(promoteKey, rootNode); isLeave = false; RootBlockFactory.writeHeader(getDataBlock(), false); } } else { throw new JasDBStorageException("Unable to store key, root is not a leave"); } }
rootBlock.getLockManager().readLock(); try { nextBlock = rootBlock.findFirstLeaveBlock(LockIntentType.READ); } finally { rootBlock.getLockManager().readUnlock();
currentLeave = rootBlock.findLeaveBlock(LockIntentType.READ, rangeCondition.getStart()); } else { currentLeave = rootBlock.findFirstLeaveBlock(LockIntentType.READ);
@Override public IndexSearchResultIteratorCollection search(SearchCondition condition, SearchLimit limit) throws JasDBStorageException { EqualsCondition equalsCondition = validateCondition(keyInfo, condition); Key desiredKey = equalsCondition.getKey(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.READ, rootBlock); try { LeaveBlock leaveBlock = rootBlock.findLeaveBlock(LockIntentType.READ, equalsCondition.getKey()); return doLeaveSearch(leaveBlock, desiredKey); } finally { lockManager.releaseLockChain(); } }
@Override public RootBlock createBlock(long parentBlock, DataBlock dataBlock) throws JasDBStorageException { RootBlock rootBlock = new RootBlock(persister, dataBlock, true); if(dataBlock.getHeader().marker() == 0) { writeHeader(dataBlock, true); } return rootBlock; } }
@Override public void removeFromIndex(Key key) throws JasDBStorageException { openIndex(); resourceLockManager.sharedLock(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.LEAVELOCK_OPTIMISTIC, rootBlock); try { LeaveBlock leaveBlock = rootBlock.findLeaveBlock(LockIntentType.LEAVELOCK_OPTIMISTIC, key); if(leaveBlock.size() == persister.getMinKeys()) { lockManager.releaseLockChain(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.WRITE_EXCLUSIVE, rootBlock); leaveBlock = rootBlock.findLeaveBlock(LockIntentType.WRITE_EXCLUSIVE, key); doLeaveBlockRemove(leaveBlock, key); } else { doLeaveBlockRemove(leaveBlock, key); } } finally { lockManager.releaseLockChain(); resourceLockManager.sharedUnlock(); } }
@Override public void insertIntoIndex(Key key) throws JasDBStorageException { openIndex(); StatRecord btreeInsertRecord = StatisticsMonitor.createRecord("btree:insert"); resourceLockManager.sharedLock(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.LEAVELOCK_OPTIMISTIC, rootBlock); try { LeaveBlock leaveBlock = rootBlock.findLeaveBlock(LockIntentType.LEAVELOCK_OPTIMISTIC, key); if(leaveBlock.size() == persister.getMaxKeys()) { lockManager.releaseLockChain(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.WRITE_EXCLUSIVE, rootBlock); leaveBlock = rootBlock.findLeaveBlock(LockIntentType.WRITE_EXCLUSIVE, key); doLeaveBlockInsert(leaveBlock, key); } else { //no overflow, we can just write into the leave doLeaveBlockInsert(leaveBlock, key); } } finally { lockManager.releaseLockChain(); resourceLockManager.sharedUnlock(); btreeInsertRecord.stop(); } }
@Override public boolean requiresWriteLock(BlockPersister persister, IndexBlock block) { if(block instanceof RootBlock) { return ((RootBlock)block).isLeave(); } else { return block instanceof LeaveBlock; } } }
private boolean isRootLeave(RootBlock rootBlock) throws JasDBStorageException { int isLeave = rootBlock.getDataBlock().getHeader().getInt(ISLEAVE_INDEX); return isLeave > 0; }
@Override public void updateKey(Key oldKey, Key newKey) throws JasDBStorageException { openIndex(); StatRecord updateIndex = StatisticsMonitor.createRecord("btree:update"); resourceLockManager.sharedLock(); lockManager.startLockChain(); lockManager.acquireLock(LockIntentType.UPDATE, rootBlock); try { LeaveBlock leaveBlock = rootBlock.findLeaveBlock(LockIntentType.UPDATE, oldKey); doLeaveBlockUpdate(leaveBlock, newKey); } finally { lockManager.releaseLockChain(); resourceLockManager.sharedUnlock(); updateIndex.stop(); } }
@Override public void persistBlock(TreeBlock treeBlock) throws JasDBStorageException { writeHeader(treeBlock.getDataBlock(), ((RootBlock)treeBlock).isLeave()); super.persistBlock(treeBlock); }