Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-4237

Go TServerSocket Race Conditions

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 0.10.0
    • 0.11.0
    • Go - Library

    Description

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

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

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

      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
      

      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.

      Attachments

        Activity

          People

            zwass Zach Wasserman
            zwass Zach Wasserman
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: