Top Description Fields Constructors Methods
org.apache.derby.impl.store.replication.buffer

public Class ReplicationLogBuffer

extends Object
Class Inheritance
Imports
org.apache.derby.shared.common.sanity.SanityManager, java.util.NoSuchElementException, .LinkedList, org.apache.derby.iapi.store.replication.master.MasterFactory

Used for the replication master role only. When a Derby instance has the replication master role for a database 'x', all log records that are written to the local log file are also appended to this log buffer. The replication master service will consume chunks of log from this buffer and send it to the Derby instance with the slave role for 'x'. ReplicationLogBuffer consists of a number of LogBufferElements. Elements that are not in use are in the freeBuffers list, while elements that contains dirty log are in dirtyBuffers. Chunks of log records are appended to the buffer element in currentDirtyBuffer. Hence, the life cycle of buffer elements is: freeBuffers -> currentDirtyBuffer -> dirtyBuffers -> freeBuffers To append chunks of log records to the buffer, use appendLog(...) To consume chunks of log records, use next() followed by getData(), getLastInstant() and getSize(). These get-methods throw NoSuchElementException if next() returned false, meaning that there were no dirty log at the time next() was called. Threads: ReplicationLogBuffer is threadsafe. It can be used by a logger (LogToFile) and a log consumer (LogShipping service) concurrently without further synchronization. Important: If methods in this class calls methods outside this package (e.g. MasterFactory#workToDo), make sure that deadlocks are not introduced. If possible, a call to any method in another package should be done without holding latches in this class.

Field Summary

Modifier and TypeField and Description
private LogBufferElement
public static final int
private int
private final LinkedList<LogBufferElement>
private final LinkedList<LogBufferElement>
private final Object
private final MasterFactory
private byte[]
private long
private int
private final Object
private boolean

Constructor Summary

AccessConstructor and Description
public
ReplicationLogBuffer(int
the default number of buffer elements
bufferSize
,
MasterFactory
Used to notify the master controller that a log buffer element is full and work needs to be done.
mf
)

Class constructor specifies the number of buffer elements and the master controller that creates this replication log buffer.

Method Summary

Modifier and TypeMethod and Description
public void
appendLog(long
the instant of the log record that was added last to this chunk of log
greatestInstant
,
byte[]
the chunk of log records
log
,
int
offset in log to start copy from
logOffset
,
int
number of bytes to copy, starting from logOffset
logLength
)

Append a chunk of log records to the log buffer.

public byte[]

Returns:

A copy of the current byte[], which is a chunk of log
getData
()

Returns a byte[] containing a chunk of serialized log records.

public int

Returns:

an integer value between 0-100 representing the fill information.
getFillInformation
()

Used to calculate the Fill Information.

public long

Returns:

The highest log instant in the chunk of log returned by getData().
getLastInstant
()

Can be used so that only the necessary log records are sent when a flush(LogInstant flush_to_this) is called in the log factory.

public int

Returns:

The number of bytes returned by getData
getSize
()

public boolean

Returns:

true if there is log in the buffer, resulting in valid data for the get-methods
next
()

Sets the output data to that of the next (oldest) buffer element in dirtyBuffers so that getData(), getLastInstant() and getSize() return values from the next oldest chunk of log.

private void
switchDirtyBuffer()

Appends the currentDirtyBuffer to dirtyBuffers, and makes a fresh buffer element from freeBuffers the currentDirtyBuffer.

public boolean

Returns:

true if the buffer contained log records the last time next() was called. False if not, or if next() has not been called yet.
validData
()

Method to determine whether or not the buffer had any log records the last time next() was called.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

currentDirtyBufferback to summary
private LogBufferElement currentDirtyBuffer
DEFAULT_NUMBER_LOG_BUFFERSback to summary
public static final int DEFAULT_NUMBER_LOG_BUFFERS
defaultBufferSizeback to summary
private int defaultBufferSize
dirtyBuffersback to summary
private final LinkedList<LogBufferElement> dirtyBuffers
freeBuffersback to summary
private final LinkedList<LogBufferElement> freeBuffers
listLatchback to summary
private final Object listLatch
mfback to summary
private final MasterFactory mf
outBufferDataback to summary
private byte[] outBufferData
outBufferLastInstantback to summary
private long outBufferLastInstant
outBufferStoredback to summary
private int outBufferStored
outputLatchback to summary
private final Object outputLatch
validOutBufferback to summary
private boolean validOutBuffer

Constructor Detail

ReplicationLogBufferback to summary
public ReplicationLogBuffer(int bufferSize, MasterFactory mf)

Class constructor specifies the number of buffer elements and the master controller that creates this replication log buffer.

Parameters
bufferSize:int

the default number of buffer elements

mf:MasterFactory

Used to notify the master controller that a log buffer element is full and work needs to be done.

Method Detail

appendLogback to summary
public void appendLog(long greatestInstant, byte[] log, int logOffset, int logLength) throws LogBufferFullException

Append a chunk of log records to the log buffer.

Parameters
greatestInstant:long

the instant of the log record that was added last to this chunk of log

log:byte[]

the chunk of log records

logOffset:int

offset in log to start copy from

logLength:int

number of bytes to copy, starting from logOffset

Exceptions
LogBufferFullException:
- thrown if there is not enough free space in the buffer to store the chunk of log.
getDataback to summary
public byte[] getData() throws NoSuchElementException

Returns a byte[] containing a chunk of serialized log records. Always returns the log that was oldest at the time next() was called last time. Use next() to move to the next chunk of log records.

Returns:byte[]

A copy of the current byte[], which is a chunk of log

Exceptions
NoSuchElementException:
if there was no log in the buffer the last time next() was called.
getFillInformationback to summary
public int getFillInformation()

Used to calculate the Fill Information. The fill information is a indicator of how full the buffer is at any point of time fill information = (full buffers/Total Buffers)*100. The Fill information ranges between 0-100 (both 0 and 100 inclusive).

Returns:int

an integer value between 0-100 representing the fill information.

getLastInstantback to summary
public long getLastInstant() throws NoSuchElementException

Can be used so that only the necessary log records are sent when a flush(LogInstant flush_to_this) is called in the log factory. Returns the highest log instant in the chunk of log that can be read with getData().

Returns:long

The highest log instant in the chunk of log returned by getData().

Exceptions
NoSuchElementException:
if there was no log in the buffer the last time next() was called.
getSizeback to summary
public int getSize() throws NoSuchElementException
Returns:int

The number of bytes returned by getData

Exceptions
NoSuchElementException:
if there was no log in the buffer the last time next() was called.
nextback to summary
public boolean next()

Sets the output data to that of the next (oldest) buffer element in dirtyBuffers so that getData(), getLastInstant() and getSize() return values from the next oldest chunk of log. Used by the log consumer (the LogShipping service) to move to the next chunk of log in the buffer.

Returns:boolean

true if there is log in the buffer, resulting in valid data for the get-methods

switchDirtyBufferback to summary
private void switchDirtyBuffer() throws LogBufferFullException

Appends the currentDirtyBuffer to dirtyBuffers, and makes a fresh buffer element from freeBuffers the currentDirtyBuffer.

Note

this method is not synchronized since all uses of it is inside synchronized(listLatch) code blocks.

Exceptions
LogBufferFullException:
if the freeBuffers list is empty
validDataback to summary
public boolean validData()

Method to determine whether or not the buffer had any log records the last time next() was called.

Returns:boolean

true if the buffer contained log records the last time next() was called. False if not, or if next() has not been called yet.