private void mergeLeaves(TreeBlock parentBlock, LeaveBlockImpl leftLeave, LeaveBlockImpl rightLeave) throws JasDBStorageException { //lets remove the block and update the admin above Key removeKey; if(leftLeave != null && leftLeave.getParentPointer() == getParentPointer()) { removeKey = getFirst(); log.debug("Doing merge into left leave with remove key: {}", removeKey); leftLeave.addKeys(leaves.values()); leftLeave.recalculateMemorySize(); } else if(rightLeave != null && rightLeave.getParentPointer() == getParentPointer()) { removeKey = getLast(); log.debug("Doing merge into right leave with remove key: {}", removeKey); rightLeave.addKeys(leaves.values()); rightLeave.recalculateMemorySize(); } else { throw new JasDBStorageException("Invalid index state there should always be a sibbling leave block"); } if(leftLeave != null) { leftLeave.setNext(rightLeave != null ? rightLeave.getPosition() : -1); } if(rightLeave != null) { rightLeave.setPrevious(leftLeave != null ? leftLeave.getPosition() : -1); } leaves.reset(); persister.markDeleted(this); parentBlock.removeBlockPointer(removeKey, this); }
if(leftLeave != null && leftLeave.getParentPointer() == getParentPointer() && leftLeave.size() > persister.getMinKeys()) { log.debug("Borrowing from left leave"); } else if(rightLeave != null && rightLeave.getParentPointer() == getParentPointer() && rightLeave.size() > persister.getMinKeys()) { log.debug("Borrowing from right leave");
@Override public void persistBlock(LeaveBlock block) throws JasDBStorageException { if(block instanceof LeaveBlockImpl && block.isModified()) { LOG.debug("Persisting block at position: {}", block.getPosition()); LeaveBlockImpl leaveBlock = (LeaveBlockImpl) block; List<Key> writeKeys = leaveBlock.getValues(); int nrKeys = writeKeys.size(); DataBlock dataBlock = block.getDataBlock(); dataBlock.reset(); dataBlock.getHeader().putLong(PREVIOUS_LEAVE_INDEX, leaveBlock.getProperties().getPreviousBlock()); dataBlock.getHeader().putLong(NEXT_LEAVE_INDEX, leaveBlock.getProperties().getNextBlock()); dataBlock.getHeader().putLong(PARENT_BLOCK_INDEX, leaveBlock.getParentPointer()); dataBlock.getHeader().putInt(AMOUNT_KEY_INDEX, nrKeys); LOG.debug("Writing amount of keys: {}", nrKeys); for(Key key : writeKeys) { dataBlock = keyInfo.writeKey(key, dataBlock); } } else if(block.isModified()) { throw new JasDBStorageException("Unable to store block, unexpected type"); } }