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

yaohaishi pushed a commit to branch 2.8.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit e4e4f7d3561174e0266a7dfb84db6025c97e60f0
Author: yhs0092 <[email protected]>
AuthorDate: Fri Mar 21 10:13:46 2025 +0800

    [SCB-2897] optimize the pause status switching concurrency control
    
    Since it's not possible to keep the VertxWebSocketAdaptor.inPauseStatus 
consistent with the VertxWebSocketAdaptor.vertxWebSocket pause status just by 
the AtomicBoolean CAS operation, it's better to use a simple synchronized code 
block to make the code clearer.
---
 .../rest/vertx/ws/VertxWebSocketAdaptor.java       | 31 +++++++++++-----------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java
 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java
index 796a72979..3137e0f03 100644
--- 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java
+++ 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java
@@ -20,7 +20,6 @@ package org.apache.servicecomb.transport.rest.vertx.ws;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.servicecomb.core.executor.ReactiveExecutor;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
@@ -62,7 +61,9 @@ public class VertxWebSocketAdaptor implements 
WebSocketAdapter {
    */
   private final WebSocketBase vertxWebSocket;
 
-  private final AtomicBoolean inPauseStatus;
+  private final Object pauseLock = new Object();
+
+  private boolean inPauseStatus;
 
   private final String websocketSessionId;
 
@@ -86,7 +87,7 @@ public class VertxWebSocketAdaptor implements 
WebSocketAdapter {
         : prepareSerialExecutorWrapper(workerPool);
     this.bizWebSocket = bizWebSocket;
     this.vertxWebSocket = vertxWebSocket;
-    inPauseStatus = new AtomicBoolean(true);
+    inPauseStatus = true;
     vertxWebSocket.pause(); // make sure the vert.x WebSocket pause status 
keep consistent with inPauseStatus flag
 
     // make sure the bi-direction message stream is established
@@ -206,25 +207,25 @@ public class VertxWebSocketAdaptor implements 
WebSocketAdapter {
 
   @Override
   public void pause() {
-    if (!inPauseStatus.compareAndSet(false, true)) {
-      return;
-    }
-    LOGGER.info("[{}]-[{}] pause websocket", invocationType, 
websocketSessionId);
-    synchronized (this) {
+    synchronized (pauseLock) {
+      if (inPauseStatus) {
+        return;
+      }
       vertxWebSocket.pause();
-      inPauseStatus.set(true);
+      inPauseStatus = true;
+      LOGGER.info("[{}]-[{}] pause websocket", invocationType, 
websocketSessionId);
     }
   }
 
   @Override
   public void resume() {
-    if (!inPauseStatus.compareAndSet(true, false)) {
-      return;
-    }
-    LOGGER.info("[{}]-[{}] resume websocket", invocationType, 
websocketSessionId);
-    synchronized (this) {
+    synchronized (pauseLock) {
+      if (!inPauseStatus) {
+        return;
+      }
       vertxWebSocket.resume();
-      inPauseStatus.set(false);
+      inPauseStatus = false;
+      LOGGER.info("[{}]-[{}] resume websocket", invocationType, 
websocketSessionId);
     }
   }
 

Reply via email to