Class RAFContainer
- All Implemented Interfaces:
PrivilegedExceptionAction<Object>
,Cacheable
,TypedFormat
,Lockable
- Direct Known Subclasses:
RAFContainer4
,TempRAFContainer
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate int
private boolean
private StorageFile
private ContainerKey
private LogInstant
private boolean
private boolean
private static final int
protected StorageRandomAccessFile
private String
private static final int
private static final int
private boolean
private boolean
protected boolean
private static final int
private static final int
private static final int
private static final int
Fields inherited from class org.apache.derby.impl.store.raw.data.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, spareSpace
Fields inherited from class org.apache.derby.impl.store.raw.data.BaseContainer
identity, isCommittedDrop, isDropped, isReusableRecordId
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected void
backupContainer
(BaseContainerHandle handle, String backupLocation) Backup the container.void
clean
(boolean forRemove) Clean the container.private void
(package private) void
private void
copyFile
(StorageFile from, File to) Copy the contents of aStorageFile
to ajava.io.File
.(package private) void
createContainer
(ContainerKey newIdentity) Create a new container.protected void
encryptOrDecryptContainer
(BaseContainerHandle handle, String newFilePath, boolean doEncrypt) Creates encrypted or decrypted version of the container.protected void
flushAll()
flush the cache to ensure all of my pages are written to disk(package private) StorageFile
getFileName
(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) private RandomAccessFile
getRandomAccessFile
(File file) Get a RandomAccessFile for accessing a file in read-write mode.(package private) StorageRandomAccessFile
boolean
isDirty()
We treat this container as dirty if it has the container file open.(package private) boolean
openContainer
(ContainerKey newIdentity) Open a container.private boolean
padFile
(StorageRandomAccessFile file, long pageOffset) Pad the file upto the passed in page offset.protected int
preAllocate
(long lastPreallocPagenum, int preAllocSize) Preallocate some pages if need beprotected StorageFile
privGetFileName
(ContainerKey identity, boolean stub, boolean errorOK, boolean tryAlternatePath) private boolean
privRemoveFile
(StorageFile file) protected void
readPage
(long pageNumber, byte[] pageData) Read a page into the supplied array.protected void
removeContainer
(LogInstant instant, boolean leaveStub) Remove the containerprivate void
removeFile
(File file) Remove a file.(package private) boolean
removeFile
(StorageFile file) protected void
reopenContainer
(ContainerKey currentIdentity) Only used by RAFContainer4 (NIO) to reopen RAF when its channel gets closed due to interrupts.run()
private void
stubbify
(LogInstant instant) protected void
truncatePages
(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 void
writePage
(long pageNumber, byte[] pageData, boolean syncPage) Write a page from the supplied array.private void
writeRAFHeader
(Object identity, StorageRandomAccessFile file, boolean create, boolean syncFile) Write the header of a random access file and sync itMethods inherited from class org.apache.derby.impl.store.raw.data.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, writeHeader
Methods inherited from class org.apache.derby.impl.store.raw.data.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, use
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.apache.derby.iapi.services.cache.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:FileContainer
We treat this container as dirty if it has the container file open.- Specified by:
isDirty
in interfaceCacheable
- Overrides:
isDirty
in classFileContainer
- See Also:
-
removeContainer
Remove the container- Specified by:
removeContainer
in 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:
closeContainer
in classFileContainer
-
readPage
Read a page into the supplied array.
MT - thread safe- Specified by:
readPage
in 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:
writePage
in 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, ornull
if 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:
StandardException
IOException
-
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:
IOException
StandardException
-
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:
clean
in 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:
preAllocate
in 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:
truncatePages
in 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:
IOException
StandardException
-
flushAll
flush the cache to ensure all of my pages are written to disk- Specified by:
flushAll
in 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:FileContainer
Create 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:
createContainer
in classFileContainer
- Throws:
StandardException
- Derby Standard error policy
-
copyFile
Copy the contents of aStorageFile
to 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:
SecurityException
StandardException
-
privRemoveFile
- Throws:
StandardException
-
openContainer
Description copied from class:FileContainer
Open 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:
openContainer
in 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:
backupContainer
in 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:
encryptOrDecryptContainer
in 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
- iffile
cannot be opened in read-write modeIOException
- if some other I/O error happens
-
getRandomAccessFile
StorageRandomAccessFile getRandomAccessFile(StorageFile file) throws SecurityException, StandardException - Throws:
SecurityException
StandardException
-
run
- Specified by:
run
in interfacePrivilegedExceptionAction<Object>
- Throws:
StandardException
-