This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/master by this push:
new 8d848f4 ARTEMIS-3188 / ARTEMIS-2108 Fixing StackOverFlow over bindings
new 02ec0bf This closes #3501
8d848f4 is described below
commit 8d848f4615a6ea81002eaf638e93826c810b0884
Author: gtully <[email protected]>
AuthorDate: Thu Mar 18 10:08:38 2021 +0000
ARTEMIS-3188 / ARTEMIS-2108 Fixing StackOverFlow over bindings
This fix was done in collaboration with Gary Tully
---
.../artemis/core/postoffice/impl/BindingsImpl.java | 32 ++++++++--------------
.../RemoteBindingWithoutLoadBalancingTest.java | 21 ++++++++++++++
2 files changed, 32 insertions(+), 21 deletions(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
index bc29edb..54266e1 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
@@ -437,9 +437,7 @@ public final class BindingsImpl implements Bindings {
}
}
- Filter filter = binding.getFilter();
-
- if (filter == null || filter.match(message)) {
+ if (matchBinding(message, binding)) {
// bindings.length == 1 ==> only a local queue so we don't check
for matching consumers (it's an
// unnecessary overhead)
if (length == 1 || (binding.isConnected() &&
(messageLoadBalancingType.equals(MessageLoadBalancingType.STRICT) ||
binding.isHighAcceptPriority(message)))) {
@@ -486,29 +484,21 @@ public final class BindingsImpl implements Bindings {
if (pos != startPos) {
routingNamePositions.put(routingName, pos);
}
-
- if (messageLoadBalancingType.equals(MessageLoadBalancingType.OFF) &&
theBinding instanceof RemoteQueueBinding) {
- if (exclusivelyRemote(bindings)) {
- theBinding = null;
- } else {
- theBinding = getNextBinding(message, routingName, bindings);
- }
- }
-
return theBinding;
}
- private boolean exclusivelyRemote(List<Binding> bindings) {
- boolean result = true;
-
- for (Binding binding : bindings) {
- if (!(binding instanceof RemoteQueueBinding)) {
- result = false;
- break;
- }
+ private boolean matchBinding(Message message, Binding binding) {
+ if (messageLoadBalancingType.equals(MessageLoadBalancingType.OFF) &&
binding instanceof RemoteQueueBinding) {
+ return false;
}
- return result;
+ Filter filter = binding.getFilter();
+
+ if (filter == null || filter.match(message)) {
+ return true;
+ } else {
+ return false;
+ }
}
private void routeUsingStrictOrdering(final Message message,
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 b627e87..028bbd7 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
@@ -67,6 +67,27 @@ public class RemoteBindingWithoutLoadBalancingTest extends
ClusterTestBase {
}
@Test
+ public void testStackOverflowWithLocalConsumerAndFilter() throws Exception {
+ setupCluster();
+
+ startServers();
+
+ setupSessionFactory(0, isNetty());
+ setupSessionFactory(1, isNetty());
+
+ createQueue(0, "queues.testaddress", "queue0", "0", true);
+ createQueue(1, "queues.testaddress", "queue0", "1", true);
+
+ waitForBindings(0, "queues.testaddress", 1, 0, true);
+
+ waitForBindings(1, "queues.testaddress", 1, 0, false);
+
+ for (int i = 0; i < 10; i++) {
+ send(1, "queues.testaddress", 10, false, "" + i % 2);
+ }
+ }
+
+ @Test
public void testStackOverflowJMS() throws Exception {
final String QUEUE_NAME = "queues.queue0";