Skip to content

data race in various middlewares #217

@gsparx

Description

@gsparx

I'm able to consistently induce the golang race detector to detect data race in several middleware

In the DefaultDevStack (likely not expected to be used in production code)

==================
WARNING: DATA RACE
Read at 0x000000b1a0b0 by goroutine 8:
  github.com/ant0ine/go-json-rest/rest.(*JsonIndentMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/json_indent.go:27 +0x48
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func2()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:23 +0x3c

Previous write at 0x000000b1a0b0 by goroutine 7:
  github.com/ant0ine/go-json-rest/rest.(*JsonIndentMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/json_indent.go:28 +0x156
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func1()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:15 +0x3c

Goroutine 8 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:28 +0x8f
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107

Goroutine 7 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:20 +0x63
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107
==================
==================
WARNING: DATA RACE
Read at 0x000000b0fcf0 by goroutine 8:
  github.com/ant0ine/go-json-rest/rest.(*RecoverMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/recover.go:32 +0x3f
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func2()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:23 +0x3c

Previous write at 0x000000b0fcf0 by goroutine 7:
  github.com/ant0ine/go-json-rest/rest.(*RecoverMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/recover.go:33 +0x243
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func1()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:15 +0x3c

Goroutine 8 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:28 +0x8f
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107

Goroutine 7 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:20 +0x63
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107
==================
==================
WARNING: DATA RACE
Read at 0x000000b1a080 by goroutine 8:
  github.com/ant0ine/go-json-rest/rest.(*AccessLogApacheMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/access_log_apache.go:74 +0x3f
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func2()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:23 +0x3c

Previous write at 0x000000b1a080 by goroutine 7:
  github.com/ant0ine/go-json-rest/rest.(*AccessLogApacheMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/access_log_apache.go:75 +0x2cf
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func1()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:15 +0x3c

Goroutine 8 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:28 +0x8f
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107

Goroutine 7 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:20 +0x63
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107
==================
==================
WARNING: DATA RACE
Read at 0x000000b1a088 by goroutine 8:
  github.com/ant0ine/go-json-rest/rest.(*AccessLogApacheMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/access_log_apache.go:79 +0x65
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func2()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:23 +0x3c

Previous write at 0x000000b1a088 by goroutine 7:
  github.com/ant0ine/go-json-rest/rest.(*AccessLogApacheMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/access_log_apache.go:80 +0x17c
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func1()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:15 +0x3c

Goroutine 8 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:28 +0x8f
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107

Goroutine 7 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:20 +0x63
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107
==================
FAIL
exit status 1
FAIL	go_json_rest_race_test	0.020s

and in the DefaultCommonStack (seems like this should be viable for production)

==================
WARNING: DATA RACE
Read at 0x000000ab58d0 by goroutine 8:
  github.com/ant0ine/go-json-rest/rest.(*RecoverMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/recover.go:32 +0x3f
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func2()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:23 +0x3c

Previous write at 0x000000ab58d0 by goroutine 7:
  github.com/ant0ine/go-json-rest/rest.(*RecoverMiddleware).MiddlewareFunc()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/recover.go:33 +0x243
  github.com/ant0ine/go-json-rest/rest.WrapMiddlewares()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/middleware.go:46 +0x92
  github.com/ant0ine/go-json-rest/rest.(*Api).MakeHandler()
      /home/garretts/dev/go/src/github.com/ant0ine/go-json-rest/rest/api.go:44 +0x9f
  go_json_rest_race_test.TestSimulReads.func1()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:15 +0x3c

Goroutine 8 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:28 +0x8f
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107

Goroutine 7 (running) created at:
  go_json_rest_race_test.TestSimulReads()
      /home/garretts/dev/go/src/go_json_rest_race_test/race_test.go:20 +0x63
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:657 +0x107
==================
Reading data
Reading data
FAIL
exit status 1
FAIL	go_json_rest_race_test	0.016s

Just based on the naming, it seems like RecoverMiddleware is non-optional. If it is optional, is there a middleware stack that you would suggest running in production that is not susceptible to data races?

Code is attached (it's basically just the HelloWorld example plus a test). Runnable with go test -race

Thanks!

go_json_rest_race_test.tar.gz

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions