You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Cole Greer (Jira)" <ji...@apache.org> on 2022/12/16 18:45:00 UTC

[jira] [Created] (TINKERPOP-2845) Race conditions in Go GLV

Cole Greer created TINKERPOP-2845:
-------------------------------------

             Summary: Race conditions in Go GLV
                 Key: TINKERPOP-2845
                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2845
             Project: TinkerPop
          Issue Type: Bug
          Components: go
    Affects Versions: 3.7.0
            Reporter: Cole Greer


While working on writing tests for the Go GLV using [gremlin-socket-server|https://issues.apache.org/jira/browse/TINKERPOP-2819], 2 possible race conditions were detected by go test -race. The provided test code I will include is relying on configuration and docker setup which has not yet been merged to tinkerpop and is being included for reference only. I will update this ticket once the relevant supporting code is included in Tinkerpop and these tests can be run.

 

Race condition 1:
{code:java}
func TestClientAgainstSocketServer(t *testing.T) {
   // Integration test variables.
   testNoAuthEnable := getEnvOrDefaultBool("RUN_INTEGRATION_TESTS", true)
   settings := FromYaml(getEnvOrDefaultString("GREMLIN_SOCKET_SERVER_CONFIG_PATH", "../../gremlin-tools/gremlin-socket-server/conf/test-ws-gremlin.yaml"))
   testSocketServerUrl := getEnvOrDefaultString("GREMLIN_SOCKET_SERVER_URL", "ws://localhost")
   testSocketServerUrl = fmt.Sprintf("%s:%v/gremlin", testSocketServerUrl, settings.PORT)

   t.Run("Should try create new connection if closed by server", func(t *testing.T) {
      skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
      client, _ := NewClient(testSocketServerUrl)

      //The server will immediately close the connection upon receiving this request creating a 1005 error
      resultSet, _ := client.Submit("1", map[string]interface{}{"requestId": settings.CLOSE_CONNECTION_REQUEST_ID})

      resultSet.One()

      client.Close()
   })
} {code}
{code:java}
=== RUN   TestClientAgainstSocketServer === CONT  TestClientAgainstSocketServer     testing.go:1319: race detected during execution of test --- FAIL: TestClientAgainstSocketServer (1.04s) === RUN   TestClientAgainstSocketServer/Should_try_create_new_connection_if_closed_by_server 2022/12/16 10:43:37 Connecting. 2022/12/16 10:43:38 Read loop error 'websocket: close 1005 (no status)', closing read loop. 2022/12/16 10:43:38 Read loop error 'websocket: close 1005 (no status)', closing read loop. ================== WARNING: DATA RACE Write at 0x00c000358040 by goroutine 15:   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*channelResultSet).setError()       /Users/coleg/tinkerpop/gremlin-go/driver/resultSet.go:79 +0x80   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*synchronizedMap).closeAll()       /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:154 +0xfc   github.com/apache/tinkerpop/gremlin-go/v3/driver.readErrorHandler()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:93 +0xd8   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*gremlinServerWSProtocol).readLoop()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:70 +0x448   github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x4cPrevious read at 0x00c000358040 by goroutine 8:   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*channelResultSet).One()       /Users/coleg/tinkerpop/gremlin-go/driver/resultSet.go:171 +0x34   github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:122 +0x1a4   testing.tRunner()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188   testing.(*T).Run.func1()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40Goroutine 15 (running) created at:   github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x398   github.com/apache/tinkerpop/gremlin-go/v3/driver.createConnection()       /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:110 +0x204   github.com/apache/tinkerpop/gremlin-go/v3/driver.newLoadBalancingPool.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:150 +0xa8Goroutine 8 (running) created at:   testing.(*T).Run()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x55c   github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer()       /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:115 +0x1cc   testing.tRunner()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188   testing.(*T).Run.func1()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40 ================== 2022/12/16 10:43:38 Connection error callback invoked, closing protocol. 2022/12/16 10:43:38 Closing Client with url 'ws://localhost:45943/gremlin' ================== WARNING: DATA RACE Read at 0x00c00027dc10 by goroutine 8:   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*connection).close()       /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:68 +0x34   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*loadBalancingPool).close()       /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:57 +0x10c   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*Client).Close()       /Users/coleg/tinkerpop/gremlin-go/driver/client.go:147 +0x2d0   github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:124 +0x1ac   testing.tRunner()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188   testing.(*T).Run.func1()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40Previous write at 0x00c00027dc10 by goroutine 15:   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*connection).errorCallback()       /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:58 +0x60   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*connection).errorCallback-fm()       <autogenerated>:1 +0x34   github.com/apache/tinkerpop/gremlin-go/v3/driver.readErrorHandler()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:94 +0xe4   github.com/apache/tinkerpop/gremlin-go/v3/driver.(*gremlinServerWSProtocol).readLoop()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:70 +0x448   github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x4cGoroutine 8 (running) created at:   testing.(*T).Run()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x55c   github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer()       /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:115 +0x1cc   testing.tRunner()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188   testing.(*T).Run.func1()       /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40Goroutine 15 (finished) created at:   github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol()       /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x398   github.com/apache/tinkerpop/gremlin-go/v3/driver.createConnection()       /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:110 +0x204   github.com/apache/tinkerpop/gremlin-go/v3/driver.newLoadBalancingPool.func1()       /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:150 +0xa8 ================== 2022/12/16 10:43:38 Ignoring error closing connection: E0101: cannot close connection that has already been closed or has not been connected     testing.go:1319: race detected during execution of test     --- FAIL: TestClientAgainstSocketServer/Should_try_create_new_connection_if_closed_by_server (1.03s) === CONT       testing.go:1319: race detected during execution of test FAILProcess finished with the exit code 1
{code}


Race condition 2:
{code:java}
func TestClientAgainstSocketServer(t *testing.T) {
   // Integration test variables.
   testNoAuthEnable := getEnvOrDefaultBool("RUN_INTEGRATION_TESTS", true)
   settings := FromYaml(getEnvOrDefaultString("GREMLIN_SOCKET_SERVER_CONFIG_PATH", "../../gremlin-tools/gremlin-socket-server/conf/test-ws-gremlin.yaml"))
   testSocketServerUrl := getEnvOrDefaultString("GREMLIN_SOCKET_SERVER_URL", "ws://localhost")
   testSocketServerUrl = fmt.Sprintf("%s:%v/gremlin", testSocketServerUrl, settings.PORT)

   t.Run("Should try create new connection if closed by server", func(t *testing.T) {
      skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
      client, _ := NewClient(testSocketServerUrl)
      
      //The server will immediately close the connection upon receiving this request creating a 1005 error
      resultSet, _ := client.Submit("1", map[string]interface{}{"requestId": settings.CLOSE_CONNECTION_REQUEST_ID}) 

      //Synchronization added to avoid race condition #1
      time.Sleep(5 * time.Second)
      chResultSet := resultSet.(*channelResultSet)
      chResultSet.channelMutex.Lock()

      resultSet.One()

      chResultSet.channelMutex.Unlock()

      resultSet, _ = client.Submit("1", map[string]interface{}{"requestId": settings.SINGLE_VERTEX_REQUEST_ID})

      resultSet.One()

      client.Close()
   })
}{code}
{code:java}
=== RUN   TestClientAgainstSocketServer
=== CONT  TestClientAgainstSocketServer
    testing.go:1319: race detected during execution of test
--- FAIL: TestClientAgainstSocketServer (5.10s)
=== RUN   TestClientAgainstSocketServer/Should_try_create_new_connection_if_closed_by_server
2022/12/16 10:36:03 Connecting.
2022/12/16 10:36:04 Read loop error 'websocket: close 1005 (no status)', closing read loop.
2022/12/16 10:36:04 Read loop error 'websocket: close 1005 (no status)', closing read loop.
2022/12/16 10:36:04 Connection error callback invoked, closing protocol.
==================
WARNING: DATA RACE
Read at 0x00c0002fdc10 by goroutine 8:
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*loadBalancingPool).getLeastUsedConnection()
      /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:102 +0x154
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*loadBalancingPool).write()
      /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:74 +0x90
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*Client).Submit()
      /Users/coleg/tinkerpop/gremlin-go/driver/client.go:154 +0x1d4
  github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer.func1()
      /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:129 +0x29c
  testing.tRunner()
      /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188
  testing.(*T).Run.func1()
      /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40Previous write at 0x00c0002fdc10 by goroutine 15:
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*connection).errorCallback()
      /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:58 +0x60
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*connection).errorCallback-fm()
      <autogenerated>:1 +0x34
  github.com/apache/tinkerpop/gremlin-go/v3/driver.readErrorHandler()
      /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:94 +0xe4
  github.com/apache/tinkerpop/gremlin-go/v3/driver.(*gremlinServerWSProtocol).readLoop()
      /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:70 +0x448
  github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol.func1()
      /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x4cGoroutine 8 (running) created at:
  testing.(*T).Run()
      /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x55c
  github.com/apache/tinkerpop/gremlin-go/v3/driver.TestClientAgainstSocketServer()
      /Users/coleg/tinkerpop/gremlin-go/driver/client_test.go:116 +0x1cc
  testing.tRunner()
      /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1446 +0x188
  testing.(*T).Run.func1()
      /opt/homebrew/Cellar/go/1.19.1/libexec/src/testing/testing.go:1493 +0x40Goroutine 15 (finished) created at:
  github.com/apache/tinkerpop/gremlin-go/v3/driver.newGremlinServerWSProtocol()
      /Users/coleg/tinkerpop/gremlin-go/driver/protocol.go:200 +0x398
  github.com/apache/tinkerpop/gremlin-go/v3/driver.createConnection()
      /Users/coleg/tinkerpop/gremlin-go/driver/connection.go:110 +0x204
  github.com/apache/tinkerpop/gremlin-go/v3/driver.newLoadBalancingPool.func1()
      /Users/coleg/tinkerpop/gremlin-go/driver/connectionPool.go:150 +0xa8
==================
2022/12/16 10:36:08 Connecting.
2022/12/16 10:36:08 Closing Client with url 'ws://localhost:45943/gremlin'
2022/12/16 10:36:08 Closing the connection.
    testing.go:1319: race detected during execution of test
    --- FAIL: TestClientAgainstSocketServer/Should_try_create_new_connection_if_closed_by_server (5.09s)
=== CONT  
    testing.go:1319: race detected during execution of test
FAILProcess finished with the exit code 1 {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)