public abstract class AbstractBufferStrategy extends AbstractRawWormStore implements IBufferStrategy
IBufferStrategy
implementation.Modifier and Type | Field and Description |
---|---|
protected BufferMode |
bufferMode
The buffer strategy implemented by this class.
|
protected AtomicLong |
commitOffset
The WORM address of the last committed allocation.
|
static String |
ERR_ADDRESS_IS_NULL
Text of the error message used when a ZERO (0L) is passed as an address
to
IRawStore.read(long) or similar methods. |
static String |
ERR_ADDRESS_NOT_WRITTEN
Text of the error message used when an address is given has never been
written.
|
static String |
ERR_BAD_RECORD_SIZE
Error message used when the record size is invalid (e.g., negative).
|
static String |
ERR_BUFFER_EMPTY
Text of the error message used when a
ByteBuffer with zero bytes
Buffer.remaining() is passed to IRawStore.write(ByteBuffer) . |
static String |
ERR_BUFFER_NULL
Text of the error message used when a
null reference is
provided for a ByteBuffer . |
static String |
ERR_BUFFER_OVERRUN
Error message used when an operation would write more data than would be
permitted onto a buffer.
|
static String |
ERR_MAX_EXTENT
Text of the error message used when a write operation would exceed the
maximum extent for a backing store.
|
static String |
ERR_NOT_OPEN
Error message used when the store is closed but the operation requires
that the store is open.
|
static String |
ERR_OPEN
Error message used when the store is open by the operation requires that
the store is closed.
|
static String |
ERR_READ_ONLY
Error message used when the writes are not allowed.
|
static String |
ERR_RECORD_LENGTH_ZERO
Text of the error message used when an address provided to
IRawStore.read(long) or a similar method encodes a record length
of zero (0). |
static String |
ERR_TRUNCATE
Text of the error message used when
IBufferStrategy.truncate(long) would truncate data that has
already been written. |
protected long |
initialExtent |
protected static org.apache.log4j.Logger |
log
Log for buffer operations.
|
protected long |
maximumExtent |
protected AtomicLong |
nextOffset
The next offset at which a data item would be written on the store as an
offset into the user extent (offset zero(0) addresses the first
byte after the root blocks).
|
protected static boolean |
WARN |
am
NULL
Modifier and Type | Method and Description |
---|---|
void |
abort()
A method that requires the implementation to discard its buffered write
set (if any).
|
protected void |
assertOpen() |
void |
close()
Manages the
open flag state. |
void |
closeForWrites()
Sets the
readOnly flag. |
void |
commit()
A method that removes assumptions of how a specific strategy commits
data.
|
void |
delete(long addr)
The default is a NOP.
|
void |
destroy()
Closes the store immediately (if open) and deletes its persistent
resources.
|
BufferMode |
getBufferMode()
The buffer mode supported by the implementation
|
long |
getInitialExtent()
The initial extent.
|
long |
getMaximumExtent()
The maximum extent allowable before a buffer overflow operation will be
rejected.
|
int |
getMaxRecordSize()
The maximum size of a record for the address manager less 4 bytes iff
checksums are enabled.
|
long |
getMetaBitsAddr()
The RWStrategy requires meta allocation info in the root block, this
method is the hook to enable access.
|
long |
getMetaStartAddr()
The RWStrategy requires meta allocation info in the root block, this
method is the hook to enable access.
|
protected long |
getMinimumExtension()
The minimum amount to extend the backing storage when it overflows.
|
long |
getNextOffset()
The next offset at which a data item would be written on the store as an
offset into the user extent.
|
IResourceMetadata |
getResourceMetadata()
Not supported - this is available on the
AbstractJournal . |
UUID |
getUUID()
Not supported - this is available on the
AbstractJournal . |
boolean |
isDirty()
Return
true if the store has been modified since the last
IBufferStrategy.commit() or IBufferStrategy.abort() . |
boolean |
isOpen()
true iff the store is open. |
boolean |
isReadOnly()
true iff the store does not allow writes. |
boolean |
overflow(long needed)
Invoked if the store would exceed its current extent by
IRawStore.write(ByteBuffer) . |
boolean |
requiresCommit(IRootBlockView block)
A method that removes assumptions of how a specific strategy determines
whether a transaction commit is required.
|
long |
size()
The #of application data bytes written on the store (does not count any
headers or root blocks that may exist for the store).
|
protected static long |
transferFromDiskTo(IDiskBasedStrategy src,
RandomAccessFile out)
Helper method used by
DiskBackedBufferStrategy and
DiskOnlyStrategy to implement
IBufferStrategy.transferTo(RandomAccessFile) using a
FileChannel to FileChannel transfer. |
boolean |
useChecksums()
|
getAddressManager, getByteCount, getOffset, getOffsetBits, getPhysicalAddress, toAddr, toString
getInputStream, getOutputStream
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getAddressManager, getCounters, getExtent, getHeaderSize, getOffsetBits, getUserExtent, readRootBlock, transferTo, truncate, writeRootBlock
deleteResources, force, getFile, isFullyBuffered, isStable, read, write
getByteCount, getOffset, getPhysicalAddress, toAddr, toString
getInputStream, getOutputStream
protected static final org.apache.log4j.Logger log
protected static final boolean WARN
public static final String ERR_BUFFER_EMPTY
ByteBuffer
with zero bytes
Buffer.remaining()
is passed to IRawStore.write(ByteBuffer)
.public static final String ERR_BUFFER_NULL
null
reference is
provided for a ByteBuffer
.public static final String ERR_ADDRESS_NOT_WRITTEN
nextOffset
on which data
would be written may be easily detected.public static final String ERR_ADDRESS_IS_NULL
IRawStore.read(long)
or similar methods. This value 0L is
reserved to indicate a persistent null reference and may never be read.public static final String ERR_RECORD_LENGTH_ZERO
IRawStore.read(long)
or a similar method encodes a record length
of zero (0). Empty records are not permitted on write and addresses with
a zero length are rejected on read.public static final String ERR_MAX_EXTENT
public static final String ERR_TRUNCATE
IBufferStrategy.truncate(long)
would truncate data that has
already been written.public static final String ERR_READ_ONLY
public static final String ERR_BAD_RECORD_SIZE
public static final String ERR_NOT_OPEN
public static final String ERR_OPEN
public static final String ERR_BUFFER_OVERRUN
protected final long initialExtent
protected final long maximumExtent
protected final BufferMode bufferMode
protected final AtomicLong nextOffset
Note: It is NOT safe to reload the current root block and therefore reset
this to an earlier offset unless all transactions are discarded. The
reason is that transactions may use objects (btrees) to provide
isolation. Those objects write on the store but do not register as
ICommitter
s and therefore never make themselves restart safe.
However, you can not discard the writes of those objects unless the
entire store is being restarted, e.g., after a shutdown or a crash.
Note: An AtomicLong
is used to provide an object on which we can
lock when assigning the next record's address and synchronously updating
the counter value. It also ensures that threads can not see a stale value
for the counter.
protected final AtomicLong commitOffset
public final long getInitialExtent()
IBufferStrategy
getInitialExtent
in interface IBufferStrategy
public final long getMaximumExtent()
IBufferStrategy
Note: The semantics here differ from those defined by
Options.MAXIMUM_EXTENT
. The latter specifies the threshold at
which a journal will overflow (onto another journal) while this specifies
the maximum size to which a buffer is allowed to grow.
Note: This is normally zero (0L), which basically means that
the maximum extent is ignored by the IBufferStrategy
but
respected by the AbstractJournal
, resulting in a soft limit
on journal overflow.
getMaximumExtent
in interface IBufferStrategy
0L
iff no limit is imposed.protected long getMinimumExtension()
public final BufferMode getBufferMode()
IBufferStrategy
getBufferMode
in interface IBufferStrategy
public final long getNextOffset()
IBufferStrategy
getNextOffset
in interface IBufferStrategy
public final long size()
IRawStore
protected final void assertOpen()
public boolean isOpen()
IRawStore
true
iff the store is open.public boolean isReadOnly()
IRawStore
true
iff the store does not allow writes.isReadOnly
in interface IRawStore
public final void destroy()
IRawStore
IllegalStateException
if the store
is already closed, but still deletes the backing resources.destroy
in interface IRawStore
IRawStore.deleteResources()
public final boolean overflow(long needed)
IRawStore.write(ByteBuffer)
. The default behavior extends the capacity of
the buffer by the at least the requested amount and a maximum of 32M or
the Options.INITIAL_EXTENT
.
If the data are fully buffered, then the maximum store size is limited to int32 bytes which is the maximum #of bytes that can be addressed in RAM (the pragmatic maximum is slightly less than 2G due to the limits of the JVM to address system memory).
protected static long transferFromDiskTo(IDiskBasedStrategy src, RandomAccessFile out) throws IOException
DiskBackedBufferStrategy
and
DiskOnlyStrategy
to implement
IBufferStrategy.transferTo(RandomAccessFile)
using a
FileChannel
to FileChannel
transfer.src
- The source.out
- The output file.IOException
public UUID getUUID()
AbstractJournal
.getUUID
in interface IRawStore
UnsupportedOperationException
- alwayspublic IResourceMetadata getResourceMetadata()
AbstractJournal
.getResourceMetadata
in interface IRawStore
UnsupportedOperationException
- alwayspublic void closeForWrites()
readOnly
flag.
Note: This method SHOULD be extended to release write caches, etc.
closeForWrites
in interface IBufferStrategy
public void delete(long addr)
delete
in interface IRawStore
delete
in class AbstractRawStore
addr
- A long integer formed using Addr
that encodes both the
offset at which the data was written and the #of bytes that
were written.public boolean isDirty()
true
if the store has been modified since the last
IBufferStrategy.commit()
or IBufferStrategy.abort()
.
This implementation checks the current allocation offset with that in the rootBlock
isDirty
in interface IBufferStrategy
public void commit()
IBufferStrategy
commit
in interface IBufferStrategy
public void abort()
IBufferStrategy
abort
in interface IBufferStrategy
public long getMetaBitsAddr()
IBufferStrategy
getMetaBitsAddr
in interface IBufferStrategy
public long getMetaStartAddr()
IBufferStrategy
getMetaStartAddr
in interface IBufferStrategy
public boolean requiresCommit(IRootBlockView block)
IBufferStrategy
requiresCommit
in interface IBufferStrategy
block
- The root block held by the client, can be checked against the
state of the Buffer Strategypublic int getMaxRecordSize()
getMaxRecordSize
in interface IBufferStrategy
public boolean useChecksums()
useChecksums
in interface IBufferStrategy
Copyright © 2006–2019 SYSTAP, LLC DBA Blazegraph. All rights reserved.