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

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


The following commit(s) were added to refs/heads/master by this push:
     new 05b3e03  Prevent RpcStatus#begincount int overflow in extreme cases 
(#6801)
05b3e03 is described below

commit 05b3e03101dce2e4bc0c01c66f0cf632ff95bb6c
Author: yizhenqiang <[email protected]>
AuthorDate: Tue Oct 13 11:05:13 2020 +0800

    Prevent RpcStatus#begincount int overflow in extreme cases (#6801)
---
 .../src/main/java/org/apache/dubbo/rpc/RpcStatus.java   | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
index 3333f0f..093baf5 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
@@ -32,10 +32,14 @@ import java.util.concurrent.atomic.AtomicLong;
  */
 public class RpcStatus {
 
-    private static final ConcurrentMap<String, RpcStatus> SERVICE_STATISTICS = 
new ConcurrentHashMap<String, RpcStatus>();
+    private static final ConcurrentMap<String, RpcStatus> SERVICE_STATISTICS = 
new ConcurrentHashMap<String,
+            RpcStatus>();
+
+    private static final ConcurrentMap<String, ConcurrentMap<String, 
RpcStatus>> METHOD_STATISTICS =
+            new ConcurrentHashMap<String, ConcurrentMap<String, RpcStatus>>();
 
-    private static final ConcurrentMap<String, ConcurrentMap<String, 
RpcStatus>> METHOD_STATISTICS = new ConcurrentHashMap<String, 
ConcurrentMap<String, RpcStatus>>();
     private final ConcurrentMap<String, Object> values = new 
ConcurrentHashMap<String, Object>();
+
     private final AtomicInteger active = new AtomicInteger();
     private final AtomicLong total = new AtomicLong();
     private final AtomicInteger failed = new AtomicInteger();
@@ -103,14 +107,18 @@ public class RpcStatus {
         }
         for (int i; ; ) {
             i = methodStatus.active.get();
-            if (i + 1 > max) {
+
+            if (i == Integer.MAX_VALUE || i + 1 > max) {
                 return false;
             }
+
             if (methodStatus.active.compareAndSet(i, i + 1)) {
                 break;
             }
         }
+
         appStatus.active.incrementAndGet();
+
         return true;
     }
 
@@ -128,13 +136,16 @@ public class RpcStatus {
         status.active.decrementAndGet();
         status.total.incrementAndGet();
         status.totalElapsed.addAndGet(elapsed);
+
         if (status.maxElapsed.get() < elapsed) {
             status.maxElapsed.set(elapsed);
         }
+
         if (succeeded) {
             if (status.succeededMaxElapsed.get() < elapsed) {
                 status.succeededMaxElapsed.set(elapsed);
             }
+
         } else {
             status.failed.incrementAndGet();
             status.failedElapsed.addAndGet(elapsed);

Reply via email to