Repository: activemq-artemis
Updated Branches:
  refs/heads/2.6.x 59300713a -> 773721f7b


ARTEMIS-2108 fix another potential StackOverflow

(cherry picked from commit f4396da9fd9f7ecc7d9c0b02118d1eb1b76af523)


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

Branch: refs/heads/2.6.x
Commit: 773721f7b028754c39e441aa9372dc614f31ce47
Parents: 5930071
Author: Justin Bertram <jbert...@apache.org>
Authored: Mon Nov 5 10:42:32 2018 -0600
Committer: Clebert Suconic <clebertsuco...@apache.org>
Committed: Wed Nov 14 11:15:18 2018 -0500

----------------------------------------------------------------------
 .../cluster/impl/ClusterConnectionImpl.java     |  2 +-
 .../cluster/impl/RemoteQueueBindingImpl.java    |  9 ++++-
 .../RemoteBindingWithoutLoadBalancingTest.java  | 40 ++++++++++++++++++++
 .../cluster/impl/RemoteQueueBindImplTest.java   |  3 +-
 4 files changed, 50 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/773721f7/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionImpl.java
----------------------------------------------------------------------
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionImpl.java
index 70923be..feeb0d1 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionImpl.java
@@ -1219,7 +1219,7 @@ public final class ClusterConnectionImpl implements 
ClusterConnection, AfterConn
             return;
          }
 
-         RemoteQueueBinding binding = new 
RemoteQueueBindingImpl(server.getStorageManager().generateID(), queueAddress, 
clusterName, routingName, queueID, filterString, queue, bridge.getName(), 
distance + 1);
+         RemoteQueueBinding binding = new 
RemoteQueueBindingImpl(server.getStorageManager().generateID(), queueAddress, 
clusterName, routingName, queueID, filterString, queue, bridge.getName(), 
distance + 1, messageLoadBalancingType);
 
          if (logger.isTraceEnabled()) {
             logger.trace("Adding binding " + clusterName + " into " + 
ClusterConnectionImpl.this);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/773721f7/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
----------------------------------------------------------------------
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
index 2161f72..f7ea2cc 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
@@ -62,6 +62,8 @@ public class RemoteQueueBindingImpl implements 
RemoteQueueBinding {
 
    private final int distance;
 
+   private final MessageLoadBalancingType messageLoadBalancingType;
+
    private boolean connected = true;
 
    public RemoteQueueBindingImpl(final long id,
@@ -72,7 +74,8 @@ public class RemoteQueueBindingImpl implements 
RemoteQueueBinding {
                                  final SimpleString filterString,
                                  final Queue storeAndForwardQueue,
                                  final SimpleString bridgeName,
-                                 final int distance) throws Exception {
+                                 final int distance,
+                                 final MessageLoadBalancingType 
messageLoadBalancingType) throws Exception {
       this.id = id;
 
       this.address = address;
@@ -90,6 +93,8 @@ public class RemoteQueueBindingImpl implements 
RemoteQueueBinding {
       idsHeaderName = Message.HDR_ROUTE_TO_IDS.concat(bridgeName);
 
       this.distance = distance;
+
+      this.messageLoadBalancingType = messageLoadBalancingType;
    }
 
    @Override
@@ -149,7 +154,7 @@ public class RemoteQueueBindingImpl implements 
RemoteQueueBinding {
 
    @Override
    public synchronized boolean isHighAcceptPriority(final Message message) {
-      if (consumerCount == 0) {
+      if (consumerCount == 0 || 
messageLoadBalancingType.equals(MessageLoadBalancingType.OFF)) {
          return false;
       }
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/773721f7/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/RemoteBindingWithoutLoadBalancingTest.java
----------------------------------------------------------------------
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/RemoteBindingWithoutLoadBalancingTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/RemoteBindingWithoutLoadBalancingTest.java
index da06175..0322f38 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/RemoteBindingWithoutLoadBalancingTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/RemoteBindingWithoutLoadBalancingTest.java
@@ -16,7 +16,16 @@
  */
 package org.apache.activemq.artemis.tests.integration.cluster.distribution;
 
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.activemq.artemis.api.core.SimpleString;
 import 
org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.junit.Wait;
 import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
 import org.junit.Before;
 import org.junit.Test;
@@ -60,6 +69,37 @@ public class RemoteBindingWithoutLoadBalancingTest extends 
ClusterTestBase {
       send(1, "queues.testaddress", 1, false, null);
    }
 
+   @Test
+   public void testStackOverflowJMS() throws Exception {
+      final String QUEUE_NAME = "queues.queue0";
+
+      setupCluster();
+
+      startServers();
+
+      ConnectionFactory cf1 = new ActiveMQConnectionFactory("vm://0");
+      Connection c1 = cf1.createConnection();
+      c1.start();
+      Session s1 = c1.createSession();
+      MessageConsumer mc1 = s1.createConsumer(s1.createQueue(QUEUE_NAME));
+
+      waitForBindings(0, QUEUE_NAME, 1, 1, true);
+      waitForBindings(1, QUEUE_NAME, 1, 1, false);
+
+      ConnectionFactory cf2 = new ActiveMQConnectionFactory("vm://1");
+      Connection c2 = cf2.createConnection();
+      Session s2 = c2.createSession();
+      MessageProducer mp2 = s2.createProducer(s2.createQueue(QUEUE_NAME));
+      mp2.send(s2.createMessage());
+
+      waitForBindings(1, QUEUE_NAME, 1, 0, true);
+
+      assertTrue(Wait.waitFor(() -> 
servers[1].locateQueue(SimpleString.toSimpleString(QUEUE_NAME)).getMessageCount()
 == 1, 2000, 100));
+
+      c1.close();
+      c2.close();
+   }
+
    protected void setupCluster() throws Exception {
       setupClusterConnection("cluster0", "queues", 
MessageLoadBalancingType.OFF, 1, isNetty(), 0, 1);
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/773721f7/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/cluster/impl/RemoteQueueBindImplTest.java
----------------------------------------------------------------------
diff --git 
a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/cluster/impl/RemoteQueueBindImplTest.java
 
b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/cluster/impl/RemoteQueueBindImplTest.java
index 66528da..77a8ee5 100644
--- 
a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/cluster/impl/RemoteQueueBindImplTest.java
+++ 
b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/cluster/impl/RemoteQueueBindImplTest.java
@@ -18,6 +18,7 @@ package 
org.apache.activemq.artemis.tests.unit.core.server.cluster.impl;
 
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.server.Queue;
+import 
org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import 
org.apache.activemq.artemis.core.server.cluster.impl.RemoteQueueBindingImpl;
 import org.apache.activemq.artemis.tests.unit.core.postoffice.impl.FakeQueue;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -48,7 +49,7 @@ public class RemoteQueueBindImplTest extends ActiveMQTestBase 
{
       final Queue storeAndForwardQueue = new FakeQueue(null);
       final SimpleString bridgeName = RandomUtil.randomSimpleString();
       final int distance = 0;
-      RemoteQueueBindingImpl binding = new RemoteQueueBindingImpl(id, address, 
uniqueName, routingName, remoteQueueID, filterString, storeAndForwardQueue, 
bridgeName, distance);
+      RemoteQueueBindingImpl binding = new RemoteQueueBindingImpl(id, address, 
uniqueName, routingName, remoteQueueID, filterString, storeAndForwardQueue, 
bridgeName, distance, MessageLoadBalancingType.ON_DEMAND);
 
       for (int i = 0; i < 100; i++) {
          binding.addConsumer(new SimpleString("B" + i + "<A"));

Reply via email to