Package org.jgroups.protocols
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.- Author:
- Bela Ban
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected classDiscovery.DiscoveryCacheDisseminationTask
-
Field Summary
Fields Modifier and Type Field Description protected booleanasync_discoveryprotected booleanasync_discovery_use_separate_thread_per_requestprotected booleanbreak_on_coord_rspprotected java.lang.Stringcluster_nameprotected Addresscurrent_coordprotected java.util.List<java.util.concurrent.Future<?>>discovery_req_futuresprotected java.util.function.Consumer<PingData>discovery_rsp_callbackprotected longdiscovery_rsp_expiry_timeprotected booleanis_coordprotected booleanis_leavingprotected booleanis_serverprotected intmax_members_in_discovery_requestprotected intmax_rank_to_replyprotected intnum_discovery_requestsprotected intnum_discovery_runsprotected java.util.Map<java.lang.Long,Responses>ping_responsesprotected booleanreturn_entire_cacheprotected booleansend_cache_on_joinprotected booleansends_can_blockprotected longstagger_timeoutprotected TimeSchedulertimerprotected TPtransportprotected booleantransport_supports_multicastingprotected booleanuse_disk_cacheprotected Viewviewprotected static byte[]WHITESPACE-
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 Discovery()
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected booleanaddDiscoveryResponseToCaches(Address mbr, java.lang.String logical_name, PhysicalAddress physical_addr)protected voidaddResponse(PingData rsp, boolean overwrite)voidaddResponse(Responses rsp)protected static java.lang.StringaddressAsString(Address address)voidaddToCache(java.lang.String filename)booleanbreakOnCoordResponse()<T extends Discovery>
TbreakOnCoordResponse(boolean flag)protected voidcallFindMembersInAllDiscoveryProtocols(java.util.List<Address> mbrs, boolean initial_discovery, Responses rsps)CallsfindMembers(List, boolean, Responses)in this protocol and all discovery protocols belowprotected voidclearRequestFutures()static java.util.List<PingData>deserialize(byte[] data, int offset, int length)voiddiscoveryRequestReceived(Address sender, java.lang.String logical_name, PhysicalAddress physical_addr)<T extends Discovery>
TdiscoveryRspExpiryTime(long t)protected voiddisseminateDiscoveryInformation(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 membersjava.lang.Objectdown(Event evt)An event is to be sent down the stack.voiddumpCache(java.lang.String output_filename)java.lang.StringfindInitialMembersAsString()ResponsesfindMembers(java.util.List<Address> members, boolean initial_discovery, boolean async, long timeout)protected abstract voidfindMembers(java.util.List<Address> members, boolean initial_discovery, Responses responses)Fetches information (e.g.protected DiscoveryfindTopmostDiscoveryProtocol()Finds the top-most discovery protocol, starting from this.java.lang.StringgetClusterName()java.lang.StringgetCurrentCoord()intgetNumberOfDiscoveryRequestsSent()java.lang.StringgetView()ViewIdgetViewId()protected java.lang.Objecthandle(PingHeader hdr, Message msg)voidhandleConnect()voidhandleDisconnect()protected voidhandleDiscoveryResponse(java.util.List<PingData> data, Address sender)protected voidhandleDiscoveryResponse(PingData data, Address sender)voidinit()Called after a protocol has been created and before the protocol is started.protected booleanisCoord(Address member)abstract booleanisDynamic()protected booleanisMergeRunning()static ByteArraymarshal(java.util.List<PingData> list)static ByteArraymarshal(PingData data)static ByteArraymarshal(PingData... list)protected static java.lang.Stringprint(java.util.List<PingData> list)java.util.List<java.lang.Integer>providedUpServices()List of events that are provided to layers above (they will be handled when sent down from above)protected java.util.List<PingData>read(java.io.InputStream in)protected java.util.List<PingData>readPingData(byte[] buffer, int offset, int length)voidresetStats()booleanreturnEntireCache()<T extends Discovery>
TreturnEntireCache(boolean flag)voidsendCacheInformation()booleansendCacheOnJoin()<T extends Discovery>
TsendCacheOnJoin(boolean b)protected voidsendDiscoveryResponse(java.util.List<PingData> list, Address sender)protected voidsendDiscoveryResponse(Address logical_addr, PhysicalAddress physical_addr, java.lang.String logical_name, Address sender, boolean coord)protected ByteArrayserializeWithoutView(PingData data)Creates a byte[] representation of the PingData, but DISCARDING the view it contains.<T extends Discovery>
TsetClusterName(java.lang.String n)longstaggerTimeout()<T extends Discovery>
TstaggerTimeout(long timeout)voidstart()This method is called on aJChannel.connect(String); starts work.protected voidstartCacheDissemination(java.util.List<Address> curr_mbrs, java.util.List<Address> left_mbrs, java.util.List<Address> new_mbrs)voidstop()Called on aJChannel.disconnect(); stops work (e.g.java.lang.Objectup(Event evt)An event was received from the protocol below.java.lang.Objectup(Message msg)A single message was received.voidup(MessageBatch batch)Sends up a multiple messages in aMessageBatch.booleanuseDiskCache()<T extends Discovery>
TuseDiskCache(boolean flag)voidweedOutCompletedDiscoveryResponses()Removes responses which are done or whose timeout has expired (in the latter case, an expired response is marked as done)protected voidwrite(java.util.List<PingData> list, java.io.OutputStream out)-
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, removePolicy, requiredDownServices, requiredUpServices, resetStatistics, setAddress, setDownProtocol, setErgonomics, setId, setLevel, setPolicies, setProtocolStack, setSocketFactory, setUpProtocol, setValue, statsEnabled, toString
-
-
-
-
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
-
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 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
-
-
Method Detail
-
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.
-
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:ProtocolList of events that are provided to layers above (they will be handled when sent down from above)- Overrides:
providedUpServicesin classProtocol
-
resetStats
public void resetStats()
- Overrides:
resetStatsin classProtocol
-
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 theResponsesobject. Ifasync_discoveryis 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 (typicallyUUIDs). If null, then information for all members is fetchedinitial_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:ProtocolAn 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 usingdown_prot.down()or c) the event (or another event) is sent up the stack usingup_prot.up().
-
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.
-
handle
protected java.lang.Object handle(PingHeader hdr, Message msg)
-
callFindMembersInAllDiscoveryProtocols
protected void callFindMembersInAllDiscoveryProtocols(java.util.List<Address> mbrs, boolean initial_discovery, Responses rsps)
CallsfindMembers(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)
-
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().
-
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 leftnew_mbrs- The new members that we need to disseminate the information to. Will be all members if null.
-
-