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/08 19:36:19 UTC

svn commit: r412808 - in /tomcat/container/tc5.5.x/modules/groupcom: doc/ src/share/org/apache/catalina/tribes/group/interceptors/ src/share/org/apache/catalina/tribes/util/

Author: fhanik
Date: Thu Jun  8 10:36:19 2006
New Revision: 412808

URL: http://svn.apache.org/viewvc?rev=412808&view=rev
Log:
More updates, far from complete

Modified:
    tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.dia
    tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.jpg
    tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
    tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/util/Arrays.java

Modified: tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.dia
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.dia?rev=412808&r1=412807&r2=412808&view=diff
==============================================================================
Binary files - no diff available.

Modified: tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.jpg
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/doc/leader-election-initiate-election.jpg?rev=412808&r1=412807&r2=412808&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=412808&r1=412807&r2=412808&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 Thu Jun  8 10:36:19 2006
@@ -32,6 +32,7 @@
 import org.apache.catalina.tribes.util.UUIDGenerator;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.catalina.tribes.membership.*;
 
 /**
  * <p>Title: Auto merging leader election algorithm</p>
@@ -191,7 +192,11 @@
             int prio = AbsoluteOrder.comp.compare(local,others[0]);
             MemberImpl leader = ( prio < 0 )?local:others[0];//am I the leader in my view?
             if ( local.equals(leader) || force ) {
-                sendElectionMsg(local,leader,others);
+                CoordinationMessage msg = createElectionMsg(local, others, leader);
+                suggestedviewId = msg.getId();
+                suggestedView = new Membership(local,AbsoluteOrder.comp,true);
+                Arrays.fill(suggestedView,msg.getMembers());
+                sendElectionMsg(local,others[0],msg);
             } else {
                 try {
                     coordMsgReceived.set(false);
@@ -207,23 +212,35 @@
         }
     }
 
-    protected void sendElectionMsg(MemberImpl local, MemberImpl leader, MemberImpl[] others) throws ChannelException {
-        synchronized (electionMutex) {
-            if ( suggestedviewId != null ) return;//election already running, I'm not allowed to have two of them
-            Membership m = new Membership(local,AbsoluteOrder.comp,true);
-            Arrays.fill(m,others);
-            MemberImpl[] mbrs = m.getMembers();
-            CoordinationMessage msg = new CoordinationMessage(leader, local, mbrs,new UniqueId(UUIDGenerator.randomUUID(true)), this.COORD_REQUEST);
-            suggestedviewId = msg.getId();
-            suggestedView = new Membership(local,AbsoluteOrder.comp,true);
-            Arrays.fill(suggestedView,mbrs);
-            m.reset(); 
-            m = null;
-            super.sendMessage(new Member[] {others[0]}, createData(msg, local), null);
+    private CoordinationMessage createElectionMsg(MemberImpl local, MemberImpl[] others, MemberImpl leader) {
+        Membership m = new Membership(local,AbsoluteOrder.comp,true);
+        Arrays.fill(m,others);
+        MemberImpl[] mbrs = m.getMembers();
+        m.reset(); 
+        CoordinationMessage msg = new CoordinationMessage(leader, local, mbrs,new UniqueId(UUIDGenerator.randomUUID(true)), this.COORD_REQUEST);
+        return msg;
+    }
+
+    protected void sendElectionMsg(MemberImpl local, MemberImpl next, CoordinationMessage msg) throws ChannelException {
+        super.sendMessage(new Member[] {next}, createData(msg, local), null);
+    }
+    
+    protected void sendElectionMsgToNextInline(MemberImpl local, CoordinationMessage msg) { 
+        int next = Arrays.nextIndex(local,msg.getMembers());
+        if ( AbsoluteOrder.comp.compare(local,msg.getLeader()) > 0 ) msg.leader = local;
+        if ( next >= 0 ) sendElectionMsg(local,(MemberImpl)msg.getMembers()[next],msg);
+    }
+    
+    public Member getNextInLine(MemberImpl local, MemberImpl[] others) {
+        MemberImpl result = null;
+        for ( int i=0; i<others.length; i++ ) {
+            
         }
+        return result;
     }
     
     public ChannelData createData(CoordinationMessage msg, MemberImpl local) {
+        msg.write();
         ChannelData data = new ChannelData(true);
         data.setAddress(local);
         data.setMessage(msg.getBuffer());
@@ -270,19 +287,47 @@
     }
     
     protected void handleToken(CoordinationMessage msg, Member sender,Membership merged) throws ChannelException {
+        MemberImpl local = (MemberImpl)getLocalMember(false);
+        if ( local.equals(msg.getSource()) ) {
+            //my message msg.src=local
+            handleMyToken(local, msg, sender,merged);
+        } else {
+            handleOtherToken(local, msg, sender,merged);
+        }
+    }
+    
+    protected void handleMyToken(MemberImpl local, CoordinationMessage msg, Member sender,Membership merged) throws ChannelException {
+        if ( local.equals(msg.getLeader()) ) {
+            //no leadership change
+            if ( Arrays.sameMembers(msg.getMembers(),merged.getMembers()) ) {
+                msg.type = COORD_CONF;
+                super.sendMessage(Arrays.remove(msg.getMembers(),local),createData(msg,local),null);
+                handleViewConf(msg,local,merged);
+            } else {
+                //membership change
+                
+            }
+        } else {
+            //leadership change
+        }
+    }
+    
+    protected void handleOtherToken(MemberImpl local, CoordinationMessage msg, Member sender,Membership merged) throws ChannelException {
         
     }
     
     protected void handleViewConf(CoordinationMessage msg, Member sender,Membership merged) throws ChannelException {
-        //not yet complete
-        this.view = new Membership((MemberImpl)getLocalMember(false),AbsoluteOrder.comp,true);
-        this.viewId = msg.getId();
+        if ( viewId != null && msg.getId().equals(viewId) ) return;//we already have this view
+        view = new Membership((MemberImpl)getLocalMember(false),AbsoluteOrder.comp,true);
+        Arrays.fill(view,msg.getMembers());
+        viewId = msg.getId();
         
-        if ( viewId.equals(this.suggestedviewId) ) {
-            this.suggestedView = null;
-            this.suggestedviewId = null;
+        if ( viewId.equals(suggestedviewId) ) {
+            suggestedView = null;
+            suggestedviewId = null;
         }
-        this.viewChange(viewId,view.getMembers());
+        viewChange(viewId,view.getMembers());
+        
         if ( suggestedviewId == null && hasHigherPriority(merged.getMembers(),membership.getMembers()) ) {
             startElection(false);
         }
@@ -480,6 +525,7 @@
         
         public CoordinationMessage(XByteBuffer buf) {
             this.buf = buf;
+            parse();
         }
 
         public CoordinationMessage(MemberImpl leader,

Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/util/Arrays.java
URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/util/Arrays.java?rev=412808&r1=412807&r2=412808&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/util/Arrays.java (original)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/util/Arrays.java Thu Jun  8 10:36:19 2006
@@ -15,15 +15,15 @@
  */
 package org.apache.catalina.tribes.util;
 
-import org.apache.catalina.tribes.UniqueId;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.catalina.tribes.ChannelMessage;
 import org.apache.catalina.tribes.Member;
+import org.apache.catalina.tribes.UniqueId;
 import org.apache.catalina.tribes.group.AbsoluteOrder;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.Comparator;
-import org.apache.catalina.tribes.membership.Membership;
 import org.apache.catalina.tribes.membership.MemberImpl;
+import org.apache.catalina.tribes.membership.Membership;
 
 /**
  * @author Filip Hanik
@@ -109,6 +109,29 @@
             if ( local.getMember(comp[i]) == null ) result.add(comp[i]);
         }
         return (MemberImpl[])result.toArray(new MemberImpl[result.size()]);
+    }
+    
+    public static Member[] remove(Member[] all, Member remove) {
+        return extract(all,new Member[] {remove});
+    }
+    
+    public static Member[] extract(Member[] all, Member[] remove) {
+        List list = java.util.Arrays.asList(all);
+        for (int i=0; i<remove.length; i++ ) list.remove(remove[i]);
+        return (Member[])list.toArray(new Member[list.size()]);
+    }
+    
+    public static int indexOf(Member member, Member[] members) {
+        int result = -1;
+        for (int i=0; (result==-1) && (i<members.length); i++ ) 
+            if ( member.equals(members[i]) ) result = i;
+        return result;
+    }
+    
+    public static int nextIndex(Member member, Member[] members) {
+        int idx = indexOf(member,members);
+        if (idx == (members.length-1) ) return members.length>0?0:-1;
+        else return idx+1;
     }
 
     



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org