activemq-0002/0003: candidateConsumers List→Set O(1); ENDED_XA List→Set O(1)
This commit is contained in:
parent
e0486b7301
commit
23fbfdca44
3 changed files with 193 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue