You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2014/08/06 14:02:20 UTC

svn commit: r1616178 - /directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java

Author: kayyagari
Date: Wed Aug  6 12:02:19 2014
New Revision: 1616178

URL: http://svn.apache.org/r1616178
Log:
fixed the free() method, this was not freeing the associated PageIOs

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

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=1616178&r1=1616177&r2=1616178&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 Wed Aug  6 12:02:19 2014
@@ -106,6 +106,9 @@ public class RecordManager extends Abstr
     /**
      * A Map used to hold the pages that were copied in a new version.
      * Those pages can be reclaimed when the associated version is dead.
+     * 
+     * Note: the offsets are of AbstractPageS' while freeing the associated
+     *       PageIOs will be fetched and freed.
      **/
     /* no qualifier */ Map<RevisionName, long[]> copiedPageMap = null;
 
@@ -3585,28 +3588,26 @@ public class RecordManager extends Abstr
     /**
      * Add an array of PageIOs to the list of free PageIOs
      *
-     * @param offsets The offsets of the pages to be freed
+     * @param offsets The offsets of the pages whose associated PageIOs will be fetched and freed.
      * @throws IOException If we weren't capable of updating the file
      */
     public void free( long[] offsets ) throws IOException
     {
-        if( offsets.length == 1 )
-        {
-            PageIO page = fetchPage( offsets[0] );
-            free( page );
-            return;
-        }
-        
-        PageIO[] pageIos = new PageIO[offsets.length];
-        
+        List<PageIO> pageIos = new ArrayList<PageIO>();
+        int pageIndex = 0;
         for( int i=0; i < offsets.length; i++ )
         {
-            PageIO page = fetchPage( offsets[i] );
-            pageIos[i] = page;
-            
-            if( i > 0 )
+            PageIO[] ios = readPageIOs( offsets[i], Long.MAX_VALUE );
+            for( PageIO io : ios )
             {
-                pageIos[i-1].setNextPage( page.getOffset() );
+                pageIos.add( io );
+                
+                if( pageIndex > 0 )
+                {
+                    pageIos.get( pageIndex - 1 ).setNextPage( io.getOffset() );
+                }
+                
+                pageIndex++;
             }
         }
 
@@ -3615,16 +3616,16 @@ public class RecordManager extends Abstr
         // We add the Page's PageIOs before the
         // existing free pages.
         // Link it to the first free page
-        pageIos[pageIos.length - 1].setNextPage( firstFreePage );
+        pageIos.get( pageIndex -1 ).setNextPage( firstFreePage );
 
         LOG.debug( "Flushing the first free page" );
 
         // And flush it to disk
         //FIXME can be flushed last after releasing the lock
-        flushPages( pageIos );
+        flushPages( pageIos.toArray( new PageIO[0] ) );
 
         // We can update the firstFreePage offset
-        firstFreePage = pageIos[0].getOffset();
+        firstFreePage = pageIos.get( 0 ).getOffset();
         
         freePageLock.unlock();
     }