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 2015/02/24 14:43:59 UTC

svn commit: r1661949 [3/3] - in /directory/mavibot/trunk/mavibot: img/ src/main/java/org/apache/directory/mavibot/btree/ src/test/java/org/apache/directory/mavibot/btree/

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractBTree.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractBTree.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractBTree.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractBTree.java Tue Feb 24 13:43:59 2015
@@ -1095,11 +1095,6 @@ import org.apache.directory.mavibot.btre
 
                         long t1 = System.currentTimeMillis();
 
-                        if ( nbTxns > 0 )
-                        {
-                            System.out.println( "Processing old txn : " + nbTxns + ", " + ( t1 - t0 ) + "ms" );
-                        }
-
                         // Wait until we reach the timeout
                         Thread.sleep( readTimeOut );
                     }

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java Tue Feb 24 13:43:59 2015
@@ -138,11 +138,6 @@ import org.apache.directory.mavibot.btre
         {
             Page<K, V> page = children[pos].getValue();
 
-            if ( page == null )
-            {
-                System.out.println( "Page is null for pos = " + pos + ", children = " + children[pos] );
-            }
-
             return page.hasKey( key );
         }
     }
@@ -318,6 +313,17 @@ import org.apache.directory.mavibot.btre
     }
 
 
+    /**
+     * Sets the value at a give position
+     * @param pos The position in the values array
+     * @param value the value to inject
+     */
+    /* no qualifier */void setValue( int pos, ValueHolder<V> value )
+    {
+        // Implementation in the leaves
+    }
+
+
     /**
      * {@inheritDoc}
      */

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java Tue Feb 24 13:43:59 2015
@@ -23,6 +23,7 @@ package org.apache.directory.mavibot.btr
 import java.io.IOException;
 import java.lang.reflect.Array;
 import java.util.Comparator;
+import java.util.Iterator;
 
 import org.apache.directory.mavibot.btree.exception.KeyNotFoundException;
 import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
@@ -247,7 +248,8 @@ import org.apache.directory.mavibot.btre
         }
         catch ( KeyNotFoundException knfe )
         {
-            knfe.printStackTrace();return false;
+            knfe.printStackTrace();
+            return false;
         }
     }
 
@@ -275,9 +277,15 @@ import org.apache.directory.mavibot.btre
 
 
     /**
+     * Manage a new Sub-BTree .
+     */
+    protected abstract void manageSubTree();
+
+
+    /**
      * Add the value in an array
      */
-    private void addInArray( V value )
+    private void addInArray( final V value )
     {
         // We have to check that we have reached the threshold or not
         if ( size() >= valueThresholdUp )
@@ -285,27 +293,61 @@ import org.apache.directory.mavibot.btre
             // Ok, transform the array into a btree
             createSubTree();
 
-            try
+            Iterator<Tuple<V, V>> valueIterator = new Iterator<Tuple<V, V>>()
             {
-                for ( V val : valueArray )
+                int pos = 0;
+
+
+                @Override
+                public Tuple<V, V> next()
+                {
+                    // We can now return the found value
+                    if ( pos == valueArray.length )
+                    {
+                        // Special case : deal with the added value
+                        pos++;
+
+                        return new Tuple<V, V>( value, value );
+                    }
+                    else
+                    {
+                        V oldValue = valueArray[pos];
+                        pos++;
+
+                        return new Tuple<V, V>( oldValue, oldValue );
+                    }
+                }
+
+
+                @Override
+                public boolean hasNext()
+                {
+                    // Check that we have at least one element to read
+                    return pos < valueArray.length + 1;
+                }
+
+
+                @Override
+                public void remove()
                 {
-                    // Here, we should insert all the values in one shot then 
-                    // write the btree on disk only once.
-                    valueBtree.insert( val, null );
                 }
 
-                // We can delete the array now
-                nbArrayElems = 0;
-                valueArray = null;
+            };
 
-                // And inject the new value
-                valueBtree.insert( value, null );
+            try
+            {
+                BulkLoader.load( valueBtree, valueIterator, valueArray.length );
             }
             catch ( IOException e )
             {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
+
+            manageSubTree();
+
+            // And make the valueArray to be null now
+            valueArray = null;
         }
         else
         {
@@ -375,24 +417,24 @@ import org.apache.directory.mavibot.btre
             addInBtree( value );
         }
     }
-    
-    
+
+
     /**
      * {@inheritDoc}
      */
     @Override
     public V replaceValueArray( V newValue )
     {
-        if( isSubBtree() )
+        if ( isSubBtree() )
         {
             throw new IllegalStateException( "method is not applicable for the duplicate B-Trees" );
         }
-        
+
         V tmp = valueArray[0];
-        
+
         nbArrayElems = 1;
         valueArray[0] = newValue;
-        
+
         return tmp;
     }
 

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BTreeHeader.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BTreeHeader.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BTreeHeader.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BTreeHeader.java Tue Feb 24 13:43:59 2015
@@ -59,7 +59,7 @@ import java.util.concurrent.atomic.Atomi
     private long rootPageOffset;
 
     /** The position of the B-tree header in the file */
-    private long btreeHeaderOffset;
+    private long btreeHeaderOffset = RecordManager.NO_PAGE;
 
     // Those are data which aren't serialized : they are in memory only */
     /** A Map containing the rootPage for this tree */

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BulkLoader.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BulkLoader.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BulkLoader.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/BulkLoader.java Tue Feb 24 13:43:59 2015
@@ -65,6 +65,27 @@ public class BulkLoader<K, V>
         NODE
     }
 
+    /**
+     * A private class used to store the temporary sorted file. It's used by
+     * the bulkLoader
+     */
+    private static class SortedFile
+    {
+        /** the file that contains the values */
+        private File file;
+
+        /** The number of stored values */
+        private int nbValues;
+
+
+        /** A constructor for this class */
+        /*No Qualifier*/SortedFile( File file, int nbValues )
+        {
+            this.file = file;
+            this.nbValues = nbValues;
+        }
+    }
+
 
     /**
      * Process the data, and creates files to store them sorted if necessary, or store them
@@ -163,7 +184,7 @@ public class BulkLoader<K, V>
      * sorted and merged elements.
      * @throws IOException 
      */
-    private static <K, V> Tuple<Iterator<Tuple<K, Set<V>>>, Integer> processFiles( BTree<K, V> btree,
+    private static <K, V> Tuple<Iterator<Tuple<K, Set<V>>>, SortedFile> processFiles( BTree<K, V> btree,
         Iterator<Tuple<K, Set<V>>> dataIterator ) throws IOException
     {
         File file = File.createTempFile( "sortedUnique", "data" );
@@ -206,9 +227,10 @@ public class BulkLoader<K, V>
 
         FileInputStream fis = new FileInputStream( file );
         Iterator<Tuple<K, Set<V>>> uniqueIterator = createUniqueFileIterator( btree, fis );
+        SortedFile sortedFile = new SortedFile( file, nbReads );
 
-        Tuple<Iterator<Tuple<K, Set<V>>>, Integer> result = new Tuple<Iterator<Tuple<K, Set<V>>>, Integer>(
-            uniqueIterator, nbReads );
+        Tuple<Iterator<Tuple<K, Set<V>>>, SortedFile> result = new Tuple<Iterator<Tuple<K, Set<V>>>, SortedFile>(
+            uniqueIterator, sortedFile );
 
         return result;
     }
@@ -222,7 +244,7 @@ public class BulkLoader<K, V>
      * @param chunkSize The number of elements we may store in memory at each iteration
      * @throws IOException If there is a problem while processing the data
      */
-    public static <K, V> BTree<K, V> load( PersistedBTree<K, V> btree, Iterator<Tuple<K, V>> iterator, int chunkSize )
+    public static <K, V> BTree<K, V> load( BTree<K, V> btree, Iterator<Tuple<K, V>> iterator, int chunkSize )
         throws IOException
     {
         if ( btree == null )
@@ -281,8 +303,9 @@ public class BulkLoader<K, V>
             dataIterator = createIterator( btree, streams );
 
             // Process the files, and construct one single file with an iterator
-            Tuple<Iterator<Tuple<K, Set<V>>>, Integer> result = processFiles( btree, dataIterator );
-            resultBTree = bulkLoad( btree, result.key, result.value );
+            Tuple<Iterator<Tuple<K, Set<V>>>, SortedFile> result = processFiles( btree, dataIterator );
+            resultBTree = bulkLoad( btree, result.key, result.value.nbValues );
+            result.value.file.delete();
         }
 
         // Ok, we have an iterator over sorted elements, we can now load them in the 
@@ -444,14 +467,18 @@ public class BulkLoader<K, V>
     /**
      * Inject a tuple into a leaf
      */
-    private static <K, V> void injectInLeaf( BTree<K, V> btree, Tuple<K, Set<V>> tuple, LevelInfo leafLevel )
+    private static <K, V> void injectInLeaf( BTree<K, V> btree, Tuple<K, Set<V>> tuple, LevelInfo<K, V> leafLevel )
     {
         PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) leafLevel.getCurrentPage();
 
         KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), tuple.getKey() );
-        ValueHolder<V> valueHolder = new PersistedValueHolder<V>( btree, ( V[] ) tuple.getValue().toArray() );
         leaf.setKey( leafLevel.getCurrentPos(), keyHolder );
-        leaf.setValue( leafLevel.getCurrentPos(), valueHolder );
+
+        if ( btree.getType() != BTreeTypeEnum.PERSISTED_SUB )
+        {
+            ValueHolder<V> valueHolder = new PersistedValueHolder<V>( btree, ( V[] ) tuple.getValue().toArray() );
+            leaf.setValue( leafLevel.getCurrentPos(), valueHolder );
+        }
 
         leafLevel.incCurrentPos();
     }
@@ -515,8 +542,8 @@ public class BulkLoader<K, V>
         LevelInfo<K, V> level ) throws IOException
     {
         PersistedNode<K, V> node = ( PersistedNode<K, V> ) level.getCurrentPage();
-        if ( ( level.getCurrentPos() == 0 ) && ( node.getPage( 0 ) == null ) )
 
+        if ( ( level.getCurrentPos() == 0 ) && ( node.getPage( 0 ) == null ) )
         {
             node.setPageHolder( 0, pageHolder );
             level.incNbAddedElems();
@@ -759,8 +786,23 @@ public class BulkLoader<K, V>
     private static <K, V> BTree<K, V> bulkLoadSinglePage( BTree<K, V> btree, Iterator<Tuple<K, Set<V>>> dataIterator,
         int nbElems ) throws IOException
     {
-        // Create a new page
-        PersistedLeaf<K, V> rootPage = ( PersistedLeaf<K, V> ) BTreeFactory.createLeaf( btree, 0L, nbElems );
+        // Use the root page
+        Page<K, V> rootPage = btree.getRootPage();
+
+        // Initialize the root page
+        ( ( AbstractPage<K, V> ) rootPage ).setNbElems( nbElems );
+        KeyHolder<K>[] keys = new KeyHolder[nbElems];
+        ValueHolder<V>[] values = new ValueHolder[nbElems];
+
+        switch ( btree.getType() )
+        {
+            case IN_MEMORY:
+                ( ( InMemoryLeaf<K, V> ) rootPage ).values = values;
+                break;
+
+            default:
+                ( ( PersistedLeaf<K, V> ) rootPage ).values = values;
+        }
 
         // We first have to inject data into the page
         int pos = 0;
@@ -771,18 +813,31 @@ public class BulkLoader<K, V>
 
             // Store the current element in the rootPage
             KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), tuple.getKey() );
-            ValueHolder<V> valueHolder = new PersistedValueHolder<V>( btree, ( V[] ) tuple.getValue().toArray() );
-            rootPage.setKey( pos, keyHolder );
-            rootPage.setValue( pos, valueHolder );
+            keys[pos] = keyHolder;
+
+            switch ( btree.getType() )
+            {
+                case IN_MEMORY:
+                    ValueHolder<V> valueHolder = new InMemoryValueHolder<V>( btree, ( V[] ) tuple.getValue()
+                        .toArray() );
+                    ( ( InMemoryLeaf<K, V> ) rootPage ).values[pos] = valueHolder;
+                    break;
+
+                default:
+                    valueHolder = new PersistedValueHolder<V>( btree, ( V[] ) tuple.getValue()
+                        .toArray() );
+                    ( ( PersistedLeaf<K, V> ) rootPage ).values[pos] = valueHolder;
+            }
+
             pos++;
         }
 
-        // Now write the page on disk
-        ( ( PersistedBTree<K, V> ) btree ).getRecordManager().writePage( btree, rootPage, 0L );
+        // Update the rootPage
+        ( ( AbstractPage<K, V> ) rootPage ).setKeys( keys );
 
-        // Update the btree with the rootPage and the nb of added elements
-        ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader().setRootPage( rootPage );
-        ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader().setNbElems( nbElems );
+        // Update the btree with the nb of added elements, and write it$
+        BTreeHeader<K, V> btreeHeader = ( ( AbstractBTree<K, V> ) btree ).getBtreeHeader();
+        btreeHeader.setNbElems( nbElems );
 
         return btree;
     }
@@ -862,7 +917,8 @@ public class BulkLoader<K, V>
                     }
 
                     // Now inject the page into the node
-                    injectInNode( btree, leafLevel.getCurrentPage(), levels, 1 );
+                    Page<K, V> currentPage = leafLevel.getCurrentPage();
+                    injectInNode( btree, currentPage, levels, 1 );
 
                     // Create a new page for the remaining elements
                     nbToAdd = pageSize / 2;
@@ -880,7 +936,8 @@ public class BulkLoader<K, V>
                     }
 
                     // And update the parent node
-                    injectInNode( btree, leafLevel.getCurrentPage(), levels, 1 );
+                    Page<K, V> levelCurrentPage = leafLevel.getCurrentPage();
+                    injectInNode( btree, levelCurrentPage, levels, 1 );
 
                     // We are done
                     break;
@@ -910,6 +967,10 @@ public class BulkLoader<K, V>
             }
         }
 
+        // Update the btree with the nb of added elements, and write it$
+        BTreeHeader<K, V> btreeHeader = ( ( AbstractBTree<K, V> ) btree ).getBtreeHeader();
+        btreeHeader.setNbElems( nbElems );
+
         return btree;
     }
 

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/InMemoryValueHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/InMemoryValueHolder.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/InMemoryValueHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/InMemoryValueHolder.java Tue Feb 24 13:43:59 2015
@@ -134,6 +134,15 @@ import org.apache.directory.mavibot.btre
 
 
     /**
+     * Manage a new Sub-BTree
+     */
+    protected void manageSubTree()
+    {
+        // Nothing to do
+    }
+
+
+    /**
      * Set the subBtree in the ValueHolder
      */
     /* No qualifier*/void setSubBtree( BTree<V, V> subBtree )

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedBTree.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedBTree.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedBTree.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedBTree.java Tue Feb 24 13:43:59 2015
@@ -67,7 +67,7 @@ public class PersistedBTree<K, V> extend
     /*No qualifier*/static int valueThresholdLow = DEFAULT_VALUE_THRESHOLD_LOW;
 
     /** The BtreeInfo offset */
-    private long btreeInfoOffset;
+    private long btreeInfoOffset = RecordManager.NO_PAGE;
 
     /** The internal recordManager */
     private RecordManager recordManager;

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedKeyHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedKeyHolder.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedKeyHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedKeyHolder.java Tue Feb 24 13:43:59 2015
@@ -121,6 +121,11 @@ import org.apache.directory.mavibot.btre
             sb.append( key );
             sb.append( ", " );
         }
+        else if ( raw != null )
+        {
+            K key = getKey();
+            sb.append( ":" ).append( key ).append( ":," );
+        }
         else
         {
             sb.append( "null," );

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedLeaf.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedLeaf.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedLeaf.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedLeaf.java Tue Feb 24 13:43:59 2015
@@ -1113,11 +1113,6 @@ import org.apache.directory.mavibot.btre
      */
     public K getLeftMostKey()
     {
-        if ( keys.length == 0 )
-        {
-            System.out.println( "" );
-        }
-
         return keys[0].getKey();
     }
 
@@ -1250,7 +1245,18 @@ import org.apache.directory.mavibot.btre
                     sb.append( ", " );
                 }
 
-                sb.append( "<" ).append( keys[i] ).append( "," ).append( values[i] ).append( ">" );
+                sb.append( "<" ).append( keys[i] ).append( "," );
+
+                if ( values != null )
+                {
+                    sb.append( values[i] );
+                }
+                else
+                {
+                    sb.append( "null" );
+                }
+
+                sb.append( ">" );
             }
         }
 
@@ -1422,7 +1428,18 @@ import org.apache.directory.mavibot.btre
                     sb.append( ", " );
                 }
 
-                sb.append( "<" ).append( keys[i] ).append( "," ).append( values[i] ).append( ">" );
+                sb.append( "<" ).append( keys[i] ).append( "," );
+
+                if ( values != null )
+                {
+                    sb.append( values[i] );
+                }
+                else
+                {
+                    sb.append( "null" );
+                }
+
+                sb.append( ">" );
             }
         }
 

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedValueHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedValueHolder.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedValueHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedValueHolder.java Tue Feb 24 13:43:59 2015
@@ -20,16 +20,10 @@
 package org.apache.directory.mavibot.btree;
 
 
-import static org.apache.directory.mavibot.btree.BTreeFactory.createLeaf;
-import static org.apache.directory.mavibot.btree.BTreeFactory.createNode;
-import static org.apache.directory.mavibot.btree.BTreeFactory.setKey;
-
 import java.io.IOException;
 import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Comparator;
-import java.util.List;
+import java.util.Iterator;
 import java.util.UUID;
 
 import org.apache.directory.mavibot.btree.exception.BTreeAlreadyCreatedException;
@@ -139,6 +133,8 @@ import org.slf4j.LoggerFactory;
                 {
                     throw new RuntimeException( e );
                 }
+
+                manageSubTree();
             }
         }
         else
@@ -249,29 +245,33 @@ import org.slf4j.LoggerFactory;
      */
     protected void createSubTree()
     {
-        try
-        {
-            PersistedBTreeConfiguration<V, V> configuration = new PersistedBTreeConfiguration<V, V>();
-            configuration.setAllowDuplicates( false );
-            configuration.setKeySerializer( valueSerializer );
-            configuration.setName( UUID.randomUUID().toString() );
-            configuration.setValueSerializer( valueSerializer );
-            configuration.setParentBTree( parentBtree );
-            configuration.setBtreeType( BTreeTypeEnum.PERSISTED_SUB );
+        PersistedBTreeConfiguration<V, V> configuration = new PersistedBTreeConfiguration<V, V>();
+        configuration.setAllowDuplicates( false );
+        configuration.setKeySerializer( valueSerializer );
+        configuration.setName( UUID.randomUUID().toString() );
+        configuration.setValueSerializer( valueSerializer );
+        configuration.setParentBTree( parentBtree );
+        configuration.setBtreeType( BTreeTypeEnum.PERSISTED_SUB );
 
-            valueBtree = BTreeFactory.createPersistedBTree( configuration );
+        valueBtree = BTreeFactory.createPersistedBTree( configuration );
+        ( ( PersistedBTree<V, V> ) valueBtree ).setRecordManager( parentBtree.getRecordManager() );
+    }
 
-            try
-            {
-                // The sub-btree will not be added into the BOB.
-                parentBtree.getRecordManager().manage( valueBtree, RecordManager.INTERNAL_BTREE );
-                raw = null;
-            }
-            catch ( BTreeAlreadyManagedException e )
-            {
-                // should never happen
-                throw new BTreeAlreadyCreatedException( e );
-            }
+
+    /**
+     * Push the sub-BTree into the RecordManager
+     */
+    protected void manageSubTree()
+    {
+        try
+        {
+            parentBtree.getRecordManager().manageSubBtree( valueBtree );
+            raw = null;
+        }
+        catch ( BTreeAlreadyManagedException e )
+        {
+            // should never happen
+            throw new BTreeAlreadyCreatedException( e );
         }
         catch ( IOException e )
         {
@@ -712,159 +712,42 @@ import org.slf4j.LoggerFactory;
      * @return The created BTree
      * @throws Exception
      */
-    private BTree<V, V> build( PersistedBTree<V, V> btree, V[] dupKeyValues ) throws Exception
+    private BTree<V, V> build( PersistedBTree<V, V> btree, final V[] dupKeyValues ) throws Exception
     {
-        long newRevision = btree.getRevision() + 1;
-        int numKeysInNode = btree.getPageSize();
-        RecordManager rm = btree.getRecordManager();
-        List<Page<V, V>> lstLeaves = new ArrayList<Page<V, V>>();
-        int totalTupleCount = 0;
-        int nbKeyPage = Math.min( dupKeyValues.length, numKeysInNode );
-
-        Page<V, V> newLeaf = BTreeFactory.createLeaf( btree, newRevision, nbKeyPage );
-        lstLeaves.add( newLeaf );
-
-        int leafIndex = 0;
-
-        // Iterate on all the values
-        for ( V v : dupKeyValues )
+        Iterator<Tuple<V, V>> valueIterator = new Iterator<Tuple<V, V>>()
         {
-            // Inject the key in the leaf
-            setKey( btree, newLeaf, leafIndex, v );
+            int pos = 0;
 
-            leafIndex++;
-            totalTupleCount++;
 
-            if ( ( totalTupleCount % numKeysInNode ) == 0 )
+            @Override
+            public Tuple<V, V> next()
             {
-                // The page has been completed, create a new one or 
-                // if it was the last value, we are done
-                if ( totalTupleCount == dupKeyValues.length )
-                {
-                    // We are done with the values, exit
-                    break;
-                }
-                else
-                {
-                    // Create a new leaf
-                    leafIndex = 0;
-                    nbKeyPage = Math.min( dupKeyValues.length - totalTupleCount, numKeysInNode );
+                // We can now return the found value
+                V value = dupKeyValues[pos];
+                pos++;
 
-                    newLeaf = createLeaf( btree, newRevision, nbKeyPage );
-                    lstLeaves.add( newLeaf );
-                }
+                return new Tuple<V, V>( value, value );
             }
 
-            //TODO build the whole tree in chunks rather than processing *all* leaves at first
-        }
-
-        if ( lstLeaves.isEmpty() )
-        {
-            return btree;
-        }
-
-        // make sure either one of the root pages is reclaimed, cause when we call rm.manage()
-        // there is already a root page created
-        Page<V, V> rootPage = attachNodes( lstLeaves, btree, numKeysInNode, rm );
-        rm.writePage( btree, rootPage, rootPage.getRevision() );
-
-        Page<V, V> oldRoot = btree.getRootPage();
-
-        long newRootPageOffset = ( ( AbstractPage<?, V> ) rootPage ).getOffset();
-        LOG.debug( "replacing old offset {} of the BTree {} with {}",
-            btree.getRootPageOffset(), btree.getName(), newRootPageOffset );
 
-        BTreeHeader<V, V> header = btree.getBtreeHeader();
-
-        header.setRootPage( rootPage );
-        header.setRevision( newRevision );
-        header.setNbElems( totalTupleCount );
-
-        long newBtreeHeaderOffset = rm.writeBtreeHeader( btree, header );
-
-        header.setBTreeHeaderOffset( newBtreeHeaderOffset );
-        rm.writeBtreeHeader( btree, header );
-
-        rm.freePages( ( BTree ) btree, btree.getRevision(), ( List ) Arrays.asList( oldRoot ) );
-
-        return btree;
-    }
-
-
-    /**
-     * Attaches the Nodes together
-     * 
-     * @param children the leaves
-     * @param btree the sub-BTree
-     * @param numKeysInNode number of keys per each node
-     * @param rm the RecordManager
-     * @return the new root page of the sub-BTree after attaching all the nodes
-     * @throws IOException
-     */
-    private Page<V, V> attachNodes( List<Page<V, V>> children, BTree btree, int numKeysInNode, RecordManager rm )
-        throws IOException
-    {
-        if ( children.size() == 1 )
-        {
-            return children.get( 0 );
-        }
-
-        List<Page<V, V>> lstNodes = new ArrayList<Page<V, V>>();
-
-        int numChildren = numKeysInNode + 1;
-
-        PersistedNode node = ( PersistedNode ) createNode( btree, btree.getRevision(), numKeysInNode );
-        lstNodes.add( node );
-        int i = 0;
-        int totalNodes = 0;
-
-        for ( Page<?, V> p : children )
-        {
-            if ( i != 0 )
+            @Override
+            public boolean hasNext()
             {
-                setKey( btree, node, i - 1, p.getLeftMostKey() );
+                // Check that we have at least one element to read
+                return pos < dupKeyValues.length;
             }
 
-            node.children[i] = new PersistedPageHolder( btree, p );
 
-            i++;
-            totalNodes++;
-
-            if ( ( totalNodes % numChildren ) == 0 )
+            @Override
+            public void remove()
             {
-                i = 0;
-
-                PageHolder pageHolder = ( PageHolder ) rm.writePage( btree, node, 1 );
-
-                node = ( PersistedNode ) createNode( btree, btree.getRevision(), numKeysInNode );
-                lstNodes.add( node );
             }
-        }
 
-        // remove null keys and values from the last node and resize
-        AbstractPage<?, V> lastNode = ( AbstractPage<?, V> ) lstNodes.get( lstNodes.size() - 1 );
+        };
 
-        for ( int j = 0; j < lastNode.nbElems; j++ )
-        {
-            if ( lastNode.keys[j] == null )
-            {
-                int n = j;
-                lastNode.nbElems = n;
-                KeyHolder<?>[] keys = lastNode.keys;
+        BulkLoader.load( btree, valueIterator, dupKeyValues.length );
 
-                lastNode.keys = ( KeyHolder[] ) Array.newInstance( KeyHolder.class, n );
-                System.arraycopy( keys, 0, lastNode.keys, 0, n );
-
-                break;
-            }
-        }
-
-        if ( lastNode.keys.length == 0 )
-        {
-            lstNodes.remove( lastNode );
-        }
-
-        return attachNodes( lstNodes, btree, numKeysInNode, rm );
+        return btree;
     }
 
 

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java Tue Feb 24 13:43:59 2015
@@ -23,6 +23,7 @@ package org.apache.directory.mavibot.btr
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
+import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
@@ -376,7 +377,7 @@ public class RecordManager extends Abstr
         // Create a new Header
         nbBtree = 0;
         firstFreePage = NO_PAGE;
-        currentBtreeOfBtreesOffset = 0L;
+        currentBtreeOfBtreesOffset = NO_PAGE;
 
         updateRecordManagerHeader();
 
@@ -389,7 +390,7 @@ public class RecordManager extends Abstr
         // Inject these B-trees into the RecordManager. They are internal B-trees.
         try
         {
-            manage( btreeOfBtrees, INTERNAL_BTREE );
+            manageSubBtree( btreeOfBtrees );
 
             currentBtreeOfBtreesOffset = ( ( PersistedBTree<NameRevision, Long> ) btreeOfBtrees ).getBtreeHeader()
                 .getBTreeHeaderOffset();
@@ -1407,18 +1408,81 @@ public class RecordManager extends Abstr
      * Manage a B-tree. The btree will be added and managed by this RecordManager. We will create a
      * new RootPage for this added B-tree, which will contain no data.<br/>
      * This method is threadsafe.
+     * Managing a btree is a matter of storing an reference to the managed B-tree in the B-tree Of B-trees.
+     * We store a tuple of NameRevision (where revision is 0L) and a offset to the B-tree header.
+     * At the same time, we keep a track of the managed B-trees in a Map.
      *
      * @param btree The new B-tree to manage.
-     * @throws BTreeAlreadyManagedException if the B-tree is already managed
+     * @param treeType flag indicating if this is an internal tree
+     *
+     * @throws BTreeAlreadyManagedException If the B-tree is already managed
      * @throws IOException if there was a problem while accessing the file
      */
     public synchronized <K, V> void manage( BTree<K, V> btree ) throws BTreeAlreadyManagedException, IOException
     {
         beginTransaction();
 
-        manage( ( BTree<Object, Object> ) btree, NORMAL_BTREE );
+        try
+        {
+            LOG.debug( "Managing the btree {}", btree.getName() );
+            BTreeFactory.setRecordManager( btree, this );
+
+            String name = btree.getName();
+
+            if ( managedBtrees.containsKey( name ) )
+            {
+                // There is already a B-tree with this name in the recordManager...
+                LOG.error( "There is already a B-tree named '{}' managed by this recordManager", name );
+                rollback();
+                throw new BTreeAlreadyManagedException( name );
+            }
+
+            // Now, write the B-tree informations
+            long btreeInfoOffset = writeBtreeInfo( btree );
+            BTreeHeader<K, V> btreeHeader = ( ( AbstractBTree<K, V> ) btree ).getBtreeHeader();
+            ( ( PersistedBTree<K, V> ) btree ).setBtreeInfoOffset( btreeInfoOffset );
+
+            // Serialize the B-tree root page
+            Page<K, V> rootPage = btreeHeader.getRootPage();
+
+            PageIO[] rootPageIos = serializePage( btree, btreeHeader.getRevision(), rootPage );
+
+            // Get the reference on the first page
+            long rootPageOffset = rootPageIos[0].getOffset();
+
+            // Store the rootPageOffset into the Btree header and into the rootPage
+            btreeHeader.setRootPageOffset( rootPageOffset );
+            ( ( PersistedLeaf<K, V> ) rootPage ).setOffset( rootPageOffset );
+
+            LOG.debug( "Flushing the newly managed '{}' btree rootpage", btree.getName() );
+            flushPages( rootPageIos );
+
+            // And the B-tree header
+            long btreeHeaderOffset = writeBtreeHeader( btree, btreeHeader );
 
-        commit();
+            // Now, if this is a new B-tree, add it to the B-tree of B-trees
+            // Add the btree into the map of managed B-trees
+            managedBtrees.put( name, ( BTree<Object, Object> ) btree );
+
+            // And in the Map of currentBtreeHeaders and newBtreeHeaders
+            currentBTreeHeaders.put( name, btreeHeader );
+            newBTreeHeaders.put( name, btreeHeader );
+
+            // We can safely increment the number of managed B-trees
+            nbBtree++;
+
+            // Create the new NameRevision
+            NameRevision nameRevision = new NameRevision( name, 0L );
+
+            // Inject it into the B-tree of B-tree
+            btreeOfBtrees.insert( nameRevision, btreeHeaderOffset );
+            commit();
+        }
+        catch ( IOException ioe )
+        {
+            rollback();
+            throw ioe;
+        }
     }
 
 
@@ -1433,22 +1497,22 @@ public class RecordManager extends Abstr
      * @throws BTreeAlreadyManagedException If the B-tree is already managed
      * @throws IOException
      */
-    public synchronized <K, V> void manage( BTree<K, V> btree, boolean treeType )
+    public synchronized <K, V> void manageSubBtree( BTree<K, V> btree )
         throws BTreeAlreadyManagedException, IOException
     {
-        LOG.debug( "Managing the btree {} which is an internam tree : {}", btree.getName(), treeType );
+        LOG.debug( "Managing the sub-btree {}", btree.getName() );
         BTreeFactory.setRecordManager( btree, this );
 
         String name = btree.getName();
 
         if ( managedBtrees.containsKey( name ) )
         {
-            // There is already a B-tree with this name in the recordManager...
-            LOG.error( "There is already a B-tree named '{}' managed by this recordManager", name );
+            // There is already a subB-tree with this name in the recordManager...
+            LOG.error( "There is already a sub-B-tree named '{}' managed by this recordManager", name );
             throw new BTreeAlreadyManagedException( name );
         }
 
-        // Now, write the B-tree informations
+        // Now, write the subB-tree informations
         long btreeInfoOffset = writeBtreeInfo( btree );
         BTreeHeader<K, V> btreeHeader = ( ( AbstractBTree<K, V> ) btree ).getBtreeHeader();
         ( ( PersistedBTree<K, V> ) btree ).setBtreeInfoOffset( btreeInfoOffset );
@@ -1463,7 +1527,8 @@ public class RecordManager extends Abstr
 
         // Store the rootPageOffset into the Btree header and into the rootPage
         btreeHeader.setRootPageOffset( rootPageOffset );
-        ( ( PersistedLeaf<K, V> ) rootPage ).setOffset( rootPageOffset );
+
+        ( ( AbstractPage<K, V> ) rootPage ).setOffset( rootPageOffset );
 
         LOG.debug( "Flushing the newly managed '{}' btree rootpage", btree.getName() );
         flushPages( rootPageIos );
@@ -1472,24 +1537,29 @@ public class RecordManager extends Abstr
         long btreeHeaderOffset = writeBtreeHeader( btree, btreeHeader );
 
         // Now, if this is a new B-tree, add it to the B-tree of B-trees
-        if ( treeType != INTERNAL_BTREE )
+        // Add the btree into the map of managed B-trees
+        if ( ( btree.getType() != BTreeTypeEnum.BTREE_OF_BTREES ) && ( btree.getType() != BTreeTypeEnum.PERSISTED_SUB ) )
         {
-            // Add the btree into the map of managed B-trees
             managedBtrees.put( name, ( BTree<Object, Object> ) btree );
+        }
 
-            // And in the Map of currentBtreeHeaders and newBtreeHeaders
-            currentBTreeHeaders.put( name, btreeHeader );
-            newBTreeHeaders.put( name, btreeHeader );
+        // And in the Map of currentBtreeHeaders and newBtreeHeaders
+        currentBTreeHeaders.put( name, btreeHeader );
+        newBTreeHeaders.put( name, btreeHeader );
+
+        // Create the new NameRevision
+        NameRevision nameRevision = new NameRevision( name, 0L );
 
+        // Inject it into the B-tree of B-tree
+        if ( ( btree.getType() != BTreeTypeEnum.BTREE_OF_BTREES ) && ( btree.getType() != BTreeTypeEnum.PERSISTED_SUB ) )
+        {
             // We can safely increment the number of managed B-trees
             nbBtree++;
 
-            // Create the new NameRevision
-            NameRevision nameRevision = new NameRevision( name, 0L );
-
-            // Inject it into the B-tree of B-tree
             btreeOfBtrees.insert( nameRevision, btreeHeaderOffset );
         }
+
+        updateRecordManagerHeader();
     }
 
 
@@ -1692,6 +1762,15 @@ public class RecordManager extends Abstr
         int dataSize = 0;
         int nbValues = valueHolder.size();
 
+        if ( nbValues == 0 )
+        {
+            // No value.
+            byte[] buffer = IntSerializer.serialize( nbValues );
+            serializedData.add( buffer );
+
+            return buffer.length;
+        }
+
         if ( !valueHolder.isSubBtree() )
         {
             // Write the nb elements first
@@ -1716,47 +1795,15 @@ public class RecordManager extends Abstr
         }
         else
         {
-            if ( nbValues == 0 )
-            {
-                // No value.
-                byte[] buffer = IntSerializer.serialize( nbValues );
-                serializedData.add( buffer );
-
-                return buffer.length;
-            }
-
-            if ( valueHolder.isSubBtree() )
-            {
-                // Store the nbVlues as a negative number. We add 1 so that 0 is not confused with an Array value
-                byte[] buffer = IntSerializer.serialize( -( nbValues + 1 ) );
-                serializedData.add( buffer );
-                dataSize += buffer.length;
-
-                // the B-tree offset
-                buffer = LongSerializer.serialize( ( ( PersistedValueHolder<V> ) valueHolder ).getOffset() );
-                serializedData.add( buffer );
-                dataSize += buffer.length;
-            }
-            else
-            {
-                // This is an array, store the nb of values as a positive number
-                byte[] buffer = IntSerializer.serialize( nbValues );
-                serializedData.add( buffer );
-                dataSize += buffer.length;
-
-                // Now store each value
-                byte[] data = ( ( PersistedValueHolder<V> ) valueHolder ).getRaw();
-                buffer = IntSerializer.serialize( data.length );
-                serializedData.add( buffer );
-                dataSize += buffer.length;
-
-                if ( data.length > 0 )
-                {
-                    serializedData.add( data );
-                }
+            // Store the nbVlues as a negative number. We add 1 so that 0 is not confused with an Array value
+            byte[] buffer = IntSerializer.serialize( -( nbValues + 1 ) );
+            serializedData.add( buffer );
+            dataSize += buffer.length;
 
-                dataSize += data.length;
-            }
+            // the B-tree offset
+            buffer = LongSerializer.serialize( ( ( PersistedValueHolder<V> ) valueHolder ).getOffset() );
+            serializedData.add( buffer );
+            dataSize += buffer.length;
         }
 
         return dataSize;
@@ -2926,8 +2973,6 @@ public class RecordManager extends Abstr
      */
     private PageIO fetchNewPage() throws IOException
     {
-        //dumpFreePages( firstFreePage );
-
         if ( firstFreePage == NO_PAGE )
         {
             nbCreatedPages.incrementAndGet();

Modified: directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/BulkLoaderTest.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/BulkLoaderTest.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/BulkLoaderTest.java (original)
+++ directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/BulkLoaderTest.java Tue Feb 24 13:43:59 2015
@@ -150,7 +150,7 @@ public class BulkLoaderTest
     public void testPersistedBulkLoad1000Elements() throws IOException, KeyNotFoundException,
         BTreeAlreadyManagedException
     {
-        for ( int i = 0; i < 1001; i++ )
+        for ( int i = 1000000; i < 1000001; i++ )
         {
             Random random = new Random( System.currentTimeMillis() );
             File file = File.createTempFile( "managedbtreebuilder", ".data" );
@@ -161,6 +161,7 @@ public class BulkLoaderTest
                 RecordManager rm = new RecordManager( file.getAbsolutePath() );
                 PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
                     LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
+                btree.setPageSize( 64 );
 
                 int nbElems = i;
                 int addedElems = 0;
@@ -193,12 +194,8 @@ public class BulkLoaderTest
                     expectedTuple.value.add( value );
                     expected.put( key, expectedTuple );
                     addedElems++;
-
-                    if ( addedElems % 100 == 0 )
-                    {
-                        //System.out.println( "Nb added elements = " + addedElems );
-                    }
                 }
+
                 long t01 = System.currentTimeMillis();
 
                 // System.out.println( "Time to create the " + nbElems + " elements " + ( ( t01 - t00 ) / 1 ) );
@@ -229,10 +226,10 @@ public class BulkLoaderTest
                 };
 
                 long t0 = System.currentTimeMillis();
-                BTree<Long, String> result = BulkLoader.load( btree, tupleIterator, 128 );
+                BTree<Long, String> result = BulkLoader.load( btree, tupleIterator, 1024000 );
                 long t1 = System.currentTimeMillis();
 
-                if ( i % 100 == 0 )
+                if ( ( i % 100 ) == 0 )
                 {
                     System.out.println( "== Btree #" + i + ", Time to bulkoad the " + nbElems + " elements "
                         + ( t1 - t0 ) + "ms" );
@@ -451,10 +448,6 @@ public class BulkLoaderTest
 
             for ( int i = 0; i < 49; i++ )
             {
-                System.out.println( "=======================================" );
-                System.out.println( "== Iteration n#" + i );
-                System.out.println( "=======================================" );
-
                 LevelInfo<Long, String> leafInfo = BulkLoader.computeLevel( btree, i, LevelEnum.LEAF );
 
                 assertEquals( expectedNbPages[i], leafInfo.getNbPages() );
@@ -510,10 +503,6 @@ public class BulkLoaderTest
 
             for ( int i = 2; i < 52; i++ )
             {
-                System.out.println( "=======================================" );
-                System.out.println( "== Iteration n#" + i );
-                System.out.println( "=======================================" );
-
                 LevelInfo<Long, String> nodeInfo = BulkLoader.computeLevel( btree, i, LevelEnum.NODE );
 
                 assertEquals( expectedNbPages[i], nodeInfo.getNbPages() );
@@ -569,10 +558,6 @@ public class BulkLoaderTest
 
             for ( int i = 2599; i <= 2599; i++ )
             {
-                System.out.println( "=======================================" );
-                System.out.println( "== Iteration #" + i );
-                System.out.println( "=======================================" );
-
                 List<LevelInfo<Long, String>> levels = BulkLoader.computeLevels( btree, i );
 
                 for ( LevelInfo<Long, String> level : levels )
@@ -592,7 +577,7 @@ public class BulkLoaderTest
      * Test that we can load 100 BTrees with 0 to 1000 elements, each one of them having multiple values
      * @throws BTreeAlreadyManagedException 
      */
-    @Ignore("The test is failing atm due to the sub-btree construction which is not working correctly when we have too many elements")
+    //@Ignore("The test is failing atm due to the sub-btree construction which is not working correctly when we have too many elements")
     @Test
     public void testPersistedBulkLoad1000ElementsMultipleValues() throws IOException, KeyNotFoundException,
         BTreeAlreadyManagedException
@@ -672,24 +657,11 @@ public class BulkLoaderTest
                 };
 
                 long t0 = System.currentTimeMillis();
-                BTree<Long, String> result = null;
-
-                try
-                {
-                    result = BulkLoader.load( btree, tupleIterator, 128 );
-                }
-                catch ( NullPointerException npe )
-                {
-                    System.out.println( "Error with : " );
-                    for ( int j = 0; j < i; j++ )
-                    {
-                        System.out.println( elems[j] );
-                    }
-                }
+                BTree<Long, String> result = BulkLoader.load( btree, tupleIterator, 128 );
                 long t1 = System.currentTimeMillis();
 
-                System.out.println( "== Btree #" + i + ", Time to bulkoad the " + nbElems + " elements "
-                    + ( t1 - t0 ) + "ms" );
+                //System.out.println( "== Btree #" + i + ", Time to bulkoad the " + nbElems + " elements "
+                //    + ( t1 - t0 ) + "ms" );
 
                 TupleCursor<Long, String> cursor = result.browse();
                 int nbFetched = 0;
@@ -793,19 +765,8 @@ public class BulkLoaderTest
 
             long t0 = System.currentTimeMillis();
             BTree<Long, String> result = null;
-            try
-            {
-                result = BulkLoader.load( btree, tupleIterator, 128 );
-            }
-            catch ( NullPointerException npe )
-            {
-                npe.printStackTrace();
-                System.out.println( "Error with : " );
-                for ( int j = 0; j < 4; j++ )
-                {
-                    System.out.println( elems[j] );
-                }
-            }
+
+            result = BulkLoader.load( btree, tupleIterator, 128 );
             long t1 = System.currentTimeMillis();
 
             System.out.println( "== Btree #" + 4 + ", Time to bulkoad the " + nbElems + " elements "
@@ -819,10 +780,6 @@ public class BulkLoaderTest
             while ( cursor.hasNext() )
             {
                 Tuple<Long, String> elem = cursor.next();
-
-                assertTrue( expected.containsKey( elem.key ) );
-                Tuple<Long, Set<String>> tuple = expected.get( elem.key );
-                assertNotNull( tuple );
                 nbFetched++;
             }
 
@@ -856,7 +813,7 @@ public class BulkLoaderTest
         listTuples.add( new Tuple<Long, String>( 32L, "V8" ) );
         listTuples.add( new Tuple<Long, String>( -21L, "V9" ) );
         listTuples.add( new Tuple<Long, String>( 9L, "V10" ) );
-        //listTuples.add( new Tuple<Long, String>( 0L, "V11" ) );
+        listTuples.add( new Tuple<Long, String>( 0L, "V11" ) );
         listTuples.add( new Tuple<Long, String>( -7L, "V12" ) );
         listTuples.add( new Tuple<Long, String>( -13L, "V13" ) );
         listTuples.add( new Tuple<Long, String>( 23L, "V14" ) );
@@ -1222,6 +1179,7 @@ public class BulkLoaderTest
                     prev = elem;
                     elem = cursor.next();
                     nbFetched++;
+                    System.out.println( elem );
                 }
             }
             catch ( Exception e )
@@ -1234,7 +1192,7 @@ public class BulkLoaderTest
         }
         catch ( Exception e )
         {
-
+            e.printStackTrace();
         }
     }
 }

Modified: directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/InMemoryBTreeTest.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/InMemoryBTreeTest.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/InMemoryBTreeTest.java (original)
+++ directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/InMemoryBTreeTest.java Tue Feb 24 13:43:59 2015
@@ -1193,7 +1193,8 @@ public class InMemoryBTreeTest
      * @param element The removed element
      * @param expected The expected set of elements
      */
-    private void checkRemoval( BTree<Integer, String> btree, int element, Set<Integer> expected ) throws IOException, KeyNotFoundException
+    private void checkRemoval( BTree<Integer, String> btree, int element, Set<Integer> expected ) throws IOException,
+        KeyNotFoundException
     {
         Tuple<Integer, String> removed = btree.delete( element );
         assertEquals( element, removed.getKey().intValue() );
@@ -1983,7 +1984,7 @@ public class InMemoryBTreeTest
         btree.close();
     }
 
-    
+
     /**
      * Test the overwriting of elements
      */
@@ -1999,7 +2000,7 @@ public class InMemoryBTreeTest
         assertTrue( btree.hasKey( 1 ) );
 
         assertEquals( Integer.valueOf( 1 ), btree.get( 1 ) );
-        
+
         btree.insert( 1, 10 );
 
         assertTrue( btree.hasKey( 1 ) );

Modified: directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/PersistedSubBtreeKeyCursorTest.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/PersistedSubBtreeKeyCursorTest.java?rev=1661949&r1=1661948&r2=1661949&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/PersistedSubBtreeKeyCursorTest.java (original)
+++ directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/PersistedSubBtreeKeyCursorTest.java Tue Feb 24 13:43:59 2015
@@ -19,6 +19,7 @@
  */
 package org.apache.directory.mavibot.btree;
 
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -35,6 +36,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
+
 /**
  * Tests for KeyCursor of a persisted sub-Btree.
  *
@@ -71,7 +73,7 @@ public class PersistedSubBtreeKeyCursorT
 
             btree = BTreeFactory.createPersistedBTree( configuration );
 
-            recordManager.manage( btree, RecordManager.INTERNAL_BTREE );
+            recordManager.manage( btree );
         }
         catch ( Exception e )
         {
@@ -91,33 +93,34 @@ public class PersistedSubBtreeKeyCursorT
         {
             FileUtils.deleteDirectory( dataDir );
         }
-        
+
         recordManager.close();
         assertTrue( recordManager.isContextOk() );
     }
 
+
     @Test
     public void testBrowseKeys() throws Exception
     {
-        for( int i=0; i< 10; i++ )
+        for ( int i = 0; i < 10; i++ )
         {
             // only the keys are stored, values are ignored
             btree.insert( i, i );
         }
-        
+
         KeyCursor<Integer> cursor = btree.browseKeys();
-        
-        for( int i=0; i< 10; i++ )
+
+        for ( int i = 0; i < 10; i++ )
         {
             assertTrue( cursor.hasNext() );
             assertEquals( String.valueOf( i ), String.valueOf( cursor.next() ) );
         }
-        
+
         assertFalse( cursor.hasNext() );
 
         cursor.afterLast();
-        
-        for( int i=9; i>= 0; i-- )
+
+        for ( int i = 9; i >= 0; i-- )
         {
             assertTrue( cursor.hasPrev() );
             assertEquals( String.valueOf( i ), String.valueOf( cursor.prev() ) );