Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data race in simple span processor #3948

Closed
brian-gavin opened this issue Mar 29, 2023 · 3 comments · Fixed by #3951
Closed

Data race in simple span processor #3948

brian-gavin opened this issue Mar 29, 2023 · 3 comments · Fixed by #3951
Assignees
Labels
area:trace Part of OpenTelemetry tracing bug Something isn't working help wanted Extra attention is needed pkg:exporter:jaeger Related to the Jaeger exporter package

Comments

@brian-gavin
Copy link

Description

The Go race detector finds a data race in the following code:

package main

import (
	"context"
	"sync"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/jaeger"
	"go.opentelemetry.io/otel/sdk/trace"
)

func init() {
	jaegerExporter, err := jaeger.New(jaeger.WithAgentEndpoint())
	if err != nil {
		panic(err)
	}
	tp := trace.NewTracerProvider(trace.WithSyncer(jaegerExporter))
	otel.SetTracerProvider(tp)
}

func main() {
	var wg sync.WaitGroup
	wg.Add(2)
	go func() {
		_, span := otel.Tracer("test").Start(context.Background(), "A")
		defer span.End()
		wg.Done()
	}()
	go func() {
		_, span := otel.Tracer("test").Start(context.Background(), "B")
		defer span.End()
		wg.Done()
	}()
	wg.Wait()
}

Running with -race will print (at least):

==================
WARNING: DATA RACE
Read at 0x00c00007f2c0 by goroutine 9:
  bytes.(*Buffer).Reset()
      /usr/local/go/src/bytes/buffer.go:98 +0x87
  go.opentelemetry.io/otel/exporters/jaeger.(*agentClientUDP).calcSizeOfSerializedThrift()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/agent.go:205 +0x47
  go.opentelemetry.io/otel/exporters/jaeger.(*agentClientUDP).EmitBatch()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/agent.go:125 +0x93
  go.opentelemetry.io/otel/exporters/jaeger.(*agentUploader).upload()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/uploader.go:283 +0x59
  go.opentelemetry.io/otel/exporters/jaeger.(*Exporter).ExportSpans()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/jaeger.go:105 +0x491
  go.opentelemetry.io/otel/sdk/trace.(*simpleSpanProcessor).OnEnd()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/[email protected]/trace/simple_span_processor.go:58 +0x23e
  go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/[email protected]/trace/span.go:419 +0xc3d
  main.main.func1.1()
      /Users/brian.gavin/code/otel-jaeger-race/main.go:26 +0x52
  runtime.deferreturn()
      /usr/local/go/src/runtime/panic.go:476 +0x32

Previous write at 0x00c00007f2c0 by goroutine 10:
  bytes.(*Buffer).tryGrowByReslice()
      /usr/local/go/src/bytes/buffer.go:108 +0xb3
  bytes.(*Buffer).Write()
      /usr/local/go/src/bytes/buffer.go:168 +0x18
  go.opentelemetry.io/otel/exporters/jaeger/internal/third_party/thrift/lib/go/thrift.(*TMemoryBuffer).Write()
      <autogenerated>:1 +0x6e
  go.opentelemetry.io/otel/exporters/jaeger/internal/third_party/thrift/lib/go/thrift.(*TCompactProtocol).writeVarint32()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/internal/third_party/thrift/lib/go/thrift/compact_protocol.go:691 +0xea
  go.opentelemetry.io/otel/exporters/jaeger/internal/third_party/thrift/lib/go/thrift.(*TCompactProtocol).WriteString()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/internal/third_party/thrift/lib/go/thrift/compact_protocol.go:333 +0x44
  go.opentelemetry.io/otel/exporters/jaeger/internal/gen-go/jaeger.(*Process).writeField1()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/internal/gen-go/jaeger/jaeger.go:1894 +0xef
  go.opentelemetry.io/otel/exporters/jaeger/internal/gen-go/jaeger.(*Process).Write()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/internal/gen-go/jaeger/jaeger.go:1874 +0xc8
  go.opentelemetry.io/otel/exporters/jaeger.(*agentClientUDP).calcSizeOfSerializedThrift()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/agent.go:206 +0x115
  go.opentelemetry.io/otel/exporters/jaeger.(*agentClientUDP).EmitBatch()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/agent.go:125 +0x93
  go.opentelemetry.io/otel/exporters/jaeger.(*agentUploader).upload()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/uploader.go:283 +0x59
  go.opentelemetry.io/otel/exporters/jaeger.(*Exporter).ExportSpans()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/exporters/[email protected]/jaeger.go:105 +0x491
  go.opentelemetry.io/otel/sdk/trace.(*simpleSpanProcessor).OnEnd()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/[email protected]/trace/simple_span_processor.go:58 +0x23e
  go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End()
      /Users/brian.gavin/go/pkg/mod/go.opentelemetry.io/otel/[email protected]/trace/span.go:419 +0xc3d
  main.main.func2.1()
      /Users/brian.gavin/code/otel-jaeger-race/main.go:31 +0x52
  runtime.deferreturn()
      /usr/local/go/src/runtime/panic.go:476 +0x32

Goroutine 9 (running) created at:
  main.main()
      /Users/brian.gavin/code/otel-jaeger-race/main.go:24 +0xce

Goroutine 10 (running) created at:
  main.main()
      /Users/brian.gavin/code/otel-jaeger-race/main.go:29 +0x136
==================

This code can be found at https://github.com/brian-gavin/otel-jaeger-race.

Thanks!

Environment

  • OS: macOS 13.1
  • Architecture: x86_64
  • Go Version: 1.20
  • opentelemetry-go version: v1.14.0

Steps To Reproduce

  1. git clone [email protected]:brian-gavin/otel-jaeger-race.git
  2. cd otel-jaeger-race
  3. go run -race .
  4. See error

Expected behavior

For no race to be detected.

@brian-gavin brian-gavin added the bug Something isn't working label Mar 29, 2023
@MrAlias MrAlias added area:trace Part of OpenTelemetry tracing pkg:exporter:jaeger Related to the Jaeger exporter package help wanted Extra attention is needed labels Mar 29, 2023
@Kaushal28
Copy link
Contributor

Hey @MrAlias, I would like to contribute here, could you please provide me with any entry point from where I can start?

@pellared
Copy link
Member

@Kaushal28 answering before @MrAlias gets up 😉

  1. Here is the source code https://github.com/open-telemetry/opentelemetry-go/tree/main/exporters/jaeger
  2. I suggest starting with writing a unit test that would reproduce the race condition
  3. See the contributing documentation

Do you need any more information?

@Lim3nius
Copy link

Hi, please, could someone either fix title or some other way make it visible, that bug was in go.opentelemetry.io/otel/sdk/trace.NewSimpleSpanProcessor and in WithSyncer(), and not in package exporters/jaeger? Thank you.

@pellared pellared changed the title Data race in exporters/jaeger Data race in simple span processor Apr 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:trace Part of OpenTelemetry tracing bug Something isn't working help wanted Extra attention is needed pkg:exporter:jaeger Related to the Jaeger exporter package
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants