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)

Reply via email to