/** * Create a new B-tree header to be used for update operations * @param revision The reclaimed revision */ private BTreeHeader<K, V> createNewBtreeHeader( BTreeHeader<K, V> btreeHeader, long revision ) { BTreeHeader<K, V> newBtreeHeader = new BTreeHeader<K, V>(); newBtreeHeader.setBTreeHeaderOffset( btreeHeader.getBTreeHeaderOffset() ); newBtreeHeader.setRevision( revision ); newBtreeHeader.setNbElems( btreeHeader.getNbElems() ); newBtreeHeader.setRootPage( btreeHeader.getRootPage() ); return newBtreeHeader; }
/** * Copy the current B-tree header and return the copy * @return The copied B-tree header */ /* no qualifier */BTreeHeader<K, V> copy() { BTreeHeader<K, V> copy = clone(); // Clear the fields that should not be copied copy.rootPage = null; copy.rootPageOffset = -1L; copy.btreeHeaderOffset = -1L; copy.nbUsers.set( 0 ); return copy; }
/** * Store the new revision in the map of btrees, increment the current revision */ protected void storeRevision( BTreeHeader<K, V> btreeHeader ) { long revision = btreeHeader.getRevision(); synchronized ( btreeRevisions ) { btreeRevisions.put( revision, btreeHeader ); } currentRevision.set( revision ); currentBtreeHeader = btreeHeader; // And update the newBTreeHeaders map if ( btreeHeader.getBtree().getType() != BTreeTypeEnum.PERSISTED_SUB ) { transactionManager.updateNewBTreeHeaders( btreeHeader ); } }
newBtreeHeader.setBtree( this ); InsertResult<K, V> result = newBtreeHeader.getRootPage().insert( key, value, revision ); newBtreeHeader.setRootPage( modifiedPage ); newBtreeHeader.setRootPage( new InMemoryNode<K, V>( this, revision, pivot, leftPage, rightPage ) ); newBtreeHeader.incrementNbElems(); if ( oldBtreeHeader.getNbUsers() == 0 ) long oldRevision = oldBtreeHeader.getRevision(); if ( oldRevision < newBtreeHeader.getRevision() ) btreeRevisions.remove( oldBtreeHeader.getRevision() );
BTreeHeader<K, V> newBtreeHeader = new BTreeHeader<K, V>(); newBtreeHeader.setBTreeHeaderOffset( 0L ); newBtreeHeader.setRevision( 0L ); newBtreeHeader.setNbElems( 0L ); newBtreeHeader.setRootPage( new InMemoryLeaf<K, V>( this ) ); newBtreeHeader.setRootPageOffset( 0L );
BTreeHeader<K, V> btreeHeader = new BTreeHeader<K, V>(); btreeHeader.setBtree( btree ); btreeHeader.setBTreeHeaderOffset( pageIos[0].getOffset() ); btreeHeader.setRevision( revision ); dataPos += LONG_SIZE; btreeHeader.setNbElems( nbElems ); dataPos += LONG_SIZE; btreeHeader.setRootPageOffset( rootPageOffset ); dataPos += LONG_SIZE;
DeleteResult<K, V> result = btreeHeader.getRootPage().delete( key, value, revision ); BTreeHeader<K, V> newBtreeHeader = btreeHeader.copy(); PageIO[] pageIos = recordManager.readPageIOs( btreeHeader.getBTreeHeaderOffset(), -1L ); newBtreeHeader.decrementNbElems(); newBtreeHeader.setRootPage( newRootPage ); newBtreeHeader.setRevision( revision );
InsertResult<K, V> result = btreeHeader.getRootPage().insert( key, value, revision ); BTreeHeader<K, V> newBtreeHeader = btreeHeader.copy(); PageIO[] pageIos = recordManager.readPageIOs( btreeHeader.getBTreeHeaderOffset(), -1L ); newBtreeHeader.incrementNbElems(); newBtreeHeader.incrementNbElems(); newBtreeHeader.setRootPage( newRootPage ); newBtreeHeader.setRevision( revision );
newBtreeHeader.setBtree( this ); newBtreeHeader.setRootPage( modifiedPage ); tuple = removeResult.getRemovedElement(); newBtreeHeader.decrementNbElems(); if ( oldBtreeHeader.getNbUsers() == 0 ) btreeRevisions.remove( oldBtreeHeader.getRevision() );
position = store( position, btreeHeader.getRevision(), btreeHeaderPageIos ); position = store( position, btreeHeader.getNbElems(), btreeHeaderPageIos ); position = store( position, btreeHeader.getRootPageOffset(), btreeHeaderPageIos ); LOG_PAGES.debug( "Writing BTreeHeader revision {} for {}", btreeHeader.getRevision(), btree.getName() ); StringBuilder sb = new StringBuilder(); sb.append( " Revision : " ).append( btreeHeader.getRevision() ).append( "\n" ); sb.append( " NbElems : " ).append( btreeHeader.getNbElems() ).append( "\n" ); sb.append( " RootPage : 0x" ).append( Long.toHexString( btreeHeader.getRootPageOffset() ) ) .append( "\n" ); sb.append( " Info : 0x" ) .append( Long.toHexString( ( ( PersistedBTree<K, V> ) btree ).getBtreeInfoOffset() ) ).append( "\n" ); LOG_PAGES.debug( "Btree Header[{}]\n{}", btreeHeader.getRevision(), sb.toString() ); btreeHeader.setBTreeHeaderOffset( btreeHeaderOffset );
Page<K, V> rootPage = btreeHeader.getRootPage(); PageIO[] rootPageIos = serializePage( btree, btreeHeader.getRevision(), rootPage ); btreeHeader.setRootPageOffset( rootPageOffset ); ( ( PersistedLeaf<K, V> ) rootPage ).setOffset( rootPageOffset );
BTreeHeader<K, V> btreeHeader = new BTreeHeader<K, V>(); btreeHeader.setRootPage( new InMemoryLeaf<K, V>( this ) ); btreeHeader.setBtree( this ); storeRevision( btreeHeader );
sb.append( "( pageSize:" ).append( getPageSize() ); if ( getBTreeHeader( getName() ).getRootPage() != null ) sb.append( ", nbEntries:" ).append( getBTreeHeader( getName() ).getNbElems() ); sb.append( getBTreeHeader( getName() ).getRootPage().dumpPage( "" ) );
/** * @return the btreeOffset */ /* No qualifier*/long getBtreeOffset() { return getBTreeHeader( getName() ).getBTreeHeaderOffset(); }
/** * Creates a new transaction instance * * @param btreeHeader The BtreeHeader we will use for this read transaction */ public ReadTransaction( BTreeHeader<K, V> btreeHeader, ConcurrentLinkedQueue<ReadTransaction<K, V>> readTransactions ) { if ( btreeHeader != null ) { this.revision = btreeHeader.getRevision(); this.creationDate = System.currentTimeMillis(); this.btreeHeader = btreeHeader; closed = false; } this.readTransactions = readTransactions; }
/** * Get the current rootPage * * @return The rootPage */ public Page<K, V> getRootPage() { return getBtreeHeader().getRootPage(); }
/** * {@inheritDoc} */ public void updateNewBTreeHeaders( BTreeHeader btreeHeader ) { newBTreeHeaders.put( btreeHeader.getBtree().getName(), btreeHeader ); }
bb.putLong( getBtreeHeader().getNbElems() );
Page<K, V> rootPage = btreeHeader.getRootPage(); PageIO[] rootPageIos = serializePage( btree, btreeHeader.getRevision(), rootPage ); btreeHeader.setRootPageOffset( rootPageOffset );
BTreeHeader<K, V> btreeHeader = new BTreeHeader<K, V>(); btreeHeader.setRootPage( rootPage ); btreeHeader.setBtree( this );