Class RAFContainer

All Implemented Interfaces:
PrivilegedExceptionAction<Object>, Cacheable, TypedFormat, Lockable
Direct Known Subclasses:
RAFContainer4, TempRAFContainer

class RAFContainer extends FileContainer implements PrivilegedExceptionAction<Object>
RAFContainer (short for RandomAccessFileContainer) is a concrete subclass of FileContainer for FileContainers which are implemented on java.io.RandomAccessFile.
  • Field Details

    • fileData

      protected StorageRandomAccessFile 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

      private ContainerKey actionIdentity
    • actionStub

      private boolean actionStub
    • actionErrorOK

      private boolean actionErrorOK
    • actionTryAlternatePath

      private boolean actionTryAlternatePath
    • actionFile

      private StorageFile actionFile
    • actionInstant

      private LogInstant actionInstant
    • inBackup

      private boolean inBackup
    • inRemove

      private boolean inRemove
    • fileName

      private String fileName
  • Constructor Details

  • 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 interface Cacheable
      Overrides:
      isDirty in class FileContainer
      See Also:
    • removeContainer

      protected void removeContainer(LogInstant instant, boolean leaveStub) throws StandardException
      Remove the container
      Specified by:
      removeContainer in class BaseContainer
      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 class FileContainer
    • readPage

      protected void readPage(long pageNumber, byte[] pageData) throws IOException, StandardException
      Read a page into the supplied array.
      MT - thread safe
      Specified by:
      readPage in class FileContainer
      Throws:
      IOException - exception reading page
      StandardException - 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 class FileContainer
      Throws:
      StandardException - Standard Derby error policy
      IOException - 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 page
      pageData - byte array that has the actual page data.
      encryptionBuf - buffer that is used to store encrypted version of the page, or null if encryption is to be skipped
      encryptWithNewEngine - whether to use the new encryption engine for encryption (only considered if encryptionBuf != 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

      public void clean(boolean forRemove) throws StandardException
      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 interface Cacheable
      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 class FileContainer
      Parameters:
      lastPreallocPagenum - the last preallocated page number as known by the allocation page
      preAllocSize - 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

      protected void truncatePages(long lastValidPagenum) throws StandardException
      Truncate pages of a container.

      Truncate all pages from lastValidPagenum+1 through the end of the file.

      Specified by:
      truncatePages in class BaseContainer
      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 exist
      syncFile - if true, sync the file
      Throws:
      IOException
      StandardException
    • flushAll

      protected void flushAll() throws StandardException
      flush the cache to ensure all of my pages are written to disk
      Specified by:
      flushAll in class BaseContainer
      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

      void createContainer(ContainerKey newIdentity) throws StandardException
      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 class FileContainer
      Throws:
      StandardException - Derby Standard error policy
    • copyFile

      private void copyFile(StorageFile from, File to) throws StandardException
      Copy the contents of a StorageFile to a java.io.File.
      Parameters:
      from - the file to copy from
      to - the file to copy to
      Throws:
      StandardException - if the copying failed
    • removeFile

      private void removeFile(File file) throws StandardException
      Remove a file.
      Parameters:
      file - the file to remove
      Throws:
      StandardException - if the file could not be removed
    • removeFile

      boolean removeFile(StorageFile file) throws SecurityException, StandardException
      Throws:
      SecurityException
      StandardException
    • privRemoveFile

      private boolean privRemoveFile(StorageFile file) throws StandardException
      Throws:
      StandardException
    • openContainer

      boolean openContainer(ContainerKey newIdentity) throws StandardException
      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 class FileContainer
      Throws:
      StandardException - Standard exception policy.
    • reopenContainer

      protected void reopenContainer(ContainerKey currentIdentity) throws StandardException
      Only used by RAFContainer4 (NIO) to reopen RAF when its channel gets closed due to interrupts.
      Parameters:
      currentIdentity -
      Throws:
      StandardException - standard exception policy
    • stubbify

      private void stubbify(LogInstant instant) throws StandardException
      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 class FileContainer
      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 class BaseContainer
      Parameters:
      handle - the container handle
      newFilePath - file to store the new version of the container in
      doEncrypt - tells whether to encrypt or not
      Throws:
      StandardException - Derby Standard error policy
    • getRandomAccessFile

      private RandomAccessFile getRandomAccessFile(File file) throws IOException
      Get a RandomAccessFile for accessing a file in read-write mode.
      Parameters:
      file - the file to access
      Returns:
      a RandomAccessFile
      Throws:
      FileNotFoundException - if file cannot be opened in read-write mode
      IOException - if some other I/O error happens
    • getRandomAccessFile

      Throws:
      SecurityException
      StandardException
    • run

      public Object run() throws StandardException
      Specified by:
      run in interface PrivilegedExceptionAction<Object>
      Throws:
      StandardException