@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"); } }
LeaveBlockImpl leftLeave = null; LeaveBlockImpl rightLeave = null; if(leaveProperties.getPreviousBlock() != -1) { leftLeave = (LeaveBlockImpl) persister.loadBlock(leaveProperties.getPreviousBlock());
private void handleBlockOverflow() throws JasDBStorageException { if(leaves.size() > persister.getMaxKeys()) { List<Key>[] splittedKeys = leaves.split(); this.leaves.reset(); /* this block keeps representing the right half, the last current block key == max right */ List<Key> rightKeys = splittedKeys[1]; addKeys(rightKeys); List<Key> leftKeys = splittedKeys[0]; long currentPrevious = leaveProperties.getPreviousBlock(); LeaveBlockImpl leftLeaveBlock = (LeaveBlockImpl) persister.createBlock(BlockTypes.LEAVEBLOCK, leaveProperties.getParentPointer()); leftLeaveBlock.setPrevious(currentPrevious); leftLeaveBlock.setNext(getPosition()); leftLeaveBlock.addKeys(leftKeys); this.recalculateMemorySize(); leftLeaveBlock.recalculateMemorySize(); if(currentPrevious != -1) { //we need to relink, there is a previous block present LeaveBlockImpl previousBlock = (LeaveBlockImpl) persister.loadBlock(currentPrevious); previousBlock.setNext(leftLeaveBlock.getPosition()); } leaveProperties.setPreviousBlock(leftLeaveBlock.getPosition()); TreeBlock parentBlock = (TreeBlock) persister.loadBlock(leaveProperties.getParentPointer()); parentBlock.insertBlock(leftLeaveBlock.getLast(), leftLeaveBlock, this); } }