public class FD_SOCK extends Protocol implements java.lang.Runnable
A pinger thread will be started when the membership goes above 1 and will be stopped when it drops below 2. The pinger thread connects to its neighbor on the right and waits until the socket is closed. When the socket is closed by the monitored peer in an abnormal fashion (IOException), the neighbor will be suspected.
The main feature of this protocol is that no ping messages need to be exchanged between any 2 peers, as failure detection relies entirely on TCP sockets. The advantage is that no activity will take place between 2 peers as long as they are alive (i.e. have their server sockets open). The disadvantage is that hung servers or crashed routers will not cause sockets to be closed, therefore they won't be detected.
The costs involved are 2 additional threads: one that monitors the client side of the socket connection (to monitor a peer) and another one that manages the server socket. However, those threads will be idle as long as both peers are running.
Modifier and Type | Class and Description |
---|---|
protected class |
FD_SOCK.BroadcastTask
Task that periodically broadcasts a list of suspected members to the group.
|
protected static class |
FD_SOCK.ClientConnectionHandler
Handles a client connection; multiple client can connect at the same time
|
static class |
FD_SOCK.FdHeader |
protected class |
FD_SOCK.ServerSocketHandler
Handles the server-side of a client-server socket connection.
|
Modifier and Type | Field and Description |
---|---|
protected static int |
ABNORMAL_TERMINATION |
protected FD_SOCK.BroadcastTask |
bcast_task |
protected java.net.InetAddress |
bind_addr |
protected java.lang.String |
bind_interface_str |
protected LazyRemovalCache<Address,IpAddress> |
cache
Cache of member addresses and their ServerSocket addresses
|
protected long |
cache_max_age |
protected int |
cache_max_elements |
protected int |
client_bind_port |
protected java.net.InetAddress |
external_addr |
protected int |
external_port |
protected Promise<java.util.Map<Address,IpAddress>> |
get_cache_promise
Used to rendezvous on GET_CACHE and GET_CACHE_RSP
|
protected long |
get_cache_timeout |
protected boolean |
got_cache_from_coord |
protected boolean |
keep_alive |
protected Address |
local_addr |
protected java.util.concurrent.locks.Lock |
lock |
protected boolean |
log_suspected_msgs |
protected java.util.List<Address> |
members |
protected static int |
NORMAL_TERMINATION |
protected int |
num_suspect_events |
protected int |
num_tries |
protected Promise<IpAddress> |
ping_addr_promise |
protected Address |
ping_dest |
protected java.io.InputStream |
ping_input |
protected java.net.Socket |
ping_sock |
protected java.util.List<Address> |
pingable_mbrs |
protected java.lang.Thread |
pinger_thread |
protected int |
port_range |
protected boolean |
regular_sock_close |
protected boolean |
shuttin_down |
protected int |
sock_conn_timeout |
protected java.net.ServerSocket |
srv_sock |
protected IpAddress |
srv_sock_addr |
protected FD_SOCK.ServerSocketHandler |
srv_sock_handler |
protected boolean |
srv_sock_sent |
protected int |
start_port |
protected BoundedList<java.lang.String> |
suspect_history |
protected long |
suspect_msg_interval |
protected java.util.Set<Address> |
suspected_mbrs |
protected TimeScheduler |
timer |
after_creation_hook, down_prot, ergonomics, id, log, name, stack, stats, up_prot
Constructor and Description |
---|
FD_SOCK() |
Modifier and Type | Method and Description |
---|---|
protected void |
broadcastSuspectMessage(Address suspected_mbr)
Sends a SUSPECT message to all group members.
|
protected void |
broadcastUnuspectMessage(Address mbr) |
protected Address |
determineCoordinator() |
protected Address |
determinePingDest() |
java.lang.Object |
down(Event evt)
An event is to be sent down the stack.
|
protected IpAddress |
fetchPingAddress(Address mbr)
Attempts to obtain the ping_addr first from the cache, then by unicasting q request to
mbr ,
then by multicasting a request to all members. |
protected void |
getCacheFromCoordinator()
Determines coordinator C.
|
java.lang.String |
getLocalAddress() |
java.lang.String |
getMembers() |
int |
getNumSuspectedMembers() |
int |
getNumSuspectEventsGenerated() |
java.lang.String |
getPingableMembers() |
java.lang.String |
getPingDest() |
java.lang.String |
getSuspectedMembers() |
protected void |
handleSocketClose(java.lang.Exception ex) |
void |
init()
Called after instance has been created (null constructor) and before protocol is started.
|
protected void |
interruptPingerThread(boolean sendTerminationSignal)
Interrupts the pinger thread.
|
boolean |
isLogSuspectedMessages() |
boolean |
isNodeCrashMonitorRunning() |
protected boolean |
isPingerThreadRunning() |
static Buffer |
marshal(LazyRemovalCache<Address,IpAddress> addrs) |
java.lang.String |
printCache() |
java.lang.String |
printSuspectHistory() |
void |
resetStats() |
void |
run()
Runs as long as there are 2 members and more.
|
protected void |
sendIHaveSockMessage(Address dst,
Address mbr,
IpAddress addr)
Sends or broadcasts a I_HAVE_SOCK response.
|
protected void |
sendPingSignal(int signal) |
protected void |
sendPingTermination() |
void |
setLogSuspectedMessages(boolean log_suspected_msgs) |
protected boolean |
setupPingSocket(IpAddress dest)
Creates a socket to
dest , and assigns it to ping_sock. |
protected static java.lang.String |
signalToString(int signal) |
void |
start()
This method is called on a
Channel.connect(String) . |
boolean |
startNodeCrashMonitor() |
protected boolean |
startPingerThread()
Does *not* need to be synchronized on pinger_mutex because the caller (down()) already has the mutex acquired
|
protected void |
startServerSocket() |
void |
stop()
This method is called on a
Channel.disconnect() . |
protected void |
stopPingerThread() |
void |
stopServerSocket(boolean graceful) |
protected void |
suspect(java.util.Set<Address> suspects) |
protected void |
teardownPingSocket() |
protected java.util.Map<Address,IpAddress> |
unmarshal(byte[] buffer,
int offset,
int length) |
protected void |
unsuspect(Address mbr) |
java.lang.Object |
up(Event evt)
An event was received from the layer below.
|
accept, afterCreationHook, destroy, dumpStats, enableStats, getConfigurableObjects, getDownProtocol, getDownServices, getId, getIdsAbove, getLevel, getLog, getName, getProtocolStack, getSocketFactory, getThreadFactory, getTransport, getUpProtocol, getUpServices, getValue, isErgonomics, level, parse, printStats, providedDownServices, providedUpServices, requiredDownServices, requiredUpServices, resetStatistics, setDownProtocol, setErgonomics, setId, setLevel, setProtocolStack, setSocketFactory, setUpProtocol, setValue, setValues, statsEnabled, up
protected static final int NORMAL_TERMINATION
protected static final int ABNORMAL_TERMINATION
protected java.net.InetAddress bind_addr
protected java.net.InetAddress external_addr
protected int external_port
protected java.lang.String bind_interface_str
protected long get_cache_timeout
protected int cache_max_elements
protected long cache_max_age
protected long suspect_msg_interval
protected int num_tries
protected int start_port
protected int client_bind_port
protected int port_range
protected boolean keep_alive
protected int sock_conn_timeout
protected int num_suspect_events
protected final BoundedList<java.lang.String> suspect_history
protected volatile java.util.List<Address> members
protected final java.util.Set<Address> suspected_mbrs
protected final java.util.List<Address> pingable_mbrs
protected volatile boolean srv_sock_sent
protected final Promise<java.util.Map<Address,IpAddress>> get_cache_promise
protected volatile boolean got_cache_from_coord
protected Address local_addr
protected java.net.ServerSocket srv_sock
protected FD_SOCK.ServerSocketHandler srv_sock_handler
protected IpAddress srv_sock_addr
protected Address ping_dest
protected java.net.Socket ping_sock
protected java.io.InputStream ping_input
protected volatile java.lang.Thread pinger_thread
protected LazyRemovalCache<Address,IpAddress> cache
protected final java.util.concurrent.locks.Lock lock
protected TimeScheduler timer
protected final FD_SOCK.BroadcastTask bcast_task
protected volatile boolean regular_sock_close
protected volatile boolean shuttin_down
protected boolean log_suspected_msgs
public java.lang.String getLocalAddress()
public java.lang.String getMembers()
public java.lang.String getPingableMembers()
public java.lang.String getSuspectedMembers()
public int getNumSuspectedMembers()
public java.lang.String getPingDest()
public int getNumSuspectEventsGenerated()
public boolean isNodeCrashMonitorRunning()
public boolean isLogSuspectedMessages()
public void setLogSuspectedMessages(boolean log_suspected_msgs)
public java.lang.String printSuspectHistory()
public java.lang.String printCache()
public boolean startNodeCrashMonitor()
public void init() throws java.lang.Exception
Protocol
public void start() throws java.lang.Exception
Protocol
Channel.connect(String)
. Starts work.
Protocols are connected and queues are ready to receive events.
Will be called from bottom to top. This call will replace
the START and START_OK events.start
in class Protocol
java.lang.Exception
- Thrown if protocol cannot be started successfully. This will cause the ProtocolStack
to fail, so Channel.connect(String)
will throw an exceptionpublic void stop()
Protocol
Channel.disconnect()
. Stops work (e.g. by closing multicast socket).
Will be called from top to bottom. This means that at the time of the method invocation the
neighbor protocol below is still working. This method will replace the
STOP, STOP_OK, CLEANUP and CLEANUP_OK events. The ProtocolStack guarantees that
when this method is called all messages in the down queue will have been flushedpublic void resetStats()
resetStats
in class Protocol
public java.lang.Object up(Event evt)
Protocol
down_prot.down()
or c) the event (or another event) is sent up
the stack using up_prot.up()
.public java.lang.Object down(Event evt)
Protocol
down_prot.down()
. In case of a GET_ADDRESS event (which tries to
retrieve the stack's address from one of the bottom layers), the layer may need to send
a new response event back up the stack using up_prot.up()
.public void run()
run
in interface java.lang.Runnable
protected boolean isPingerThreadRunning()
protected void suspect(java.util.Set<Address> suspects)
protected void unsuspect(Address mbr)
protected void handleSocketClose(java.lang.Exception ex)
protected boolean startPingerThread()
protected void interruptPingerThread(boolean sendTerminationSignal)
Oct 29 2001 (bela): completely removed Thread.interrupt(), but used socket close on all OSs. This makes this code portable and we don't have to check for OSs.
protected void stopPingerThread()
protected void sendPingTermination()
protected void sendPingSignal(int signal)
protected void startServerSocket() throws java.lang.Exception
java.lang.Exception
public void stopServerSocket(boolean graceful)
protected boolean setupPingSocket(IpAddress dest)
dest
, and assigns it to ping_sock. Also assigns ping_inputprotected void teardownPingSocket()
protected void getCacheFromCoordinator()
protected void broadcastSuspectMessage(Address suspected_mbr)
protected void broadcastUnuspectMessage(Address mbr)
protected void sendIHaveSockMessage(Address dst, Address mbr, IpAddress addr)
protected IpAddress fetchPingAddress(Address mbr)
mbr
,
then by multicasting a request to all members.protected Address determinePingDest()
public static Buffer marshal(LazyRemovalCache<Address,IpAddress> addrs)
protected java.util.Map<Address,IpAddress> unmarshal(byte[] buffer, int offset, int length)
protected Address determineCoordinator()
protected static java.lang.String signalToString(int signal)
Copyright © 1998-2020 Red Hat. All Rights Reserved.