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 class
MERGE3.InfoSender
static class
MERGE3.MergeHeader
protected class
MERGE3.ViewConsistencyChecker
-
Field Summary
Fields Modifier and Type Field Description protected Event
ASYNC_DISCOVERY_EVENT
protected long
check_interval
protected java.lang.String
cluster_name
protected java.util.function.Consumer<PingData>
discovery_rsp_cb
protected MERGE3.InfoSender
info_sender
protected java.util.concurrent.Future<?>
info_sender_future
protected boolean
is_coord
protected long
max_interval
protected int
max_participants_in_merge
protected long
min_interval
protected int
num_merge_events
protected TimeScheduler
timer
protected boolean
transport_supports_multicasting
protected View
view
protected java.util.concurrent.Future<?>
view_consistency_checker
protected ResponseCollector<View>
view_rsps
protected 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 void
addInfo(Address sender, ViewId view_id, java.lang.String logical_name, PhysicalAddress physical_addr)
Adds received INFO to views hashmapvoid
checkInconsistencies()
void
clearViews()
protected long
computeCheckInterval()
protected java.util.Map<ViewId,java.util.Set<Address>>
convertViews()
protected MERGE3.MergeHeader
createInfo()
static java.util.List<View>
detectDifferentViews(java.util.Map<Address,View> map)
protected boolean
differentViewIds()
java.lang.Object
down(Event evt)
An event is to be sent down the stack.java.lang.String
dumpViews()
long
getCheckInterval()
long
getMaxInterval()
int
getMaxParticipantsInMerge()
long
getMinInterval()
int
getNumMergeEvents()
int
getViews()
protected java.lang.Object
handle(MERGE3.MergeHeader hdr, Message msg)
void
init()
Called after a protocol has been created and before the protocol is started.boolean
isCoord()
boolean
isInfoSenderRunning()
protected boolean
isMergeRunning()
boolean
isMergeTaskRunning()
boolean
isViewConsistencyCheckerRunning()
static ByteArray
marshal(View view)
protected View
readView(byte[] buffer, int offset, int length)
void
sendInfo()
protected void
sendInfoMessage(PingData data)
MERGE3
setCheckInterval(long ci)
MERGE3
setMaxInterval(long val)
MERGE3
setMaxParticipantsInMerge(int m)
MERGE3
setMinInterval(long i)
void
start()
This method is called on aJChannel.connect(String)
; starts work.protected void
startInfoSender()
protected void
startViewConsistencyChecker()
void
stop()
Called on aJChannel.disconnect()
; stops work (e.g.protected void
stopInfoSender()
protected void
stopViewConsistencyChecker()
java.lang.Object
up(Message msg)
A single message was received.void
up(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.Exception
Description copied from class:Protocol
Called 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.Exception
Description copied from class:Protocol
This 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:
start
in interfaceLifecycle
- Overrides:
start
in 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:Protocol
Called 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:Protocol
An 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:Protocol
A 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:Protocol
Sends 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)
-
-