From aa3669fff7f880f6592eaacf5e6ca499cd74539d Mon Sep 17 00:00:00 2001 From: zhang-wei Date: Sat, 28 Mar 2020 21:33:31 +0800 Subject: [PATCH] recover the panic caused by close sendCh (#50) --- reporter/grpc.go | 6 ++++++ reporter/grpc_test.go | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/reporter/grpc.go b/reporter/grpc.go index 773cdac..8728bbc 100644 --- a/reporter/grpc.go +++ b/reporter/grpc.go @@ -264,6 +264,12 @@ func (r *gRPCReporter) Send(spans []go2sky.ReportedSpan) { r.logger.Printf("marshal segment object err %v", err) return } + defer func() { + // recover the panic caused by close sendCh + if err := recover(); err != nil { + r.logger.Printf("reporter segment err %v", err) + } + }() segment.Segment = b select { case r.sendCh <- segment: diff --git a/reporter/grpc_test.go b/reporter/grpc_test.go index cf60223..6ed843c 100644 --- a/reporter/grpc_test.go +++ b/reporter/grpc_test.go @@ -25,6 +25,7 @@ import ( "os" "strings" "testing" + "time" "github.com/golang/mock/gomock" @@ -85,6 +86,25 @@ func Test_e2e(t *testing.T) { } } +func TestGRPCReporter_Close(t *testing.T) { + serviceName, _, instance, _, reporter := createMockReporter(t) + reporter.sendCh = make(chan *common.UpstreamSegment, 1) + tracer, err := go2sky.NewTracer(serviceName, go2sky.WithReporter(reporter), go2sky.WithInstance(instance)) + if err != nil { + t.Error(err) + } + tracer.WaitUntilRegister() + entry, _, err := tracer.CreateEntrySpan(context.Background(), "/close", func() (s string, err error) { + return header, nil + }) + if err != nil { + t.Error(err) + } + reporter.Close() + entry.End() + time.Sleep(time.Second) +} + func createMockReporter(t *testing.T) (string, int32, string, int32, *gRPCReporter) { ctrl := gomock.NewController(t) mockRegisterClient := mock_register.NewMockRegisterClient(ctrl) -- GitLab