Package org.jgroups.protocols
Class MERGE3
- java.lang.Object
-
- org.jgroups.stack.Protocol
-
- org.jgroups.protocols.MERGE3
-
- All Implemented Interfaces:
Lifecycle
public class MERGE3 extends Protocol
Protocol to discover subgroups; e.g., existing due to a network partition (that healed). Example: group {p,q,r,s,t,u,v,w} is split into 3 subgroups {p,q}, {r,s,t,u} and {v,w}. This protocol will eventually send a MERGE event with the views of each subgroup up the stack: {p,r,v}. Works as follows (https://issues.redhat.com/browse/JGRP-1387): every member periodically broadcasts its address (UUID), logical name, physical address and ViewID information. Other members collect this information and see if the ViewIds are different (indication of different subpartitions). If they are, the member with the lowest address (first in the sorted list of collected addresses) sends a MERGE event up the stack, which will be handled by GMS. The others do nothing. The advantage compared to MERGE2 is that there are no merge collisions caused by multiple merges going on. Also, the INFO traffic is spread out over max_interval, and every member sends its physical address with INFO, so we don't need to fetch the physical address first.- Since:
- 3.1
- Author:
- Bela Ban, Nov 2011
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected classMERGE3.InfoSenderstatic classMERGE3.MergeHeaderprotected classMERGE3.ViewConsistencyChecker
-
Field Summary
Fields Modifier and Type Field Description protected EventASYNC_DISCOVERY_EVENTprotected longcheck_intervalprotected java.lang.Stringcluster_nameprotected java.util.function.Consumer<PingData>discovery_rsp_cbprotected MERGE3.InfoSenderinfo_senderprotected java.util.concurrent.Future<?>info_sender_futureprotected booleanis_coordprotected longmax_intervalprotected intmax_participants_in_mergeprotected longmin_intervalprotected intnum_merge_eventsprotected TimeSchedulertimerprotected booleantransport_supports_multicastingprotected Viewviewprotected java.util.concurrent.Future<?>view_consistency_checkerprotected ResponseCollector<View>view_rspsprotected java.util.Map<Address,ViewId>views-
Fields 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 Constructor Description MERGE3()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaddInfo(Address sender, ViewId view_id, java.lang.String logical_name, PhysicalAddress physical_addr)Adds received INFO to views hashmapvoidcheckInconsistencies()voidclearViews()protected longcomputeCheckInterval()protected java.util.Map<ViewId,java.util.Set<Address>>convertViews()protected MERGE3.MergeHeadercreateInfo()static java.util.List<View>detectDifferentViews(java.util.Map<Address,View> map)protected booleandifferentViewIds()java.lang.Objectdown(Event evt)An event is to be sent down the stack.java.lang.StringdumpViews()longgetCheckInterval()longgetMaxInterval()intgetMaxParticipantsInMerge()longgetMinInterval()intgetNumMergeEvents()intgetViews()protected java.lang.Objecthandle(MERGE3.MergeHeader hdr, Message msg)voidinit()Called after a protocol has been created and before the protocol is started.booleanisCoord()booleanisInfoSenderRunning()protected booleanisMergeRunning()booleanisMergeTaskRunning()booleanisViewConsistencyCheckerRunning()static ByteArraymarshal(View view)protected ViewreadView(byte[] buffer, int offset, int length)voidsendInfo()protected voidsendInfoMessage(PingData data)MERGE3setCheckInterval(long ci)MERGE3setMaxInterval(long val)MERGE3setMaxParticipantsInMerge(int m)MERGE3setMinInterval(long i)voidstart()This method is called on aJChannel.connect(String); starts work.protected voidstartInfoSender()protected voidstartViewConsistencyChecker()voidstop()Called on aJChannel.disconnect(); stops work (e.g.protected voidstopInfoSender()protected voidstopViewConsistencyChecker()java.lang.Objectup(Message msg)A single message was received.voidup(MessageBatch batch)Sends up a multiple messages in aMessageBatch.-
Methods inherited from class org.jgroups.stack.Protocol
accept, addPolicy, addr, addr, afterCreationHook, destroy, 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, requiredDownServices, requiredUpServices, resetStatistics, resetStats, setAddress, setDownProtocol, setErgonomics, setId, setLevel, setPolicies, setProtocolStack, setSocketFactory, setUpProtocol, setValue, statsEnabled, toString, up
-
-
-
-
Field Detail
-
min_interval
protected long min_interval
-
max_interval
protected long max_interval
-
max_participants_in_merge
protected int max_participants_in_merge
-
check_interval
protected long check_interval
-
view
protected volatile View view
-
timer
protected TimeScheduler timer
-
info_sender
protected final MERGE3.InfoSender info_sender
-
info_sender_future
protected java.util.concurrent.Future<?> info_sender_future
-
view_consistency_checker
protected java.util.concurrent.Future<?> view_consistency_checker
-
view_rsps
protected final ResponseCollector<View> view_rsps
-
transport_supports_multicasting
protected boolean transport_supports_multicasting
-
cluster_name
protected java.lang.String cluster_name
-
discovery_rsp_cb
protected final java.util.function.Consumer<PingData> discovery_rsp_cb
-
ASYNC_DISCOVERY_EVENT
protected final Event ASYNC_DISCOVERY_EVENT
-
is_coord
protected volatile boolean is_coord
-
num_merge_events
protected int num_merge_events
-
-
Method Detail
-
getViews
public int getViews()
-
getNumMergeEvents
public int getNumMergeEvents()
-
isViewConsistencyCheckerRunning
public boolean isViewConsistencyCheckerRunning()
-
isMergeTaskRunning
public boolean isMergeTaskRunning()
-
isInfoSenderRunning
public boolean isInfoSenderRunning()
-
dumpViews
public java.lang.String dumpViews()
-
clearViews
public void clearViews()
-
sendInfo
public void sendInfo()
-
checkInconsistencies
public void checkInconsistencies()
-
init
public void init() throws java.lang.ExceptionDescription 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.
-
start
public void start() throws java.lang.ExceptionDescription 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.- Specified by:
startin interfaceLifecycle- Overrides:
startin classProtocol- Throws:
java.lang.Exception- Thrown if protocol cannot be started successfully. This will cause the ProtocolStack to fail, soJChannel.connect(String)will throw an exception
-
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.
-
getMinInterval
public long getMinInterval()
-
setMinInterval
public MERGE3 setMinInterval(long i)
-
getMaxInterval
public long getMaxInterval()
-
setMaxInterval
public MERGE3 setMaxInterval(long val)
-
getCheckInterval
public long getCheckInterval()
-
setCheckInterval
public MERGE3 setCheckInterval(long ci)
-
getMaxParticipantsInMerge
public int getMaxParticipantsInMerge()
-
setMaxParticipantsInMerge
public MERGE3 setMaxParticipantsInMerge(int m)
-
isCoord
public boolean isCoord()
-
computeCheckInterval
protected long computeCheckInterval()
-
isMergeRunning
protected boolean isMergeRunning()
-
startInfoSender
protected void startInfoSender()
-
stopInfoSender
protected void stopInfoSender()
-
startViewConsistencyChecker
protected void startViewConsistencyChecker()
-
stopViewConsistencyChecker
protected void stopViewConsistencyChecker()
-
down
public java.lang.Object down(Event evt)
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
public java.lang.Object up(Message msg)
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
public void up(MessageBatch batch)
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 (callingProtocol.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. usingMessageBatch.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.
-
detectDifferentViews
public static java.util.List<View> detectDifferentViews(java.util.Map<Address,View> map)
-
readView
protected View readView(byte[] buffer, int offset, int length)
-
handle
protected java.lang.Object handle(MERGE3.MergeHeader hdr, Message msg)
-
createInfo
protected MERGE3.MergeHeader createInfo()
-
addInfo
protected void addInfo(Address sender, ViewId view_id, java.lang.String logical_name, PhysicalAddress physical_addr)
Adds received INFO to views hashmap
-
differentViewIds
protected boolean differentViewIds()
-
sendInfoMessage
protected void sendInfoMessage(PingData data)
-
-