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