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)
+       })
+}

Reply via email to