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);