Class StreamingStateTransfer
- All Implemented Interfaces:
Lifecycle,ProcessingQueue.Handler<Address>
- Direct Known Subclasses:
STATE,STATE_SOCK
The major advantage of this approach is that transferring application state to a
joining member of a group does not entail loading of the complete application
state into memory. The application state, for example, might be located entirely
on some form of disk based storage. The default 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.
- Since:
- 3.0
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected classThread which invokesReceiver.getState(java.io.OutputStream)in the applicationstatic class -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected doubleprotected intprotected booleanprotected intprotected final LongAdderprotected final LongAdderprotected longprotected Addressprotected final ProcessingQueue<Address> List of members requesting state.protected ThreadPoolExecutorThread pool (configured withmax_poolandpool_thread_keep_alive) to runStreamingStateTransfer.StateGetterthreads onFields inherited from class org.jgroups.stack.Protocol
after_creation_hook, down_prot, ergonomics, id, local_addr, log, policies, stack, stats, up_prot -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected voidvoidprotected voidcloseHoleFor(Address member) protected abstract Tuple<InputStream, Object> createStreamToProvider(Address provider, StreamingStateTransfer.StateHeader hdr) Creates an InputStream to the state provider to read the state.protected voidcreateStreamToRequester(Address requester) Creates an OutputStream to the state requester to write the stateprotected ThreadPoolExecutorvoiddestroy()This method is called on aJChannel.close().protected AddressAn event is to be sent down the stack.doublelonglongprotected voidgetStateFromApplication(Address requester, OutputStream out, boolean use_separate_thread) longintvoidprotected Objecthandle(StreamingStateTransfer.StateHeader hdr, Message msg) protected voidhandleConfig(Map<String, Object> config) protected voidprotected voidhandleException(Throwable exception) protected voidhandleStateChunk(Address sender, byte[] buffer, int offset, int length) protected voidhandleStateReq(Address requester) protected voidhandleStateRsp(Address provider, StreamingStateTransfer.StateHeader hdr) protected voidvoidinit()Called after a protocol has been created and before the protocol is started.protected booleanWhen FLUSH is used we do not need to pass digests between members (see JGroups/doc/design/FLUSH.txt)protected voidprotected voidvoidprotected voidpunchHoleFor(Address member) List of events that are required to be answered by some layer belowvoidprotected voidprotected voidprotected voidsendException(Address requester, Throwable exception) protected voidsetStateInApplication(InputStream in, Object resource, Address provider) voidstart()This method is called on aJChannel.connect(String); starts work.voidstop()Called on aJChannel.disconnect(); stops work (e.g.An event was received from the protocol below.A single message was received.voidup(MessageBatch batch) Sends up a multiple messages in aMessageBatch.protected booleanMethods inherited from class org.jgroups.stack.Protocol
accept, addPolicy, addr, addr, afterCreationHook, down, down, enableStats, getAddress, getComponents, getDownProtocol, getDownServices, getId, getIdsAbove, getLevel, getLog, getName, getPolicies, getProtocolStack, getSocketFactory, getThreadFactory, getTransport, getUpProtocol, getUpServices, getValue, isErgonomics, level, parse, policies, providedDownServices, providedUpServices, removePolicy, requiredUpServices, resetStatistics, setAddress, setDownProtocol, setErgonomics, setId, setLevel, setPolicies, setProtocolStack, setSocketFactory, setUpProtocol, setValue, statsEnabled, toString
-
Field Details
-
buffer_size
protected int buffer_size -
max_pool
protected int max_pool -
pool_thread_keep_alive
protected long pool_thread_keep_alive -
num_state_reqs
-
num_bytes_sent
-
avg_state_size
protected double avg_state_size -
state_provider
-
members
-
flushProtocolInStack
protected volatile boolean flushProtocolInStack -
thread_pool
Thread pool (configured withmax_poolandpool_thread_keep_alive) to runStreamingStateTransfer.StateGetterthreads on -
state_requesters
List of members requesting state. Only a single state request is handled at any time
-
-
Constructor Details
-
StreamingStateTransfer
public StreamingStateTransfer()
-
-
Method Details
-
getNumberOfStateRequests
public long getNumberOfStateRequests() -
getNumberOfStateBytesSent
public long getNumberOfStateBytesSent() -
getAverageStateSize
public double getAverageStateSize() -
getThreadPoolSize
public int getThreadPoolSize() -
getThreadPoolCompletedTasks
public long getThreadPoolCompletedTasks() -
requiredDownServices
Description copied from class:ProtocolList of events that are required to be answered by some layer below- Overrides:
requiredDownServicesin classProtocol
-
resetStats
public void resetStats()- Overrides:
resetStatsin classProtocol
-
init
Description copied from class:ProtocolCalled after a protocol has been created and before the protocol is started. Attributes are already set. Other protocols are not yet connected and events cannot yet be sent. -
destroy
public void destroy()Description copied from class:ProtocolThis method is called on aJChannel.close(). Does some cleanup; after the call, the VM will terminate -
start
Description copied from class:ProtocolThis method is called on aJChannel.connect(String); starts work. Protocols are connected ready to receive events. Will be called from bottom to top. -
stop
public void stop()Description copied from class:ProtocolCalled on aJChannel.disconnect(); stops work (e.g. by closing multicast socket). Will be called from top to bottom. -
down
Description copied from class:ProtocolAn event is to be sent down the stack. A protocol may want to examine its type and perform some action on it, depending on the event's type. If the event is a message MSG, then the protocol may need to add a header to it (or do nothing at all) before sending it down the stack usingdown_prot.down(). -
up
Description copied from class:ProtocolAn event was received from the protocol below. Usually the current protocol will want to examine the event type and - depending on its type - perform some computation (e.g. removing headers from a MSG event type, or updating the internal membership list when receiving a VIEW_CHANGE event). Finally, the event is either a) discarded, or b) an event is sent down the stack usingdown_prot.down()or c) the event (or another event) is sent up the stack usingup_prot.up(). -
up
Description copied from class:ProtocolA single message was received. Protocols may examine the message and do something (e.g. add a header) with it before passing it up. -
up
Description copied from class:ProtocolSends up a multiple messages in aMessageBatch. The sender of the batch is always the same, and so is the destination (null == multicast messages). Messages in a batch can be OOB messages, regular messages, or mixed messages, although the transport itself will create initial MessageBatches that contain only either OOB or regular messages.The default processing below sends messages up the stack individually, based on a matching criteria (calling
Protocol.accept(Message)), and - if true - callsProtocol.up(org.jgroups.Event)for that message and removes the message. If the batch is not empty, it is passed up, or else it is dropped.Subclasses should check if there are any messages destined for them (e.g. using
MessageBatch.iterator(Predicate)), then possibly remove and process them and finally pass the batch up to the next protocol. Protocols can also modify messages in place, e.g. ENCRYPT could decrypt all encrypted messages in the batch, not remove them, and pass the batch up when done. -
handle
-
isDigestNeeded
protected boolean isDigestNeeded()When FLUSH is used we do not need to pass digests between members (see JGroups/doc/design/FLUSH.txt)- Returns:
- true if use of digests is required, false otherwise
-
handleConfig
-
handleStateChunk
-
handleEOF
-
handleException
-
getStateFromApplication
protected void getStateFromApplication(Address requester, OutputStream out, boolean use_separate_thread) -
setStateInApplication
-
closeBarrierAndSuspendStable
public void closeBarrierAndSuspendStable() -
openBarrierAndResumeStable
public void openBarrierAndResumeStable() -
openBarrier
protected void openBarrier() -
resumeStable
protected void resumeStable() -
sendEof
-
sendException
-
createThreadPool
-
determineCoordinator
-
handleViewChange
-
handle
- Specified by:
handlein interfaceProcessingQueue.Handler<Address>- Throws:
Exception
-
handleStateReq
- Throws:
Exception
-
createStreamToRequester
Creates an OutputStream to the state requester to write the state -
createStreamToProvider
protected abstract Tuple<InputStream,Object> createStreamToProvider(Address provider, StreamingStateTransfer.StateHeader hdr) throws Exception Creates an InputStream to the state provider to read the state. Return the input stream and a handback object as a tuple. The handback object is handed back to the subclass when done, or in case of an error (e.g. to clean up resources)- Throws:
Exception
-
close
-
useAsyncStateDelivery
protected boolean useAsyncStateDelivery() -
modifyStateResponseHeader
-
handleStateRsp
-
punchHoleFor
-
closeHoleFor
-