Author: kfujino Date: Tue Dec 15 06:45:36 2015 New Revision: 1720076 URL: http://svn.apache.org/viewvc?rev=1720076&view=rev Log: Add support for the startup notification of local members in the static cluster.
Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties?rev=1720076&r1=1720075&r2=1720076&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties Tue Dec 15 06:45:36 2015 @@ -34,6 +34,7 @@ nonBlockingCoordinator.heartbeat.failed= orderInterceptor.messageAdded.sameCounter=Message added has the same counter, synchronization bug. Disable the order interceptor staticMembershipInterceptor.no.failureDetector=There is no TcpFailureDetector. Automatic detection of static members does not work properly. By defining the StaticMembershipInterceptor under the TcpFailureDetector, automatic detection of the static members will work. staticMembershipInterceptor.no.pingInterceptor=There is no TcpPingInterceptor. The health check of static members does not work properly. By defining the TcpPingInterceptor, the health check of static members will work. +staticMembershipInterceptor.sendLocalMember.failed=Local member notification failed. tcpFailureDetector.memberDisappeared.verify=Received memberDisappeared[{0}] message. Will verify. tcpFailureDetector.already.disappeared=Verification complete. Member already disappeared[{0}] tcpFailureDetector.member.disappeared=Verification complete. Member disappeared[{0}] Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java?rev=1720076&r1=1720075&r2=1720076&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java Tue Dec 15 06:45:36 2015 @@ -17,13 +17,17 @@ package org.apache.catalina.tribes.group.interceptors; import java.util.ArrayList; +import java.util.Arrays; import org.apache.catalina.tribes.Channel; import org.apache.catalina.tribes.ChannelException; import org.apache.catalina.tribes.ChannelInterceptor; +import org.apache.catalina.tribes.ChannelMessage; import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.group.AbsoluteOrder; import org.apache.catalina.tribes.group.ChannelInterceptorBase; +import org.apache.catalina.tribes.io.ChannelData; +import org.apache.catalina.tribes.io.XByteBuffer; import org.apache.catalina.tribes.util.StringManager; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -34,6 +38,10 @@ public class StaticMembershipInterceptor protected static final StringManager sm = StringManager.getManager(StaticMembershipInterceptor.class.getPackage().getName()); + protected static final byte[] MEMBER_START = new byte[] { + 76, 111, 99, 97, 108, 32, 83, 116, 97, 116, 105, 99, 77, 101, 109, 98, 101, 114, 32, 78, + 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 32, 68, 97, 116, 97}; + protected final ArrayList<Member> members = new ArrayList<>(); protected Member localMember = null; @@ -57,6 +65,21 @@ public class StaticMembershipInterceptor this.localMember = member; } + @Override + public void messageReceived(ChannelMessage msg) { + if (msg.getMessage().getLength() == MEMBER_START.length && + Arrays.equals(MEMBER_START, msg.getMessage().getBytes())) { + // receive member start + Member member = getMember(msg.getAddress()); + if (member != null) { + super.memberAdded(member); + } + + } else { + super.messageReceived(msg); + } + } + /** * has members */ @@ -115,17 +138,19 @@ public class StaticMembershipInterceptor public void start(int svc) throws ChannelException { if ( (Channel.SND_RX_SEQ&svc)==Channel.SND_RX_SEQ ) super.start(Channel.SND_RX_SEQ); if ( (Channel.SND_TX_SEQ&svc)==Channel.SND_TX_SEQ ) super.start(Channel.SND_TX_SEQ); - final Member[] mbrs = members.toArray(new Member[members.size()]); final ChannelInterceptorBase base = this; - Thread t = new Thread() { - @Override - public void run() { - for (int i=0; i<mbrs.length; i++ ) { - base.memberAdded(mbrs[i]); + for (final Member member : members) { + Thread t = new Thread() { + @Override + public void run() { + base.memberAdded(member); + if (getfirstInterceptor().getMember(member) != null) { + sendLocalMember(new Member[]{member}); + } } - } - }; - t.start(); + }; + t.start(); + } super.start(svc & (~Channel.SND_RX_SEQ) & (~Channel.SND_TX_SEQ)); // check required interceptors @@ -145,4 +170,28 @@ public class StaticMembershipInterceptor } } + protected void sendLocalMember(Member[] members) { + if ( members == null || members.length == 0 ) return; + ChannelData data = new ChannelData(true); + data.setAddress(getLocalMember(false)); + data.setTimestamp(System.currentTimeMillis()); + data.setOptions(getOptionFlag()); + data.setMessage(new XByteBuffer(MEMBER_START, false)); + try { + super.sendMessage(members, data, null); + }catch (ChannelException cx) { + log.warn(sm.getString("staticMembershipInterceptor.sendLocalMember.failed"),cx); + } + } + + protected ChannelInterceptor getfirstInterceptor() { + ChannelInterceptor result = null; + ChannelInterceptor now = this; + do { + result = now; + now = now.getPrevious(); + } while (now.getPrevious() != null); + return result; + } + } \ No newline at end of file Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1720076&r1=1720075&r2=1720076&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Tue Dec 15 06:45:36 2015 @@ -83,6 +83,10 @@ Fix potential NPE in <code>AbstractReplicatedMap.breakdown()</code>. (kfujino) </fix> + <fix> + Add support for the startup notification of local members in the static + cluster. (kfujino) + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org