|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.derby.impl.store.raw.data.BaseContainer
org.apache.derby.impl.store.raw.data.FileContainer
org.apache.derby.impl.store.raw.data.RAFContainer
org.apache.derby.impl.store.raw.data.RAFContainer4
class RAFContainer4
RAFContainer4 overrides a few methods in RAFContainer in an attempt to use FileChannel from Java 1.4's New IO framework to issue multiple IO operations to the same file concurrently instead of strictly serializing IO operations using a mutex on the container object.
Note that our requests for multiple concurrent IOs may be serialized further down in the IO stack - this is entirely up to the JVM and OS. However, at least in Linux on Sun's 1.4.2_09 JVM we see the desired behavior: The FileChannel.read/write(ByteBuffer buf, long position) calls map to pread/pwrite system calls, which enable efficient IO to the same file descriptor by multiple threads.
This whole class should be merged back into RAFContainer when Derby officially stops supporting Java 1.3.
Significant behavior changes from RAFContainer:
FileChannel
Field Summary | |
---|---|
private int |
iosInProgress
For debugging - will be incremented when an IO is started, decremented when it is done. |
private java.nio.channels.FileChannel |
ourChannel
This channel will be retrieved from RAFContainer's fileData member when fileData is set. |
Fields inherited from class org.apache.derby.impl.store.raw.data.RAFContainer |
---|
fileData, needsSync |
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 | |
---|---|
RAFContainer4(BaseDataFileFactory factory)
|
Method Summary | |
---|---|
(package private) void |
closeContainer()
|
(package private) void |
createContainer(ContainerKey newIdentity)
Create a new container. |
private java.nio.channels.FileChannel |
getChannel()
Return the file channel for the current value of the fileData
field. |
private java.nio.channels.FileChannel |
getChannel(StorageRandomAccessFile file)
Return the FileChannel for the specified
StorageRandomAccessFile if it is a RandomAccessFile . |
(package private) byte[] |
getEmbryonicPage(StorageRandomAccessFile file,
long offset)
Read an embryonic page (that is, a section of the first alloc page that is so large that we know all the borrowed space is included in it) from the specified offset in a StorageRandomAccessFile . |
(package private) boolean |
openContainer(ContainerKey newIdentity)
Open a container. |
private void |
readFull(java.nio.ByteBuffer dstBuffer,
java.nio.channels.FileChannel srcChannel,
long position)
Attempts to fill buf completely from start until it's full. |
protected void |
readPage(long pageNumber,
byte[] pageData)
Read a page into the supplied array. |
private void |
readPage0(long pageNumber,
byte[] pageData)
|
(package private) void |
writeAtOffset(StorageRandomAccessFile file,
byte[] bytes,
long offset)
Write a sequence of bytes at the given offset in a file. |
private void |
writeFull(java.nio.ByteBuffer srcBuffer,
java.nio.channels.FileChannel dstChannel,
long position)
Attempts to write buf completely from start until end, at the given position in the destination fileChannel. |
protected void |
writePage(long pageNumber,
byte[] pageData,
boolean syncPage)
Write a page from the supplied array. |
private void |
writePage0(long pageNumber,
byte[] pageData,
boolean syncPage)
|
Methods inherited from class org.apache.derby.impl.store.raw.data.RAFContainer |
---|
backupContainer, clean, createIdentity, encryptContainer, flushAll, getFileName, isDirty, preAllocate, privGetFileName, privGetRandomAccessFile, removeContainer, removeFile, run, setIdentity, truncatePages, updatePageArray |
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 Detail |
---|
private java.nio.channels.FileChannel ourChannel
private int iosInProgress
Constructor Detail |
---|
public RAFContainer4(BaseDataFileFactory factory)
Method Detail |
---|
private java.nio.channels.FileChannel getChannel(StorageRandomAccessFile file)
FileChannel
for the specified
StorageRandomAccessFile
if it is a RandomAccessFile
.
Otherwise, return null
.
file
- the file to get the channel for
FileChannel
if file
is an instance of
RandomAccessFile
, null
otherwiseprivate java.nio.channels.FileChannel getChannel()
Return the file channel for the current value of the fileData
field. If fileData
doesn't support file channels, return
null
.
Callers of this method must synchronize on the container object since
two shared fields (fileData
and ourChannel
) are
accessed.
FileChannel
object, if supported, or null
boolean openContainer(ContainerKey newIdentity) throws StandardException
FileContainer
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.
openContainer
in class RAFContainer
StandardException
- Standard exception policy.void createContainer(ContainerKey newIdentity) throws StandardException
FileContainer
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.
createContainer
in class RAFContainer
StandardException
- Derby Standard error policyvoid closeContainer()
closeContainer
in class RAFContainer
protected void readPage(long pageNumber, byte[] pageData) throws java.io.IOException, StandardException
readPage
in class RAFContainer
java.io.IOException
- exception reading page
StandardException
- Standard Derby error policyprivate void readPage0(long pageNumber, byte[] pageData) throws java.io.IOException, StandardException
java.io.IOException
StandardException
protected void writePage(long pageNumber, byte[] pageData, boolean syncPage) throws java.io.IOException, StandardException
writePage
in class RAFContainer
StandardException
- Standard Derby error policy
java.io.IOException
- IO error accessing pageprivate void writePage0(long pageNumber, byte[] pageData, boolean syncPage) throws java.io.IOException, StandardException
java.io.IOException
StandardException
void writeAtOffset(StorageRandomAccessFile file, byte[] bytes, long offset) throws java.io.IOException, StandardException
writeAtOffset
in class FileContainer
file
- the file to write tobytes
- the bytes to writeoffset
- the offset to start writing at
java.io.IOException
- if an I/O error occurs while writing
StandardException
- Derby Standard error policybyte[] getEmbryonicPage(StorageRandomAccessFile file, long offset) throws java.io.IOException, StandardException
StorageRandomAccessFile
.
getEmbryonicPage
in class FileContainer
file
- the file to read fromoffset
- where to start reading (normally
FileContainer.FIRST_ALLOC_PAGE_OFFSET
)
java.io.IOException
- if an I/O error occurs while reading
StandardException
- if thread is interrupted.private final void readFull(java.nio.ByteBuffer dstBuffer, java.nio.channels.FileChannel srcChannel, long position) throws java.io.IOException, StandardException
dstBuffer
- buffer to read intosrcChannel
- channel to read fromposition
- file position from where to read
java.io.IOException
- if an I/O error occurs while reading
StandardException
- If thread is interrupted.private final void writeFull(java.nio.ByteBuffer srcBuffer, java.nio.channels.FileChannel dstChannel, long position) throws java.io.IOException, StandardException
srcBuffer
- buffer to writedstChannel
- channel to write toposition
- file position to start writing at
java.io.IOException
- if an I/O error occurs while writing
StandardException
- If thread is interrupted.
|
Built on Thu 2010-12-23 20:49:13+0000, from revision ??? | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |