in mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java [3725:3807]
/* Package protected */<K, V> void freePages( BTree<K, V> btree, long revision, List<Page<K, V>> pages )
throws EndOfFileExceededException, IOException
{
if ( ( pages == null ) || pages.isEmpty() )
{
return;
}
if ( !keepRevisions )
{
// if the B-tree doesn't keep revisions, we can safely move
// the pages to the freed page list.
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Freeing the following pages :" );
for ( Page<K, V> page : pages )
{
LOG.debug( " {}", page );
}
}
for ( Page<K, V> page : pages )
{
long pageOffset = ( ( AbstractPage<K, V> ) page ).getOffset();
PageIO[] pageIos = readPageIOs( pageOffset, Long.MAX_VALUE );
for ( PageIO pageIo : pageIos )
{
freedPages.add( pageIo );
}
}
}
else
{
// We are keeping revisions of standard B-trees, so we move the pages to the CopiedPages B-tree
// but only for non managed B-trees
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Moving the following pages to the CopiedBtree :" );
for ( Page<K, V> page : pages )
{
LOG.debug( " {}", page );
}
}
long[] pageOffsets = new long[pages.size()];
int pos = 0;
for ( Page<K, V> page : pages )
{
pageOffsets[pos++] = ( ( AbstractPage<K, V> ) page ).offset;
}
if ( ( btree.getType() != BTreeTypeEnum.BTREE_OF_BTREES )
&& ( btree.getType() != BTreeTypeEnum.COPIED_PAGES_BTREE ) )
{
// Deal with standard B-trees
RevisionName revisionName = new RevisionName( revision, btree.getName() );
copiedPageBtree.insert( revisionName, pageOffsets );
// Update the RecordManager Copiedpage Offset
currentCopiedPagesBtreeOffset = ( ( PersistedBTree<RevisionName, long[]> ) copiedPageBtree )
.getBtreeOffset();
}
else
{
// Managed B-trees : we simply free the copied pages
for ( long pageOffset : pageOffsets )
{
PageIO[] pageIos = readPageIOs( pageOffset, Long.MAX_VALUE );
for ( PageIO pageIo : pageIos )
{
freedPages.add( pageIo );
}
}
}
}
}