Author: schultz Date: Wed Jun 21 14:58:57 2017 New Revision: 1799462 URL: http://svn.apache.org/viewvc?rev=1799462&view=rev Log: Allow human-readable channelSendOptions and mapSendOptions in configurations. Patch provided by Igal Sapir.
This closes #56. Added: tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java (with props) Modified: tomcat/trunk/build.xml tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml tomcat/trunk/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java tomcat/trunk/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml tomcat/trunk/java/org/apache/catalina/tribes/Channel.java tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/cluster-howto.xml tomcat/trunk/webapps/docs/config/cluster.xml Modified: tomcat/trunk/build.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/build.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/build.xml (original) +++ tomcat/trunk/build.xml Wed Jun 21 14:58:57 2017 @@ -1423,8 +1423,8 @@ <junit printsummary="yes" fork="yes" dir="." showoutput="${test.verbose}" errorproperty="test.result.error" failureproperty="test.result.failure" - haltonfailure="${test.haltonfailure}" - threads="${test.threads}" > + haltonfailure="${test.haltonfailure}"> + <!-- threads="${test.threads}" --> <jvmarg value="${test.jvmarg.egd}"/> <jvmarg value="-Dfile.encoding=UTF-8"/> Modified: tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java Wed Jun 21 14:58:57 2017 @@ -200,10 +200,26 @@ public class BackupManager extends Clust this.mapSendOptions = mapSendOptions; } + public void setMapSendOptions(String mapSendOptions) { + + int value = Channel.parseSendOptions(mapSendOptions); + if (value > 0) { + this.setMapSendOptions(value); + } + } + public int getMapSendOptions() { return mapSendOptions; } + /** + * returns the SendOptions as a comma separated list of names + * @return a comma separated list of the option names + */ + public String getMapSendOptionsName(){ + return Channel.getSendOptionsAsString(mapSendOptions); + } + public void setRpcTimeout(long rpcTimeout) { this.rpcTimeout = rpcTimeout; } Modified: tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml Wed Jun 21 14:58:57 2017 @@ -454,6 +454,11 @@ type="int" writeable="false"/> <attribute + name="mapSendOptionsName" + description="mapSendOptions name." + writeable="false" + type="java.lang.String"/> + <attribute name="maxActive" description="Maximum number of active sessions so far" type="int"/> Modified: tomcat/trunk/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java Wed Jun 21 14:58:57 2017 @@ -339,6 +339,14 @@ public class SimpleTcpCluster extends Li this.channelSendOptions = channelSendOptions; } + public void setChannelSendOptions(String channelSendOptions) { + + int value = Channel.parseSendOptions(channelSendOptions); + if (value > 0) { + this.setChannelSendOptions(value); + } + } + /** * has members */ @@ -392,6 +400,14 @@ public class SimpleTcpCluster extends Li } /** + * returns the SendOptions as a comma separated list of names for use by JMX + * @return a comma separated list of the option names + */ + public String getChannelSendOptionsName(){ + return Channel.getSendOptionsAsString(channelSendOptions); + } + + /** * Create new Manager without add to cluster (comes with start the manager) * * @param name Modified: tomcat/trunk/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml (original) +++ tomcat/trunk/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml Wed Jun 21 14:58:57 2017 @@ -28,7 +28,12 @@ <attribute name="channelSendOptions" description="This sets channel behaviour on sent messages." - type="int"/> + type="java.lang.String"/> + <attribute + name="channelSendOptionsName" + description="channelSendOptions name." + writeable="false" + type="java.lang.String"/> <attribute name="channelStartOptions" description="This sets channel start behaviour." Modified: tomcat/trunk/java/org/apache/catalina/tribes/Channel.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/Channel.java?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/Channel.java (original) +++ tomcat/trunk/java/org/apache/catalina/tribes/Channel.java Wed Jun 21 14:58:57 2017 @@ -16,7 +16,11 @@ */ package org.apache.catalina.tribes; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + import java.io.Serializable; +import java.util.StringJoiner; /** * Channel interface<br> @@ -369,4 +373,88 @@ public interface Channel { */ public void setName(String name); + /** + * Translates the name of an option to its integer value. Valid option names are "asynchronous" (alias "async"), + * "byte_message" (alias "byte"), "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack" + * @param opt The name of the option + * @return the int value of the passed option name + */ + public static int getSendOptionValue(String opt){ + + switch (opt){ + + case "asynchronous": + case "async": + return SEND_OPTIONS_ASYNCHRONOUS; + + case "byte_message": + case "byte": + return SEND_OPTIONS_BYTE_MESSAGE; + + case "multicast": + return SEND_OPTIONS_MULTICAST; + + case "secure": + return SEND_OPTIONS_SECURE; + + case "synchronized_ack": + case "sync": + return SEND_OPTIONS_SYNCHRONIZED_ACK; + + case "udp": + return SEND_OPTIONS_UDP; + + case "use_ack": + return SEND_OPTIONS_USE_ACK; + } + + throw new IllegalArgumentException(String.format("[%s] is not a valid option", opt)); + } + + /** + * Translates a comma separated list of option names to their bitwise-ORd value + * @param input A comma separated list of options, e.g. "async, multicast" + * @return a bitwise ORd value of the passed option names + */ + public static int parseSendOptions(String input){ + + try { + return Integer.parseInt(input); + } catch (NumberFormatException nfe){ + final Log log = LogFactory.getLog(Channel.class); + log.trace(String.format("Failed to parse [%s] as integer, channelSendOptions possibly set by name(s)", input)); + } + + String[] options = input.split("\\s*,\\s*"); + + int result = 0; + for (String opt : options) { + result |= getSendOptionValue(opt); + } + + return result; + } + + /** + * Translates an integer value of SendOptions to its human-friendly comma separated value list for use in JMX and such. + * @param input the int value of SendOptions + * @return the human-friendly string representation in a reverse order (i.e. the last option will be shown first) + */ + public static String getSendOptionsAsString(int input){ + + // allOptionNames must be in order of the bits of the available options + final String[] allOptionNames = new String[]{ "byte", "use_ack", "sync", "async", "secure", "udp", "multicast" }; + + StringJoiner names = new StringJoiner(", "); + for (int bit=allOptionNames.length - 1; bit >= 0; bit--){ + + // if the bit is set then add the name to the result + if (((1 << bit) & input) > 0){ + names.add(allOptionNames[bit]); + } + } + + return names.toString(); + } + } Added: tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java?rev=1799462&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java (added) +++ tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java Wed Jun 21 14:58:57 2017 @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.tribes.test.channel; + +import static org.junit.Assert.assertEquals; + +import org.apache.catalina.ha.session.BackupManager; +import org.apache.catalina.tribes.Channel; +import org.apache.catalina.ha.tcp.SimpleTcpCluster; +import org.junit.Test; + + +public class TestChannelConfig { + + @Test + public void testIntInput() { + + SimpleTcpCluster cluster = new SimpleTcpCluster(); + cluster.setChannelSendOptions(Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST); + assertEquals(Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST, cluster.getChannelSendOptions()); + } + + @Test + public void testStringInputSimple() { + + SimpleTcpCluster cluster = new SimpleTcpCluster(); + cluster.setChannelSendOptions("multicast"); + assertEquals(Channel.SEND_OPTIONS_MULTICAST, cluster.getChannelSendOptions()); + } + + @Test + public void testStringInputCompound() { + + SimpleTcpCluster cluster = new SimpleTcpCluster(); + cluster.setChannelSendOptions("async, multicast"); + assertEquals(Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST, cluster.getChannelSendOptions()); + } + + @Test + public void testStringRepresentationOfIntValue() { + + String options = "multicast, async"; + SimpleTcpCluster cluster = new SimpleTcpCluster(); + cluster.setChannelSendOptions(options); + assertEquals(options, cluster.getChannelSendOptionsName()); + } + + @Test + public void testStringInputForMapSendOptions() { + + BackupManager manager = new BackupManager(); + manager.setMapSendOptions("async, multicast"); + assertEquals(Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST, manager.getMapSendOptions()); + } + +} \ No newline at end of file Propchange: tomcat/trunk/test/org/apache/catalina/tribes/test/channel/TestChannelConfig.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Wed Jun 21 14:58:57 2017 @@ -230,6 +230,14 @@ </fix> </changelog> </subsection> + <subsection name="Tribes"> + <changelog> + <add> + <bug>61127</bug>Allow human-readable names for channelSendOptions and + mapSendOptions. Patch provided by Igal Sapir. (schultz) + </add> + </changelog> + </subsection> <subsection name="Other"> <changelog> <add> Modified: tomcat/trunk/webapps/docs/cluster-howto.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/cluster-howto.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/cluster-howto.xml (original) +++ tomcat/trunk/webapps/docs/cluster-howto.xml Wed Jun 21 14:58:57 2017 @@ -210,10 +210,22 @@ should be completed:</p> sent over the wire and reinstantiated on all the other cluster nodes. Synchronous vs. asynchronous is configured using the <code>channelSendOptions</code> flag and is an integer value. The default value for the <code>SimpleTcpCluster/DeltaManager</code> combo is - 8, which is asynchronous. You can read more on the <a href="tribes/introduction.html">send flag(overview)</a> or the - <doc path="/api/org/apache/catalina/tribes/Channel.html">send flag(javadoc)</doc>. - During async replication, the request is returned before the data has been replicated. async replication yields shorter - request times, and synchronous replication guarantees the session to be replicated before the request returns. + 8, which is asynchronous. +</p> +<p> + For convenience, <code>channelSendOptions</code> can be set by name(s) rather than integer, + which are then translated to their integer value upon startup. The valid option names are: + "asynchronous" (alias "async"), "byte_message" (alias "byte"), "multicast", "secure", + "synchronized_ack" (alias "sync"), "udp", "use_ack". Use comma to separate multiple names, + e.g. pass "async, multicast" for the options + <code>SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST</code>. +</p> +<p> + You can read more on the <a href="tribes/introduction.html">send flag(overview)</a> or the + <doc path="/api/org/apache/catalina/tribes/Channel.html">send flag(javadoc)</doc>. + During async replication, the request is returned before the data has been replicated. async + replication yields shorter request times, and synchronous replication guarantees the session + to be replicated before the request returns. </p> </section> Modified: tomcat/trunk/webapps/docs/config/cluster.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/cluster.xml?rev=1799462&r1=1799461&r2=1799462&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/cluster.xml (original) +++ tomcat/trunk/webapps/docs/config/cluster.xml Wed Jun 21 14:58:57 2017 @@ -142,7 +142,15 @@ Tomcat cluster. These include:</p> <br/> Note that if you use ASYNC messaging it is possible for update messages for a session to be processed by the receiving nodes in a different order - to the order in which they were sent.</p> + to the order in which they were sent. + </p> + <p> + You may also set these options as a comma separated string, e.g. "async, multicast", which + will be translated into <code>Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST</code> + <br/> + The valid option names are "asynchronous" (alias "async"), "byte_message" (alias "byte") + , "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack" + </p> </attribute> <attribute name="channelStartOptions" required="false"> <p>Sets the start and stop flags for the <Channel> object used by the cluster. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org