You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2022/06/10 04:57:30 UTC

[activemq-artemis] branch main updated: ARTEMIS-3856 re-applying recursive logic on ThreadLocal

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 578f2fb5cf ARTEMIS-3856 re-applying recursive logic on ThreadLocal
578f2fb5cf is described below

commit 578f2fb5cf386a1c24566776f376d1361e5574bf
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Thu Jun 9 18:27:05 2022 -0400

    ARTEMIS-3856 re-applying recursive logic on ThreadLocal
---
 .../core/remoting/impl/netty/NettyConnection.java  | 50 ++++++++++++----------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyConnection.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyConnection.java
index 0a58e04f8f..a0a0476c6d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyConnection.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyConnection.java
@@ -62,7 +62,7 @@ public class NettyConnection implements Connection {
     * here for when the connection (or Netty Channel) becomes available again.
     */
    private final List<ReadyListener> readyListeners = new ArrayList<>();
-   private static final FastThreadLocal<ArrayList<ReadyListener>> readyListenersPool = new FastThreadLocal<>();
+   private static final FastThreadLocal<ArrayList<ReadyListener>> localListenersPool = new FastThreadLocal<>();
 
    private final boolean batchingEnabled;
 
@@ -138,47 +138,51 @@ public class NettyConnection implements Connection {
 
    @Override
    public final void fireReady(final boolean ready) {
-
-      // We are reusing a previously created ArrayList for this localArray
-      ArrayList<ReadyListener> localArrayList = readyListenersPool.get();
-      if (localArrayList == null) {
-         localArrayList = new ArrayList<>();
-         readyListenersPool.set(localArrayList);
-      } else {
-         localArrayList.clear();
+      ArrayList<ReadyListener> readyToCall = localListenersPool.get();
+      if (readyToCall != null) {
+         localListenersPool.set(null);
       }
-
       synchronized (readyListeners) {
          this.ready = ready;
 
          if (ready) {
             final int size = this.readyListeners.size();
-            localArrayList.ensureCapacity(size);
+            if (readyToCall != null) {
+               readyToCall.ensureCapacity(size);
+            }
             try {
                for (int i = 0; i < size; i++) {
                   final ReadyListener readyListener = readyListeners.get(i);
                   if (readyListener == null) {
                      break;
                   }
-                  localArrayList.add(readyListener);
+                  if (readyToCall == null) {
+                     readyToCall = new ArrayList<>(size);
+                  }
+                  readyToCall.add(readyListener);
                }
             } finally {
                readyListeners.clear();
             }
          }
       }
-      try {
-         localArrayList.forEach(readyListener -> {
-            try {
-               readyListener.readyForWriting();
-            } catch (Throwable logOnly) {
-               ActiveMQClientLogger.LOGGER.failedToSetChannelReadyForWriting(logOnly);
+      if (readyToCall != null) {
+         try {
+            readyToCall.forEach(readyListener -> {
+               try {
+                  readyListener.readyForWriting();
+               } catch (Throwable logOnly) {
+                  ActiveMQClientLogger.LOGGER.failedToSetChannelReadyForWriting(logOnly);
+               }
+            });
+         } catch (Throwable t) {
+            ActiveMQClientLogger.LOGGER.failedToSetChannelReadyForWriting(t);
+         } finally {
+            readyToCall.clear();
+            if (localListenersPool.get() != null) {
+               localListenersPool.set(readyToCall);
             }
-         });
-      } catch (Throwable t) {
-         ActiveMQClientLogger.LOGGER.failedToSetChannelReadyForWriting(t);
-      } finally {
-         localArrayList.clear();
+         }
       }
    }