in mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java [492:615]
private void loadRecordManager() throws IOException, ClassNotFoundException, IllegalAccessException,
InstantiationException, IllegalArgumentException, SecurityException, NoSuchFieldException, KeyNotFoundException
{
if ( fileChannel.size() != 0 )
{
ByteBuffer recordManagerHeader = ByteBuffer.allocate( RECORD_MANAGER_HEADER_SIZE );
// The file exists, we have to load the data now
fileChannel.read( recordManagerHeader );
recordManagerHeader.rewind();
// read the RecordManager Header :
// +---------------------+
// | PageSize | 4 bytes : The size of a physical page (default to 4096)
// +---------------------+
// | NbTree | 4 bytes : The number of managed B-trees (at least 1)
// +---------------------+
// | FirstFree | 8 bytes : The offset of the first free page
// +---------------------+
// | current BoB offset | 8 bytes : The offset of the current B-tree of B-trees
// +---------------------+
// | previous BoB offset | 8 bytes : The offset of the previous B-tree of B-trees
// +---------------------+
// | current CP offset | 8 bytes : The offset of the current Copied Pages B-tree
// +---------------------+
// | previous CP offset | 8 bytes : The offset of the previous Copied Pages B-tree
// +---------------------+
// The page size
pageSize = recordManagerHeader.getInt();
// The number of managed B-trees
nbBtree = recordManagerHeader.getInt();
// The first and last free page
firstFreePage = recordManagerHeader.getLong();
// Read all the free pages
checkFreePages();
// The current BOB offset
currentBtreeOfBtreesOffset = recordManagerHeader.getLong();
// The previous BOB offset
previousBtreeOfBtreesOffset = recordManagerHeader.getLong();
// The current Copied Pages B-tree offset
currentCopiedPagesBtreeOffset = recordManagerHeader.getLong();
// The previous Copied Pages B-tree offset
previousCopiedPagesBtreeOffset = recordManagerHeader.getLong();
// read the B-tree of B-trees
PageIO[] bobHeaderPageIos = readPageIOs( currentBtreeOfBtreesOffset, Long.MAX_VALUE );
btreeOfBtrees = BTreeFactory.<NameRevision, Long> createPersistedBTree( BTreeTypeEnum.BTREE_OF_BTREES );
loadBtree( bobHeaderPageIos, btreeOfBtrees );
// read the copied page B-tree
PageIO[] copiedPagesPageIos = readPageIOs( currentCopiedPagesBtreeOffset, Long.MAX_VALUE );
copiedPageBtree = BTreeFactory
.<RevisionName, long[]> createPersistedBTree( BTreeTypeEnum.COPIED_PAGES_BTREE );
loadBtree( copiedPagesPageIos, copiedPageBtree );
// Now, read all the B-trees from the btree of btrees
TupleCursor<NameRevision, Long> btreeCursor = btreeOfBtrees.browse();
Map<String, Long> loadedBtrees = new HashMap<String, Long>();
// loop on all the btrees we have, and keep only the latest revision
long currentRevision = -1L;
while ( btreeCursor.hasNext() )
{
Tuple<NameRevision, Long> btreeTuple = btreeCursor.next();
NameRevision nameRevision = btreeTuple.getKey();
long btreeOffset = btreeTuple.getValue();
long revision = nameRevision.getValue();
// Check if we already have processed this B-tree
Long loadedBtreeRevision = loadedBtrees.get( nameRevision.getName() );
if ( loadedBtreeRevision != null )
{
// The btree has already been loaded. The revision is necessarily higher
if ( revision > currentRevision )
{
// We have a newer revision : switch to the new revision (we keep the offset atm)
loadedBtrees.put( nameRevision.getName(), btreeOffset );
currentRevision = revision;
}
}
else
{
// This is a new B-tree
loadedBtrees.put( nameRevision.getName(), btreeOffset );
currentRevision = nameRevision.getRevision();
}
}
// TODO : clean up the old revisions...
// Now, we can load the real btrees using the offsets
for ( String btreeName : loadedBtrees.keySet() )
{
long btreeOffset = loadedBtrees.get( btreeName );
PageIO[] btreePageIos = readPageIOs( btreeOffset, Long.MAX_VALUE );
BTree<?, ?> btree = BTreeFactory.<NameRevision, Long> createPersistedBTree();
//( ( PersistedBTree<NameRevision, Long> ) btree ).setBtreeHeaderOffset( btreeOffset );
loadBtree( btreePageIos, btree );
// Add the btree into the map of managed B-trees
managedBtrees.put( btreeName, ( BTree<Object, Object> ) btree );
}
// We are done ! Let's finish with the last initialization parts
endOfFileOffset = fileChannel.size();
}
}