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