public abstract class StreamingStateTransfer extends Protocol
STATE_TRANSFER
protocol
requires this state to be loaded entirely into memory before being
transferred to a group member while the streaming state transfer protocols do not.
Thus the streaming state transfer protocols are able to
transfer application state that is very large (>1Gb) without a likelihood of the
such transfer resulting in OutOfMemoryException.
Note that prior to 3.0, there was only 1 streaming protocol: STATE. In 3.0 the functionality
was split between STATE and STATE_SOCK, and common functionality moved up
into StreamingStateTransfer.STATE_TRANSFER
,
STATE
,
STATE_SOCK
Modifier and Type | Class and Description |
---|---|
protected class |
StreamingStateTransfer.StateGetter
Thread which invokes
MessageListener.getState(java.io.OutputStream) in the application |
static class |
StreamingStateTransfer.StateHeader |
Modifier and Type | Field and Description |
---|---|
protected double |
avg_state_size |
protected AtomicBoolean |
barrier_closed
Used to prevent spurious open and close barrier calls
|
protected int |
buffer_size |
protected boolean |
flushProtocolInStack |
protected Address |
local_addr |
protected int |
max_pool |
protected List<Address> |
members |
protected AtomicLong |
num_bytes_sent |
protected AtomicInteger |
num_state_reqs |
protected Map<Address,OutputStream> |
pending_state_transfers
Whenever we get a state transfer request, we create an OutputStream and add the state requester's address and
the OutputStream to this map.
|
protected long |
pool_thread_keep_alive |
protected Lock |
state_lock
Used to synchronize all state requests and responses
|
protected Address |
state_provider |
protected ThreadPoolExecutor |
thread_pool
Thread pool (configured with
max_pool and pool_thread_keep_alive ) to run
StreamingStateTransfer.StateGetter threads on |
Constructor and Description |
---|
StreamingStateTransfer() |
Modifier and Type | Method and Description |
---|---|
void |
closeBarrierAndSuspendStable() |
protected abstract void |
createStreamToProvider(Address provider,
StreamingStateTransfer.StateHeader hdr)
Creates an InputStream to the state provider to read the state
|
protected abstract void |
createStreamToRequester(Address requester)
Creates an OutputStream to the state requester to write the state
|
protected ThreadPoolExecutor |
createThreadPool() |
void |
destroy()
This method is called on a
Channel.close() . |
protected Address |
determineCoordinator() |
Object |
down(Event evt)
An event is to be sent down the stack.
|
double |
getAverageStateSize() |
long |
getNumberOfStateBytesSent() |
int |
getNumberOfStateRequests() |
protected void |
getStateFromApplication(Address requester,
OutputStream out,
boolean use_separate_thread) |
long |
getThreadPoolCompletedTasks() |
int |
getThreadPoolSize() |
protected void |
handleConfig(Map<String,Object> config) |
protected void |
handleEOF(Address sender) |
protected void |
handleException(Throwable exception) |
protected void |
handleStateChunk(Address sender,
byte[] buffer,
int offset,
int length) |
protected void |
handleStateReq(Address requester) |
protected void |
handleViewChange(View v) |
void |
init()
Called after instance has been created (null constructor) and before protocol is started.
|
protected boolean |
isDigestNeeded()
When FLUSH is used we do not need to pass digests between members (see JGroups/doc/design/FLUSH.txt)
|
protected void |
modifyStateResponseHeader(StreamingStateTransfer.StateHeader hdr) |
void |
openBarrierAndResumeStable() |
protected void |
removeRequester(Address requester) |
List<Integer> |
requiredDownServices()
List of events that are required to be answered by some layer below
|
void |
resetStats() |
protected void |
sendEof(Address requester) |
protected void |
sendException(Address requester,
Throwable exception) |
protected void |
setStateInApplication(Address provider,
InputStream in,
Digest digest) |
void |
start()
This method is called on a
Channel.connect(String) . |
void |
stop()
This method is called on a
Channel.disconnect() . |
Object |
up(Event evt)
An event was received from the layer below.
|
accept, dumpStats, enableStats, getConfigurableObjects, getDownProtocol, getDownServices, getId, getIdsAbove, getLevel, getName, getProtocolStack, getSocketFactory, getThreadFactory, getTransport, getUpProtocol, getUpServices, getValue, isErgonomics, level, printStats, providedDownServices, providedUpServices, requiredUpServices, resetStatistics, setDownProtocol, setErgonomics, setId, setLevel, setProtocolStack, setSocketFactory, setUpProtocol, setValue, setValues, statsEnabled, up
protected int buffer_size
protected int max_pool
protected long pool_thread_keep_alive
protected final AtomicInteger num_state_reqs
protected final AtomicLong num_bytes_sent
protected double avg_state_size
protected Address local_addr
protected volatile Address state_provider
protected volatile boolean flushProtocolInStack
protected AtomicBoolean barrier_closed
protected ThreadPoolExecutor thread_pool
max_pool
and pool_thread_keep_alive
) to run
StreamingStateTransfer.StateGetter
threads onprotected final Map<Address,OutputStream> pending_state_transfers
StreamingStateTransfer.StateGetter
thread.protected final Lock state_lock
public int getNumberOfStateRequests()
public long getNumberOfStateBytesSent()
public double getAverageStateSize()
public int getThreadPoolSize()
public long getThreadPoolCompletedTasks()
public List<Integer> requiredDownServices()
Protocol
requiredDownServices
in class Protocol
public void resetStats()
resetStats
in class Protocol
public void init() throws Exception
Protocol
public void destroy()
Protocol
Channel.close()
.
Does some cleanup; after the call the VM will terminatepublic void start() throws Exception
Protocol
Channel.connect(String)
. Starts work.
Protocols are connected and queues are ready to receive events.
Will be called from bottom to top. This call will replace
the START and START_OK events.start
in class Protocol
Exception
- Thrown if protocol cannot be started successfully. This will cause the ProtocolStack
to fail, so Channel.connect(String)
will throw an exceptionpublic void stop()
Protocol
Channel.disconnect()
. Stops work (e.g. by closing multicast socket).
Will be called from top to bottom. This means that at the time of the method invocation the
neighbor protocol below is still working. This method will replace the
STOP, STOP_OK, CLEANUP and CLEANUP_OK events. The ProtocolStack guarantees that
when this method is called all messages in the down queue will have been flushedpublic Object down(Event evt)
Protocol
down_prot.down()
. In case of a GET_ADDRESS event (which tries to
retrieve the stack's address from one of the bottom layers), the layer may need to send
a new response event back up the stack using up_prot.up()
.public Object up(Event evt)
Protocol
down_prot.down()
or c) the event (or another event) is sent up
the stack using up_prot.up()
.protected boolean isDigestNeeded()
protected void handleStateChunk(Address sender, byte[] buffer, int offset, int length)
protected void handleEOF(Address sender)
protected void handleException(Throwable exception)
protected void getStateFromApplication(Address requester, OutputStream out, boolean use_separate_thread)
protected void removeRequester(Address requester)
protected void setStateInApplication(Address provider, InputStream in, Digest digest)
public void closeBarrierAndSuspendStable()
public void openBarrierAndResumeStable()
protected void sendEof(Address requester)
protected ThreadPoolExecutor createThreadPool()
protected Address determineCoordinator()
protected void handleViewChange(View v)
protected void handleStateReq(Address requester)
protected abstract void createStreamToRequester(Address requester)
protected abstract void createStreamToProvider(Address provider, StreamingStateTransfer.StateHeader hdr)
protected void modifyStateResponseHeader(StreamingStateTransfer.StateHeader hdr)
Copyright © 2016 JBoss, a division of Red Hat. All rights reserved.