You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2018/08/06 15:13:16 UTC

activemq-artemis git commit: ARTEMIS-2011 Fixing incompatibility of AddressSettings encode between versions

Repository: activemq-artemis
Updated Branches:
  refs/heads/2.6.x 58add60c3 -> 1eebe46cb


ARTEMIS-2011 Fixing incompatibility of AddressSettings encode between versions

To fix this I added a retry on AddressSettings using code that's closer to the original version

(cherry picked from commit b710df7844c36633566d3f93f2707a378e4c5af8)


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/1eebe46c
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/1eebe46c
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/1eebe46c

Branch: refs/heads/2.6.x
Commit: 1eebe46cb304618d1e7fa0c5599df00de198a0eb
Parents: 58add60
Author: Clebert Suconic <cl...@apache.org>
Authored: Fri Aug 3 18:19:05 2018 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Aug 6 11:13:07 2018 -0400

----------------------------------------------------------------------
 .../core/settings/impl/AddressSettings.java     | 17 +++++--
 tests/compatibility-tests/pom.xml               | 52 ++++++++++++++++++++
 .../artemis/tests/compatibility/GroovyRun.java  |  2 +
 .../main/resources/servers/artemisServer.groovy | 41 ++++++++++++---
 .../compatibility/JournalCompatibilityTest.java | 16 +++---
 .../tests/compatibility/VersionedBaseTest.java  |  5 ++
 6 files changed, 117 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
index c7021fd..36826ed 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
@@ -20,9 +20,9 @@ import java.io.Serializable;
 
 import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
 import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.journal.EncodingSupport;
-import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.core.settings.Mergeable;
 import org.apache.activemq.artemis.utils.BufferHelper;
 import org.apache.activemq.artemis.utils.DataConstants;
@@ -671,6 +671,17 @@ public class AddressSettings implements Mergeable<AddressSettings>, Serializable
 
    @Override
    public void decode(ActiveMQBuffer buffer) {
+      int original = buffer.readerIndex();
+      try {
+         decode(buffer, false);
+      } catch (Throwable e) {
+         buffer.readerIndex(original);
+         // Try a compatible version where the wire was broken
+         decode(buffer, true);
+      }
+   }
+
+   public void decode(ActiveMQBuffer buffer, boolean tryCompatible) {
       SimpleString policyStr = buffer.readNullableSimpleString();
 
       if (policyStr != null) {
@@ -733,7 +744,7 @@ public class AddressSettings implements Mergeable<AddressSettings>, Serializable
 
       autoDeleteQueues = BufferHelper.readNullableBoolean(buffer);
 
-      policyStr = buffer.readNullableSimpleString();
+      policyStr = tryCompatible ? null : buffer.readNullableSimpleString();
 
       if (policyStr != null) {
          configDeleteQueues = DeletionPolicy.valueOf(policyStr.toString());
@@ -745,7 +756,7 @@ public class AddressSettings implements Mergeable<AddressSettings>, Serializable
 
       autoDeleteAddresses = BufferHelper.readNullableBoolean(buffer);
 
-      policyStr = buffer.readNullableSimpleString();
+      policyStr = tryCompatible ? null : buffer.readNullableSimpleString();
 
       if (policyStr != null) {
          configDeleteAddresses = DeletionPolicy.valueOf(policyStr.toString());

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/tests/compatibility-tests/pom.xml
----------------------------------------------------------------------
diff --git a/tests/compatibility-tests/pom.xml b/tests/compatibility-tests/pom.xml
index f4edcd6..a889303 100644
--- a/tests/compatibility-tests/pom.xml
+++ b/tests/compatibility-tests/pom.xml
@@ -351,6 +351,50 @@
                   </configuration>
                </execution>
                <execution>
+                  <phase>compile</phase>
+                  <goals>
+                     <goal>dependency-scan</goal>
+                  </goals>
+                  <id>210-check</id>
+                  <configuration>
+                     <libListWithDeps>
+                        <arg>org.apache.activemq:artemis-jms-server:2.1.0</arg>
+                        <arg>org.apache.activemq:artemis-jms-client:2.1.0</arg>
+                        <arg>org.apache.activemq:artemis-cli:2.1.0</arg>
+                        <arg>org.apache.activemq:artemis-hornetq-protocol:2.1.0</arg>
+                        <arg>org.apache.activemq:artemis-amqp-protocol:2.1.0</arg>
+                        <arg>org.apache.activemq:artemis-hornetq-protocol:2.1.0</arg>
+                        <arg>org.codehaus.groovy:groovy-all:${groovy.version}</arg>
+                     </libListWithDeps>
+                     <libList>
+                        <arg>org.apache.activemq.tests:compatibility-tests:${project.version}</arg>
+                     </libList>
+                     <variableName>ARTEMIS-210</variableName>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>compile</phase>
+                  <goals>
+                     <goal>dependency-scan</goal>
+                  </goals>
+                  <id>200-check</id>
+                  <configuration>
+                     <libListWithDeps>
+                        <arg>org.apache.activemq:artemis-jms-server:2.0.0</arg>
+                        <arg>org.apache.activemq:artemis-jms-client:2.0.0</arg>
+                        <arg>org.apache.activemq:artemis-cli:2.0.0</arg>
+                        <arg>org.apache.activemq:artemis-hornetq-protocol:2.0.0</arg>
+                        <arg>org.apache.activemq:artemis-amqp-protocol:2.0.0</arg>
+                        <arg>org.apache.activemq:artemis-hornetq-protocol:2.0.0</arg>
+                        <arg>org.codehaus.groovy:groovy-all:${groovy.version}</arg>
+                     </libListWithDeps>
+                     <libList>
+                        <arg>org.apache.activemq.tests:compatibility-tests:${project.version}</arg>
+                     </libList>
+                     <variableName>ARTEMIS-200</variableName>
+                  </configuration>
+               </execution>
+               <execution>
                   <id>140-check</id>
                   <phase>compile</phase>
                   <goals>
@@ -454,6 +498,14 @@
                      <value>${ARTEMIS-SNAPSHOT}</value>
                   </property>
                   <property>
+                     <name>ARTEMIS-200</name>
+                     <value>${ARTEMIS-200}</value>
+                  </property>
+                  <property>
+                     <name>ARTEMIS-210</name>
+                     <value>${ARTEMIS-210}</value>
+                  </property>
+                  <property>
                      <name>ARTEMIS-240</name>
                      <value>${ARTEMIS-240}</value>
                   </property>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/tests/compatibility-tests/src/main/java/org/apache/activemq/artemis/tests/compatibility/GroovyRun.java
----------------------------------------------------------------------
diff --git a/tests/compatibility-tests/src/main/java/org/apache/activemq/artemis/tests/compatibility/GroovyRun.java b/tests/compatibility-tests/src/main/java/org/apache/activemq/artemis/tests/compatibility/GroovyRun.java
index 46b6cec..5efa3d3 100644
--- a/tests/compatibility-tests/src/main/java/org/apache/activemq/artemis/tests/compatibility/GroovyRun.java
+++ b/tests/compatibility-tests/src/main/java/org/apache/activemq/artemis/tests/compatibility/GroovyRun.java
@@ -30,6 +30,8 @@ public class GroovyRun {
    public static final String SNAPSHOT = "ARTEMIS-SNAPSHOT";
    public static final String ONE_FIVE = "ARTEMIS-155";
    public static final String ONE_FOUR = "ARTEMIS-140";
+   public static final String TWO_ZERO = "ARTEMIS-200";
+   public static final String TWO_ONE = "ARTEMIS-210";
    public static final String TWO_FOUR = "ARTEMIS-240";
    public static final String HORNETQ_235 = "HORNETQ-235";
    public static final String HORNETQ_247 = "HORNETQ-247";

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/tests/compatibility-tests/src/main/resources/servers/artemisServer.groovy
----------------------------------------------------------------------
diff --git a/tests/compatibility-tests/src/main/resources/servers/artemisServer.groovy b/tests/compatibility-tests/src/main/resources/servers/artemisServer.groovy
index fbae168..35ffb93 100644
--- a/tests/compatibility-tests/src/main/resources/servers/artemisServer.groovy
+++ b/tests/compatibility-tests/src/main/resources/servers/artemisServer.groovy
@@ -1,4 +1,7 @@
 package servers
+
+import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements. See the NOTICE file distributed with
@@ -17,15 +20,11 @@ package servers
  */
 
 // starts an artemis server
-
-import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
 import org.apache.activemq.artemis.core.server.JournalType
-import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
-import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
-import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl;
+import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy
+import org.apache.activemq.artemis.core.settings.impl.AddressSettings
+import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl
 import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS
-import org.apache.activemq.artemis.tests.compatibility.GroovyRun;
-
 
 String folder = arg[0];
 String id = arg[1];
@@ -62,3 +61,31 @@ server.start();
 
 server.getJMSServerManager().createTopic(true, "topic");
 server.getJMSServerManager().createQueue(true, "queue", null, true);
+
+if (setAddressSettings) {
+
+    // this is to force records that will have pittfals between versions
+    server.getJMSServerManager().getActiveMQServer().getActiveMQServerControl().
+            addAddressSettings("ad1", //@Parameter(desc = "an address match", name = "addressMatch") String addressMatch,
+                    "dla", // @Parameter(desc = "the dead letter address setting", name = "DLA") String DLA,
+                    "exp", //@Parameter(desc = "the expiry address setting", name = "expiryAddress") String expiryAddress,
+                    0l, //@Parameter(desc = "the expiry delay setting", name = "expiryDelay") long expiryDelay,
+                    false, //@Parameter(desc = "are any queues created for this address a last value queue", name = "lastValueQueue") boolean lastValueQueue,
+                    1, //@Parameter(desc = "the delivery attempts", name = "deliveryAttempts") int deliveryAttempts,
+                    10 * 1024 * 1024, //@Parameter(desc = "the max size in bytes", name = "maxSizeBytes") long maxSizeBytes,
+                    1024 * 1024, //@Parameter(desc = "the page size in bytes", name = "pageSizeBytes") int pageSizeBytes,
+                    3, //@Parameter(desc = "the max number of pages in the soft memory cache", name = "pageMaxCacheSize") int pageMaxCacheSize,
+                    0l, //@Parameter(desc = "the redelivery delay", name = "redeliveryDelay") long redeliveryDelay,
+                    0, //@Parameter(desc = "the redelivery delay multiplier", name = "redeliveryMultiplier") double redeliveryMultiplier,
+                    0, //@Parameter(desc = "the maximum redelivery delay", name = "maxRedeliveryDelay") long maxRedeliveryDelay,
+                    0, //@Parameter(desc = "the redistribution delay", name = "redistributionDelay") long redistributionDelay,
+                    false, //@Parameter(desc = "do we send to the DLA when there is no where to route the message", name = "sendToDLAOnNoRoute") boolean sendToDLAOnNoRoute,
+                    "BLOCK", //@Parameter(desc = "the policy to use when the address is full", name = "addressFullMessagePolicy") String addressFullMessagePolicy,
+                    1000, //@Parameter(desc = "when a consumer falls below this threshold in terms of messages consumed per second it will be considered 'slow'", name = "slowConsumerThreshold") long slowConsumerThreshold,
+                    1000, //@Parameter(desc = "how often (in seconds) to check for slow consumers", name = "slowConsumerCheckPeriod") long slowConsumerCheckPeriod,
+                    "NOTIFY", //@Parameter(desc = "the policy to use when a slow consumer is detected", name = "slowConsumerPolicy") String slowConsumerPolicy,
+                    true, //@Parameter(desc = "allow queues to be created automatically", name = "autoCreateJmsQueues") boolean autoCreateJmsQueues,
+                    true, // @Parameter(desc = "allow auto-created queues to be deleted automatically", name = "autoDeleteJmsQueues") boolean autoDeleteJmsQueues,
+                    true, //@Parameter(desc = "allow topics to be created automatically", name = "autoCreateJmsTopics") boolean autoCreateJmsTopics,
+                    true) //@Parameter(desc = "allow auto-created topics to be deleted automatically", name = "autoDeleteJmsTopics") boolean autoDeleteJmsTopics) throws Exception;
+}

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/JournalCompatibilityTest.java
----------------------------------------------------------------------
diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/JournalCompatibilityTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/JournalCompatibilityTest.java
index 171e721..e63f70b 100644
--- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/JournalCompatibilityTest.java
+++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/JournalCompatibilityTest.java
@@ -19,6 +19,8 @@ package org.apache.activemq.artemis.tests.compatibility;
 
 import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.SNAPSHOT;
 import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.TWO_FOUR;
+import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.TWO_ONE;
+import static org.apache.activemq.artemis.tests.compatibility.GroovyRun.TWO_ZERO;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -62,6 +64,8 @@ public class JournalCompatibilityTest extends VersionedBaseTest {
       //      combinations.add(new Object[]{SNAPSHOT, ONE_FIVE, ONE_FIVE});
       //      combinations.add(new Object[]{ONE_FIVE, ONE_FIVE, ONE_FIVE});
 
+      combinations.add(new Object[]{null, TWO_ZERO, SNAPSHOT});
+      combinations.add(new Object[]{null, TWO_ONE, SNAPSHOT});
       combinations.add(new Object[]{null, TWO_FOUR, SNAPSHOT});
       // the purpose on this one is just to validate the test itself.
       /// if it can't run against itself it won't work at all
@@ -94,12 +98,12 @@ public class JournalCompatibilityTest extends VersionedBaseTest {
    @Test
    public void testSendReceive() throws Throwable {
       setVariable(senderClassloader, "persistent", true);
-      startServer(serverFolder.getRoot(), senderClassloader, "journalTest");
+      startServer(serverFolder.getRoot(), senderClassloader, "journalTest", null, true);
       evaluate(senderClassloader, "meshTest/sendMessages.groovy", server, sender, "sendAckMessages");
       stopServer(senderClassloader);
 
       setVariable(receiverClassloader, "persistent", true);
-      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest");
+      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest", null, false);
 
       setVariable(receiverClassloader, "latch", null);
       evaluate(receiverClassloader, "meshTest/sendMessages.groovy", server, receiver, "receiveMessages");
@@ -112,12 +116,12 @@ public class JournalCompatibilityTest extends VersionedBaseTest {
    @Test
    public void testSendReceiveQueueMetrics() throws Throwable {
       setVariable(senderClassloader, "persistent", true);
-      startServer(serverFolder.getRoot(), senderClassloader, "journalTest");
+      startServer(serverFolder.getRoot(), senderClassloader, "journalTest", null, true);
       evaluate(senderClassloader, "meshTest/sendMessages.groovy", server, sender, "sendAckMessages");
       stopServer(senderClassloader);
 
       setVariable(receiverClassloader, "persistent", true);
-      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest");
+      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest", null, false);
 
       setVariable(receiverClassloader, "latch", null);
       evaluate(receiverClassloader, "metrics/queueMetrics.groovy", server, receiver, "receiveMessages");
@@ -132,14 +136,14 @@ public class JournalCompatibilityTest extends VersionedBaseTest {
    public void testSendReceiveSizeQueueMetricsPaging() throws Throwable {
       setVariable(senderClassloader, "persistent", true);
       //Set max size to 1 to cause messages to immediately go to the paging store
-      startServer(serverFolder.getRoot(), senderClassloader, "journalTest", Long.toString(1));
+      startServer(serverFolder.getRoot(), senderClassloader, "journalTest", Long.toString(1), true);
       evaluate(senderClassloader, "journalcompatibility/forcepaging.groovy");
       evaluate(senderClassloader, "meshTest/sendMessages.groovy", server, sender, "sendAckMessages");
       evaluate(senderClassloader, "journalcompatibility/ispaging.groovy");
       stopServer(senderClassloader);
 
       setVariable(receiverClassloader, "persistent", true);
-      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest", Long.toString(1));
+      startServer(serverFolder.getRoot(), receiverClassloader, "journalTest", Long.toString(1), false);
       evaluate(receiverClassloader, "journalcompatibility/ispaging.groovy");
 
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/1eebe46c/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/VersionedBaseTest.java
----------------------------------------------------------------------
diff --git a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/VersionedBaseTest.java b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/VersionedBaseTest.java
index 96d96d7..19bafd0 100644
--- a/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/VersionedBaseTest.java
+++ b/tests/compatibility-tests/src/test/java/org/apache/activemq/artemis/tests/compatibility/VersionedBaseTest.java
@@ -190,6 +190,10 @@ public abstract class VersionedBaseTest {
    }
 
    public void startServer(File folder, ClassLoader loader, String serverName, String globalMaxSize) throws Throwable {
+      startServer(folder, loader, serverName, globalMaxSize, false);
+
+   }
+   public void startServer(File folder, ClassLoader loader, String serverName, String globalMaxSize, boolean setAddressSettings) throws Throwable {
       folder.mkdirs();
 
       String scriptToUse;
@@ -201,6 +205,7 @@ public abstract class VersionedBaseTest {
          scriptToUse = "servers/hornetqServer.groovy";
       }
 
+      setVariable(loader, "setAddressSettings", setAddressSettings);
       evaluate(loader, scriptToUse, folder.getAbsolutePath(), serverName, server, sender, receiver, globalMaxSize);
    }
    public void stopServer(ClassLoader loader) throws Throwable {