[
https://issues.apache.org/jira/browse/THRIFT-4237?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16077418#comment-16077418
]
ASF GitHub Bot commented on THRIFT-4237:
----------------------------------------
GitHub user zwass opened a pull request:
https://github.com/apache/thrift/pull/1304
THRIFT-4237 Fix effective deadlock introduced by original patch
See discussion in https://issues.apache.org/jira/browse/THRIFT-4237
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/zwass/thrift THRIFT-4237-fix
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/thrift/pull/1304.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #1304
----
commit 6e9d0e79a98e62aef86aaada2da7fc0e04795d28
Author: Zachary Wasserman <[email protected]>
Date: 2017-07-07T00:39:55Z
THRIFT-4237 Fix effective deadlock introduced by original patch
See discussion in https://issues.apache.org/jira/browse/THRIFT-4237
----
> 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
> Assignee: Zach Wasserman
> Labels: concurrency
> Fix For: 0.11.0
>
>
> Run the following test with {{go test -race -run TestSocketConcurrency}}:
> {code}
> 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)