org.apache.derby.impl.store.raw.data
Class AllocExtent

java.lang.Object
  extended byorg.apache.derby.impl.store.raw.data.AllocExtent
All Implemented Interfaces:
java.io.Externalizable, java.io.Serializable

public class AllocExtent
extends java.lang.Object
implements java.io.Externalizable

An allocation extent row manages the page status of page in the extent. AllocExtent is externalizable and is written to the AllocPage directly, without being converted to a row first.

See Also:
AllocPage, Serialized Form
Format IDnone, format implied by AllocPage's format
Purposemanage page status of page in extent
Upgrade
Disk LayoutextentOffset(long) the begin physical byte offset of the first page of this extent extentStart(long) the first logical page mananged by this extent. extentEnd(long) the last page this extent can ever hope to manage extentLength(int) the number of pages allocated in this extent extentStatus(int) status bits for the whole extent. HAS_DEALLOCATED - most likely, this extent has a deallocated page somewhere If !HAD_DEALLOCATED, the extent has no deallocated page HAS_FREE - most likely, this extent has a free page somewhere If !HAS_FREE, there is no free page in the extent ALL_FREE - most likely, this extent only has free pages, good candidate for shrinking the file. If !ALL_FREE, the extent is not all free HAS_UNFILLED_PAGES - most likely, this extent has unfilled pages. if !HAS_UNFILLED_PAGES, all pages are filled KEEP_UNFILLED_PAGES - this extent keeps track of unfilled pages (post v1.3). If not set, this extent has no notion of unfilled page and has no unFilledPage bitmap. NO_DEALLOC_PAGE_MAP - this extents do not have a dealloc and a free page bit maps. Prior to 2.0, there are 2 bit maps, a deallocate page bit map and a free page bit map. Cloudscape 2.0 and later merged the dealloc page bit map into the free page bit map. RETIRED - this extent contains only 'retired' pages, never use any page from this extent. The pages don't actually exist, i.e., it maps to nothing (physicalOffset is garbage). The purpose of this extent is to blot out a range of logical page numbers that no longer exists for this container. Use this to reuse a physical page when a logical page has exhausted all recordId or for logical pages that has been shrunk out. preAllocLength(int) the number of pages that have been preallocated reserved1(int) reserved2(long) reserved for future use reserved3(long) reserved for future use FreePages(bit) bitmap of free pages Bit[i] is ON iff page i is free for immediate (re)use. [ on disk version before 2.0 deAllocPages(bit) bitmap of deallocated pages Bit[i] is ON iff page i has been deallocated. ] unFilledPages(bit) bitmap of pages that has free space Bit[i] is ON if page i is likely to be < 1/2 full org.apache.derby.iapi.services.io.FormatableBitSet is used to store the bit map. FormatableBitSet is an externalizable class.

Field Summary
private static int ALL_FREE
           
protected static int ALLOCATED_PAGE
          public Per Page status
protected static int DEALLOCATED_PAGE
           
private  long extentEnd
           
private  int extentLength
           
private  long extentOffset
           
private  long extentStart
           
(package private)  int extentStatus
           
protected static int FREE_PAGE
           
(package private)  FormatableBitSet freePages
           
private static int HAS_DEALLOCATED
           
private static int HAS_FREE
           
private static int HAS_UNFILLED_PAGES
           
private static int KEEP_UNFILLED_PAGES
           
private static int NO_DEALLOC_PAGE_MAP
           
private  int preAllocLength
           
private  int reserved1
           
private  long reserved2
           
private  long reserved3
           
private static int RETIRED
           
(package private)  FormatableBitSet unFilledPages
           
 
Constructor Summary
  AllocExtent()
           
protected AllocExtent(AllocExtent original)
           
protected AllocExtent(long offset, long start, int length, int pagesize, int maxlength)
           
 
Method Summary
protected  void allocPage(long pagenum)
          Allocate this page - this is called underneath the log record
protected  boolean canAddFreePage(long lastAllocatedPage)
           
private  void checkInRange(long pagenum)
           
protected  int compress(BaseContainerHandle owner, RawTransaction ntt, AllocPage alloc_page)
          Compress free pages at end of this extent.
protected  void compressPages(int new_highest_page, int num_pages_truncated)
           
protected  void deallocPage(long pagenum)
          Deallocate logical page pagenum - this is called underneath the log record.
protected  int getAllocatedPageCount()
          Get the number of used page in this extent
protected  long getExtentEnd()
           
protected  long getFirstPagenum()
          Get the first logical page number managed by this extent.
protected  long getFreePageNumber(long pnum)
          Get a page number that is free
protected  long getLastPagenum()
          Get the last logical page number managed by this extent.
protected  long getLastPreallocPagenum()
          get the last preallocated pagenumber managed by this alloc page
protected  long getLastValidPageNumber()
           
protected  long getNextValidPageNumber(long prevPageNumber)
           
protected  long getPagenum(int bit_pos)
          translate bit position in map to page number.
protected  long getPageOffset(long pagenum, int pagesize, boolean deallocOK)
          Get the physical offset of pagenum.
protected  int getPageStatus(long pagenum)
          Return the status of a particular page
protected  int getTotalPageCount()
          Get the total number of pages in this extent
protected  int getUnfilledPageCount()
          Get the number of unfilled pages in this extent
protected  long getUnfilledPageNumber(long pagenum)
          Get a page number that is unfilled, pagenum is the last page that was rejected.
protected  boolean isRetired()
          Return the status of this extent
protected static int MAX_RANGE(int availspace)
          Statically calculates how many pages this extent can manage given the availspace number of bytes to store this extent in if read/writeExternal changes, this must change too
private  boolean mayHaveFreePage()
           
 void readExternal(java.io.ObjectInput in)
           
private  void setExtentFreePageStatus(boolean hasFree)
           
protected  void setLastPreallocPagenum(long preAllocPagenum)
          preallocated N pages, passed in the last preallocated page number.
protected  java.lang.String toDebugString()
           
protected  boolean trackUnfilledPage(long pagenumber, boolean unfilled)
           
protected  void undoCompressPages(int new_highest_page, int num_pages_truncated)
          Undo the compress space operation.
protected  void updateUnfilledPageInfo(AllocExtent inputExtent)
           
 void writeExternal(java.io.ObjectOutput out)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

extentOffset

private long extentOffset

extentStart

private long extentStart

extentEnd

private long extentEnd

extentLength

private int extentLength

extentStatus

int extentStatus

preAllocLength

private int preAllocLength

reserved1

private int reserved1

reserved2

private long reserved2

reserved3

private long reserved3

HAS_DEALLOCATED

private static final int HAS_DEALLOCATED
See Also:
Constant Field Values

HAS_FREE

private static final int HAS_FREE
See Also:
Constant Field Values

ALL_FREE

private static final int ALL_FREE
See Also:
Constant Field Values

HAS_UNFILLED_PAGES

private static final int HAS_UNFILLED_PAGES
See Also:
Constant Field Values

KEEP_UNFILLED_PAGES

private static final int KEEP_UNFILLED_PAGES
See Also:
Constant Field Values

NO_DEALLOC_PAGE_MAP

private static final int NO_DEALLOC_PAGE_MAP
See Also:
Constant Field Values

RETIRED

private static final int RETIRED
See Also:
Constant Field Values

ALLOCATED_PAGE

protected static final int ALLOCATED_PAGE
public Per Page status

See Also:
Constant Field Values

DEALLOCATED_PAGE

protected static final int DEALLOCATED_PAGE
See Also:
Constant Field Values

FREE_PAGE

protected static final int FREE_PAGE
See Also:
Constant Field Values

freePages

FormatableBitSet freePages

unFilledPages

FormatableBitSet unFilledPages
Constructor Detail

AllocExtent

protected AllocExtent(long offset,
                      long start,
                      int length,
                      int pagesize,
                      int maxlength)

AllocExtent

protected AllocExtent(AllocExtent original)

AllocExtent

public AllocExtent()
Method Detail

MAX_RANGE

protected static int MAX_RANGE(int availspace)
Statically calculates how many pages this extent can manage given the availspace number of bytes to store this extent in if read/writeExternal changes, this must change too


writeExternal

public void writeExternal(java.io.ObjectOutput out)
                   throws java.io.IOException
Specified by:
writeExternal in interface java.io.Externalizable
Throws:
java.io.IOException

readExternal

public void readExternal(java.io.ObjectInput in)
                  throws java.io.IOException,
                         java.lang.ClassNotFoundException
Specified by:
readExternal in interface java.io.Externalizable
Throws:
java.io.IOException
java.lang.ClassNotFoundException

allocPage

protected void allocPage(long pagenum)
                  throws StandardException
Allocate this page - this is called underneath the log record

Throws:
StandardException - Standard Cloudscape error policy

deallocPage

protected void deallocPage(long pagenum)
                    throws StandardException
Deallocate logical page pagenum - this is called underneath the log record. pagenum must be a page managed by this extent and it must be valid

Throws:
StandardException - Standard Cloudscape error policy

compress

protected int compress(BaseContainerHandle owner,
                       RawTransaction ntt,
                       AllocPage alloc_page)
                throws StandardException
Compress free pages at end of this extent.

Search backward from end of extent and prepare data structures to return pages at end of extent to the OS. Returns the lowest page that can be returned to the OS.

Returns:
Return bit of page where all pages that follow can be returned to the OS.
Throws:
StandardException

compressPages

protected void compressPages(int new_highest_page,
                             int num_pages_truncated)

undoCompressPages

protected void undoCompressPages(int new_highest_page,
                                 int num_pages_truncated)
Undo the compress space operation.

Undo of this operation doesn't really "undo" the operation, it just makes sure the data structures are ok after the undo. We are guaranteed at the point of the transaction doing the Undo of the compress space operation fixes up the bit maps to only point at pages within the new_highest_page range.

Prior to logging the compress space operation all pages greater than There are only 2 possibilities at this point: 1) the truncate of pages greater than new_highest_page happened before the abort took place. W 2)

Returns:
The identifier to be used to open the conglomerate later.
Throws:
StandardException - Standard exception policy.

getExtentEnd

protected long getExtentEnd()

getFreePageNumber

protected long getFreePageNumber(long pnum)
Get a page number that is free


getPageOffset

protected long getPageOffset(long pagenum,
                             int pagesize,
                             boolean deallocOK)
                      throws StandardException
Get the physical offset of pagenum. If deallocOK is true, then even if pagenum is deallocated, it is OK. If deallocOK is false, then an exception is thrown if pagenum is deallocated. An exception is always thrown if pagenum is a free page

Throws:
StandardException - Standard Cloudscape error policy

isRetired

protected boolean isRetired()
Return the status of this extent


mayHaveFreePage

private boolean mayHaveFreePage()

setExtentFreePageStatus

private void setExtentFreePageStatus(boolean hasFree)

canAddFreePage

protected boolean canAddFreePage(long lastAllocatedPage)

getPageStatus

protected int getPageStatus(long pagenum)
Return the status of a particular page


getFirstPagenum

protected long getFirstPagenum()
Get the first logical page number managed by this extent.


getLastPagenum

protected long getLastPagenum()
Get the last logical page number managed by this extent.


getPagenum

protected long getPagenum(int bit_pos)
translate bit position in map to page number.

Returns:
The page number of this "bit" in the extent map.
Throws:
StandardException - Standard exception policy.

getLastPreallocPagenum

protected long getLastPreallocPagenum()
get the last preallocated pagenumber managed by this alloc page


setLastPreallocPagenum

protected void setLastPreallocPagenum(long preAllocPagenum)
preallocated N pages, passed in the last preallocated page number.


getNextValidPageNumber

protected long getNextValidPageNumber(long prevPageNumber)

getLastValidPageNumber

protected long getLastValidPageNumber()

checkInRange

private void checkInRange(long pagenum)

updateUnfilledPageInfo

protected void updateUnfilledPageInfo(AllocExtent inputExtent)

trackUnfilledPage

protected boolean trackUnfilledPage(long pagenumber,
                                    boolean unfilled)

getUnfilledPageNumber

protected long getUnfilledPageNumber(long pagenum)
Get a page number that is unfilled, pagenum is the last page that was rejected.


getAllocatedPageCount

protected int getAllocatedPageCount()
Get the number of used page in this extent


getUnfilledPageCount

protected int getUnfilledPageCount()
Get the number of unfilled pages in this extent


getTotalPageCount

protected int getTotalPageCount()
Get the total number of pages in this extent


toDebugString

protected java.lang.String toDebugString()

Built on Tue 2006-10-10 19:23:47+0200, from revision exported

Apache Derby V10.1 Engine Documentation - Copyright © 1997,2005 The Apache Software Foundation or its licensors, as applicable.