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 2013/10/04 07:45:55 UTC

svn commit: r1529080 - in /directory/mavibot/trunk/mavibot/src: main/java/org/apache/directory/mavibot/btree/managed/ test/java/org/apache/directory/mavibot/btree/managed/

Author: elecharny
Date: Fri Oct  4 05:45:54 2013
New Revision: 1529080

URL: http://svn.apache.org/r1529080
Log:
o Changed the key serialization so that we load KeyHolders instead of Keys

Modified:
    directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/AbstractPage.java
    directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/BTreeFactory.java
    directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/KeyHolder.java
    directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/Leaf.java
    directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/RecordManager.java
    directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/managed/ReadTest.java

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/AbstractPage.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/AbstractPage.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/AbstractPage.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/AbstractPage.java Fri Oct  4 05:45:54 2013
@@ -22,6 +22,7 @@ package org.apache.directory.mavibot.btr
 
 import java.io.IOException;
 import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
 
 
 /**
@@ -288,7 +289,19 @@ import java.lang.reflect.Array;
      */
     /* No qualifier*/void setKey( int pos, K key )
     {
-        keys[pos] = new KeyHolder( key, null, btree.getKeySerializer() );
+        keys[pos] = new KeyHolder<K>( key, null, btree.getKeySerializer() );
+    }
+
+
+    /**
+     * Sets the key at a give position
+     * 
+     * @param pos The position in the keys array
+     * @param key the key to inject
+     */
+    /* No qualifier*/void setKey( int pos, ByteBuffer buffer, K key )
+    {
+        keys[pos] = new KeyHolder<K>( key, buffer, btree.getKeySerializer() );
     }
 
 

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/BTreeFactory.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/BTreeFactory.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/BTreeFactory.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/BTreeFactory.java Fri Oct  4 05:45:54 2013
@@ -21,6 +21,7 @@ package org.apache.directory.mavibot.btr
 
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.LinkedList;
 
 import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
@@ -224,6 +225,17 @@ public class BTreeFactory
 
 
     /**
+     * Set the key at a give position
+     * @param pos The position in the keys array
+     * @param key the key to inject
+     */
+    public static <K, V> void setKey( Page<K, V> page, int pos, ByteBuffer buffer, K key )
+    {
+        ( ( AbstractPage<K, V> ) page ).setKey( pos, buffer, key );
+    }
+
+
+    /**
      * Set the value at a give position
      * @param pos The position in the values array
      * @param value the value to inject

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/KeyHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/KeyHolder.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/KeyHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/KeyHolder.java Fri Oct  4 05:45:54 2013
@@ -99,6 +99,12 @@ public class KeyHolder<K>
     }
 
 
+    /* No qualifier */ByteBuffer getBuffer()
+    {
+        return raw;
+    }
+
+
     /**
      * @see Object#toString()
      */
@@ -108,20 +114,22 @@ public class KeyHolder<K>
 
         sb.append( "KeyHolder[" );
 
-        if ( key == null )
+        if ( key != null )
         {
-            if ( raw.isDirect() )
-            {
-                sb.append( "raw" );
-            }
-            else
-            {
-                Strings.dumpBytes( raw.array() );
-            }
+            sb.append( key );
+            sb.append( ", " );
+        }
+
+        if ( raw.isDirect() )
+        {
+            byte[] bytes = new byte[raw.limit()];
+            raw.get( bytes );
+            raw.rewind();
+            Strings.dumpBytes( bytes );
         }
         else
         {
-            sb.append( key );
+            sb.append( Strings.dumpBytes( raw.array() ) );
         }
 
         sb.append( "]" );

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/Leaf.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/Leaf.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/Leaf.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/Leaf.java Fri Oct  4 05:45:54 2013
@@ -562,6 +562,22 @@ import org.apache.directory.mavibot.btre
     /**
      * {@inheritDoc}
      */
+    /* No qualifier */KeyHolder<K> getKeyHolder( int pos )
+    {
+        if ( pos < nbElems )
+        {
+            return keys[pos];
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public DuplicateKeyVal<V> getValues( K key ) throws KeyNotFoundException, IOException, IllegalArgumentException
     {

Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/RecordManager.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/RecordManager.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/RecordManager.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/managed/RecordManager.java Fri Oct  4 05:45:54 2013
@@ -576,19 +576,28 @@ public class RecordManager
         Page<K, V> page = null;
 
         // Reads the bytes containing all the keys and values, if we have some
+        // We read  big blog of data into  ByteBuffer, then we will process
+        // this ByteBuffer
         ByteBuffer byteBuffer = readBytes( pageIos, position );
 
+        // Now, deserialize the data block
         if ( nbElems >= 0 )
         {
-            // Its a leaf
+            // Its a leaf, create it
             page = BTreeFactory.createLeaf( btree, revision, nbElems );
 
+            // Store the page offset on disk
             ( ( AbstractPage<K, V> ) page ).setOffset( pageIos[0].getOffset() );
             ( ( AbstractPage<K, V> ) page ).setLastOffset( pageIos[pageIos.length - 1].getOffset() );
 
-            // Read each value and key
+            int[] keyLengths = new int[nbElems];
+            int[] valueLengths = new int[nbElems];
+
+            // Read each key and value
             for ( int i = 0; i < nbElems; i++ )
             {
+                //valueLengths[i] = byteBuffer.getInt();
+
                 ElementHolder<V, K, V> valueHolder;
 
                 if ( btree.isAllowDuplicates() )
@@ -622,9 +631,11 @@ public class RecordManager
 
                 BTreeFactory.setValue( ( ( Leaf<K, V> ) page ), i, valueHolder );
 
-                K key = btree.getKeySerializer().deserialize( byteBuffer );
-
-                BTreeFactory.setKey( page, i, key );
+                keyLengths[i] = byteBuffer.getInt();
+                ByteBuffer slice = byteBuffer.slice();
+                slice.limit( keyLengths[i] );
+                byteBuffer.position( byteBuffer.position() + keyLengths[i] );
+                BTreeFactory.setKey( page, i, slice, null );
             }
         }
         else
@@ -1148,7 +1159,9 @@ public class RecordManager
             serializedData.add( buffer );
             serializedSize += buffer.length;
 
-            // Iterate on the keys
+            // Iterate on the keys and values. We first serialize the value, then the key
+            // until we are done with all of them. If w are serializing a page, we have
+            // to serialize one more value
             for ( int pos = 0; pos < nbElems; pos++ )
             {
                 // Start with the value
@@ -1202,9 +1215,30 @@ public class RecordManager
                 }
 
                 // and the key
-                buffer = btree.getKeySerializer().serialize( page.getKey( pos ) );
-                serializedData.add( buffer );
-                dataSize += buffer.length;
+                if ( page instanceof Leaf )
+                {
+                    KeyHolder<K> keyHolder = ( ( Leaf<K, V> ) page ).getKeyHolder( pos );
+                    ByteBuffer keyData = keyHolder.getBuffer();
+
+                    if ( keyData != null )
+                    {
+                        serializedData.add( IntSerializer.serialize( keyData.limit() ) );
+                        serializedData.add( keyData.array() );
+                        dataSize += keyData.limit() + 4;
+                    }
+                    else
+                    {
+                        serializedData.add( IntSerializer.serialize( 4 ) );
+                        serializedData.add( Strings.EMPTY_BYTES );
+                        dataSize += 4;
+                    }
+                }
+                else
+                {
+                    buffer = btree.getKeySerializer().serialize( page.getKey( pos ) );
+                    serializedData.add( buffer );
+                    dataSize += buffer.length;
+                }
             }
 
             // Nodes have one more value to serialize

Modified: directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/managed/ReadTest.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/managed/ReadTest.java?rev=1529080&r1=1529079&r2=1529080&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/managed/ReadTest.java (original)
+++ directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/managed/ReadTest.java Fri Oct  4 05:45:54 2013
@@ -42,6 +42,7 @@ public class ReadTest
     @Rule
     public TemporaryFolder tempFolder = new TemporaryFolder();
 
+
     /**
      * Test the readInt method
      */
@@ -261,33 +262,33 @@ public class ReadTest
         storeMethod.invoke( recordManager, 0L, bytes, pageIos );
 
         // Read the bytes back
-        byte[] readBytes = ( byte[] ) readBytesMethod.invoke( recordManager, pageIos, 0L );
+        ByteBuffer readBytes = ( ByteBuffer ) readBytesMethod.invoke( recordManager, pageIos, 0L );
 
         // The byte length
         int pos = 0;
         assertNotNull( readBytes );
-        assertEquals( 4, readBytes.length );
+        assertEquals( 4, readBytes.limit() );
         // The data
-        assertEquals( 0x01, readBytes[pos++] );
-        assertEquals( 0x23, readBytes[pos++] );
-        assertEquals( 0x45, readBytes[pos++] );
-        assertEquals( 0x67, readBytes[pos++] );
+        assertEquals( 0x01, readBytes.get() );
+        assertEquals( 0x23, readBytes.get() );
+        assertEquals( 0x45, readBytes.get() );
+        assertEquals( 0x67, readBytes.get() );
 
         // Set the bytes at the end of the first page
         storeMethod.invoke( recordManager, 12L, bytes, pageIos );
 
         // Read the bytes back
-        readBytes = ( byte[] ) readBytesMethod.invoke( recordManager, pageIos, 12L );
+        readBytes = ( ByteBuffer ) readBytesMethod.invoke( recordManager, pageIos, 12L );
 
         // The byte length
         pos = 0;
         assertNotNull( readBytes );
-        assertEquals( 4, readBytes.length );
+        assertEquals( 4, readBytes.limit() );
         // The data
-        assertEquals( 0x01, readBytes[pos++] );
-        assertEquals( 0x23, readBytes[pos++] );
-        assertEquals( 0x45, readBytes[pos++] );
-        assertEquals( 0x67, readBytes[pos++] );
+        assertEquals( 0x01, readBytes.get() );
+        assertEquals( 0x23, readBytes.get() );
+        assertEquals( 0x45, readBytes.get() );
+        assertEquals( 0x67, readBytes.get() );
 
         // Set A full page of bytes in the first page 
         bytes = new byte[16];
@@ -300,33 +301,33 @@ public class ReadTest
         storeMethod.invoke( recordManager, 0L, bytes, pageIos );
 
         // Read the bytes back
-        readBytes = ( byte[] ) readBytesMethod.invoke( recordManager, pageIos, 0L );
+        readBytes = ( ByteBuffer ) readBytesMethod.invoke( recordManager, pageIos, 0L );
 
         // The byte length
         pos = 0;
         assertNotNull( readBytes );
-        assertEquals( 16, readBytes.length );
+        assertEquals( 16, readBytes.limit() );
 
         // The data
         for ( int i = 0; i < 16; i++ )
         {
-            assertEquals( i + 1, readBytes[pos++] );
+            assertEquals( i + 1, readBytes.get() );
         }
 
         // Write the bytes over 2 pages
         storeMethod.invoke( recordManager, 15L, bytes, pageIos );
 
         // Read the bytes back
-        readBytes = ( byte[] ) readBytesMethod.invoke( recordManager, pageIos, 15L );
+        readBytes = ( ByteBuffer ) readBytesMethod.invoke( recordManager, pageIos, 15L );
 
         // The byte length
         pos = 0;
         assertNotNull( readBytes );
-        assertEquals( 16, readBytes.length );
+        assertEquals( 16, readBytes.limit() );
         // The data
         for ( int i = 0; i < 16; i++ )
         {
-            assertEquals( i + 1, readBytes[pos++] );
+            assertEquals( i + 1, readBytes.get() );
         }
 
         // Write the bytes over 4 pages
@@ -340,16 +341,16 @@ public class ReadTest
         storeMethod.invoke( recordManager, 2L, bytes, pageIos );
 
         // Read the bytes back
-        readBytes = ( byte[] ) readBytesMethod.invoke( recordManager, pageIos, 2L );
+        readBytes = ( ByteBuffer ) readBytesMethod.invoke( recordManager, pageIos, 2L );
 
         // The byte length
         pos = 0;
         assertNotNull( readBytes );
-        assertEquals( 80, readBytes.length );
+        assertEquals( 80, readBytes.limit() );
         // The data
         for ( int i = 0; i < 80; i++ )
         {
-            assertEquals( i + 1, readBytes[pos++] );
+            assertEquals( i + 1, readBytes.get() );
         }
     }
 }