Author: kayyagari
Date: Sun Jun  2 18:09:03 2013
New Revision: 1488756

URL: http://svn.apache.org/r1488756
Log:
o first shot at freepage management
o fixed some managed tree getters

Modified:
    
labs/mavibot/trunk/mavibot/src/main/java/org/apache/mavibot/btree/RecordManager.java

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=1488756&r1=1488755&r2=1488756&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
 Sun Jun  2 18:09:03 2013
@@ -79,7 +79,7 @@ public class RecordManager
      * A Btree used to manage the page that has been copied in a new version.
      * Those pages can be reclaimed when the associated version is dead. 
      **/
-    private BTree<Integer, long[]> copiedPageBTree;
+    private BTree<RevisionName, long[]> copiedPageBTree;
 
     /** A BTree used to store all the valid revisions for all the stored 
BTrees */
     private BTree<RevisionName, Long> revisionBTree;
@@ -272,7 +272,7 @@ public class RecordManager
         endOfFileOffset = fileChannel.size();
 
         // Now, initialize the Copied Page BTree
-        copiedPageBTree = new BTree<Integer, long[]>( COPIED_PAGE_BTREE_NAME, 
new IntSerializer(), new LongArraySerializer() );
+        copiedPageBTree = new BTree<RevisionName, long[]>( 
COPIED_PAGE_BTREE_NAME, new RevisionNameSerializer(), new LongArraySerializer() 
);
 
         // and initialize the Revision BTree
         revisionBTree = new BTree<RevisionName, Long>( REVISION_BTREE_NAME, 
new RevisionNameSerializer(),
@@ -974,7 +974,7 @@ public class RecordManager
 
         lastAddedBTreeOffset = btreeOffset;
 
-        offsetBTree.insert( name, btreeOffset );
+        offsetBTree.insert( name, btreeOffset, 0 );
         
         // Last, not least, update the number of managed BTrees in the header
         updateRecordManagerHeader();
@@ -1904,7 +1904,7 @@ public class RecordManager
      */
     public int getNbManagedTrees()
     {
-        return nbBtree - 2;
+        return nbBtree - 3;
     }
 
 
@@ -1919,6 +1919,7 @@ public class RecordManager
         
         btrees.remove( COPIED_PAGE_BTREE_NAME );
         btrees.remove( REVISION_BTREE_NAME );
+        btrees.remove( OFFSET_BTREE_NAME );
         
         return btrees;
     }
@@ -1935,7 +1936,7 @@ public class RecordManager
     {
         RevisionName revisionName = new RevisionName( rootPage.getRevision(), 
btree.getName() );
 
-        revisionBTree.insert( revisionName, rootPage.getOffset() );
+        revisionBTree.insert( revisionName, rootPage.getOffset(), 0 );
     }
 
 
@@ -2019,6 +2020,129 @@ public class RecordManager
     
     
     /**
+     * 
+     * TODO addFreePages.
+     *
+     * @param btree
+     * @param freePages
+     */
+    public void addFreePages( BTree btree, List<Page> freePages )
+    {
+        if( ( btree == copiedPageBTree ) || ( btree == revisionBTree ) || ( 
btree == offsetBTree ) )
+        {
+            return;
+        }
+        
+        if( ( freePages == null ) || freePages.isEmpty() )
+        {
+            return;
+        }
+        
+        // if the btree doesn't keep revisions just add them to the free page 
list
+        if( !btree.isKeepRevisions() )
+        {
+            PageIO[] pages = new PageIO[freePages.size()];
+            
+            int start = 0;
+            PageIO tailPage = null;
+
+            ByteBuffer data = ByteBuffer.allocateDirect( pageSize );
+
+            if( firstFreePage == NO_PAGE )
+            {
+                tailPage = new PageIO( freePages.get( start ).getOffset() );
+
+                firstFreePage = tailPage.getOffset();
+                start = 1;
+            }
+            else if( lastFreePage != NO_PAGE )
+            {
+                tailPage = new PageIO( lastFreePage );
+            }
+            
+            tailPage.setData( data );
+            tailPage.setNextPage( NO_PAGE );
+            tailPage.setSize( 0 );
+            
+            pages[0] = tailPage;
+            
+            if( freePages.size() > start )
+            {
+                for( ; start < freePages.size(); start++ )
+                {
+                    long nextOffset = freePages.get( start ).getOffset();
+                    tailPage.setNextPage( nextOffset );
+                    
+                    PageIO tmp = new PageIO( nextOffset );
+                    tmp.setData( data );
+                    tmp.setNextPage( NO_PAGE );
+                    tmp.setSize( 0 );
+            
+                    pages[start] = tmp;
+                    
+                    tailPage = tmp;
+                }
+            }
+            
+            lastFreePage = tailPage.getOffset();
+            
+            try
+            {
+                flushPages( pages );
+            }
+            catch( IOException e )
+            {
+                throw new RuntimeException( e );
+            }
+        }
+        else
+        {
+            for( Page p : freePages )
+            {
+                addFreePage( btree, p );
+            }
+        }
+    }
+
+    
+    /**
+     * 
+     * TODO addFreePage.
+     *
+     * @param btree
+     * @param freePage
+     */
+    private void addFreePage( BTree btree, Page freePage )
+    {
+        try
+        {
+            RevisionName revision = new RevisionName( freePage.getRevision(), 
btree.getName() );
+            long[] offsetArray = null;
+            
+            if( copiedPageBTree.hasKey( revision ) )
+            {
+                offsetArray = copiedPageBTree.get( revision );
+                long[] tmp = new long[offsetArray.length + 1];
+                System.arraycopy( offsetArray, 0, tmp, 0, offsetArray.length );
+                offsetArray = tmp;
+            }
+            else
+            {
+                offsetArray = new long[1];
+            }
+            
+            offsetArray[offsetArray.length - 1] = freePage.getOffset();
+            
+            copiedPageBTree.insert( revision, offsetArray, 0 );
+        }
+        catch( Exception e )
+        {
+            throw new RuntimeException( e );
+        }
+    }
+    
+    
+    /**
      * Creates a BTree and automatically adds it to the list of managed btrees
      * 
      * @param name the name of the BTree



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to