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]

Reply via email to