public LeaveBlockImpl(BlockPersister persister, DataBlock dataBlock, long parentBlock, boolean modified) { this.leaves = new OrderedBalancedTree<>(); this.leaveProperties = new LeaveBlockProperties(dataBlock, -1, -1, parentBlock); this.leaveProperties.setModified(modified); this.lockManager = new ReadWriteLock(); this.persister = persister; }
@Override public DataBlock getDataBlock() { return leaveProperties.getDataBlock(); }
@Override public long getParentPointer() { return leaveProperties.getParentPointer(); }
@Override public void setParentPointer(long block) { leaveProperties.setParentBlock(block); leaveProperties.setModified(true); }
@Override public LeaveBlock loadBlock(DataBlock dataBlock) throws JasDBStorageException { LOG.debug("Loading block: {}", dataBlock); LeaveBlockImpl leaveBlock = createBlock(-1, dataBlock); LeaveBlockProperties properties = leaveBlock.getProperties(); properties.setModified(false); int amountOfKeys = dataBlock.getHeader().getInt(AMOUNT_KEY_INDEX); long nextBlock = dataBlock.getHeader().getLong(NEXT_LEAVE_INDEX); long previousBlock = dataBlock.getHeader().getLong(PREVIOUS_LEAVE_INDEX); long parent = dataBlock.getHeader().getLong(PARENT_BLOCK_INDEX); int offset = 0; DataBlock currentBlock = dataBlock; for(int i=0; i<amountOfKeys; i++) { KeyLoadResult loadedKeyResult = keyInfo.loadKey(offset, currentBlock); leaveBlock.addKey(loadedKeyResult.getLoadedKey()); currentBlock = loadedKeyResult.getEndBlock(); offset = loadedKeyResult.getNextOffset(); } properties.setNextBlock(nextBlock); properties.setPreviousBlock(previousBlock); properties.setModified(false); properties.setParentBlock(parent); return leaveBlock; }
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); } }
LeaveBlockImpl leftLeave = null; LeaveBlockImpl rightLeave = null; if(leaveProperties.getPreviousBlock() != -1) { leftLeave = (LeaveBlockImpl) persister.loadBlock(leaveProperties.getPreviousBlock()); if(leaveProperties.getNextBlock() != -1) { rightLeave = (LeaveBlockImpl) persister.loadBlock(leaveProperties.getNextBlock()); TreeBlock parentBlock = (TreeBlock) persister.loadBlock(leaveProperties.getParentPointer()); if(leftLeave != null && leftLeave.getParentPointer() == getParentPointer() && leftLeave.size() > persister.getMinKeys()) { log.debug("Borrowing from left 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"); } }
protected void removeKeyInternal(Key key) throws JasDBStorageException { leaves.remove(key); leaveProperties.setModified(true); }
currentBlock.getLockManager().readLock(); try { long nextBlockPointer = currentBlock.getProperties().getNextBlock(); if(nextBlockPointer > 0) { nextBlock = (LeaveBlock) persister.loadBlock(nextBlockPointer);
protected void setNext(long next) { leaveProperties.setNextBlock(next); }
@Override public long getPosition() { return leaveProperties.getPosition(); }
@Override public boolean isModified() { return leaveProperties.isModified(); }
@Override public LeaveBlockProperties getProperties() { return new LeaveBlockProperties(getDataBlock(), -1, -1, -1); }
@Override public void removeKey(Key key) throws JasDBStorageException { leaves.remove(key); leaveProperties.setModified(true); memorySize -= key.size(); handleBlockUnderflow(); }
long nextBlockPointer = currentLeave.getProperties().getNextBlock(); currentLeave = nextBlockPointer != -1 ? (LeaveBlock) persister.loadBlock(nextBlockPointer) : null; if(currentLeave != null) {
public void insertKey(Key key) throws JasDBStorageException { leaves.put(key, key); memorySize += key.size(); leaveProperties.setModified(true); handleBlockOverflow(); }
@Override public void updateKey(Key key) throws JasDBStorageException { Key foundKey = leaves.get(key); foundKey.setKeys(key.getKeys()); leaveProperties.setModified(true); }