thrift-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Zach Wasserman (JIRA)" <j...@apache.org>
Subject [jira] [Created] (THRIFT-4237) Go TServerSocket Race Conditions
Date Tue, 27 Jun 2017 00:04:00 GMT
Zach Wasserman created THRIFT-4237:
--------------------------------------

             Summary: Go TServerSocket Race Conditions
                 Key: THRIFT-4237
                 URL: https://issues.apache.org/jira/browse/THRIFT-4237
             Project: Thrift
          Issue Type: Bug
          Components: Go - Library
    Affects Versions: 0.10.0
            Reporter: Zach Wasserman


Run the following test with {{go test -race -run TestSocketConcurrency}}:

{code:golang}
func TestSocketConcurrency(t *testing.T) {
	host := "127.0.0.1"
	port := 9090
	addr := fmt.Sprintf("%s:%d", host, port)

	socket := CreateServerSocket(t, addr)
	go func() { socket.Listen() }()
	go func() { socket.Interrupt() }()
}
{code}

This will result in an error from the race detector. It looks like:

{code}
go test -v -race -run TestSocketConcurrency
=== RUN   TestSocketConcurrency
--- PASS: TestSocketConcurrency (0.00s)
==================
WARNING: DATA RACE
Write at 0x00c420016870 by goroutine 7:
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Listen()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:63
+0x134
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency.func1()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:50
+0x38

Previous read at 0x00c420016870 by goroutine 8:
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Close()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:114
+0x7b
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Interrupt()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:123
+0x6b
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency.func2()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:51
+0x38

Goroutine 7 (running) created at:
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:50
+0x1a8
  testing.tRunner()
      /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107

Goroutine 8 (running) created at:
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:51
+0x1ca
  testing.tRunner()
      /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107
==================
==================
WARNING: DATA RACE
Write at 0x00c420016870 by goroutine 8:
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Close.func1()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:112
+0x3b
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Close()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:117
+0xe6
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Interrupt()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:123
+0x6b
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency.func2()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:51
+0x38

Previous read at 0x00c420016870 by goroutine 7:
  git.apache.org/thrift.git/lib/go/thrift.(*TServerSocket).Listen()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket.go:56
+0x48
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency.func1()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:50
+0x38

Goroutine 8 (running) created at:
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:51
+0x1ca
  testing.tRunner()
      /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107

Goroutine 7 (finished) created at:
  git.apache.org/thrift.git/lib/go/thrift.TestSocketConcurrency()
      /Users/zwass/dev/go/src/git.apache.org/thrift.git/lib/go/thrift/server_socket_test.go:50
+0x1a8
  testing.tRunner()
      /usr/local/Cellar/go/1.8/libexec/src/testing/testing.go:657 +0x107
==================
FAIL
exit status 1
FAIL	git.apache.org/thrift.git/lib/go/thrift	0.186s
{code}

I believe this is because {{Interrupt()}}
 (https://github.com/apache/thrift/blob/master/lib/go/thrift/server_socket.go#L120) and {{Listen()}}
(https://github.com/apache/thrift/blob/master/lib/go/thrift/server_socket.go#L55) both read
and write {{p.listener}}, but only {{Interrupt()}} locks the mutex.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message