/** * Main method */ public static void main( String[] args ) throws Exception { if ( args.length == 0 ) { System.out.println( "Usage java MavibotInspector <db-file-path>" ); System.exit( 0 ); } File f = new File( args[0] ); MavibotInspector mi = new MavibotInspector( f ); mi.start(); } }
if ( !checkFilePresence() ) if ( !loadRm() ) char c = readOption(); printNumberOfBTrees(); break; printBTreeNames(); break; inspectBTree(); break; checkFreePages( rm, checkedPages ); break; printFileSize(); break; check( rm ); break; loadRm(); break; readPageAt(); break;
checkOffset( recordManager, firstFreePage ); checkFreePages( recordManager, checkedPages ); checkOffset( recordManager, currentBtreeOfBtreesOffset ); checkOffset( recordManager, currentCopiedPagesBtreeOffset ); checkBtreeOfBtrees( recordManager, checkedPages ); checkBtree( recordManager, currentCopiedPagesBtreeOffset, checkedPages ); dumpCheckedPages( recordManager, checkedPages );
/** * Check a user's B-tree */ private static <K, V> void checkBtree( RecordManager recordManager, long btreeOffset, Map<String, int[]> checkedPages ) throws Exception { // Read the B-tree header PageIO[] btreeHeaderPageIos = recordManager.readPageIOs( btreeOffset, Long.MAX_VALUE ); long dataPos = 0L; // The B-tree current revision long btreeRevision = recordManager.readLong( btreeHeaderPageIos, dataPos ); dataPos += RecordManager.LONG_SIZE; // The nb elems in the tree recordManager.readLong( btreeHeaderPageIos, dataPos ); dataPos += RecordManager.LONG_SIZE; // The B-tree rootPage offset long rootPageOffset = recordManager.readLong( btreeHeaderPageIos, dataPos ); checkOffset( recordManager, rootPageOffset ); dataPos += RecordManager.LONG_SIZE; // The B-tree info offset long btreeInfoOffset = recordManager.readLong( btreeHeaderPageIos, dataPos ); checkOffset( recordManager, btreeInfoOffset ); BtreeInfo<K, V> btreeInfo = checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset, btreeRevision ); // Update the checked pages updateCheckedPages( checkedPages.get( btreeInfo.btreeName ), recordManager.pageSize, btreeHeaderPageIos ); updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, btreeHeaderPageIos ); // And now, process the rootPage checkBtreePage( recordManager, btreeInfo, checkedPages, rootPageOffset ); }
updateCheckedPages( checkedPages.get( RecordManager.BTREE_OF_BTREES_NAME ), recordManager.pageSize, bobHeaderPageIos ); updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, bobHeaderPageIos ); checkOffset( recordManager, rootPageOffset ); checkOffset( recordManager, btreeInfoOffset ); checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset, -1L ); checkBtreeOfBtreesPage( recordManager, checkedPages, rootPageOffset );
updateCheckedPages( checkedPages.get( btreeInfo.btreeName ), recordManager.pageSize, pageIos ); updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, pageIos ); checkBtreeLeaf( recordManager, btreeInfo, checkedPages, nbElems, revision, byteBuffer, pageIos ); long[] children = checkBtreeNode( recordManager, btreeInfo, checkedPages, -nbElems, revision, byteBuffer, pageIos ); checkBtreePage( recordManager, btreeInfo, checkedPages, children[pos] );
updateCheckedPages( checkedPages.get( RecordManager.BTREE_OF_BTREES_NAME ), recordManager.pageSize, pageIos ); updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, pageIos ); checkBtreeOfBtreesLeaf( recordManager, checkedPages, nbElems, revision, byteBuffer, pageIos ); long[] children = checkBtreeOfBtreesNode( recordManager, checkedPages, -nbElems, revision, byteBuffer, pageIos ); checkBtreeOfBtreesPage( recordManager, checkedPages, children[pos] );
checkOffset( recordManager, btreeOffset ); int[] btreePagesArray = createPageArray( recordManager ); checkedPages.put( btreeName, btreePagesArray ); checkBtree( recordManager, btreeOffset, checkedPages );
/** * Store a reference to an old rootPage into the Revision B-tree * * @param btree The B-tree we want to keep an old RootPage for * @param rootPage The old rootPage * @throws IOException If we have an issue while writing on disk */ /* No qualifier */<K, V> void storeRootPage( BTree<K, V> btree, Page<K, V> rootPage ) throws IOException { if ( !isKeepRevisions() ) { return; } if ( btree == copiedPageBtree ) { return; } NameRevision nameRevision = new NameRevision( btree.getName(), rootPage.getRevision() ); ( ( AbstractBTree<NameRevision, Long> ) btreeOfBtrees ).insert( nameRevision, ( ( AbstractPage<K, V> ) rootPage ).getOffset(), 0 ); if ( LOG_CHECK.isDebugEnabled() ) { MavibotInspector.check( this ); } }
checkBtree( recordManager, subBtreeOffset, checkedPages );
/** * Creates a B-tree and automatically adds it to the list of managed btrees * * @param name the name of the B-tree * @param keySerializer key serializer * @param valueSerializer value serializer * @param allowDuplicates flag for allowing duplicate keys * @return a managed B-tree * @throws IOException If we weren't able to update the file on disk * @throws BTreeAlreadyManagedException If the B-tree is already managed */ @SuppressWarnings("all") public <K, V> BTree<K, V> addBTree( String name, ElementSerializer<K> keySerializer, ElementSerializer<V> valueSerializer, boolean allowDuplicates ) throws IOException, BTreeAlreadyManagedException { PersistedBTreeConfiguration config = new PersistedBTreeConfiguration(); config.setName( name ); config.setKeySerializer( keySerializer ); config.setValueSerializer( valueSerializer ); config.setAllowDuplicates( allowDuplicates ); BTree btree = new PersistedBTree( config ); manage( btree ); if ( LOG_CHECK.isDebugEnabled() ) { MavibotInspector.check( this ); } return btree; }
MavibotInspector.check( this );
MavibotInspector.check( this );