|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.derby.impl.store.replication.buffer.ReplicationLogBuffer
public class ReplicationLogBuffer
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 | |
---|---|
private LogBufferElement |
currentDirtyBuffer
|
static int |
DEFAULT_NUMBER_LOG_BUFFERS
|
private int |
defaultBufferSize
|
private java.util.LinkedList |
dirtyBuffers
|
private java.util.LinkedList |
freeBuffers
|
private java.lang.Object |
listLatch
|
private MasterFactory |
mf
|
private byte[] |
outBufferData
|
private long |
outBufferLastInstant
|
private int |
outBufferStored
|
private java.lang.Object |
outputLatch
|
private boolean |
validOutBuffer
|
Constructor Summary | |
---|---|
ReplicationLogBuffer(int bufferSize,
MasterFactory mf)
Class constructor specifies the number of buffer elements and the master controller that creates this replication log buffer. |
Method Summary | |
---|---|
void |
appendLog(long greatestInstant,
byte[] log,
int logOffset,
int logLength)
Append a chunk of log records to the log buffer. |
byte[] |
getData()
Returns a byte[] containing a chunk of serialized log records. |
int |
getFillInformation()
Used to calculate the Fill Information. |
long |
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. |
int |
getSize()
|
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. |
private void |
switchDirtyBuffer()
Appends the currentDirtyBuffer to dirtyBuffers, and makes a fresh buffer element from freeBuffers the currentDirtyBuffer. |
boolean |
validData()
Method to determine whether or not the buffer had any log records the last time next() was called. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final int DEFAULT_NUMBER_LOG_BUFFERS
private final java.util.LinkedList dirtyBuffers
private final java.util.LinkedList freeBuffers
private LogBufferElement currentDirtyBuffer
private boolean validOutBuffer
private byte[] outBufferData
private int outBufferStored
private long outBufferLastInstant
private final java.lang.Object listLatch
private final java.lang.Object outputLatch
private int defaultBufferSize
private final MasterFactory mf
Constructor Detail |
---|
public ReplicationLogBuffer(int bufferSize, MasterFactory mf)
bufferSize
- the default number of buffer elementsmf
- Used to notify the master controller that a log buffer
element is full and work needs to be done.Method Detail |
---|
public void appendLog(long greatestInstant, byte[] log, int logOffset, int logLength) throws LogBufferFullException
greatestInstant
- the instant of the log record that was
added last to this chunk of loglog
- the chunk of log recordslogOffset
- offset in log to start copy fromlogLength
- number of bytes to copy, starting
from logOffset
LogBufferFullException
- - thrown if there is not enough
free space in the buffer to store the chunk of log.public boolean next()
public byte[] getData() throws java.util.NoSuchElementException
java.util.NoSuchElementException
- if there was no log in the
buffer the last time next() was called.public boolean validData()
public int getSize() throws java.util.NoSuchElementException
java.util.NoSuchElementException
- if there was no log in the
buffer the last time next() was called.public long getLastInstant() throws java.util.NoSuchElementException
java.util.NoSuchElementException
- if there was no log in the
buffer the last time next() was called.private void switchDirtyBuffer() throws LogBufferFullException
LogBufferFullException
- if the freeBuffers list is emptypublic int getFillInformation()
|
Built on Thu 2011-03-10 11:54:14+0000, from revision ??? | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |