|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectgroupmgmt.GroupDisseminator
groupmgmt.impl.SinglePhaseDisseminator
The SinglePhaseDisseminator class. Responsible for coordinating group changes with members of the group.
This implementation does that via a "Single-phase transaction", ie it sends a message to everyone in the group and assumes that they got it. One member of the group is designated Leader, and it keeps a graph of the connections within its group (implemented as a Hashtable). The followers notify the leader of changes in their connections, and the leader updates its graph and changes the group when needed.
Multiple removes can be done simultaneously by the leader.
Adds must be serialized (to keep leader-leader communication simple), this
is done by the ConnectionChangeQueue.
Messages used:
## FUTURE WORK:
##
## anticipate potential problems with refusedchanges.
## (theoretically ConnectionChangeMessages could get out of order).
## handle unexpected loss of connection to leader/robustness in general
## test with large groups. algorithms fast/scalable enough?
Nested Class Summary | |
private class |
SinglePhaseDisseminator.ConnectionChangeQueue
Private inner class to maintain a queue of connection changes to be processed. |
private class |
SinglePhaseDisseminator.DebugFrame
## For testing. |
private class |
SinglePhaseDisseminator.MessageListener
A private inner class to listen for group changes (non-leaders) or notification messages (leaders). |
private class |
SinglePhaseDisseminator.ProcessMessageQueue
Queue so that we can pause processing of messages during disengagement. |
Field Summary | |
private SinglePhaseDisseminator.ConnectionChangeQueue |
connectionChangeQueue
Leader-only. |
private java.util.Hashtable |
connections
Leader-only. |
private SinglePhaseDisseminator.DebugFrame |
debugFrame
For debugging. |
private boolean |
debugging
Determines whether to output log messages and show debugFrame. |
private java.lang.Boolean |
disengaging
If I am currently disengaging, is set to true. |
private int |
disseminatorPort
The port to send/receive messages on. |
private Member |
engaging
If I am currently engaging, contains the Member with which I'm engaging. |
private SPGroupChangeMessage |
lastGroupChangeMessage
Keep track of the last GroupChangeMessage we've received in order to make sure new ones are in fact newer. |
private Member |
leader
Reference to the leader of the group. |
private SinglePhaseDisseminator.MessageListener |
messageListener
Listens for messages from fellow group members. |
private int |
portOffset
The offset to use to find the port that the disseminators should communicate on (relative to the groupmgmt port passed to GroupManager). |
private SinglePhaseDisseminator.ProcessMessageQueue |
processMessageQueue
Queues received messages for processing. |
Fields inherited from class groupmgmt.GroupDisseminator |
|
Constructor Summary | |
SinglePhaseDisseminator(int portOffset)
Constructor. |
Method Summary | |
private void |
addConnection(Member m1,
Member m2)
Private utility method to add a connection to my network graph. |
void |
changeGroup(Member[] arriving,
Member[] departing)
Process a change in connectivity detected by MemberDetector Send it to the connectionChangeQueue to process. |
protected void |
fireGroupChangedEvent(java.util.Vector members)
Helper method to automatically construct the event before firing. |
private void |
getGroupOfMember(Member m,
java.util.Vector g,
java.util.Hashtable table,
java.util.Hashtable newTable)
Leader-only. |
private boolean |
isLeader()
Accessor to isLeader variable. |
private void |
log(java.lang.String msg)
For testing. |
private java.util.Vector |
partitionGroups()
Leader-only. |
private void |
processArriving(SPChange arrive)
Leader-only. |
private void |
processChangeRefusedMessage(SPChangeRefusedMessage message)
The connection change we sent to a leader has been refused because it no longer applies to that leader. |
private void |
processConnectionChangesMessage(SPConnectionChangesMessage m)
Leader-only. |
private void |
processDeparting(java.util.Vector departing)
Leader-only. |
private void |
processGetLeaderMessage(SPGetLeaderMessage message)
Sent by the leader of another group that wishes to add me. |
private void |
processGroupChangeMessage(SPGroupChangeMessage message)
Process a change in the group (split or new members) sent out by the leader. |
private void |
processGroupInfoMessage(SPGroupInfoMessage message)
Leader-only. |
private void |
processLeaderAddressMessage(SPLeaderAddressMessage message)
Leader-only. |
private void |
processMessage(java.lang.Object message)
Process a Message received by the MessageListener. |
private void |
sendMessage(Member receiver,
java.io.Serializable message)
Utility method to send a message to a Member. |
private void |
sendMessage(java.util.Vector receivers,
java.io.Serializable message)
|
private void |
sendOutGroup(java.util.Hashtable gconns,
Member gleader,
java.util.Vector gmembers)
Utility method to send GroupChangeMessages creating a new group. |
void |
setDebug(boolean debugging)
Determine whether to output logging messages. |
protected void |
start()
Start responding to changeGroup messages. |
protected void |
stop()
Suspend all activity - stop responding to changeGroup events. |
Methods inherited from class groupmgmt.GroupDisseminator |
addGroupChangedListener, fireGroupChangedEvent, isActive, removeGroupChangedListener |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
private int disseminatorPort
private int portOffset
private SinglePhaseDisseminator.MessageListener messageListener
private SinglePhaseDisseminator.ConnectionChangeQueue connectionChangeQueue
private SinglePhaseDisseminator.ProcessMessageQueue processMessageQueue
private Member leader
private java.util.Hashtable connections
private Member engaging
private java.lang.Boolean disengaging
private SPGroupChangeMessage lastGroupChangeMessage
private SinglePhaseDisseminator.DebugFrame debugFrame
private boolean debugging
Constructor Detail |
public SinglePhaseDisseminator(int portOffset)
portOffset
- The offset (relative to the groupmgmt port) to use
when communicating with another member's
disseminator.Method Detail |
public void setDebug(boolean debugging)
debugging
- Outputs messages if true.protected void start()
start
in class GroupDisseminator
protected void stop()
stop
in class GroupDisseminator
private boolean isLeader()
public void changeGroup(Member[] arriving, Member[] departing)
changeGroup
in class GroupDisseminator
arriving
- The new Member(s).departing
- The leaving Member(s).private void processConnectionChangesMessage(SPConnectionChangesMessage m)
private void processChangeRefusedMessage(SPChangeRefusedMessage message)
private void processArriving(SPChange arrive)
arrive
- The connection to add.private void processDeparting(java.util.Vector departing)
departing
- A Vector containing SPChange objects for all of the
dropped connections to process. This method removes
the SPChange objects that it processes from departing.private java.util.Vector partitionGroups()
private void getGroupOfMember(Member m, java.util.Vector g, java.util.Hashtable table, java.util.Hashtable newTable)
m
- The Member to start the new group with.g
- The group.table
- The initial connections hashtable.newTable
- Hashtable to fill with the connections for this group.private void processLeaderAddressMessage(SPLeaderAddressMessage message)
private void processGroupInfoMessage(SPGroupInfoMessage message)
private void processGetLeaderMessage(SPGetLeaderMessage message)
private void processGroupChangeMessage(SPGroupChangeMessage message)
message
- The GroupChangeMessage.private void addConnection(Member m1, Member m2)
m1
- A Member.m2
- The Member connected to m1.private void sendOutGroup(java.util.Hashtable gconns, Member gleader, java.util.Vector gmembers)
gconns
- The connections table for the new group.gleader
- The leader of the new group.gmembers
- The members of the new group (including the leader).private void sendMessage(Member receiver, java.io.Serializable message)
receiver
- The Member to send the message to.message
- The message to send.private void sendMessage(java.util.Vector receivers, java.io.Serializable message)
private void processMessage(java.lang.Object message)
message
- The Message to process.protected void fireGroupChangedEvent(java.util.Vector members)
private void log(java.lang.String msg)
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |