/** * Creates a new persisted B-tree, with no initialization. * * @return a new B-tree instance */ public static <K, V> BTree<K, V> createPersistedBTree() { BTree<K, V> btree = new PersistedBTree<K, V>(); return btree; }
sb.append( "[" ).append( getName() ).append( "]" ); sb.append( "( pageSize:" ).append( getPageSize() ); if ( getBTreeHeader( getName() ).getRootPage() != null ) sb.append( ", nbEntries:" ).append( getBTreeHeader( getName() ).getNbElems() ); sb.append( ", DuplicatesAllowed: " ).append( isAllowDuplicates() ); sb.append( getBTreeHeader( getName() ).getRootPage().dumpPage( "" ) );
private BTreeHeader<K, V> getNewBTreeHeader( String name ) { if ( btreeType == BTreeTypeEnum.PERSISTED_SUB ) { return getBtreeHeader(); } BTreeHeader<K, V> btreeHeader = recordManager.getNewBTreeHeader( getName() ); return btreeHeader; }
/* no qualifier */void setRootPage( Page<K, V> root ) { getBTreeHeader( getName() ).setRootPage( root ); }
/** * Initialize the BTree. * * @throws IOException If we get some exception while initializing the BTree */ public void init( BTree<K, V> parentBTree ) { if ( parentBTree == null ) { // This is not a subBtree, we have to initialize the cache // Create the queue containing the pending read transactions readTransactions = new ConcurrentLinkedQueue<ReadTransaction<K, V>>(); if ( cacheSize < 1 ) { cacheSize = DEFAULT_CACHE_SIZE; } cache = new LRUMap( cacheSize ); } else { this.cache = ( ( PersistedBTree<K, V> ) parentBTree ).getCache(); this.readTransactions = ( ( PersistedBTree<K, V> ) parentBTree ).getReadTransactions(); } // Initialize the txnManager thread //FIXME we should NOT create a new transaction manager thread for each BTree //createTransactionManager(); }
/** * Check a B-tree */ public void inspectBTree() { if ( rm == null ) { System.out.println( "Cannot check BTree(s)" ); return; } System.out.print( "BTree Name: " ); String name = readLine(); PersistedBTree<?, ?> pb = ( PersistedBTree<?, ?> ) rm.getManagedTree( name ); if ( pb == null ) { System.out.println( "No BTree exists with the name '" + name + "'" ); return; } System.out.println( "\nBTree offset: " + String.format( "0x%1$08x", pb.getBtreeOffset() ) ); System.out.println( "BTree _info_ offset: " + String.format( "0x%1$08x", pb.getBtreeInfoOffset() ) ); System.out.println( "BTree root page offset: " + String.format( "0x%1$08x", pb.getRootPageOffset() ) ); System.out.println( "Number of elements present: " + pb.getNbElems() ); System.out.println( "BTree Page size: " + pb.getPageSize() ); System.out.println( "BTree revision: " + pb.getRevision() ); System.out.println( "Key serializer: " + pb.getKeySerializerFQCN() ); System.out.println( "Value serializer: " + pb.getValueSerializerFQCN() ); System.out.println(); }
( ( PersistedBTree<K, V> ) btree ).setBtreeInfoOffset( infoPageIos[0].getOffset() ); dataPos = 0L; ( ( PersistedBTree<K, V> ) btree ).setAllowDuplicates( allowDuplicates != 0 ); dataPos += INT_SIZE; ( ( PersistedBTree<K, V> ) btree ).setRecordManager( this ); ( ( PersistedBTree<K, V> ) btree ).storeRevision( btreeHeader, true ); ( ( PersistedBTree<K, V> ) btree ).init( parentBTree ); currentBTreeHeaders.put( btree.getName(), ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader() ); newBTreeHeaders.put( btree.getName(), ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader() );
BTreeHeader<K, V> btreeHeader = getBTreeHeader( getName() ); writePage( newRootPage, revision ); recordManager.addInBtreeOfBtrees( getName(), revision, newBtreeHeaderOffset ); recordManager.addInCopiedPagesBtree( getName(), revision, result.getCopiedPages() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() ); recordManager.addInCopiedPagesBtree( getName(), revision, result.getCopiedPages() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() );
/** * Create a new holder storing an offset and a SoftReference containing the element. * * @param page The element to store into a SoftReference */ public PersistedPageHolder( BTree<K, V> btree, Page<K, V> page, long offset, long lastOffset ) { // DO NOT keep the reference to Page, it will be fetched from cache when needed super( btree, null ); cache = ( ( PersistedBTree<K, V> ) btree ).getCache(); recordManager = ( ( PersistedBTree<K, V> ) btree ).getRecordManager(); this.offset = offset; this.lastOffset = lastOffset; if ( page != null ) { ( ( AbstractPage<K, V> ) page ).setOffset( offset ); ( ( AbstractPage<K, V> ) page ).setLastOffset( lastOffset ); } cache.put( offset, page ); }
/** * Set the rootPage offset of the B-tree * * @param btree The B-tree to update * @param rootPageOffset The rootPageOffset to set */ /* no qualifier*/static <K, V> void setRootPageOffset( BTree<K, V> btree, long rootPageOffset ) { if ( btree instanceof PersistedBTree ) { ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader().setRootPageOffset( rootPageOffset ); } else { throw new IllegalArgumentException( "The B-tree must be a PersistedBTree" ); } }
/** * @return The sub-btree offset */ /* No qualifier */long getOffset() { if ( valueArray == null ) { return ( ( PersistedBTree<V, V> ) valueBtree ).getBtreeOffset(); } else { return -1L; } }
/** * @return the B-tree info Offset */ public long getBTreeInfoOffset() { return ( ( PersistedBTree<K, V> ) btree ).getBtreeInfoOffset(); }
BTreeHeader<K, V> btreeHeader = getBTreeHeader( getName() ); InsertResult<K, V> result = btreeHeader.getRootPage().insert( key, value, revision ); PageHolder<K, V> holderLeft = writePage( leftPage, revision ); PageHolder<K, V> holderRight = writePage( rightPage, revision ); writePage( newRootPage, revision ); recordManager.addInBtreeOfBtrees( getName(), revision, newBtreeHeaderOffset ); recordManager.addInCopiedPagesBtree( getName(), revision, result.getCopiedPages() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() ); recordManager.addInCopiedPagesBtree( getName(), revision, result.getCopiedPages() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() ); storeRevision( newBtreeHeader, recordManager.isKeepRevisions() );
/** * @param btreeOffset the B-tree header Offset to set */ /* No qualifier*/void setBtreeHeaderOffset( long btreeHeaderOffset ) { getBTreeHeader( getName() ).setBTreeHeaderOffset( btreeHeaderOffset ); }
/** * Create a new holder storing an offset and a SoftReference containing the element. * * @param page The element to store into a SoftReference */ public PersistedPageHolder( BTree<K, V> btree, Page<K, V> page ) { // DO NOT keep the reference to Page, it will be fetched from cache when needed super( btree, null ); cache = ( ( PersistedBTree<K, V> ) btree ).getCache(); recordManager = ( ( PersistedBTree<K, V> ) btree ).getRecordManager(); offset = ( ( AbstractPage<K, V> ) page ).getOffset(); lastOffset = ( ( AbstractPage<K, V> ) page ).getLastOffset(); ( ( AbstractPage<K, V> ) page ).setOffset( offset ); ( ( AbstractPage<K, V> ) page ).setLastOffset( lastOffset ); cache.put( offset, page ); }
/** * {@inheritDoc} */ protected ReadTransaction<K, V> beginReadTransaction( long revision ) { BTreeHeader<K, V> btreeHeader = getBtreeHeader( revision ); if ( btreeHeader != null ) { ReadTransaction<K, V> readTransaction = new ReadTransaction<K, V>( recordManager, btreeHeader, readTransactions ); readTransactions.add( readTransaction ); return readTransaction; } else { return null; } }
currentCopiedPagesBtreeOffset = ( ( PersistedBTree<RevisionName, long[]> ) copiedPageBtree ).getBtreeOffset();
/** * @see Object#toString() */ public String toString() { StringBuilder sb = new StringBuilder(); sb.append( "B-treeHeader " ); sb.append( ", offset[0x" ).append( Long.toHexString( btreeHeaderOffset ) ).append( "]" ); sb.append( ", name[" ).append( btree.getName() ).append( "]" ); sb.append( ", revision[" ).append( revision ).append( "]" ); sb.append( ", btreeInfoOffset[0x" ) .append( Long.toHexString( ( ( PersistedBTree<K, V> ) btree ).getBtreeInfoOffset() ) ).append( "]" ); sb.append( ", rootPageOffset[0x" ).append( Long.toHexString( rootPageOffset ) ).append( "]" ); sb.append( ", nbElems[" ).append( nbElems ).append( "]" ); sb.append( ", nbUsers[" ).append( nbUsers.get() ).append( "]" ); return sb.toString(); } }
/** * @return the rootPageOffset */ /* No qualifier*/long getRootPageOffset() { return getBTreeHeader( getName() ).getRootPageOffset(); }
/** * Creates a new persisted B-tree using the BTreeConfiguration to initialize the * B-tree * * @param configuration The configuration to use * @return a new B-tree instance */ public static <K, V> BTree<K, V> createPersistedBTree( PersistedBTreeConfiguration<K, V> configuration ) { BTree<K, V> btree = new PersistedBTree<K, V>( configuration ); return btree; }