[ https://issues.apache.org/jira/browse/THRIFT-4243?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16071246#comment-16071246 ]
ASF GitHub Bot commented on THRIFT-4243: ---------------------------------------- Github user asfgit closed the pull request at: https://github.com/apache/thrift/pull/1302 > Go TSimpleServer race on wait in Stop() method > ---------------------------------------------- > > Key: THRIFT-4243 > URL: https://issues.apache.org/jira/browse/THRIFT-4243 > Project: Thrift > Issue Type: Bug > Components: Go - Library > Reporter: Zach Wasserman > > Synchronization issues with the use of {{sync.WaitGroup}} in the > {{TSimpleServer}} implementation set off the race detector. Note the docs > (https://godoc.org/sync#WaitGroup.Add) specify "calls with a positive delta > that occur when the counter is zero must happen before a Wait". > The following unit test demonstrates the issue: > {code} > package thrift > import ( > "testing" > "time" > ) > type mockProcessor struct { > ProcessFunc func(in, out TProtocol) (bool, TException) > } > func (m *mockProcessor) Process(in, out TProtocol) (bool, TException) { > return m.ProcessFunc(in, out) > } > type mockServerTransport struct { > ListenFunc func() error > AcceptFunc func() (TTransport, error) > CloseFunc func() error > InterruptFunc func() error > } > func (m *mockServerTransport) Listen() error { > return m.ListenFunc() > } > func (m *mockServerTransport) Accept() (TTransport, error) { > return m.AcceptFunc() > } > func (m *mockServerTransport) Close() error { > return m.CloseFunc() > } > func (m *mockServerTransport) Interrupt() error { > return m.InterruptFunc() > } > type mockTTransport struct { > TTransport > } > func (m *mockTTransport) Close() error { > return nil > } > func TestWaitRace(t *testing.T) { > proc := &mockProcessor{ > ProcessFunc: func(in, out TProtocol) (bool, TException) { > return false, nil > }, > } > trans := &mockServerTransport{ > ListenFunc: func() error { > return nil > }, > AcceptFunc: func() (TTransport, error) { > return &mockTTransport{}, nil > }, > CloseFunc: func() error { > return nil > }, > InterruptFunc: func() error { > return nil > }, > } > serv := NewTSimpleServer2(proc, trans) > go serv.Serve() > time.Sleep(1) > serv.Stop() > } > {code} > When run with the race detector, this test produces the following output: > {code} > go test -race -v -run TestWaitRace -count 1 > === RUN TestWaitRace > ================== > WARNING: DATA RACE > Write at 0x00c4200849f4 by goroutine 6: > internal/race.Write() > /usr/local/Cellar/go/1.8/libexec/src/internal/race/race.go:41 +0x38 > sync.(*WaitGroup).Wait() > /usr/local/Cellar/go/1.8/libexec/src/sync/waitgroup.go:129 +0x14b > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).Stop.func1() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:164 > +0x9b > sync.(*Once).Do() > /usr/local/Cellar/go/1.8/libexec/src/sync/once.go:44 +0xe1 > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).Stop() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:166 > +0x8c > git.apache.org/thrift.git/lib/go/thrift.TestWaitRace() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server_test.go:134 > +0x1be > testing.tRunner() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107 > Previous read at 0x00c4200849f4 by goroutine 7: > internal/race.Read() > /usr/local/Cellar/go/1.8/libexec/src/internal/race/race.go:37 +0x38 > sync.(*WaitGroup).Add() > /usr/local/Cellar/go/1.8/libexec/src/sync/waitgroup.go:71 +0x26b > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).AcceptLoop() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:139 > +0xa6 > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).Serve() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:154 > +0x86 > Goroutine 6 (running) created at: > testing.(*T).Run() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:697 +0x543 > testing.runTests.func1() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:882 +0xaa > testing.tRunner() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107 > testing.runTests() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:888 +0x4e0 > testing.(*M).Run() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:822 +0x1c3 > main.main() > git.apache.org/thrift.git/lib/go/thrift/_test/_testmain.go:266 +0x20f > Goroutine 7 (running) created at: > git.apache.org/thrift.git/lib/go/thrift.TestWaitRace() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server_test.go:132 > +0x1a3 > testing.tRunner() > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107 > ================== > --- FAIL: TestWaitRace (0.15s) > testing.go:610: race detected during execution of test > panic: sync: WaitGroup is reused before previous Wait has returned [recovered] > panic: sync: WaitGroup is reused before previous Wait has returned > goroutine 5 [running]: > testing.tRunner.func1(0xc42006aea0) > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:622 +0x55f > panic(0x14aea60, 0xc4201896a0) > /usr/local/Cellar/go/1.8/libexec/src/runtime/panic.go:489 +0x2f0 > sync.(*WaitGroup).Wait(0xc4200849e8) > /usr/local/Cellar/go/1.8/libexec/src/sync/waitgroup.go:133 +0x138 > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).Stop.func1() > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:164 > +0x9c > sync.(*Once).Do(0x174ce68, 0xc42002bf00) > /usr/local/Cellar/go/1.8/libexec/src/sync/once.go:44 +0xe2 > git.apache.org/thrift.git/lib/go/thrift.(*TSimpleServer).Stop(0xc420084980, > 0x153af90, 0xc420084980) > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server.go:166 > +0x8d > git.apache.org/thrift.git/lib/go/thrift.TestWaitRace(0xc42006aea0) > > /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/simple_server_test.go:134 > +0x1bf > testing.tRunner(0xc42006aea0, 0x153b2b0) > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x108 > created by testing.(*T).Run > /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:697 +0x544 > exit status 2 > FAIL git.apache.org/thrift.git/lib/go/thrift 0.190s > {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)