Class Discovery

java.lang.Object
org.jgroups.stack.Protocol
org.jgroups.protocols.Discovery
All Implemented Interfaces:
Lifecycle
Direct Known Subclasses:
DNS_PING, FILE_PING, LOCAL_PING, PING, SHARED_LOOPBACK_PING, TCPGOSSIP, TCPPING

public abstract class Discovery extends Protocol
The Discovery protocol retrieves the initial membership (used by GMS and MERGE3) by sending discovery requests. We do this in subclasses of Discovery, e.g. by mcasting a discovery request (PING) or, if gossiping is enabled, by contacting the GossipRouter (TCPGOSSIP).

The responses should allow us to determine the coordinator which we have to contact, e.g. in case we want to join the group, or to see if we have diverging views in case of MERGE2.

When we are a server (after having received the BECOME_SERVER event), we'll respond to discovery requests with a discovery response.

  • Field Details

    • break_on_coord_rsp

      protected boolean break_on_coord_rsp
    • return_entire_cache

      protected boolean return_entire_cache
    • stagger_timeout

      protected long stagger_timeout
    • use_disk_cache

      protected boolean use_disk_cache
    • max_members_in_discovery_request

      protected int max_members_in_discovery_request
    • discovery_rsp_expiry_time

      protected long discovery_rsp_expiry_time
    • async_discovery

      protected boolean async_discovery
    • async_discovery_use_separate_thread_per_request

      protected boolean async_discovery_use_separate_thread_per_request
    • send_cache_on_join

      protected boolean send_cache_on_join
    • max_rank_to_reply

      protected int max_rank_to_reply
    • num_discovery_runs

      protected int num_discovery_runs
    • num_discovery_requests

      protected int num_discovery_requests
    • is_server

      protected volatile boolean is_server
    • is_leaving

      protected volatile boolean is_leaving
    • timer

      protected TimeScheduler timer
    • view

      protected volatile View view
    • is_coord

      protected volatile boolean is_coord
    • current_coord

      protected volatile Address current_coord
    • cluster_name

      protected String cluster_name
    • transport

      protected TP transport
    • ping_responses

      protected final Map<Long,Responses> ping_responses
    • discovery_req_futures

      protected final List<Future<?>> discovery_req_futures
    • transport_supports_multicasting

      protected boolean transport_supports_multicasting
    • sends_can_block

      protected boolean sends_can_block
    • discovery_rsp_callback

      protected Consumer<PingData> discovery_rsp_callback
    • WHITESPACE

      protected static final byte[] WHITESPACE
  • Constructor Details

    • Discovery

      public Discovery()
  • Method Details

    • 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
    • isDynamic

      public abstract boolean isDynamic()
    • handleDisconnect

      public void handleDisconnect()
    • handleConnect

      public void handleConnect()
    • discoveryRequestReceived

      public void discoveryRequestReceived(Address sender, String logical_name, PhysicalAddress physical_addr)
    • getClusterName

      public String getClusterName()
    • setClusterName

      public <T extends Discovery> T setClusterName(String n)
    • getNumberOfDiscoveryRequestsSent

      public int getNumberOfDiscoveryRequestsSent()
    • breakOnCoordResponse

      public boolean breakOnCoordResponse()
    • breakOnCoordResponse

      public <T extends Discovery> T breakOnCoordResponse(boolean flag)
    • returnEntireCache

      public boolean returnEntireCache()
    • returnEntireCache

      public <T extends Discovery> T returnEntireCache(boolean flag)
    • staggerTimeout

      public long staggerTimeout()
    • staggerTimeout

      public <T extends Discovery> T staggerTimeout(long timeout)
    • useDiskCache

      public boolean useDiskCache()
    • useDiskCache

      public <T extends Discovery> T useDiskCache(boolean flag)
    • discoveryRspExpiryTime

      public <T extends Discovery> T discoveryRspExpiryTime(long t)
    • sendCacheOnJoin

      public boolean sendCacheOnJoin()
    • sendCacheOnJoin

      public <T extends Discovery> T sendCacheOnJoin(boolean b)
    • getView

      public String getView()
    • getViewId

      public ViewId getViewId()
    • getCurrentCoord

      public String getCurrentCoord()
    • isMergeRunning

      protected boolean isMergeRunning()
    • sendCacheInformation

      public void sendCacheInformation()
    • providedUpServices

      public List<Integer> providedUpServices()
      Description copied from class: Protocol
      List of events that are provided to layers above (they will be handled when sent down from above)
      Overrides:
      providedUpServices in class Protocol
    • resetStats

      public void resetStats()
      Overrides:
      resetStats in class Protocol
    • addResponse

      public void addResponse(Responses rsp)
    • findMembers

      protected abstract void findMembers(List<Address> members, boolean initial_discovery, Responses responses)
      Fetches information (e.g. physical address, logical name) for the given member addresses. Needs to add responses to the Responses object. If async_discovery is true, this method will be called in a separate thread, otherwise the caller's thread will be used.
      Parameters:
      members - A list of logical addresses (typically UUIDs). If null, then information for all members is fetched
      initial_discovery - Set to true if this is for the initial membership discovery. Some protocols (e.g. file based ones) may return only the information for the coordinator(s).
      responses - The list to which responses should be added
    • findMembers

      public Responses findMembers(List<Address> members, boolean initial_discovery, boolean async, long timeout)
    • findInitialMembersAsString

      public String findInitialMembersAsString()
    • addToCache

      public void addToCache(String filename) throws Exception
      Throws:
      Exception
    • dumpCache

      public void dumpCache(String output_filename) throws Exception
      Throws:
      Exception
    • up

      public Object up(Event evt)
      Description copied from class: Protocol
      An 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 using down_prot.down() or c) the event (or another event) is sent up the stack using up_prot.up().
      Overrides:
      up 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
    • handle

      protected Object handle(PingHeader hdr, Message msg)
    • callFindMembersInAllDiscoveryProtocols

      protected void callFindMembersInAllDiscoveryProtocols(List<Address> mbrs, boolean initial_discovery, Responses rsps)
      Calls findMembers(List, boolean, Responses) in this protocol and all discovery protocols below
    • findTopmostDiscoveryProtocol

      protected Discovery findTopmostDiscoveryProtocol()
      Finds the top-most discovery protocol, starting from this. If none is found, returns this
    • handleDiscoveryResponse

      protected void handleDiscoveryResponse(List<PingData> data, Address sender)
    • handleDiscoveryResponse

      protected void handleDiscoveryResponse(PingData data, Address sender)
    • 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
    • read

      protected List<PingData> read(InputStream in)
    • write

      protected void write(List<PingData> list, OutputStream out) throws Exception
      Throws:
      Exception
    • addResponse

      protected void addResponse(PingData rsp, boolean overwrite)
    • weedOutCompletedDiscoveryResponses

      public void weedOutCompletedDiscoveryResponses()
      Removes responses which are done or whose timeout has expired (in the latter case, an expired response is marked as done)
    • addDiscoveryResponseToCaches

      protected boolean addDiscoveryResponseToCaches(Address mbr, String logical_name, PhysicalAddress physical_addr)
    • clearRequestFutures

      protected void clearRequestFutures()
    • startCacheDissemination

      protected void startCacheDissemination(List<Address> curr_mbrs, List<Address> left_mbrs, List<Address> new_mbrs)
    • serializeWithoutView

      protected ByteArray serializeWithoutView(PingData data)
      Creates a byte[] representation of the PingData, but DISCARDING the view it contains.
      Parameters:
      data - the PingData instance to serialize.
      Returns:
    • deserialize

      public static List<PingData> deserialize(byte[] data, int offset, int length) throws Exception
      Throws:
      Exception
    • marshal

      public static ByteArray marshal(PingData data)
    • marshal

      public static ByteArray marshal(PingData... list)
    • marshal

      public static ByteArray marshal(List<PingData> list)
    • readPingData

      protected List<PingData> readPingData(byte[] buffer, int offset, int length)
    • sendDiscoveryResponse

      protected void sendDiscoveryResponse(Address logical_addr, PhysicalAddress physical_addr, String logical_name, Address sender, boolean coord)
    • sendDiscoveryResponse

      protected void sendDiscoveryResponse(List<PingData> list, Address sender)
    • print

      protected static String print(List<PingData> list)
    • addressAsString

      protected static String addressAsString(Address address)
    • isCoord

      protected boolean isCoord(Address member)
    • disseminateDiscoveryInformation

      protected void disseminateDiscoveryInformation(List<Address> current_mbrs, List<Address> left_mbrs, List<Address> new_mbrs)
      Disseminates cache information (UUID/IP adddress/port/name) to the given members
      Parameters:
      current_mbrs - The current members. Guaranteed to be non-null. This is a copy and can be modified.
      left_mbrs - The members which left. These are excluded from dissemination. Can be null if no members left
      new_mbrs - The new members that we need to disseminate the information to. Will be all members if null.