|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectorg.apache.zookeeper.server.quorum.QuorumCnxManager
public class QuorumCnxManager
This class implements a connection manager for leader election using TCP. It maintains one connection for every pair of servers. The tricky part is to guarantee that there is exactly one connection for every pair of servers that are operating correctly and that can communicate over the network. If two servers try to start a connection concurrently, then the connection manager uses a very simple tie-breaking mechanism to decide which connection to drop based on the IP addressed of the two parties. For every peer, the manager maintains a queue of messages to send. If the connection to any particular peer drops, then the sender thread puts the message back on the list. As this implementation currently uses a queue implementation to maintain messages to send to another peer, we add the message to the tail of the queue, thus changing the order of messages. Although this is not a problem for the leader election, it could be a problem when consolidating peer communication. This is to be verified, though.
| Nested Class Summary | |
|---|---|
class |
QuorumCnxManager.Listener
Thread to listen on some port |
static class |
QuorumCnxManager.Message
|
| Field Summary | |
|---|---|
QuorumCnxManager.Listener |
listener
|
ArrayBlockingQueue<QuorumCnxManager.Message> |
recvQueue
|
| Constructor Summary | |
|---|---|
QuorumCnxManager(QuorumPeer self)
|
|
| Method Summary | |
|---|---|
void |
addToRecvQueue(QuorumCnxManager.Message msg)
Inserts an element in the recvQueue. |
void |
connectAll()
Try to establish a connection with each server if one doesn't exist. |
QuorumPeer |
getQuorumPeer()
Return reference to QuorumPeer |
long |
getThreadCount()
Return number of worker threads |
void |
halt()
Flag that it is time to wrap up all activities and interrupt the listener. |
boolean |
initiateConnection(Socket sock,
Long sid)
If this server has initiated the connection, then it gives up on the connection if it loses challenge. |
QuorumCnxManager.Message |
pollRecvQueue(long timeout,
TimeUnit unit)
Retrieves and removes a message at the head of this queue, waiting up to the specified wait time if necessary for an element to become available. |
boolean |
receiveConnection(Socket sock)
If this server receives a connection request, then it gives up on the new connection if it wins. |
void |
softHalt()
A soft halt simply finishes workers. |
void |
testInitiateConnection(long sid)
Invokes initiateConnection for testing purposes |
void |
toSend(Long sid,
ByteBuffer b)
Processes invoke this message to queue a message to send. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public final ArrayBlockingQueue<QuorumCnxManager.Message> recvQueue
public final QuorumCnxManager.Listener listener
| Constructor Detail |
|---|
public QuorumCnxManager(QuorumPeer self)
| Method Detail |
|---|
public void testInitiateConnection(long sid)
throws Exception
sid -
Exception
public boolean initiateConnection(Socket sock,
Long sid)
public boolean receiveConnection(Socket sock)
public void toSend(Long sid,
ByteBuffer b)
public void connectAll()
public void halt()
public void softHalt()
public long getThreadCount()
public QuorumPeer getQuorumPeer()
public void addToRecvQueue(QuorumCnxManager.Message msg)
recvQueue. If the Queue is full, this
methods removes an element from the head of the Queue and then inserts
the element at the tail of the queue.
This method is synchronized to achieve fairness between two threads that
are trying to insert an element in the queue. Each thread checks if the
queue is full, then removes the element at the head of the queue, and
then inserts an element at the tail. This three-step process is done to
prevent a thread from blocking while inserting an element in the queue.
If we do not synchronize the call to this method, then a thread can grab
a slot in the queue created by the second thread. This can cause the call
to insert by the second thread to fail.
Note that synchronizing this method does not block another thread
from polling the queue since that synchronization is provided by the
queue itself.
msg - Reference to the message to be inserted in the queue
public QuorumCnxManager.Message pollRecvQueue(long timeout,
TimeUnit unit)
throws InterruptedException
ArrayBlockingQueue.poll(long, java.util.concurrent.TimeUnit)
InterruptedException
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||