-
Notifications
You must be signed in to change notification settings - Fork 379
Open
Description
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!
Metadata
Metadata
Assignees
Labels
No labels