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

pandaapo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/eventmesh.git


The following commit(s) were added to refs/heads/master by this push:
     new e056d7a56 [ISSUE #4630] Fix concurrency problem and  split task handle 
threadpool (#4679)
e056d7a56 is described below

commit e056d7a56f349a000611e92aa457b51b782dbfee
Author: lrhkobe <[email protected]>
AuthorDate: Tue Dec 19 20:45:36 2023 +0800

    [ISSUE #4630] Fix concurrency problem and  split task handle threadpool 
(#4679)
    
    * fix concurrency problem
    
    * split task handle threadpool
    
    * fix checkstyle problem
---
 .../eventmesh/runtime/boot/EventMeshTCPServer.java | 20 +++++++-----
 .../eventmesh/runtime/boot/TCPThreadPoolGroup.java | 38 +++++++++++++++++++++-
 .../configuration/EventMeshTCPConfiguration.java   | 23 ++++++++++++-
 .../client/group/ClientSessionGroupMapping.java    | 20 ++++++++----
 .../rebalance/EventMeshRebalanceService.java       |  5 ++-
 .../runtime/metrics/tcp/EventMeshTcpMonitor.java   | 14 ++++++--
 6 files changed, 98 insertions(+), 22 deletions(-)

diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
index 548e891c8..9c3fbc549 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
@@ -222,17 +222,21 @@ public class EventMeshTCPServer extends AbstractTCPServer 
{
         ListenProcessor listenProcessor = new ListenProcessor(this);
         registerProcessor(Command.LISTEN_REQUEST, listenProcessor, 
taskHandleExecutorService);
 
+        ThreadPoolExecutor sendExecutorService = 
super.getTcpThreadPoolGroup().getSendExecutorService();
         MessageTransferProcessor messageTransferProcessor = new 
MessageTransferProcessor(this);
-        registerProcessor(Command.REQUEST_TO_SERVER, messageTransferProcessor, 
taskHandleExecutorService);
-        registerProcessor(Command.RESPONSE_TO_SERVER, 
messageTransferProcessor, taskHandleExecutorService);
-        registerProcessor(Command.ASYNC_MESSAGE_TO_SERVER, 
messageTransferProcessor, taskHandleExecutorService);
-        registerProcessor(Command.BROADCAST_MESSAGE_TO_SERVER, 
messageTransferProcessor, taskHandleExecutorService);
+        registerProcessor(Command.REQUEST_TO_SERVER, messageTransferProcessor, 
sendExecutorService);
+        registerProcessor(Command.ASYNC_MESSAGE_TO_SERVER, 
messageTransferProcessor, sendExecutorService);
+        registerProcessor(Command.BROADCAST_MESSAGE_TO_SERVER, 
messageTransferProcessor, sendExecutorService);
 
+        ThreadPoolExecutor replyExecutorService = 
super.getTcpThreadPoolGroup().getReplyExecutorService();
+        registerProcessor(Command.RESPONSE_TO_SERVER, 
messageTransferProcessor, replyExecutorService);
+
+        ThreadPoolExecutor ackExecutorService = 
super.getTcpThreadPoolGroup().getAckExecutorService();
         MessageAckProcessor messageAckProcessor = new 
MessageAckProcessor(this);
-        registerProcessor(Command.RESPONSE_TO_CLIENT_ACK, messageAckProcessor, 
taskHandleExecutorService);
-        registerProcessor(Command.ASYNC_MESSAGE_TO_CLIENT_ACK, 
messageAckProcessor, taskHandleExecutorService);
-        registerProcessor(Command.BROADCAST_MESSAGE_TO_CLIENT_ACK, 
messageAckProcessor, taskHandleExecutorService);
-        registerProcessor(Command.REQUEST_TO_CLIENT_ACK, messageAckProcessor, 
taskHandleExecutorService);
+        registerProcessor(Command.RESPONSE_TO_CLIENT_ACK, messageAckProcessor, 
ackExecutorService);
+        registerProcessor(Command.ASYNC_MESSAGE_TO_CLIENT_ACK, 
messageAckProcessor, ackExecutorService);
+        registerProcessor(Command.BROADCAST_MESSAGE_TO_CLIENT_ACK, 
messageAckProcessor, ackExecutorService);
+        registerProcessor(Command.REQUEST_TO_CLIENT_ACK, messageAckProcessor, 
ackExecutorService);
     }
 
     public EventMeshServer getEventMeshServer() {
diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/TCPThreadPoolGroup.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/TCPThreadPoolGroup.java
index 189119294..5f71a57f5 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/TCPThreadPoolGroup.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/TCPThreadPoolGroup.java
@@ -30,6 +30,9 @@ public class TCPThreadPoolGroup implements ThreadPoolGroup {
     private final EventMeshTCPConfiguration eventMeshTCPConfiguration;
     private ScheduledExecutorService scheduler;
     private ThreadPoolExecutor taskHandleExecutorService;
+    private ThreadPoolExecutor sendExecutorService;
+    private ThreadPoolExecutor ackExecutorService;
+    private ThreadPoolExecutor replyExecutorService;
     private ThreadPoolExecutor broadcastMsgDownstreamExecutorService;
 
     public TCPThreadPoolGroup(EventMeshTCPConfiguration 
eventMeshTCPConfiguration) {
@@ -45,9 +48,27 @@ public class TCPThreadPoolGroup implements ThreadPoolGroup {
         taskHandleExecutorService = ThreadPoolFactory.createThreadPoolExecutor(
             
eventMeshTCPConfiguration.getEventMeshTcpTaskHandleExecutorPoolSize(),
             
eventMeshTCPConfiguration.getEventMeshTcpTaskHandleExecutorPoolSize(),
-            new LinkedBlockingQueue<>(10_000),
+            new 
LinkedBlockingQueue<>(eventMeshTCPConfiguration.getEventMeshTcpTaskHandleExecutorQueueSize()),
             new EventMeshThreadFactory("eventMesh-tcp-task-handle", true));
 
+        sendExecutorService = ThreadPoolFactory.createThreadPoolExecutor(
+            eventMeshTCPConfiguration.getEventMeshTcpMsgSendExecutorPoolSize(),
+            eventMeshTCPConfiguration.getEventMeshTcpMsgSendExecutorPoolSize(),
+            new 
LinkedBlockingQueue<>(eventMeshTCPConfiguration.getEventMeshTcpMsgSendExecutorQueueSize()),
+            new EventMeshThreadFactory("eventMesh-tcp-msg-send", true));
+
+        replyExecutorService = ThreadPoolFactory.createThreadPoolExecutor(
+            
eventMeshTCPConfiguration.getEventMeshTcpMsgReplyExecutorPoolSize(),
+            
eventMeshTCPConfiguration.getEventMeshTcpMsgReplyExecutorPoolSize(),
+            new 
LinkedBlockingQueue<>(eventMeshTCPConfiguration.getEventMeshTcpMsgReplyExecutorQueueSize()),
+            new EventMeshThreadFactory("eventMesh-tcp-msg-reply", true));
+
+        ackExecutorService = ThreadPoolFactory.createThreadPoolExecutor(
+            eventMeshTCPConfiguration.getEventMeshTcpMsgAckExecutorPoolSize(),
+            eventMeshTCPConfiguration.getEventMeshTcpMsgAckExecutorPoolSize(),
+            new 
LinkedBlockingQueue<>(eventMeshTCPConfiguration.getEventMeshTcpMsgAckExecutorQueueSize()),
+            new EventMeshThreadFactory("eventMesh-tcp-msg-ack", true));
+
         broadcastMsgDownstreamExecutorService = 
ThreadPoolFactory.createThreadPoolExecutor(
             
eventMeshTCPConfiguration.getEventMeshTcpMsgDownStreamExecutorPoolSize(),
             
eventMeshTCPConfiguration.getEventMeshTcpMsgDownStreamExecutorPoolSize(),
@@ -59,6 +80,9 @@ public class TCPThreadPoolGroup implements ThreadPoolGroup {
     public void shutdownThreadPool() {
         scheduler.shutdown();
         taskHandleExecutorService.shutdown();
+        sendExecutorService.shutdown();;
+        replyExecutorService.shutdown();
+        ackExecutorService.shutdown();
         broadcastMsgDownstreamExecutorService.shutdown();
     }
 
@@ -73,4 +97,16 @@ public class TCPThreadPoolGroup implements ThreadPoolGroup {
     public ThreadPoolExecutor getBroadcastMsgDownstreamExecutorService() {
         return broadcastMsgDownstreamExecutorService;
     }
+
+    public ThreadPoolExecutor getSendExecutorService() {
+        return sendExecutorService;
+    }
+
+    public ThreadPoolExecutor getAckExecutorService() {
+        return ackExecutorService;
+    }
+
+    public ThreadPoolExecutor getReplyExecutorService() {
+        return replyExecutorService;
+    }
 }
\ No newline at end of file
diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
index 2718112dd..84871b582 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
@@ -59,7 +59,28 @@ public class EventMeshTCPConfiguration extends 
CommonConfiguration {
     private int eventMeshTcpGlobalScheduler = 5;
 
     @ConfigFiled(field = "tcp.taskHandleExecutorPoolSize")
-    private int eventMeshTcpTaskHandleExecutorPoolSize = 
Runtime.getRuntime().availableProcessors();
+    private int eventMeshTcpTaskHandleExecutorPoolSize = 2 * 
Runtime.getRuntime().availableProcessors();
+
+    @ConfigFiled(field = "tcp.sendExecutorPoolSize")
+    private int eventMeshTcpMsgSendExecutorPoolSize = 2 * 
Runtime.getRuntime().availableProcessors();
+
+    @ConfigFiled(field = "tcp.replyExecutorPoolSize")
+    private int eventMeshTcpMsgReplyExecutorPoolSize = 2 * 
Runtime.getRuntime().availableProcessors();
+
+    @ConfigFiled(field = "tcp.ackExecutorPoolSize")
+    private int eventMeshTcpMsgAckExecutorPoolSize = 2 * 
Runtime.getRuntime().availableProcessors();
+
+    @ConfigFiled(field = "tcp.taskHandleExecutorQueueSize")
+    private int eventMeshTcpTaskHandleExecutorQueueSize = 10000;
+
+    @ConfigFiled(field = "tcp.sendExecutorQueueSize")
+    private int eventMeshTcpMsgSendExecutorQueueSize = 10000;
+
+    @ConfigFiled(field = "tcp.replyExecutorQueueSize")
+    private int eventMeshTcpMsgReplyExecutorQueueSize = 10000;
+
+    @ConfigFiled(field = "tcp.ackExecutorQueueSize")
+    private int eventMeshTcpMsgAckExecutorQueueSize = 10000;
 
     @ConfigFiled(field = "tcp.msgDownStreamExecutorPoolSize")
     private int eventMeshTcpMsgDownStreamExecutorPoolSize = 
Math.max(Runtime.getRuntime().availableProcessors(), 8);
diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
index f6ac3d73c..ab101ce8c 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java
@@ -167,12 +167,20 @@ public class ClientSessionGroupMapping {
 
             session.setSessionState(SessionState.CLOSED);
 
-            if 
(EventMeshConstants.PURPOSE_SUB.equals(session.getClient().getPurpose())) {
-                cleanClientGroupWrapperByCloseSub(session);
-            } else if 
(EventMeshConstants.PURPOSE_PUB.equals(session.getClient().getPurpose())) {
-                cleanClientGroupWrapperByClosePub(session);
-            } else {
-                log.error("client purpose config is error:{}", 
session.getClient().getPurpose());
+            final String clientGroup = session.getClient().getGroup();
+            if (!lockMap.containsKey(clientGroup)) {
+                lockMap.putIfAbsent(clientGroup, new Object());
+            }
+            synchronized (lockMap.get(clientGroup)) {
+                if 
(EventMeshConstants.PURPOSE_SUB.equals(session.getClient().getPurpose())) {
+                    cleanClientGroupWrapperByCloseSub(session);
+                } else if (EventMeshConstants.PURPOSE_PUB.equals(
+                    session.getClient().getPurpose())) {
+                    cleanClientGroupWrapperByClosePub(session);
+                } else {
+                    log.error("client purpose config is error:{}",
+                        session.getClient().getPurpose());
+                }
             }
 
             if (session.getContext() != null) {
diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/rebalance/EventMeshRebalanceService.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/rebalance/EventMeshRebalanceService.java
index e6fce72cb..913ac3103 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/rebalance/EventMeshRebalanceService.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/rebalance/EventMeshRebalanceService.java
@@ -20,7 +20,6 @@ package 
org.apache.eventmesh.runtime.core.protocol.tcp.client.rebalance;
 import org.apache.eventmesh.common.EventMeshThreadFactory;
 import org.apache.eventmesh.common.ThreadPoolFactory;
 import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
-import org.apache.eventmesh.runtime.util.EventMeshUtil;
 
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -67,7 +66,7 @@ public class EventMeshRebalanceService {
         log.info("rebalance service shutdown......");
     }
 
-    public void printRebalanceThreadPoolState() {
-        EventMeshUtil.printState((ThreadPoolExecutor) 
serviceRebalanceScheduler);
+    public int getRebalanceThreadPoolQueueSize() {
+        return ((ThreadPoolExecutor) 
serviceRebalanceScheduler).getQueue().size();
     }
 }
diff --git 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/metrics/tcp/EventMeshTcpMonitor.java
 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/metrics/tcp/EventMeshTcpMonitor.java
index 1808a5c3c..5ca235e64 100644
--- 
a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/metrics/tcp/EventMeshTcpMonitor.java
+++ 
b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/metrics/tcp/EventMeshTcpMonitor.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -126,8 +127,16 @@ public class EventMeshTcpMonitor {
 
         }), delay, period, TimeUnit.MILLISECONDS);
 
-        monitorThreadPoolTask = 
eventMeshTCPServer.getTcpThreadPoolGroup().getScheduler().scheduleAtFixedRate(()
 -> {
-            
eventMeshTCPServer.getEventMeshRebalanceService().printRebalanceThreadPoolState();
+        monitorThreadPoolTask =  
eventMeshTCPServer.getTcpThreadPoolGroup().getScheduler().scheduleAtFixedRate(()
 -> {
+            
appLogger.info("{TaskHandle:{},Send:{},Ack:{},Reply:{},Push:{},Scheduler:{},Rebalance:{}}",
+                
eventMeshTCPServer.getTcpThreadPoolGroup().getTaskHandleExecutorService().getQueue().size(),
+                
eventMeshTCPServer.getTcpThreadPoolGroup().getSendExecutorService().getQueue().size(),
+                
eventMeshTCPServer.getTcpThreadPoolGroup().getAckExecutorService().getQueue().size(),
+                
eventMeshTCPServer.getTcpThreadPoolGroup().getReplyExecutorService().getQueue().size(),
+                
eventMeshTCPServer.getTcpThreadPoolGroup().getBroadcastMsgDownstreamExecutorService().getQueue().size(),
+                ((ThreadPoolExecutor) 
eventMeshTCPServer.getTcpThreadPoolGroup().getScheduler()).getQueue().size(),
+                
eventMeshTCPServer.getEventMeshRebalanceService().getRebalanceThreadPoolQueueSize());
+
             eventMeshTCPServer.getTcpRetryer().printState();
 
             // monitor retry queue size
@@ -137,7 +146,6 @@ public class EventMeshTcpMonitor {
                 EventMeshConstants.PROTOCOL_TCP,
                 MonitorMetricConstants.RETRY_QUEUE_SIZE,
                 tcpSummaryMetrics.getRetrySize());
-
         }, 10, PRINT_THREADPOOLSTATE_INTERVAL, TimeUnit.SECONDS);
         log.info("EventMeshTcpMonitor started......");
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to