activemq-0002/0003: candidateConsumers List→Set O(1); ENDED_XA List→Set O(1)

This commit is contained in:
russell@unturf.com 2026-03-30 08:02:45 -04:00
parent e0486b7301
commit 23fbfdca44
3 changed files with 193 additions and 0 deletions

View file

@ -0,0 +1,24 @@
--- a/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
@@ -1558,7 +1558,8 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
List<ConsumerId> candidateConsumers = consumerInfo.getNetworkConsumerIds();
+ Set<ConsumerId> candidateSet = new HashSet<>(candidateConsumers); /* O(1) lookup in matchFound; was O(C) ArrayList.contains */
Collection<Subscription> currentSubs = getRegionSubscriptions(consumerInfo.getDestination());
for (Subscription sub : currentSubs) {
- List<ConsumerId> networkConsumers = sub.getConsumerInfo().getNetworkConsumerIds();
+ List<ConsumerId> networkConsumers = sub.getConsumerInfo().getNetworkConsumerIds(); /* note: cached at call site in callers */
if (!networkConsumers.isEmpty()) {
- if (matchFound(candidateConsumers, networkConsumers)) {
+ if (matchFound(candidateSet, networkConsumers)) {
if (isInActiveDurableSub(sub)) {
@@ -1615,9 +1615,9 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
- private boolean matchFound(List<ConsumerId> candidateConsumers, List<ConsumerId> networkConsumers) {
+ private boolean matchFound(Set<ConsumerId> candidateConsumers, List<ConsumerId> networkConsumers) {
boolean found = false;
for (ConsumerId aliasConsumer : networkConsumers) {
- if (candidateConsumers.contains(aliasConsumer)) { /* was O(C) ArrayList.contains per alias — defect */
+ if (candidateConsumers.contains(aliasConsumer)) { /* O(1) HashSet.contains */
found = true;
break;
}

View file

@ -0,0 +1,22 @@
--- a/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
+++ b/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
@@ -70,7 +70,7 @@ public class TransactionContext implements XAResource {
// XATransactionId -> ArrayList of TransactionContext objects
- private final static HashMap<TransactionId, List<TransactionContext>> ENDED_XA_TRANSACTION_CONTEXTS =
- new HashMap<TransactionId, List<TransactionContext>>();
+ private final static HashMap<TransactionId, Set<TransactionContext>> ENDED_XA_TRANSACTION_CONTEXTS =
+ new HashMap<TransactionId, Set<TransactionContext>>(); /* values are Set for O(1) contains in isInXATransaction */
@@ -94,7 +94,7 @@ public class TransactionContext implements XAResource {
public boolean isInXATransaction() {
if (transactionId != null && transactionId.isXATransaction()) {
return true;
} else {
synchronized(ENDED_XA_TRANSACTION_CONTEXTS) {
- for(List<TransactionContext> transactions : ENDED_XA_TRANSACTION_CONTEXTS.values()) {
- if (transactions.contains(this)) { /* was O(C) ArrayList.contains per XA txn — defect */
+ for(Set<TransactionContext> transactions : ENDED_XA_TRANSACTION_CONTEXTS.values()) {
+ if (transactions.contains(this)) { /* O(1) HashSet.contains */
return true;
}
}