From 683879495c5c1778495344b296ccdcf58cf7f65c Mon Sep 17 00:00:00 2001 From: gtully Date: Fri, 13 Nov 2020 10:03:28 +0000 Subject: [PATCH] ARTEMIS-2990 - avoid auto boxing on binding id used as map key --- .../artemis/core/postoffice/Binding.java | 2 +- .../core/postoffice/impl/DivertBinding.java | 4 +- .../postoffice/impl/LocalQueueBinding.java | 2 +- .../activemq/artemis/core/server/Queue.java | 2 +- .../cluster/impl/RemoteQueueBindingImpl.java | 4 +- .../artemis/core/server/impl/QueueImpl.java | 4 +- .../impl/ScheduledDeliveryHandlerTest.java | 4 +- .../integration/client/UpdateQueueTest.java | 4 +- .../postoffice/impl/BindingsImplTest.java | 4 +- .../unit/core/postoffice/impl/FakeQueue.java | 4 +- .../impl/WildcardAddressManagerPerfTest.java | 278 ++++++++++++++++++ .../impl/WildcardAddressManagerUnitTest.java | 4 +- 12 files changed, 297 insertions(+), 19 deletions(-) create mode 100644 tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerPerfTest.java diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java index bd6b705e7c..30e138c66d 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java @@ -48,7 +48,7 @@ public interface Binding extends UnproposalListener { boolean isExclusive(); - long getID(); + Long getID(); int getDistance(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java index f12d8af293..bb4ebc8b7b 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java @@ -37,7 +37,7 @@ public class DivertBinding implements Binding { private final boolean exclusive; - private final long id; + private final Long id; public DivertBinding(final long id, final SimpleString address, final Divert divert) { this.id = id; @@ -54,7 +54,7 @@ public class DivertBinding implements Binding { } @Override - public long getID() { + public Long getID() { return id; } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java index ed5eb3b00d..228921c1c9 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java @@ -55,7 +55,7 @@ public class LocalQueueBinding implements QueueBinding { } @Override - public long getID() { + public Long getID() { return queue.getID(); } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java index bf7f915466..eb04963c4d 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java @@ -45,7 +45,7 @@ public interface Queue extends Bindable,CriticalComponent { SimpleString getName(); - long getID(); + Long getID(); Filter getFilter(); 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 75d656bac7..d29c23af9a 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 @@ -58,7 +58,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding { private final SimpleString idsHeaderName; - private final long id; + private final Long id; private final int distance; @@ -98,7 +98,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding { } @Override - public long getID() { + public Long getID() { return id; } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java index 7020a9cd8d..c814067756 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java @@ -153,7 +153,7 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { public static final int DEFAULT_FLUSH_LIMIT = 500; - private final long id; + private final Long id; private final SimpleString name; @@ -985,7 +985,7 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { } @Override - public long getID() { + public Long getID() { return id; } diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java index ebae0b3b52..5d3e1d149e 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java @@ -995,8 +995,8 @@ public class ScheduledDeliveryHandlerTest extends Assert { } @Override - public long getID() { - return 0; + public Long getID() { + return Long.valueOf(0L); } @Override diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/UpdateQueueTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/UpdateQueueTest.java index a9250b3164..f355c708cd 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/UpdateQueueTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/UpdateQueueTest.java @@ -53,7 +53,7 @@ public class UpdateQueueTest extends ActiveMQTestBase { Queue queue = server.createQueue(new QueueConfiguration(ADDRESS).setRoutingType(RoutingType.ANYCAST).setUser(user)); - long originalID = queue.getID(); + Long originalID = queue.getID(); Assert.assertEquals(user, queue.getUser()); @@ -121,7 +121,7 @@ public class UpdateQueueTest extends ActiveMQTestBase { Queue queue = server.createQueue(new QueueConfiguration(ADDRESS).setRoutingType(RoutingType.ANYCAST)); - long originalID = queue.getID(); + Long originalID = queue.getID(); Assert.assertNull(queue.getUser()); diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java index e2766a38da..0b0b1083a1 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java @@ -358,8 +358,8 @@ public class BindingsImplTest extends ActiveMQTestBase { } @Override - public long getID() { - return 0; + public Long getID() { + return Long.valueOf(0L); } /* (non-Javadoc) diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java index f871d25b0b..cc88b53563 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java @@ -356,7 +356,7 @@ public class FakeQueue extends CriticalComponentImpl implements Queue { private final SimpleString name; - private final long id; + private final Long id; private long messageCount; @@ -689,7 +689,7 @@ public class FakeQueue extends CriticalComponentImpl implements Queue { } @Override - public long getID() { + public Long getID() { return id; } diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerPerfTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerPerfTest.java new file mode 100644 index 0000000000..43545e4662 --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerPerfTest.java @@ -0,0 +1,278 @@ +/* + * 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.activemq.artemis.tests.unit.core.postoffice.impl; + +import java.util.Collection; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.apache.activemq.artemis.api.core.Message; +import org.apache.activemq.artemis.api.core.RoutingType; +import org.apache.activemq.artemis.api.core.SimpleString; +import org.apache.activemq.artemis.core.config.WildcardConfiguration; +import org.apache.activemq.artemis.core.filter.Filter; +import org.apache.activemq.artemis.core.postoffice.Binding; +import org.apache.activemq.artemis.core.postoffice.BindingType; +import org.apache.activemq.artemis.core.postoffice.Bindings; +import org.apache.activemq.artemis.core.postoffice.BindingsFactory; +import org.apache.activemq.artemis.core.postoffice.QueueBinding; +import org.apache.activemq.artemis.core.postoffice.impl.BindingsImpl; +import org.apache.activemq.artemis.core.postoffice.impl.WildcardAddressManager; +import org.apache.activemq.artemis.core.server.Bindable; +import org.apache.activemq.artemis.core.server.Queue; +import org.apache.activemq.artemis.core.server.RoutingContext; +import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType; +import org.apache.activemq.artemis.core.server.impl.AddressInfo; +import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet; +import org.jboss.logging.Logger; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class WildcardAddressManagerPerfTest { + private static final Logger log = Logger.getLogger(WildcardAddressManagerPerfTest.class); + + @Test + @Ignore + public void testConcurrencyAndEfficiency() throws Exception { + + System.out.println("Type so we can go on.."); + //TimeUnit.SECONDS.sleep(20); + System.out.println("we can go on.."); + + final WildcardConfiguration configuration = new WildcardConfiguration(); + configuration.setAnyWords('>'); + final WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), configuration, null, null); + + final SimpleString wildCard = SimpleString.toSimpleString("Topic1.>"); + ad.addAddressInfo(new AddressInfo(wildCard, RoutingType.MULTICAST)); + + int numSubs = 1000; + int numThreads = 1; + ExecutorService executorService = Executors.newFixedThreadPool(numThreads); + + for (int i = 0; i < numSubs; i++ ) { + final int id = i; + + executorService.submit(() -> { + try { + + if (id % 500 == 0) { + // give gc a chance + Thread.yield(); + } + + // subscribe as wildcard + ad.addBinding(new BindingFake(SimpleString.toSimpleString("Topic1.>"), SimpleString.toSimpleString("" + id), id)); + + SimpleString pubAddr = SimpleString.toSimpleString("Topic1." + id ); + // publish + Bindings binding = ad.getBindingsForRoutingAddress(pubAddr); + + if (id % 100 == 0) { + System.err.println("1. Bindings for: " + id + ", " + binding.getBindings().size()); + } + + // publish again + binding = ad.getBindingsForRoutingAddress(pubAddr); + + if (id % 100 == 0) { + System.err.println("2. Bindings for: " + id + ", " + binding.getBindings().size()); + } + + // cluster consumer + //ad.updateMessageLoadBalancingTypeForAddress(wildCard, MessageLoadBalancingType.ON_DEMAND); + + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + executorService.shutdown(); + assertTrue("finished on time", executorService.awaitTermination(10, TimeUnit.MINUTES)); + + // TimeUnit.MINUTES.sleep(5); + + System.out.println("Type so we can go on.."); + // System.in.read(); + System.out.println("we can go on.."); + + + } + class BindingFactoryFake implements BindingsFactory { + + @Override + public Bindings createBindings(SimpleString address) throws Exception { + return new BindingsImpl(address, null); + } + } + + class BindingFake implements Binding { + + final SimpleString address; + final SimpleString id; + final Long idl; + + BindingFake(SimpleString addressParameter, SimpleString id, long idl) { + this.address = addressParameter; + this.id = id; + this.idl = idl; + } + + @Override + public void unproposed(SimpleString groupID) { + + } + + @Override + public SimpleString getAddress() { + return address; + } + + @Override + public Bindable getBindable() { + return null; + } + + @Override + public BindingType getType() { + return BindingType.LOCAL_QUEUE; + } + + @Override + public SimpleString getUniqueName() { + return id; + } + + @Override + public SimpleString getRoutingName() { + return id; + } + + @Override + public SimpleString getClusterName() { + return null; + } + + @Override + public Filter getFilter() { + return null; + } + + @Override + public boolean isHighAcceptPriority(Message message) { + return false; + } + + @Override + public boolean isExclusive() { + return false; + } + + @Override + public Long getID() { + return idl; + } + + @Override + public int getDistance() { + return 0; + } + + @Override + public void route(Message message, RoutingContext context) throws Exception { + } + + @Override + public void close() throws Exception { + } + + @Override + public String toManagementString() { + return "FakeBiding Address=" + this.address; + } + + @Override + public boolean isConnected() { + return true; + } + + @Override + public void routeWithAck(Message message, RoutingContext context) { + + } + } + + class BindingsFake implements Bindings { + + ConcurrentHashSet bindings = new ConcurrentHashSet<>(); + + @Override + public Collection getBindings() { + return bindings; + } + + @Override + public void addBinding(Binding binding) { + bindings.addIfAbsent(binding); + } + + @Override + public void removeBinding(Binding binding) { + bindings.remove(binding); + } + + @Override + public void setMessageLoadBalancingType(MessageLoadBalancingType messageLoadBalancingType) { + + } + + @Override + public MessageLoadBalancingType getMessageLoadBalancingType() { + return null; + } + + @Override + public void unproposed(SimpleString groupID) { + } + + @Override + public void updated(QueueBinding binding) { + } + + @Override + public boolean redistribute(Message message, + Queue originatingQueue, + RoutingContext context) throws Exception { + return false; + } + + @Override + public void route(Message message, RoutingContext context) throws Exception { + log.debug("routing message: " + message); + } + + @Override + public boolean allowRedistribute() { + return false; + } + } + +} diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java index 8375ae825c..24e2651aba 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java @@ -271,8 +271,8 @@ public class WildcardAddressManagerUnitTest extends ActiveMQTestBase { } @Override - public long getID() { - return 0; + public Long getID() { + return Long.valueOf(0); } @Override