You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by yi...@apache.org on 2025/09/06 09:33:56 UTC
(dubbo-go) 01/01: bugfix: Ensure that rpcStatus.maxElapsed, rpcStatus.succeededMaxElapsed, and rpcStatus.failedMaxElapsed are correctly replaced through cas.
This is an automated email from the ASF dual-hosted git repository.
yizhenqiang pushed a commit to branch feature/rpc_status_cas
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 650c81d25f46dc84093c800ba0e177787cda7796
Author: yizhenqiang <yi...@apache.org>
AuthorDate: Sat Sep 6 17:32:15 2025 +0800
bugfix: Ensure that rpcStatus.maxElapsed, rpcStatus.succeededMaxElapsed, and rpcStatus.failedMaxElapsed are correctly replaced through cas.
Fixes: #3006
Signed-off-by: yizhenqiang <yi...@apache.org>
---
protocol/base/rpc_status.go | 33 +++++++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/protocol/base/rpc_status.go b/protocol/base/rpc_status.go
index 470c1eee5..e9196c32a 100644
--- a/protocol/base/rpc_status.go
+++ b/protocol/base/rpc_status.go
@@ -159,21 +159,42 @@ func endCount0(rpcStatus *RPCStatus, elapsed int64, succeeded bool) {
atomic.AddInt32(&rpcStatus.total, 1)
atomic.AddInt64(&rpcStatus.totalElapsed, elapsed)
- if rpcStatus.maxElapsed < elapsed {
- atomic.StoreInt64(&rpcStatus.maxElapsed, elapsed)
+ for {
+ oldValue := atomic.LoadInt64(&rpcStatus.maxElapsed)
+ if oldValue >= elapsed {
+ break
+ }
+ if atomic.CompareAndSwapInt64(&rpcStatus.maxElapsed, oldValue, elapsed) {
+ break
+ }
}
+
if succeeded {
- if rpcStatus.succeededMaxElapsed < elapsed {
- atomic.StoreInt64(&rpcStatus.succeededMaxElapsed, elapsed)
+ for {
+ oldValue := atomic.LoadInt64(&rpcStatus.succeededMaxElapsed)
+ if oldValue >= elapsed {
+ break
+ }
+ if atomic.CompareAndSwapInt64(&rpcStatus.succeededMaxElapsed, oldValue, elapsed) {
+ break
+ }
}
+
atomic.StoreInt32(&rpcStatus.successiveRequestFailureCount, 0)
} else {
atomic.StoreInt64(&rpcStatus.lastRequestFailedTimestamp, CurrentTimeMillis())
atomic.AddInt32(&rpcStatus.successiveRequestFailureCount, 1)
atomic.AddInt32(&rpcStatus.failed, 1)
atomic.AddInt64(&rpcStatus.failedElapsed, elapsed)
- if rpcStatus.failedMaxElapsed < elapsed {
- atomic.StoreInt64(&rpcStatus.failedMaxElapsed, elapsed)
+
+ for {
+ oldValue := atomic.LoadInt64(&rpcStatus.failedMaxElapsed)
+ if oldValue >= elapsed {
+ break
+ }
+ if atomic.CompareAndSwapInt64(&rpcStatus.failedMaxElapsed, oldValue, elapsed) {
+ break
+ }
}
}
}