[ 
https://issues.apache.org/jira/browse/THRIFT-4237?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16078442#comment-16078442
 ] 

ASF GitHub Bot commented on THRIFT-4237:
----------------------------------------

Github user econner commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/1304#discussion_r126207049
  
    --- Diff: lib/go/thrift/server_socket.go ---
    @@ -68,15 +68,18 @@ func (p *TServerSocket) Listen() error {
     
     func (p *TServerSocket) Accept() (TTransport, error) {
        p.mu.RLock()
    -   defer p.mu.RUnlock()
    +   listener := p.listener
    +   interrupted := p.interrupted
    +   p.mu.RUnlock()
     
    --- End diff --
    
    Hmm.  It seems safest to me to unlock this mutex after the value of 
``interrupted`` has been read (assuming it is only intended to protect 
``interrupted``).
    
    For example, 
    Thread 1 reads the value of interrupted as false
    Thread 1 gets interrupted at line 74
    Thread 2 sets p.interrupted to true
    Thread 1 sees interrupted == false at line 75
    
    The question is would we want thread 1 to see interrupted == true ?
    
    This is possibly a case that does not happen.  I have very limited 
knowledge of what this code is doing.


> 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)

Reply via email to