This is an automated email from the ASF dual-hosted git repository.
marsevilspirit pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/develop by this push:
new 53b4f39f3 fix: the counter was not decremented when an error occurred
(#3013)
53b4f39f3 is described below
commit 53b4f39f35fba8acf957aaf556c044d4e4775b46
Author: yizhenqiang <[email protected]>
AuthorDate: Tue Sep 9 15:11:07 2025 +0800
fix: the counter was not decremented when an error occurred (#3013)
Co-authored-by: Copilot <[email protected]>
Co-authored-by: yizhenqiang <[email protected]>
Fixes: #3012
---
filter/active/filter.go | 2 +
filter/active/filter_test.go | 136 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 136 insertions(+), 2 deletions(-)
diff --git a/filter/active/filter.go b/filter/active/filter.go
index ce72025ce..ab070fbf5 100644
--- a/filter/active/filter.go
+++ b/filter/active/filter.go
@@ -74,6 +74,8 @@ func (f *activeFilter) OnResponse(ctx context.Context, result
result.Result, inv
if err != nil {
result.SetError(err)
logger.Errorf("parse dubbo_invoke_start_time to int64 failed")
+ // When err is not nil, use default elapsed value of 1
+ base.EndCount(invoker.GetURL(), inv.MethodName(), 1, false)
return result
}
elapsed := base.CurrentTimeMillis() - startTime
diff --git a/filter/active/filter_test.go b/filter/active/filter_test.go
index 7c4a69257..a864d27c5 100644
--- a/filter/active/filter_test.go
+++ b/filter/active/filter_test.go
@@ -20,6 +20,7 @@ package active
import (
"context"
"errors"
+ "fmt"
"strconv"
"testing"
)
@@ -32,6 +33,7 @@ import (
import (
"dubbo.apache.org/dubbo-go/v3/common"
+ "dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/protocol/base"
"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
"dubbo.apache.org/dubbo-go/v3/protocol/mock"
@@ -40,7 +42,7 @@ import (
func TestFilterInvoke(t *testing.T) {
invoc := invocation.NewRPCInvocation("test", []any{"OK"},
make(map[string]any))
- url, _ :=
common.NewURL("dubbo://192.168.10.10:20000/com.ikurento.user.UserProvider")
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
filter := activeFilter{}
ctrl := gomock.NewController(t)
defer ctrl.Finish()
@@ -57,7 +59,7 @@ func TestFilterOnResponse(t *testing.T) {
invoc := invocation.NewRPCInvocation("test", []any{"OK"},
map[string]any{
dubboInvokeStartTime: strconv.FormatInt(c-int64(elapsed), 10),
})
- url, _ :=
common.NewURL("dubbo://192.168.10.10:20000/com.ikurento.user.UserProvider")
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
filter := activeFilter{}
ctrl := gomock.NewController(t)
defer ctrl.Finish()
@@ -81,3 +83,133 @@ func TestFilterOnResponse(t *testing.T) {
assert.True(t, urlStatus.GetLastRequestFailedTimestamp() != int64(0))
assert.True(t, methodStatus.GetLastRequestFailedTimestamp() != int64(0))
}
+
+func TestFilterOnResponseWithDefer(t *testing.T) {
+ base.CleanAllStatus()
+
+ // Test scenario 1: dubboInvokeStartTime is parsed successfully and the
result is correct.
+ t.Run("ParseSuccessAndResultSuccess", func(t *testing.T) {
+ defer base.CleanAllStatus()
+
+ c := base.CurrentTimeMillis()
+ invoc := invocation.NewRPCInvocation("test1", []any{"OK"},
map[string]any{
+ dubboInvokeStartTime: strconv.FormatInt(c, 10),
+ })
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
+ filter := activeFilter{}
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+ invoker := mock.NewMockInvoker(ctrl)
+ invoker.EXPECT().GetURL().Return(url).Times(1)
+ rpcResult := &result.RPCResult{}
+
+ filter.OnResponse(context.TODO(), rpcResult, invoker, invoc)
+
+ methodStatus := base.GetMethodStatus(url, "test1")
+ urlStatus := base.GetURLStatus(url)
+
+ assert.Equal(t, int32(1), methodStatus.GetTotal())
+ assert.Equal(t, int32(1), urlStatus.GetTotal())
+ assert.Equal(t, int32(0), methodStatus.GetFailed())
+ assert.Equal(t, int32(0), urlStatus.GetFailed())
+ assert.Equal(t, int32(0),
methodStatus.GetSuccessiveRequestFailureCount())
+ assert.Equal(t, int32(0),
urlStatus.GetSuccessiveRequestFailureCount())
+ assert.True(t, methodStatus.GetTotalElapsed() >= int64(0))
+ assert.True(t, urlStatus.GetTotalElapsed() >= int64(0))
+ })
+
+ // Test scenario 2: dubboInvokeStartTime is parsed successfully, but
the result is incorrect
+ t.Run("ParseSuccessAndResultFailed", func(t *testing.T) {
+ defer base.CleanAllStatus()
+
+ c := base.CurrentTimeMillis()
+ invoc := invocation.NewRPCInvocation("test2", []any{"OK"},
map[string]any{
+ dubboInvokeStartTime: strconv.FormatInt(c, 10),
+ })
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
+ filter := activeFilter{}
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+ invoker := mock.NewMockInvoker(ctrl)
+ invoker.EXPECT().GetURL().Return(url).Times(1)
+ rpcResult := &result.RPCResult{
+ Err: errors.New("test error"),
+ }
+
+ filter.OnResponse(context.TODO(), rpcResult, invoker, invoc)
+
+ methodStatus := base.GetMethodStatus(url, "test2")
+ urlStatus := base.GetURLStatus(url)
+
+ assert.Equal(t, int32(1), methodStatus.GetTotal())
+ assert.Equal(t, int32(1), urlStatus.GetTotal())
+ assert.Equal(t, int32(1), methodStatus.GetFailed())
+ assert.Equal(t, int32(1), urlStatus.GetFailed())
+ assert.Equal(t, int32(1),
methodStatus.GetSuccessiveRequestFailureCount())
+ assert.Equal(t, int32(1),
urlStatus.GetSuccessiveRequestFailureCount())
+ assert.True(t, methodStatus.GetFailedElapsed() >= int64(0))
+ assert.True(t, urlStatus.GetFailedElapsed() >= int64(0))
+ assert.True(t, urlStatus.GetLastRequestFailedTimestamp() !=
int64(0))
+ assert.True(t, methodStatus.GetLastRequestFailedTimestamp() !=
int64(0))
+ })
+
+ // Test Scenario 3: dubboInvokeStartTime parsing failed (non-numeric
string)
+ t.Run("ParseFailedWithInvalidString", func(t *testing.T) {
+ defer base.CleanAllStatus()
+
+ invoc := invocation.NewRPCInvocation("test3", []any{"OK"},
map[string]any{
+ dubboInvokeStartTime: "invalid-time",
+ })
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
+ filter := activeFilter{}
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+ invoker := mock.NewMockInvoker(ctrl)
+ invoker.EXPECT().GetURL().Return(url).Times(1)
+ rpcResult := &result.RPCResult{}
+
+ result := filter.OnResponse(context.TODO(), rpcResult, invoker,
invoc)
+ assert.NotNil(t, result.Error())
+
+ methodStatus := base.GetMethodStatus(url, "test3")
+ urlStatus := base.GetURLStatus(url)
+
+ // Verification count and status - should use the default
duration of 1 and be marked as failed
+ assert.Equal(t, int32(1), methodStatus.GetTotal())
+ assert.Equal(t, int32(1), urlStatus.GetTotal())
+ assert.Equal(t, int32(1), methodStatus.GetFailed())
+ assert.Equal(t, int32(1), urlStatus.GetFailed())
+ assert.Equal(t, int32(1),
methodStatus.GetSuccessiveRequestFailureCount())
+ assert.Equal(t, int32(1),
urlStatus.GetSuccessiveRequestFailureCount())
+ assert.True(t, methodStatus.GetFailedElapsed() >= int64(1))
+ assert.True(t, urlStatus.GetFailedElapsed() >= int64(1))
+ })
+
+ // Test scenario 4: dubboInvokeStartTime does not exist (use the
default value 0)
+ t.Run("ParseFailedWithDefaultValue", func(t *testing.T) {
+ defer base.CleanAllStatus()
+
+ invoc := invocation.NewRPCInvocation("test4", []any{"OK"},
make(map[string]any))
+ url, _ :=
common.NewURL(fmt.Sprintf("dubbo://%s:%d/com.ikurento.user.UserProvider",
constant.LocalHostValue, constant.DefaultPort))
+ filter := activeFilter{}
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+ invoker := mock.NewMockInvoker(ctrl)
+ invoker.EXPECT().GetURL().Return(url).Times(1)
+ rpcResult := &result.RPCResult{}
+
+ filter.OnResponse(context.TODO(), rpcResult, invoker, invoc)
+
+ methodStatus := base.GetMethodStatus(url, "test4")
+ urlStatus := base.GetURLStatus(url)
+
+ assert.Equal(t, int32(1), methodStatus.GetTotal())
+ assert.Equal(t, int32(1), urlStatus.GetTotal())
+ assert.Equal(t, int32(0), methodStatus.GetFailed())
+ assert.Equal(t, int32(0), urlStatus.GetFailed())
+ assert.Equal(t, int32(0),
methodStatus.GetSuccessiveRequestFailureCount())
+ assert.Equal(t, int32(0),
urlStatus.GetSuccessiveRequestFailureCount())
+ assert.True(t, methodStatus.GetTotalElapsed() > int64(0))
+ assert.True(t, urlStatus.GetTotalElapsed() > int64(0))
+ })
+}