This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push:
new 69bb096b71 Fix some concurrency issues in OrderInterceptor
69bb096b71 is described below
commit 69bb096b710674185fbf7bd5cc120b9334b24453
Author: Mark Thomas <[email protected]>
AuthorDate: Tue Jun 9 14:29:33 2026 +0100
Fix some concurrency issues in OrderInterceptor
---
.../group/interceptors/OrderInterceptor.java | 44 ++++++++++------------
webapps/docs/changelog.xml | 4 ++
2 files changed, 23 insertions(+), 25 deletions(-)
diff --git
a/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java
b/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java
index a324986bd1..4ea952d5cb 100644
--- a/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java
+++ b/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java
@@ -16,8 +16,8 @@
*/
package org.apache.catalina.tribes.group.interceptors;
-import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -59,9 +59,9 @@ public class OrderInterceptor extends ChannelInterceptorBase {
* String manager for internationalization.
*/
protected static final StringManager sm =
StringManager.getManager(OrderInterceptor.class);
- private final Map<Member,Counter> outcounter = new HashMap<>();
- private final Map<Member,Counter> incounter = new HashMap<>();
- private final Map<Member,MessageOrder> incoming = new HashMap<>();
+ private final Map<Member,Counter> outcounter = new ConcurrentHashMap<>();
+ private final Map<Member,Counter> incounter = new ConcurrentHashMap<>();
+ private final Map<Member,MessageOrder> incoming = new
ConcurrentHashMap<>();
private long expire = 3000;
private boolean forwardExpired = true;
private int maxQueue = Integer.MAX_VALUE;
@@ -204,19 +204,18 @@ public class OrderInterceptor extends
ChannelInterceptorBase {
return result;
}
- @Override
- public void memberAdded(Member member) {
- // notify upwards
- super.memberAdded(member);
- }
-
@Override
public void memberDisappeared(Member member) {
// reset counters - lock free
incounter.remove(member);
outcounter.remove(member);
// clear the remaining queue
- processLeftOvers(member, true);
+ inLock.writeLock().lock();
+ try {
+ processLeftOvers(member, true);
+ } finally {
+ inLock.writeLock().unlock();
+ }
// notify upwards
super.memberDisappeared(member);
}
@@ -239,13 +238,8 @@ public class OrderInterceptor extends
ChannelInterceptorBase {
* @return The counter
*/
protected Counter getInCounter(Member mbr) {
- Counter cnt = incounter.get(mbr);
- if (cnt == null) {
- cnt = new Counter();
- cnt.inc(); // always start at 1 for incoming
- incounter.put(mbr, cnt);
- }
- return cnt;
+ // Always start at 1 for incoming
+ return incounter.computeIfAbsent(mbr, k -> new Counter(1));
}
/**
@@ -255,12 +249,7 @@ public class OrderInterceptor extends
ChannelInterceptorBase {
* @return The counter
*/
protected Counter getOutCounter(Member mbr) {
- Counter cnt = outcounter.get(mbr);
- if (cnt == null) {
- cnt = new Counter();
- outcounter.put(mbr, cnt);
- }
- return cnt;
+ return outcounter.computeIfAbsent(mbr, k -> new Counter());
}
/**
@@ -271,9 +260,14 @@ public class OrderInterceptor extends
ChannelInterceptorBase {
* Constructs a Counter with initial value 0.
*/
public Counter() {
+ this(0);
+ }
+
+ public Counter(int startValue) {
+ value = new AtomicInteger(startValue);
}
- private final AtomicInteger value = new AtomicInteger(0);
+ private final AtomicInteger value;
/**
* Returns the current counter value.
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 12b73ed1d1..0017450ba8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -344,6 +344,10 @@
Fix some concurrency issues in <code>FragmentationInterceptor</code>.
(markt)
</fix>
+ <fix>
+ Fix some concurrency issues in <code>OrderInterceptor</code>.
+ (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="WebSocket">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]