You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2014/05/07 13:52:10 UTC
svn commit: r1592983 -
/directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java
Author: elecharny
Date: Wed May 7 11:52:10 2014
New Revision: 1592983
URL: http://svn.apache.org/r1592983
Log:
o We know dump the page used by ever b-tree (and every revision)
o Improved the Info page dump using hex offsets
Modified:
directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java
Modified: directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java
URL: http://svn.apache.org/viewvc/directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java?rev=1592983&r1=1592982&r2=1592983&view=diff
==============================================================================
--- directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java (original)
+++ directory/mavibot/branches/with-txns/mavibot/src/main/java/org/apache/directory/mavibot/btree/MavibotInspector.java Wed May 7 11:52:10 2014
@@ -28,7 +28,9 @@ import java.io.RandomAccessFile;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
+import java.text.MessageFormat;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -54,7 +56,21 @@ public class MavibotInspector
private BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
+ // The name of the two page arrays for the global file and teh free pages
+ private static final String GLOBAL_PAGES_NAME = "__global__";
+ private static final String FREE_PAGES_NAME = "__free-pages__";
+ // The set of page array we already know about
+ private static Set<String> knownPagesArrays = new HashSet<String>();
+
+ static
+ {
+ knownPagesArrays.add( GLOBAL_PAGES_NAME );
+ knownPagesArrays.add( FREE_PAGES_NAME );
+ knownPagesArrays.add( RecordManager.BTREE_OF_BTREES_NAME );
+ knownPagesArrays.add( RecordManager.COPIED_PAGE_BTREE_NAME );
+ }
+
/**
* Create an instance of MavibotInspector
* @param dbFile The file to read
@@ -176,9 +192,9 @@ public class MavibotInspector
return;
}
- System.out.println( "\nBTree offset: " + pb.getBtreeOffset() );
- System.out.println( "BTree _info_ offset: " + pb.getBtreeInfoOffset() );
- System.out.println( "BTree root page offset: " + pb.getRootPageOffset() );
+ 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() );
@@ -261,12 +277,25 @@ public class MavibotInspector
int nbPageBits = ( int ) ( nbPages / 32 );
- // Create an array of pages to be checked
+ // Create an array of pages to be checked for each B-tree, plus
+ // two others for the free pages and the global one
// We use one bit per page. It's 0 when the page
// hasn't been checked, 1 otherwise.
- int[] checkedPages = new int[nbPageBits + 1];
+ Map<String, int[]> checkedPages = new HashMap<String, int[]>(nbBtrees + 4);
+
+ // The global page array
+ checkedPages.put( GLOBAL_PAGES_NAME, new int[nbPageBits + 1] );
+
+ // The freePages array
+ checkedPages.put( FREE_PAGES_NAME, new int[nbPageBits + 1] );
+
+ // The B-tree of B-trees array
+ checkedPages.put( RecordManager.BTREE_OF_BTREES_NAME, new int[nbPageBits + 1] );
+
+ // Last, the Copied Pages B-tree array
+ checkedPages.put( RecordManager.COPIED_PAGE_BTREE_NAME, new int[nbPageBits + 1] );
- // Then the free files
+ // Check the free files
checkFreePages( recordManager, checkedPages );
// The B-trees offsets
@@ -368,13 +397,14 @@ public class MavibotInspector
/**
* Check the Btree of Btrees
*/
- private static <K, V> void checkBtreeOfBtrees( RecordManager recordManager, int[] checkedPages ) throws Exception
+ private static <K, V> void checkBtreeOfBtrees( RecordManager recordManager, Map<String, int[]> checkedPages ) throws Exception
{
// Read the BOB header
PageIO[] bobHeaderPageIos = recordManager.readPageIOs( recordManager.currentBtreeOfBtreesOffset, Long.MAX_VALUE );
// update the checkedPages
- updateCheckedPages( checkedPages, recordManager.pageSize, bobHeaderPageIos );
+ updateCheckedPages( checkedPages.get( RecordManager.BTREE_OF_BTREES_NAME), recordManager.pageSize, bobHeaderPageIos );
+ updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, bobHeaderPageIos );
long dataPos = 0L;
@@ -398,7 +428,7 @@ public class MavibotInspector
checkOffset( recordManager, btreeInfoOffset );
- checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset );
+ checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset, -1L );
// Check the elements in the btree itself
// We will read every single page
@@ -409,18 +439,15 @@ public class MavibotInspector
/**
* Check a user's B-tree
*/
- private static <K, V> void checkBtree( RecordManager recordManager, long btreeOffset, int[] checkedPages ) throws Exception
+ 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 );
- // update the checkedPages
- updateCheckedPages( checkedPages, recordManager.pageSize, btreeHeaderPageIos );
-
long dataPos = 0L;
// The B-tree current revision
- recordManager.readLong( btreeHeaderPageIos, dataPos );
+ long btreeRevision = recordManager.readLong( btreeHeaderPageIos, dataPos );
dataPos += RecordManager.LONG_SIZE;
// The nb elems in the tree
@@ -439,7 +466,11 @@ public class MavibotInspector
checkOffset( recordManager, btreeInfoOffset );
- checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset );
+ String btreeName = checkBtreeInfo( recordManager, checkedPages, btreeInfoOffset, btreeRevision );
+
+ // Update the checked pages
+ updateCheckedPages( checkedPages.get( btreeName ), recordManager.pageSize, btreeHeaderPageIos );
+ updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, btreeHeaderPageIos );
// Check the elements in the btree itself
// We will read every single page
@@ -464,8 +495,8 @@ public class MavibotInspector
/**
* Check a B-tree
- */
- private static <K, V> void checkBtree( RecordManager recordManager, int[] checkedPages, PageIO[] pageIos ) throws Exception
+ *
+ private static <K, V> void checkBtree1( RecordManager recordManager, Map<String, int[]> checkedPages, PageIO[] pageIos ) throws Exception
{
long dataPos = 0L;
@@ -500,14 +531,10 @@ public class MavibotInspector
/**
* Check the Btree info page
*/
- private static <K, V> void checkBtreeInfo( RecordManager recordManager, int[] checkedPages, long btreeInfoOffset ) throws IOException
+ private static <K, V> String checkBtreeInfo( RecordManager recordManager, Map<String, int[]> checkedPages, long btreeInfoOffset, long btreeRevision ) throws IOException
{
PageIO[] btreeInfoPagesIos = recordManager.readPageIOs( btreeInfoOffset, Long.MAX_VALUE );
- // update the checkedPages
- updateCheckedPages( checkedPages, recordManager.pageSize, btreeInfoPagesIos );
-
- //((InMemoryBTree<K, V>)btree).setBtreeInfoOffset( btreeInfoPagesIos[0].getOffset() );
long dataPos = 0L;
// The B-tree page size
@@ -517,7 +544,7 @@ public class MavibotInspector
// The tree name
ByteBuffer btreeNameBytes = recordManager.readBytes( btreeInfoPagesIos, dataPos );
dataPos += RecordManager.INT_SIZE + btreeNameBytes.limit();
- Strings.utf8ToString( btreeNameBytes );
+ String btreeName = Strings.utf8ToString( btreeNameBytes );
// The keySerializer FQCN
ByteBuffer keySerializerBytes = recordManager.readBytes( btreeInfoPagesIos, dataPos );
@@ -531,18 +558,32 @@ public class MavibotInspector
// The B-tree allowDuplicates flag
recordManager.readInt( btreeInfoPagesIos, dataPos );
dataPos += RecordManager.INT_SIZE;
+
+ // update the checkedPages
+
+ if ( btreeRevision != -1L )
+ {
+ btreeName = btreeName + "<" + btreeRevision + ">";
+ }
+
+ int[] checkedPagesArray = checkedPages.get( btreeName );
+ updateCheckedPages( checkedPagesArray, recordManager.pageSize, btreeInfoPagesIos );
+ updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, btreeInfoPagesIos );
+
+ return btreeName;
}
/**
* Check the Btree of Btrees rootPage
*/
- private static <K, V> void checkBtreeOfBtreesPage( RecordManager recordManager, int[] checkedPages, long pageOffset ) throws Exception
+ private static <K, V> void checkBtreeOfBtreesPage( RecordManager recordManager, Map<String, int[]> checkedPages, long pageOffset ) throws Exception
{
PageIO[] pageIos = recordManager.readPageIOs( pageOffset, Long.MAX_VALUE );
// Update the checkedPages array
- updateCheckedPages( checkedPages, recordManager.pageSize, pageIos );
+ updateCheckedPages( checkedPages.get( RecordManager.BTREE_OF_BTREES_NAME), recordManager.pageSize, pageIos );
+ updateCheckedPages( checkedPages.get( GLOBAL_PAGES_NAME ), recordManager.pageSize, pageIos );
// Deserialize the page now
long position = 0L;
@@ -586,7 +627,7 @@ public class MavibotInspector
/**
* Check a Btree of Btrees leaf. It contains <revision, name> -> offset.
*/
- private static <K, V> void checkBtreeOfBtreesLeaf( RecordManager recordManager, int[] checkedPages, int nbElems, long revision, ByteBuffer byteBuffer, PageIO[] pageIos ) throws Exception
+ private static <K, V> void checkBtreeOfBtreesLeaf( RecordManager recordManager, Map<String, int[]> checkedPages, int nbElems, long revision, ByteBuffer byteBuffer, PageIO[] pageIos ) throws Exception
{
// Read each key and value
for ( int i = 0; i < nbElems; i++ )
@@ -650,6 +691,10 @@ public class MavibotInspector
byteBuffer.get( bytes );
String btreeName = Strings.utf8ToString( bytes );
+ // Add the new name in the checkedPage name if it's not already there
+ int[] btreePagesArray = createPageArray( recordManager );
+ checkedPages.put( btreeName + "<" + btreeRevision + ">", btreePagesArray );
+
// Now, we can check the Btree we just found
checkBtree( recordManager, btreeOffset, checkedPages );
@@ -663,10 +708,20 @@ public class MavibotInspector
}
+ private static int[] createPageArray( RecordManager recordManager ) throws IOException
+ {
+ long fileSize = recordManager.fileChannel.size();
+ int pageSize = recordManager.pageSize;
+ long nbPages = ( fileSize - RecordManager.RECORD_MANAGER_HEADER_SIZE ) / pageSize;
+ int nbPageBits = ( int ) ( nbPages / 32 );
+
+ return new int[nbPageBits + 1];
+ }
+
/**
* Check a Btree of Btrees Node
*/
- private static <K, V> long[] checkBtreeOfBtreesNode( RecordManager recordManager, int[] checkedPages, int nbElems, long revision,
+ private static <K, V> long[] checkBtreeOfBtreesNode( RecordManager recordManager, Map<String, int[]> checkedPages, int nbElems, long revision,
ByteBuffer byteBuffer, PageIO[] pageIos ) throws IOException
{
long[] children = new long[nbElems + 1];
@@ -784,7 +839,7 @@ public class MavibotInspector
/**
* Check the free pages
*/
- private static void checkFreePages( RecordManager recordManager, int[] checkedPages )
+ private static void checkFreePages( RecordManager recordManager, Map<String, int[]> checkedPages )
throws IOException
{
if ( recordManager.firstFreePage == RecordManager.NO_PAGE )
@@ -815,7 +870,8 @@ public class MavibotInspector
return;
}
- setCheckedPage( recordManager, checkedPages, currentOffset );
+ setCheckedPage( recordManager, checkedPages.get( GLOBAL_PAGES_NAME ), currentOffset );
+ setCheckedPage( recordManager, checkedPages.get( FREE_PAGES_NAME ), currentOffset );
long newOffset = pageIo.getNextPage();
currentOffset = newOffset;
@@ -853,7 +909,58 @@ public class MavibotInspector
* Output the pages that has been seen ('1') and those which has not been seen ('0'). The '.' represent non-pages
* at the end of the file.
*/
- private static void dumpCheckedPages( RecordManager recordManager, int[] checkedPages ) throws IOException
+ private static void dumpCheckedPages( RecordManager recordManager, Map<String, int[]> checkedPages ) throws IOException
+ {
+ // First dump the global array
+ int[] globalArray = checkedPages.get( GLOBAL_PAGES_NAME );
+ String result = dumpPageArray( recordManager, globalArray );
+
+ String dump = String.format( "%1$-18s : %2$s", GLOBAL_PAGES_NAME, result );
+ System.out.println( dump );
+
+ // The free pages array
+ int[] freePagesArray = checkedPages.get( FREE_PAGES_NAME );
+ result = dumpPageArray( recordManager, freePagesArray );
+
+ dump = String.format( "%1$-18s : %2$s", FREE_PAGES_NAME, result );
+ System.out.println( dump );
+
+ // The B-tree of B-trees pages array
+ int[] btreeOfBtreesArray = checkedPages.get( RecordManager.BTREE_OF_BTREES_NAME );
+ result = dumpPageArray( recordManager, btreeOfBtreesArray );
+
+ dump = String.format( "%1$-18s : %2$s", RecordManager.BTREE_OF_BTREES_NAME, result );
+ System.out.println( dump );
+
+ // The Copied page B-tree pages array
+ int[] copiedPagesArray = checkedPages.get( RecordManager.COPIED_PAGE_BTREE_NAME );
+ result = dumpPageArray( recordManager, copiedPagesArray );
+
+ dump = String.format( "%1$-18s : %2$s", RecordManager.COPIED_PAGE_BTREE_NAME, result );
+ System.out.println( dump );
+
+ // And now, all the other btree arrays
+ for ( String btreeName : checkedPages.keySet() )
+ {
+ // Don't do the array we have already processed
+ if ( knownPagesArrays.contains( btreeName ) )
+ {
+ continue;
+ }
+
+ int[] btreePagesArray = checkedPages.get( btreeName );
+ result = dumpPageArray( recordManager, btreePagesArray );
+
+ dump = String.format( "%1$-18s : %2$s", btreeName, result );
+ System.out.println( dump );
+ }
+ }
+
+
+ /**
+ * Process a page array
+ */
+ private static String dumpPageArray( RecordManager recordManager, int[] checkedPages ) throws IOException
{
StringBuilder sb = new StringBuilder();
int i = -1;
@@ -898,9 +1005,9 @@ public class MavibotInspector
}
}
- System.out.println( sb.toString() );
+ return sb.toString();
}
-
+
/**
* The entry point method
@@ -951,7 +1058,14 @@ public class MavibotInspector
long fileSize = rm.fileChannel.size();
long nbPages = fileSize / rm.pageSize;
int nbPageBits = ( int ) ( nbPages / RecordManager.INT_SIZE );
- int[] checkedPages = new int[nbPageBits + 1];
+
+ Map<String, int[]> checkedPages = new HashMap<String, int[]>(2);
+
+ // The global page array
+ checkedPages.put( GLOBAL_PAGES_NAME, new int[nbPageBits + 1] );
+
+ // The freePages array
+ checkedPages.put( FREE_PAGES_NAME, new int[nbPageBits + 1] );
checkFreePages( rm, checkedPages );
break;