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
  • Field Details

    • 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 Future<?> info_sender_future
    • view_consistency_checker

      protected Future<?> view_consistency_checker
    • views

      protected final Map<Address,ViewId> views
    • view_rsps

      protected final ResponseCollector<View> view_rsps
    • transport_supports_multicasting

      protected boolean transport_supports_multicasting
    • cluster_name

      protected String cluster_name
    • discovery_rsp_cb

      protected final 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
  • Constructor Details

    • MERGE3

      public MERGE3()
  • Method Details

    • getViews

      public int getViews()
    • getNumMergeEvents

      public int getNumMergeEvents()
    • isViewConsistencyCheckerRunning

      public boolean isViewConsistencyCheckerRunning()
    • isMergeTaskRunning

      public boolean isMergeTaskRunning()
    • isInfoSenderRunning

      public boolean isInfoSenderRunning()
    • dumpViews

      public String dumpViews()
    • clearViews

      public void clearViews()
    • sendInfo

      public void sendInfo()
    • checkInconsistencies

      public void checkInconsistencies()
    • init

      public void init() throws 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.
      Specified by:
      init in interface Lifecycle
      Overrides:
      init in class Protocol
      Throws:
      Exception - Thrown if protocol cannot be initialized successfully. This will cause the ProtocolStack to fail, so the the channel constructor will throw an exception
    • start

      public void start() throws Exception
      Description copied from class: Protocol
      This method is called on a JChannel.connect(String); starts work. Protocols are connected ready to receive events. Will be called from bottom to top.
      Specified by:
      start in interface Lifecycle
      Overrides:
      start in class Protocol
      Throws:
      Exception - Thrown if protocol cannot be started successfully. This will cause the ProtocolStack to fail, so JChannel.connect(String) will throw an exception
    • stop

      public void stop()
      Description copied from class: Protocol
      Called on a JChannel.disconnect(); stops work (e.g. by closing multicast socket). Will be called from top to bottom.
      Specified by:
      stop in interface Lifecycle
      Overrides:
      stop in class Protocol
    • 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 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 using down_prot.down().
      Overrides:
      down in class Protocol
    • up

      public 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.
      Overrides:
      up in class Protocol
    • up

      public void up(MessageBatch batch)
      Description copied from class: Protocol
      Sends up a multiple messages in a MessageBatch. 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 - calls Protocol.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.

      Overrides:
      up in class Protocol
      Parameters:
      batch - The message batch
    • detectDifferentViews

      public static List<View> detectDifferentViews(Map<Address,View> map)
    • marshal

      public static ByteArray marshal(View view)
    • readView

      protected View readView(byte[] buffer, int offset, int length)
    • handle

      protected Object handle(MERGE3.MergeHeader hdr, Message msg)
    • createInfo

      protected MERGE3.MergeHeader createInfo()
    • addInfo

      protected void addInfo(Address sender, ViewId view_id, String logical_name, PhysicalAddress physical_addr)
      Adds received INFO to views hashmap
    • convertViews

      protected Map<ViewId,Set<Address>> convertViews()
    • differentViewIds

      protected boolean differentViewIds()
    • sendInfoMessage

      protected void sendInfoMessage(PingData data)