Class 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.

    Author:
    Bela Ban
    • Field Detail

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

        protected volatile View view
      • is_coord

        protected volatile boolean is_coord
      • current_coord

        protected volatile Address current_coord
      • cluster_name

        protected java.lang.String cluster_name
      • transport

        protected TP transport
      • ping_responses

        protected final java.util.Map<java.lang.Long,​Responses> ping_responses
      • discovery_req_futures

        protected final java.util.List<java.util.concurrent.Future<?>> discovery_req_futures
      • transport_supports_multicasting

        protected boolean transport_supports_multicasting
      • sends_can_block

        protected boolean sends_can_block
      • discovery_rsp_callback

        protected java.util.function.Consumer<PingData> discovery_rsp_callback
      • WHITESPACE

        protected static final byte[] WHITESPACE
    • Constructor Detail

      • Discovery

        public Discovery()
    • Method Detail

      • 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.
        Specified by:
        init in interface Lifecycle
        Overrides:
        init in class Protocol
        Throws:
        java.lang.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 java.lang.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:
        java.lang.Exception - Thrown if protocol cannot be started successfully. This will cause the ProtocolStack to fail, so JChannel.connect(String) will throw an exception
      • isDynamic

        public abstract boolean isDynamic()
      • handleDisconnect

        public void handleDisconnect()
      • handleConnect

        public void handleConnect()
      • discoveryRequestReceived

        public void discoveryRequestReceived​(Address sender,
                                             java.lang.String logical_name,
                                             PhysicalAddress physical_addr)
      • getClusterName

        public java.lang.String getClusterName()
      • setClusterName

        public <T extends Discovery> T setClusterName​(java.lang.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 java.lang.String getView()
      • getViewId

        public ViewId getViewId()
      • getCurrentCoord

        public java.lang.String getCurrentCoord()
      • isMergeRunning

        protected boolean isMergeRunning()
      • sendCacheInformation

        public void sendCacheInformation()
      • providedUpServices

        public java.util.List<java.lang.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
      • addResponse

        public void addResponse​(Responses rsp)
      • findMembers

        protected abstract void findMembers​(java.util.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​(java.util.List<Address> members,
                                     boolean initial_discovery,
                                     boolean async,
                                     long timeout)
      • findInitialMembersAsString

        public java.lang.String findInitialMembersAsString()
      • addToCache

        public void addToCache​(java.lang.String filename)
                        throws java.lang.Exception
        Throws:
        java.lang.Exception
      • dumpCache

        public void dumpCache​(java.lang.String output_filename)
                       throws java.lang.Exception
        Throws:
        java.lang.Exception
      • up

        public java.lang.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 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.
        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
      • callFindMembersInAllDiscoveryProtocols

        protected void callFindMembersInAllDiscoveryProtocols​(java.util.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​(java.util.List<PingData> data,
                                               Address sender)
      • handleDiscoveryResponse

        protected void handleDiscoveryResponse​(PingData data,
                                               Address sender)
      • 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 using down_prot.down().
        Overrides:
        down in class Protocol
      • read

        protected java.util.List<PingData> read​(java.io.InputStream in)
      • write

        protected void write​(java.util.List<PingData> list,
                             java.io.OutputStream out)
                      throws java.lang.Exception
        Throws:
        java.lang.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,
                                                       java.lang.String logical_name,
                                                       PhysicalAddress physical_addr)
      • clearRequestFutures

        protected void clearRequestFutures()
      • startCacheDissemination

        protected void startCacheDissemination​(java.util.List<Address> curr_mbrs,
                                               java.util.List<Address> left_mbrs,
                                               java.util.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 java.util.List<PingData> deserialize​(byte[] data,
                                                           int offset,
                                                           int length)
                                                    throws java.lang.Exception
        Throws:
        java.lang.Exception
      • readPingData

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

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

        protected void sendDiscoveryResponse​(java.util.List<PingData> list,
                                             Address sender)
      • print

        protected static java.lang.String print​(java.util.List<PingData> list)
      • addressAsString

        protected static java.lang.String addressAsString​(Address address)
      • isCoord

        protected boolean isCoord​(Address member)
      • disseminateDiscoveryInformation

        protected void disseminateDiscoveryInformation​(java.util.List<Address> current_mbrs,
                                                       java.util.List<Address> left_mbrs,
                                                       java.util.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.