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