You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2006/06/07 23:40:01 UTC
svn commit: r412555 - in /tomcat/container/tc5.5.x/modules/groupcom:
doc/leader-election-message-arrives.dia
doc/leader-election-message-arrives.jpg
src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
Author: fhanik
Date: Wed Jun 7 14:40:00 2006
New Revision: 412555
URL: http://svn.apache.org/viewvc?rev=412555&view=rev
Log:
Improvements to the merging leadership election algorithm, implementation is still pending
Modified:
tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.dia
tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.jpg
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
Modified: tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.dia
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.dia?rev=412555&r1=412554&r2=412555&view=diff
==============================================================================
Binary files - no diff available.
Modified: tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.jpg
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-message-arrives.jpg?rev=412555&r1=412554&r2=412555&view=diff
==============================================================================
Binary files - no diff available.
Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java?rev=412555&r1=412554&r2=412555&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java (original)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java Wed Jun 7 14:40:00 2006
@@ -31,6 +31,7 @@
import org.apache.catalina.tribes.util.Arrays;
import org.apache.catalina.tribes.util.UUIDGenerator;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* <p>Title: Auto merging leader election algorithm</p>
@@ -166,14 +167,13 @@
protected UniqueId suggestedviewId;
protected Membership suggestedView;
- protected LinkedHashMap rotatingViews = new LinkedHashMap();
-
protected boolean started = false;
protected final int startsvc = 0xFFFF;
protected Object electionMutex = new Object();
protected AtomicBoolean coordMsgReceived = new AtomicBoolean(false);
+ protected AtomicInteger runningElections = new AtomicInteger(0);
public NonBlockingCoordinator() {
super();
@@ -183,10 +183,6 @@
// COORDINATION HANDLING
//============================================================================================================
- public Membership getView(UniqueId id) {
- return (Membership)rotatingViews.get(id);
- }
-
public void startElection(boolean force) throws ChannelException {
synchronized (electionMutex) {
if ( suggestedviewId != null ) return;//election already running, I'm not allowed to have two of them
@@ -194,16 +190,18 @@
MemberImpl[] others = (MemberImpl[])membership.getMembers();
if ( others.length == 0 ) return; //the only member, no need for an election
int prio = AbsoluteOrder.comp.compare(local,others[0]);
- MemberImpl leader = ( prio < 0 )?local:others[0];
- if ( local.equals(leader) || force ) sendElectionMsg(local,leader,others);
- else {
+ MemberImpl leader = ( prio < 0 )?local:others[0];//am I the leader in my view?
+ if ( local.equals(leader) || force ) {
+ runningElections.addAndGet(1);
+ sendElectionMsg(local,leader,others);
+ } else {
try {
coordMsgReceived.set(false);
electionMutex.wait(waitForCoordMsgTimeout);
}catch ( InterruptedException x ) {
Thread.currentThread().interrupted();
}
- if ( rotatingViews.size() == 0 && suggestedviewId == null && (!coordMsgReceived.get())) {
+ if ( runningElections.get() == 0 && suggestedviewId == null && (!coordMsgReceived.get())) {
//no message arrived, send the coord msg
startElection(true);
}
@@ -222,7 +220,7 @@
suggestedviewId = msg.getId();
suggestedView = new Membership(local);
Arrays.fill(suggestedView,mbrs);
- rotatingViews.put(suggestedviewId, msg);
+
super.sendMessage(new Member[] {others[0]}, createData(msg, local), null);
}
}
@@ -267,10 +265,9 @@
synchronized (electionMutex) {
coordMsgReceived.set(true);
msg.timestamp = System.currentTimeMillis();
- rotatingViews.put(msg.getId(),msg);
Membership merged = mergeOnArrive(msg,sender);
if ( isViewConf(msg) ) handleViewConf(msg, sender,merged);
- else handleToken(msg,sender,merged);
+ else handleToken(msg, sender, merged);
}
}
@@ -279,17 +276,20 @@
}
protected void handleViewConf(CoordinationMessage msg, Member sender,Membership merged) throws ChannelException {
+ //not yet complete
this.view = new Membership((MemberImpl)getLocalMember(false),AbsoluteOrder.comp);
+ this.view.addMember((MemberImpl)getLocalMember(false));
this.viewId = msg.getId();
+
if ( viewId.equals(this.suggestedviewId) ) {
this.suggestedView = null;
this.suggestedviewId = null;
+ this.runningElections.addAndGet(-1);
}
this.viewChange(viewId,view.getMembers());
if ( suggestedviewId == null && hasHigherPriority(merged.getMembers(),membership.getMembers()) ) {
startElection(false);
}
-
}
protected boolean isViewConf(CoordinationMessage msg) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org