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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]