Class RAFContainer
- All Implemented Interfaces:
PrivilegedExceptionAction<Object>, Cacheable, TypedFormat, Lockable
- Direct Known Subclasses:
RAFContainer4, TempRAFContainer
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate intprivate booleanprivate StorageFileprivate ContainerKeyprivate LogInstantprivate booleanprivate booleanprivate static final intprotected StorageRandomAccessFileprivate Stringprivate static final intprivate static final intprivate booleanprivate booleanprotected booleanprivate static final intprivate static final intprivate static final intprivate static final intFields inherited from class FileContainer
allocCache, canUpdate, CHECKSUM_SIZE, CONTAINER_INFO_SIZE, containerCache, containerInfo, containerVersion, dataFactory, estimatedRowCount, FIRST_ALLOC_PAGE_NUMBER, FIRST_ALLOC_PAGE_OFFSET, firstAllocPageNumber, firstAllocPageOffset, formatIdInteger, initialPages, isDirty, lastLogInstant, minimumRecordSize, pageCache, pageSize, preDirty, SPACE_TRACE, spareSpaceFields inherited from class BaseContainer
identity, isCommittedDrop, isDropped, isReusableRecordId -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected voidbackupContainer(BaseContainerHandle handle, String backupLocation) Backup the container.voidclean(boolean forRemove) Clean the container.private void(package private) voidprivate voidcopyFile(StorageFile from, File to) Copy the contents of aStorageFileto ajava.io.File.(package private) voidcreateContainer(ContainerKey newIdentity) Create a new container.protected voidencryptOrDecryptContainer(BaseContainerHandle handle, String newFilePath, boolean doEncrypt) Creates encrypted or decrypted version of the container.protected voidflushAll()flush the cache to ensure all of my pages are written to disk(package private) StorageFilegetFileName(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) private RandomAccessFilegetRandomAccessFile(File file) Get a RandomAccessFile for accessing a file in read-write mode.(package private) StorageRandomAccessFilebooleanisDirty()We treat this container as dirty if it has the container file open.(package private) booleanopenContainer(ContainerKey newIdentity) Open a container.private booleanpadFile(StorageRandomAccessFile file, long pageOffset) Pad the file upto the passed in page offset.protected intpreAllocate(long lastPreallocPagenum, int preAllocSize) Preallocate some pages if need beprotected StorageFileprivGetFileName(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) private booleanprivRemoveFile(StorageFile file) protected voidreadPage(long pageNumber, byte[] pageData) Read a page into the supplied array.protected voidremoveContainer(LogInstant instant, boolean leaveStub) Remove the containerprivate voidremoveFile(File file) Remove a file.(package private) booleanremoveFile(StorageFile file) protected voidreopenContainer(ContainerKey currentIdentity) Only used by RAFContainer4 (NIO) to reopen RAF when its channel gets closed due to interrupts.run()private voidstubbify(LogInstant instant) protected voidtruncatePages(long lastValidPagenum) Truncate pages of a container.protected byte[]updatePageArray(long pageNumber, byte[] pageData, byte[] encryptionBuf, boolean encryptWithNewEngine) Updates the page array with container header if the page is a first allocation page and encrypts the page data if the database is encrypted.protected voidwritePage(long pageNumber, byte[] pageData, boolean syncPage) Write a page from the supplied array.private voidwriteRAFHeader(Object identity, StorageRandomAccessFile file, boolean create, boolean syncFile) Write the header of a random access file and sync itMethods inherited from class FileContainer
bumpContainerVersion, canUpdate, clearIdentity, clearPreallocThreshold, compressContainer, createIdent, createIdentity, deallocatePage, decryptPage, doPreAllocatePages, dropContainer, encryptPage, getAllocPage, getAnyPage, getContainerProperties, getContainerVersion, getContextService, getEmbryonicPage, getEmbryonicPage, getEncryptionBuffer, getEstimatedPageCount, getEstimatedRowCount, getFirstHeadPage, getHeadPage, getLastPageNumber, getLatchedPage, getMinimumRecordSize, getNextHeadPage, getPage, getPageForCompress, getPageForInsert, getPageSize, getReusableRecordIdSequenceNumber, getSpaceInfo, getSpareSpace, getTypeFormatId, incrementReusableRecordIdSequenceNumber, initPage, latchPage, letGo, logCreateContainerInfo, newPage, preDirty, prepareForBulkLoad, readHeader, reCreatePageForRedoRecovery, setDirty, setEstimatedRowCount, setIdent, setIdentity, trackUnfilledPage, updateEstimatedRowCount, writeAtOffset, writeHeader, writeHeaderMethods inherited from class BaseContainer
addPage, compressContainer, fillInIdentity, getAllocPage, getAnyPage, getCommittedDropState, getContainerId, getContainerStatus, getDeallocLock, getDroppedState, getFirstPage, getIdentity, getNextPage, getSegmentId, isReusableRecordId, lockAttributes, lockerAlwaysCompatible, lockEvent, removePage, requestCompatible, setCommittedDropState, setDroppedState, setReusableRecordIdState, truncate, unlockEvent, useMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface Cacheable
getIdentity
-
Field Details
-
fileData
-
needsSync
protected boolean needsSync -
actionCode
private int actionCode -
GET_FILE_NAME_ACTION
private static final int GET_FILE_NAME_ACTION- See Also:
-
CREATE_CONTAINER_ACTION
private static final int CREATE_CONTAINER_ACTION- See Also:
-
REMOVE_FILE_ACTION
private static final int REMOVE_FILE_ACTION- See Also:
-
OPEN_CONTAINER_ACTION
private static final int OPEN_CONTAINER_ACTION- See Also:
-
STUBBIFY_ACTION
private static final int STUBBIFY_ACTION- See Also:
-
GET_RANDOM_ACCESS_FILE_ACTION
private static final int GET_RANDOM_ACCESS_FILE_ACTION- See Also:
-
REOPEN_CONTAINER_ACTION
private static final int REOPEN_CONTAINER_ACTION- See Also:
-
actionIdentity
-
actionStub
private boolean actionStub -
actionErrorOK
private boolean actionErrorOK -
actionTryAlternatePath
private boolean actionTryAlternatePath -
actionFile
-
actionInstant
-
inBackup
private boolean inBackup -
inRemove
private boolean inRemove -
fileName
-
-
Constructor Details
-
RAFContainer
RAFContainer(BaseDataFileFactory factory)
-
-
Method Details
-
isDirty
public boolean isDirty()Description copied from class:FileContainerWe treat this container as dirty if it has the container file open.- Specified by:
isDirtyin interfaceCacheable- Overrides:
isDirtyin classFileContainer- See Also:
-
removeContainer
Remove the container- Specified by:
removeContainerin classBaseContainer- Parameters:
leaveStub- if true, leave a stub. If false, remove everything- Throws:
StandardException- Standard Derby error policy- See Also:
-
closeContainer
void closeContainer()- Specified by:
closeContainerin classFileContainer
-
readPage
Read a page into the supplied array.
MT - thread safe- Specified by:
readPagein classFileContainer- Throws:
IOException- exception reading pageStandardException- Standard Derby error policy
-
writePage
protected void writePage(long pageNumber, byte[] pageData, boolean syncPage) throws IOException, StandardException Write a page from the supplied array.
MT - thread safe- Specified by:
writePagein classFileContainer- Throws:
StandardException- Standard Derby error policyIOException- IO error accessing page
-
updatePageArray
protected byte[] updatePageArray(long pageNumber, byte[] pageData, byte[] encryptionBuf, boolean encryptWithNewEngine) throws StandardException, IOException Updates the page array with container header if the page is a first allocation page and encrypts the page data if the database is encrypted.- Parameters:
pageNumber- the page number of the pagepageData- byte array that has the actual page data.encryptionBuf- buffer that is used to store encrypted version of the page, ornullif encryption is to be skippedencryptWithNewEngine- whether to use the new encryption engine for encryption (only considered ifencryptionBuf != null)- Returns:
- byte array of the the page data as it should be on the disk.
- Throws:
StandardExceptionIOException
-
padFile
private boolean padFile(StorageRandomAccessFile file, long pageOffset) throws IOException, StandardException Pad the file upto the passed in page offset. Returns true if the file needed padding.- Throws:
IOExceptionStandardException
-
clean
Clean the container.Write out the container header and sync all dirty pages of this container to disk before returning.
checkpoint calls this interface through callbacks by telling the cache manager to clean all containers in the open container cache. This sync of the file happens as part of writing and then syncing the container header in writeRAFHeader().
- Specified by:
cleanin interfaceCacheable- Parameters:
forRemove- Is clean called because container is being removed?- Throws:
StandardException- Standard exception policy.
-
clearDirty
private void clearDirty() -
preAllocate
protected int preAllocate(long lastPreallocPagenum, int preAllocSize) Preallocate some pages if need be- Specified by:
preAllocatein classFileContainer- Parameters:
lastPreallocPagenum- the last preallocated page number as known by the allocation pagepreAllocSize- try to preallocate this page number of pages. Since only the container knows how many pages are actually on disk, it may determine that certain number of pages that the allocation page thinks need to be preallocated is already allocated, in those case, act as if the preallocation is successful.- Returns:
- number of successfully preallocated page, or 0 if no page has been preallocated
-
truncatePages
Truncate pages of a container.Truncate all pages from lastValidPagenum+1 through the end of the file.
- Specified by:
truncatePagesin classBaseContainer- Parameters:
lastValidPagenum- The page number of the last valid page of the file. All pages after this one are truncated.- Throws:
StandardException- Standard exception policy.
-
writeRAFHeader
private void writeRAFHeader(Object identity, StorageRandomAccessFile file, boolean create, boolean syncFile) throws IOException, StandardException Write the header of a random access file and sync it- Parameters:
create- if true, the container is being created if false, the container already existsyncFile- if true, sync the file- Throws:
IOExceptionStandardException
-
flushAll
flush the cache to ensure all of my pages are written to disk- Specified by:
flushAllin classBaseContainer- Throws:
StandardException- Standard Derby error policy
-
getFileName
StorageFile getFileName(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) throws StandardException - Throws:
StandardException
-
privGetFileName
protected StorageFile privGetFileName(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) throws StandardException - Throws:
StandardException
-
createContainer
Description copied from class:FileContainerCreate a new container.Create a new container, all references to identity must be through the passed in identity, this object will no identity until after this method returns.
- Specified by:
createContainerin classFileContainer- Throws:
StandardException- Derby Standard error policy
-
copyFile
Copy the contents of aStorageFileto ajava.io.File.- Parameters:
from- the file to copy fromto- the file to copy to- Throws:
StandardException- if the copying failed
-
removeFile
Remove a file.- Parameters:
file- the file to remove- Throws:
StandardException- if the file could not be removed
-
removeFile
- Throws:
SecurityExceptionStandardException
-
privRemoveFile
- Throws:
StandardException
-
openContainer
Description copied from class:FileContainerOpen a container.Longer descrption of routine.
Open a container. Open the file that maps to this container, if the file does not exist then we assume the container was never created. If the file exists but we have trouble opening it then we throw some exception.
MT - single thread required - Enforced by cache manager.- Specified by:
openContainerin classFileContainer- Throws:
StandardException- Standard exception policy.
-
reopenContainer
Only used by RAFContainer4 (NIO) to reopen RAF when its channel gets closed due to interrupts.- Parameters:
currentIdentity-- Throws:
StandardException- standard exception policy
-
stubbify
- Throws:
StandardException
-
backupContainer
protected void backupContainer(BaseContainerHandle handle, String backupLocation) throws StandardException Backup the container. The container is written to the backup by reading the pages through the page cache, and then writing into the backup container. If the container is dropped(commitetd drop), only container stub is copied to the backup using simple file copy. MT - At any given time only one backup thread is allowed, but when backup in progress DML/DDL operations can run in parallel. Pages are latched while writing them to the backup to avoid copying partial changes to the pages. Online backup does not acquire any user level locks , so users can drop tables when backup is in progress. So it is possible that Container Removal request can come in when container backup is in progress. This case is handled by using the synchronization on this object monitor and using inRemove and inBackup flags. Conatiner removal checks if backup is in progress and wait for the backup to yield to continue the removal. Basic idea is to give preference to remove by stopping the backup of the container temporarily, when the remove container is requested by another thread. Generally, it takes more time to backup a regular container than the stub becuase stub is just one page. After each page copy, a check is made to find if a remove is requested and if it is then backup of the container is aborted and the backup thread puts itself into the wait state until remove request thread notifies that the remove is complete. When remove request compeletes stub is copied into the backup. Compress is blocked when backup is in progesss, so truncation of the container can not happen when backup is in progess. No need to synchronize backup of the container with truncation.- Specified by:
backupContainerin classFileContainer- Parameters:
handle- the container handle.backupLocation- location of the backup container.- Throws:
StandardException- Derby Standard error policy
-
encryptOrDecryptContainer
protected void encryptOrDecryptContainer(BaseContainerHandle handle, String newFilePath, boolean doEncrypt) throws StandardException Creates encrypted or decrypted version of the container. Reads all the pages of the container from the original container through the page cache, then either encrypts page data with the new encryption mechanism or leaves the page data un-encrypted, and finally writes the data to the specified new container file.The encryption and decryption engines used to carry out the cryptographic operation(s) are configured through the raw store, and accessed via the data factory. Note that the pages have already been decrypted before being put into the page cache.
- Specified by:
encryptOrDecryptContainerin classBaseContainer- Parameters:
handle- the container handlenewFilePath- file to store the new version of the container indoEncrypt- tells whether to encrypt or not- Throws:
StandardException- Derby Standard error policy
-
getRandomAccessFile
Get a RandomAccessFile for accessing a file in read-write mode.- Parameters:
file- the file to access- Returns:
- a RandomAccessFile
- Throws:
FileNotFoundException- iffilecannot be opened in read-write modeIOException- if some other I/O error happens
-
getRandomAccessFile
StorageRandomAccessFile getRandomAccessFile(StorageFile file) throws SecurityException, StandardException - Throws:
SecurityExceptionStandardException
-
run
- Specified by:
runin interfacePrivilegedExceptionAction<Object>- Throws:
StandardException
-