Author: elecharny
Date: Fri Jun 14 21:12:08 2013
New Revision: 1493248
URL: http://svn.apache.org/r1493248
Log:
o Added the lastOffset pointer in the Page
o Store the lastOffset in page referenceHolder
o Added some javadoc
o Improved the way we pdate the free page, leading to a gain of 25% n speed
o Improved the output of some tests to provide more realistic numbers
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/AbstractPage.java
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/BTree.java
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Node.java
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Page.java
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/ReferenceHolder.java
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/InMemoryBTreeTest.java
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/LeafTest.java
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/AbstractPage.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/AbstractPage.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/AbstractPage.java
(original)
+++
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/AbstractPage.java
Fri Jun 14 21:12:08 2013
@@ -47,9 +47,12 @@ import java.lang.reflect.Array;
/** The number of current values in the Page */
protected int nbElems;
- /** The Page offset on disk if the BTree is managed */
+ /** The first {@link PageIO} storing the serialized Page on disk */
private long offset;
+ /** The last {@link PageIO} storing the serialized Page on disk */
+ private long lastOffset;
+
/**
* Creates a default empty AbstractPage
@@ -290,7 +293,7 @@ import java.lang.reflect.Array;
/**
- * @return the offset
+ * {@inheritDoc}
*/
public long getOffset()
{
@@ -308,6 +311,24 @@ import java.lang.reflect.Array;
/**
+ * {@inheritDoc}
+ */
+ public long getLastOffset()
+ {
+ return lastOffset;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ /* No qualifier */void setLastOffset( long lastOffset )
+ {
+ this.lastOffset = lastOffset;
+ }
+
+
+ /**
* @see Object#toString()
*/
public String toString()
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/BTree.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/BTree.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/BTree.java
(original)
+++
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/BTree.java
Fri Jun 14 21:12:08 2013
@@ -1722,7 +1722,7 @@ public class BTree<K, V>
if ( value instanceof Page )
{
return new ReferenceHolder<Page<K, V>, K, V>( this, ( Page<K,
V> ) value,
- ( ( AbstractPage<K, V> ) value ).getOffset() );
+ ( ( Page ) value ).getOffset(), ( ( Page ) value
).getLastOffset() );
}
else if ( isAllowDuplicates() )
{
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Node.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Node.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
--- labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Node.java
(original)
+++ labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Node.java
Fri Jun 14 21:12:08 2013
@@ -1019,9 +1019,11 @@ import org.apache.mavibot.btree.exceptio
page,
revision );
- // Store the offset on disk in the page in memory
+ // Store the offsets on disk in the page in memory
( ( AbstractPage<K, V> ) page ).setOffset( ( (
ReferenceHolder<Page<K, V>, K, V> ) holder )
.getOffset() );
+ ( ( AbstractPage<K, V> ) page ).setLastOffset( ( (
ReferenceHolder<Page<K, V>, K, V> ) holder )
+ .getLastOffset() );
return holder;
}
@@ -1220,13 +1222,13 @@ import org.apache.mavibot.btree.exceptio
public K getRightMostKey() throws EndOfFileExceededException, IOException
{
int index = ( nbElems + 1 ) - 1;
-
- if( children[index] != null )
+
+ if ( children[index] != null )
{
- return children[ index ].getValue( btree ).getRightMostKey();
+ return children[index].getValue( btree ).getRightMostKey();
}
-
- return children[ nbElems - 1 ].getValue( btree ).getRightMostKey();
+
+ return children[nbElems - 1].getValue( btree ).getRightMostKey();
}
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Page.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Page.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
--- labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Page.java
(original)
+++ labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/Page.java
Fri Jun 14 21:12:08 2013
@@ -29,7 +29,9 @@ import org.apache.mavibot.btree.exceptio
/**
* A MVCC Page interface. A Page can be either a Leaf (containing keys and
values) or a Node
- * (containing keys and references to child pages).
+ * (containing keys and references to child pages).<br/>
+ * A Page can be stored on disk. If so, we store the serialized value of this
Page into
+ * one or more {@link PageIO} (they will be linked)
*
* @param <K> The type for the Key
* @param <V> The type for the stored value
@@ -95,7 +97,7 @@ import org.apache.mavibot.btree.exceptio
*/
V get( K key ) throws KeyNotFoundException, IOException;
-
+
/**
* Gets the values associated with the given key, if any. If we don't have
* the key, this method will throw a KeyNotFoundException.<br/>
@@ -108,9 +110,9 @@ import org.apache.mavibot.btree.exceptio
* @throws IOException If we have an error while trying to access the page
* @throws IllegalArgumentException If duplicates are not enabled
*/
- BTree<V,V> getValues( K key ) throws KeyNotFoundException, IOException,
IllegalArgumentException;
+ BTree<V, V> getValues( K key ) throws KeyNotFoundException, IOException,
IllegalArgumentException;
+
-
/**
* Checks if the page contains the given key with the given value.
*
@@ -260,7 +262,13 @@ import org.apache.mavibot.btree.exceptio
/**
- * @return the offset
+ * @return the offset of the first {@link PageIO} which stores the Page on
disk.
*/
long getOffset();
+
+
+ /**
+ * @return the offset of the last {@link PageIO} which stores the Page on
disk.
+ */
+ long getLastOffset();
}
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java
(original)
+++
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java
Fri Jun 14 21:12:08 2013
@@ -630,8 +630,9 @@ public class RecordManager
{
// This is an Offset
long offset = OFFSET_SERIALIZER.deserialize( byteBuffer );
+ long lastOffset = OFFSET_SERIALIZER.deserialize( byteBuffer );
- ElementHolder valueHolder = new ReferenceHolder( btree, null,
offset );
+ ElementHolder valueHolder = new ReferenceHolder( btree, null,
offset, lastOffset );
( ( Node ) page ).setValue( i, valueHolder );
Object key = btree.getKeySerializer().deserialize( byteBuffer
);
@@ -640,8 +641,9 @@ public class RecordManager
// and read the last value, as it's a node
long offset = OFFSET_SERIALIZER.deserialize( byteBuffer );
+ long lastOffset = OFFSET_SERIALIZER.deserialize( byteBuffer );
- ElementHolder valueHolder = new ReferenceHolder( btree, null,
offset );
+ ElementHolder valueHolder = new ReferenceHolder( btree, null,
offset, lastOffset );
( ( Node ) page ).setValue( nodeNbElems, valueHolder );
}
@@ -928,6 +930,7 @@ public class RecordManager
// - the BTree name
// - the keySerializer FQCN
// - the valueSerializer FQCN
+ // - the flags that tell if the dups are allowed
// Starts at 0
long position = 0L;
@@ -1083,7 +1086,14 @@ public class RecordManager
if ( page instanceof Node )
{
Page child = ( ( Node ) page ).getReference( pos );
- buffer = LongSerializer.serialize( ( ( AbstractPage )
child ).getOffset() );
+
+ // The first offset
+ buffer = LongSerializer.serialize( child.getOffset() );
+ serializedData.add( buffer );
+ dataSize += buffer.length;
+
+ // The last offset
+ buffer = LongSerializer.serialize( child.getLastOffset() );
serializedData.add( buffer );
dataSize += buffer.length;
}
@@ -1115,7 +1125,14 @@ public class RecordManager
if ( page instanceof Node )
{
Page child = ( ( Node ) page ).getReference( nbElems );
- buffer = LongSerializer.serialize( ( ( AbstractPage ) child
).getOffset() );
+
+ // The first offset
+ buffer = LongSerializer.serialize( child.getOffset() );
+ serializedData.add( buffer );
+ dataSize += buffer.length;
+
+ // The last offset
+ buffer = LongSerializer.serialize( child.getOffset() );
serializedData.add( buffer );
dataSize += buffer.length;
}
@@ -1166,7 +1183,7 @@ public class RecordManager
HEADER_BUFFER.rewind();
LOG.debug( "Update RM header, FF : {}, LF : {}", firstFreePage,
lastFreePage );
- fileChannel.write( HEADER_BUFFER, 0L );
+ fileChannel.write( HEADER_BUFFER, 0 );
}
@@ -1612,7 +1629,9 @@ public class RecordManager
flushPages( pageIos );
// Build the resulting reference
- ElementHolder valueHolder = new ReferenceHolder( btree, newPage,
pageIos[0].getOffset() );
+ long offset = pageIos[0].getOffset();
+ long lastOffset = pageIos[pageIos.length - 1].getOffset();
+ ElementHolder valueHolder = new ReferenceHolder( btree, newPage,
offset, lastOffset );
return valueHolder;
}
@@ -2004,28 +2023,14 @@ public class RecordManager
for ( Page page : pages )
{
// Retrieve all the PageIO associated with this logical page
- long pageIoOffset = page.getOffset();
- long firstPageIoOffset = page.getOffset();
- long lastPageIoOffset = NO_PAGE;
-
- // Iterate on the pageIOs
- while ( pageIoOffset != NO_PAGE )
- {
- // Keep a track of the current page
- lastPageIoOffset = pageIoOffset;
-
- // Retrieve the first physical page from disk
- PageIO pageIo = fetchPage( pageIoOffset );
-
- // Get the next offset
- pageIoOffset = pageIo.getNextPage();
- }
+ long firstOffset = page.getOffset();
+ long lastOffset = page.getLastOffset();
// Update the pointers
if ( firstFreePage == NO_PAGE )
{
- firstFreePage = firstPageIoOffset;
- lastFreePage = lastPageIoOffset;
+ firstFreePage = firstOffset;
+ lastFreePage = lastOffset;
}
else
{
@@ -2033,7 +2038,7 @@ public class RecordManager
PageIO previousLastFreePage = fetchPage( lastFreePage );
// update its pointer to the next free pageIo
- previousLastFreePage.setNextPage( firstPageIoOffset );
+ previousLastFreePage.setNextPage( firstOffset );
LOG.debug( "Flushing the last free page" );
@@ -2041,12 +2046,12 @@ public class RecordManager
flushPages( previousLastFreePage );
// We can update the lastFreePage offset
- lastFreePage = lastPageIoOffset;
+ lastFreePage = lastOffset;
}
-
- // Last, not least, flush the header
- updateRecordManagerHeader();
}
+
+ // Last, not least, flush the header
+ updateRecordManagerHeader();
}
else
{
Modified:
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/ReferenceHolder.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/ReferenceHolder.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/ReferenceHolder.java
(original)
+++
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/ReferenceHolder.java
Fri Jun 14 21:12:08 2013
@@ -42,9 +42,12 @@ public class ReferenceHolder<E, K, V> im
/** The BTree */
private BTree<K, V> btree;
- /** The offset for a value stored on disk */
+ /** The offset of the first {@link PageIO} storing the page on disk */
private long offset;
+ /** The offset of the last {@link PageIO} storing the page on disk */
+ private long lastOffset;
+
/** The reference to the element instance, or null if it's not present */
private SoftReference<E> reference;
@@ -55,10 +58,11 @@ public class ReferenceHolder<E, K, V> im
* @param offset The offset in disk for this value
* @param element The element to store into a SoftReference
*/
- public ReferenceHolder( BTree<K, V> btree, E element, long offset )
+ public ReferenceHolder( BTree<K, V> btree, E element, long offset, long
lastOffset )
{
this.btree = btree;
this.offset = offset;
+ this.lastOffset = lastOffset;
this.reference = new SoftReference<E>( element );
}
@@ -98,6 +102,9 @@ public class ReferenceHolder<E, K, V> im
}
+ /**
+ * @return The offset of the first {@link PageIO} storing the data on disk
+ */
/* No qualifier */long getOffset()
{
return offset;
@@ -105,6 +112,15 @@ public class ReferenceHolder<E, K, V> im
/**
+ * @return The offset of the last {@link PageIO} storing the data on disk
+ */
+ /* No qualifier */long getLastOffset()
+ {
+ return lastOffset;
+ }
+
+
+ /**
* @see Object#toString()
*/
public String toString()
Modified:
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/InMemoryBTreeTest.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/InMemoryBTreeTest.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/InMemoryBTreeTest.java
(original)
+++
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/InMemoryBTreeTest.java
Fri Jun 14 21:12:08 2013
@@ -238,7 +238,7 @@ public class InMemoryBTreeTest
long l2 = System.currentTimeMillis();
System.out.println( "Delta : " + ( l2 - l1 ) + ", nbError = " + nbError
- + ", Nb insertion per second : " + ( nbTrees * nbElems ) / ( ( l2
- l1 ) / 1000 ) );
+ + ", Nb insertion per second : " + ( nbTrees * nbElems * 1000 ) /
( l2 - l1 ) );
}
@@ -360,7 +360,7 @@ public class InMemoryBTreeTest
long l2 = System.currentTimeMillis();
System.out.println( "Delta : " + ( l2 - l1 ) + ", nbError = " + nbError
- + ", Nb deletion per second : " + ( nbTrees * nbElems ) / ( ( l2 -
l1 ) / 1000 ) );
+ + ", Nb deletion per second : " + ( nbTrees * nbElems * 1000 ) / (
l2 - l1 ) );
}
@@ -1804,7 +1804,7 @@ public class InMemoryBTreeTest
long l2 = System.currentTimeMillis();
System.out.println( "Delta : " + ( l2 - l1 ) + ", nbError = " + nbError
- + ", Nb searches per second : " + ( ( nbElems ) / ( l2 - l1 ) ) *
1000 );
+ + ", Nb searches per second : " + ( ( nbElems * 1000 ) / ( l2 - l1
) ) );
}
@@ -1834,7 +1834,8 @@ public class InMemoryBTreeTest
// expected
}
}
-
+
+
/**
* Test a browse forward and backward
*/
@@ -1873,7 +1874,7 @@ public class InMemoryBTreeTest
assertFalse( cursor.hasNext() );
assertTrue( cursor.hasPrev() );
-
+
// Lets go backward. We should get the same value, as the next() call
have incremented the counter
assertEquals( 12, cursor.prev().getKey().intValue() );
@@ -1889,13 +1890,14 @@ public class InMemoryBTreeTest
// Get 8
assertEquals( 8, cursor.prev().getKey().intValue() );
- assertFalse(cursor.hasPrev());
- assertTrue(cursor.hasNext());
-
+ assertFalse( cursor.hasPrev() );
+ assertTrue( cursor.hasNext() );
+
cursor.close();
btree.close();
}
+
@Test
public void testNextAfterPrev() throws Exception
{
@@ -1908,19 +1910,19 @@ public class InMemoryBTreeTest
BTree<Integer, Integer> btree = new BTree<Integer, Integer>( config );
int i = 7;
- for ( int k=0; k < i; k++ )
+ for ( int k = 0; k < i; k++ )
{
btree.insert( k, k );
}
-
+
// 3 is the last element of the first leaf
- Cursor<Integer, Integer> cursor = btree.browseFrom(4);
+ Cursor<Integer, Integer> cursor = btree.browseFrom( 4 );
assertTrue( cursor.hasNext() );
Tuple<Integer, Integer> tuple = cursor.next();
assertEquals( Integer.valueOf( 4 ), tuple.getKey() );
assertEquals( Integer.valueOf( 4 ), tuple.getValue() );
-
+
assertTrue( cursor.hasPrev() );
tuple = cursor.prev();
assertEquals( Integer.valueOf( 4 ), tuple.getKey() );
@@ -1931,6 +1933,6 @@ public class InMemoryBTreeTest
assertEquals( Integer.valueOf( 4 ), tuple.getKey() );
assertEquals( Integer.valueOf( 4 ), tuple.getValue() );
cursor.close();
- }
-
+ }
+
}
Modified:
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/LeafTest.java
URL:
http://svn.apache.org/viewvc/labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/LeafTest.java?rev=1493248&r1=1493247&r2=1493248&view=diff
==============================================================================
---
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/LeafTest.java
(original)
+++
labs/mavibot/trunk/mavibot/src/test/java/org/apache/mavibot/btree/LeafTest.java
Fri Jun 14 21:12:08 2013
@@ -237,11 +237,11 @@ public class LeafTest
right = insert( right, 13L, "v13" );
parent.children[0] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, left,
- ( ( AbstractPage<Long, String> ) left ).getOffset() );
+ left.getOffset(), left.getLastOffset() );
parent.children[1] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, target,
- ( ( AbstractPage<Long, String> ) target ).getOffset() );
+ target.getOffset(), target.getLastOffset() );
parent.children[2] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, right,
- ( ( AbstractPage<Long, String> ) right ).getOffset() );
+ right.getOffset(), right.getLastOffset() );
// Update the parent
parent.keys[0] = 6L;
@@ -310,11 +310,11 @@ public class LeafTest
right = insert( right, 14L, "v14" );
parent.children[0] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, left,
- ( ( AbstractPage<Long, String> ) left ).getOffset() );
+ left.getOffset(), left.getLastOffset() );
parent.children[1] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, target,
- ( ( AbstractPage<Long, String> ) target ).getOffset() );
+ target.getOffset(), target.getLastOffset() );
parent.children[2] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, right,
- ( ( AbstractPage<Long, String> ) right ).getOffset() );
+ right.getOffset(), right.getLastOffset() );
// Update the parent
parent.keys[0] = 6L;
@@ -383,11 +383,11 @@ public class LeafTest
right = insert( right, 12L, "v12" );
parent.children[0] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, left,
- ( ( AbstractPage<Long, String> ) left ).getOffset() );
+ left.getOffset(), left.getLastOffset() );
parent.children[1] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, target,
- ( ( AbstractPage<Long, String> ) target ).getOffset() );;
+ target.getOffset(), target.getLastOffset() );;
parent.children[2] = new ReferenceHolder<Page<Long, String>, Long,
String>( null, right,
- ( ( AbstractPage<Long, String> ) right ).getOffset() );
+ right.getOffset(), right.getLastOffset() );
// Update the parent
parent.keys[0] = 5L;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]