This is an automated email from the ASF dual-hosted git repository.
dinglei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/rocketmq-client-go.git
The following commit(s) were added to refs/heads/master by this push:
new 2173d07 fix(producer): prevent panic when TraceDispatcher is a typed
nil (#1232)
2173d07 is described below
commit 2173d070fd1b2ba1eba39e4f694eb7060d008613
Author: JasonZhu <[email protected]>
AuthorDate: Fri Dec 26 15:09:45 2025 +0800
fix(producer): prevent panic when TraceDispatcher is a typed nil (#1232)
Co-authored-by: 御锋 <[email protected]>
---
producer/interceptor.go | 3 ++-
producer/interceptor_test.go | 47 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/producer/interceptor.go b/producer/interceptor.go
index 956bfec..b86599b 100644
--- a/producer/interceptor.go
+++ b/producer/interceptor.go
@@ -23,6 +23,7 @@ package producer
import (
"context"
"fmt"
+ "reflect"
"time"
"github.com/apache/rocketmq-client-go/v2/internal"
@@ -43,7 +44,7 @@ func WithTrace(traceCfg *primitive.TraceConfig) Option {
}
func newTraceInterceptor(dispatcher internal.TraceDispatcher)
primitive.Interceptor {
- if dispatcher != nil {
+ if dispatcher != nil && !reflect.ValueOf(dispatcher).IsNil() {
dispatcher.Start()
}
diff --git a/producer/interceptor_test.go b/producer/interceptor_test.go
new file mode 100644
index 0000000..5870e9b
--- /dev/null
+++ b/producer/interceptor_test.go
@@ -0,0 +1,47 @@
+package producer
+
+import (
+ "testing"
+
+ "github.com/apache/rocketmq-client-go/v2/internal"
+ "github.com/stretchr/testify/assert"
+)
+
+// mockTraceDispatcher is a simple implementation of TraceDispatcher interface
+type mockTraceDispatcher struct{}
+
+func (m *mockTraceDispatcher) GetTraceTopicName() string {
+ return "TRACE_TOPIC"
+}
+
+func (m *mockTraceDispatcher) Start() {
+ // Mock implementation
+}
+
+func (m *mockTraceDispatcher) Append(ctx internal.TraceContext) bool {
+ // Mock implementation
+ return true
+}
+
+func (m *mockTraceDispatcher) Close() {
+ // Mock implementation
+}
+
+func TestNewTraceInterceptor_WithTypedNil(t *testing.T) {
+ var typedNil *mockTraceDispatcher = nil
+ var interfaceDispatcher internal.TraceDispatcher = typedNil
+
+ assert.True(t, interfaceDispatcher != nil, "Typed nil interface should
not be nil")
+
+ assert.NotPanics(t, func() {
+ interceptor := newTraceInterceptor(interfaceDispatcher)
+ assert.NotNil(t, interceptor)
+ }, "newTraceInterceptor should safely handle typed nil dispatcher
without panic")
+}
+
+func TestNewTraceInterceptor_WithNil(t *testing.T) {
+ assert.NotPanics(t, func() {
+ interceptor := newTraceInterceptor(nil)
+ assert.NotNil(t, interceptor)
+ })
+}