Skip to content

Possible race condition in storage Rollback() v begin() #617

@Martin2112

Description

@Martin2112

Travis log here:

https://travis-ci.org/google/trillian/jobs/232450746

Extract of error below. Happens inside the Go driver but I wonder if there's a path through our code that doesn't clean up properly on error as it happens when a transaction subsequently tries to start. We should examine both pieces of code that were involved to see if there's anything suspicious.

Also watch to see if it reproduces.

==================
WARNING: DATA RACE
Write at 0x00c4203b9dc6 by goroutine 71:
  github.com/go-sql-driver/mysql.(*mysqlConn).writeCommandPacketStr()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:425 +0x57
  github.com/go-sql-driver/mysql.(*mysqlConn).exec()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/connection.go:292 +0x6f
  github.com/go-sql-driver/mysql.(*mysqlTx).Rollback()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/transaction.go:28 +0xfd
  database/sql.(*Tx).rollback.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1526 +0x6e
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Tx).rollback()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1527 +0x10a
  database/sql.(*Tx).awaitDone()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1446 +0x8d
Previous write at 0x00c4203b9dc6 by goroutine 59:
  github.com/go-sql-driver/mysql.(*mysqlConn).readPacket()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:48 +0x1c8
  github.com/go-sql-driver/mysql.(*binaryRows).readRow()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:1108 +0x7d
  github.com/go-sql-driver/mysql.(*binaryRows).Next()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/rows.go:153 +0x9c
  database/sql.(*Rows).nextLocked()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2149 +0xd1
  database/sql.(*Rows).Next.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2134 +0x57
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Rows).Next()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2135 +0xe8
  github.com/google/trillian/storage/mysql.(*logTreeTX).DequeueLeaves()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:277 +0x64e
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:180 +0x36c
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 71 (running) created at:
  database/sql.(*DB).begin()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1383 +0x38f
  database/sql.(*DB).BeginTx()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1342 +0x89
  github.com/google/trillian/storage/mysql.(*mySQLTreeStorage).beginTreeTx()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/tree_storage.go:144 +0xaf
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).beginInternal()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:206 +0x23f
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).BeginForTree()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:227 +0x68
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:171 +0xa7
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 59 (finished) created at:
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:329 +0x6a6
  github.com/google/trillian/server.(*LogOperationManager).OperationLoop()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:358 +0xc4
  github.com/google/trillian/testonly/integration.NewLogEnv.func1()
      /home/travis/gopath/src/github.com/google/trillian/testonly/integration/clientserver.go:120 +0x76
==================
--- FAIL: TestInProcessCTIntegration (3.14s)
	testing.go:610: race detected during execution of test
==================
WARNING: DATA RACE
Read at 0x00c4203b9d70 by goroutine 71:
  github.com/go-sql-driver/mysql.(*mysqlConn).writeCommandPacketStr()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:428 +0x75
  github.com/go-sql-driver/mysql.(*mysqlConn).exec()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/connection.go:292 +0x6f
  github.com/go-sql-driver/mysql.(*mysqlTx).Rollback()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/transaction.go:28 +0xfd
  database/sql.(*Tx).rollback.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1526 +0x6e
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Tx).rollback()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1527 +0x10a
  database/sql.(*Tx).awaitDone()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1446 +0x8d
Previous write at 0x00c4203b9d70 by goroutine 59:
  github.com/go-sql-driver/mysql.(*buffer).readNext()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/buffer.go:104 +0xf5
  github.com/go-sql-driver/mysql.(*mysqlConn).readPacket()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:31 +0x74
  github.com/go-sql-driver/mysql.(*binaryRows).readRow()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:1108 +0x7d
  github.com/go-sql-driver/mysql.(*binaryRows).Next()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/rows.go:153 +0x9c
  database/sql.(*Rows).nextLocked()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2149 +0xd1
  database/sql.(*Rows).Next.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2134 +0x57
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Rows).Next()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2135 +0xe8
  github.com/google/trillian/storage/mysql.(*logTreeTX).DequeueLeaves()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:277 +0x64e
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:180 +0x36c
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 71 (running) created at:
  database/sql.(*DB).begin()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1383 +0x38f
  database/sql.(*DB).BeginTx()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1342 +0x89
  github.com/google/trillian/storage/mysql.(*mySQLTreeStorage).beginTreeTx()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/tree_storage.go:144 +0xaf
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).beginInternal()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:206 +0x23f
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).BeginForTree()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:227 +0x68
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:171 +0xa7
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 59 (finished) created at:
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:329 +0x6a6
  github.com/google/trillian/server.(*LogOperationManager).OperationLoop()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:358 +0xc4
  github.com/google/trillian/testonly/integration.NewLogEnv.func1()
      /home/travis/gopath/src/github.com/google/trillian/testonly/integration/clientserver.go:120 +0x76
==================
--- FAIL: TestLiveLogIntegration (0.00s)
	log_integration_test.go:46: Log integration test skipped as no tree ID provided
	testing.go:610: race detected during execution of test
==================
WARNING: DATA RACE
Write at 0x00c4203b9d68 by goroutine 71:
  github.com/go-sql-driver/mysql.(*buffer).fill()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/buffer.go:59 +0xaf
  github.com/go-sql-driver/mysql.(*buffer).readNext()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/buffer.go:97 +0x1dd
  github.com/go-sql-driver/mysql.(*mysqlConn).readPacket()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:31 +0x74
  github.com/go-sql-driver/mysql.(*mysqlConn).readResultSetHeaderPacket()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:517 +0x50
  github.com/go-sql-driver/mysql.(*mysqlConn).exec()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/connection.go:297 +0x9d
  github.com/go-sql-driver/mysql.(*mysqlTx).Rollback()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/transaction.go:28 +0xfd
  database/sql.(*Tx).rollback.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1526 +0x6e
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Tx).rollback()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1527 +0x10a
  database/sql.(*Tx).awaitDone()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1446 +0x8d
Previous write at 0x00c4203b9d68 by goroutine 59:
  github.com/go-sql-driver/mysql.(*buffer).readNext()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/buffer.go:103 +0xb2
  github.com/go-sql-driver/mysql.(*mysqlConn).readPacket()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:31 +0x74
  github.com/go-sql-driver/mysql.(*binaryRows).readRow()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/packets.go:1108 +0x7d
  github.com/go-sql-driver/mysql.(*binaryRows).Next()
      /home/travis/gopath/src/github.com/go-sql-driver/mysql/rows.go:153 +0x9c
  database/sql.(*Rows).nextLocked()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2149 +0xd1
  database/sql.(*Rows).Next.func1()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2134 +0x57
  database/sql.withLock()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2545 +0x76
  database/sql.(*Rows).Next()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:2135 +0xe8
  github.com/google/trillian/storage/mysql.(*logTreeTX).DequeueLeaves()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:277 +0x64e
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:180 +0x36c
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 71 (running) created at:
  database/sql.(*DB).begin()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1383 +0x38f
  database/sql.(*DB).BeginTx()
      /home/travis/.gimme/versions/go1.8.linux.amd64/src/database/sql/sql.go:1342 +0x89
  github.com/google/trillian/storage/mysql.(*mySQLTreeStorage).beginTreeTx()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/tree_storage.go:144 +0xaf
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).beginInternal()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:206 +0x23f
  github.com/google/trillian/storage/mysql.(*mySQLLogStorage).BeginForTree()
      /home/travis/gopath/src/github.com/google/trillian/storage/mysql/log_storage.go:227 +0x68
  github.com/google/trillian/log.Sequencer.SequenceBatch()
      /home/travis/gopath/src/github.com/google/trillian/log/sequencer.go:171 +0xa7
  github.com/google/trillian/server.(*SequencerManager).ExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/sequencer_manager.go:81 +0x991
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass.func1()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:314 +0x137
Goroutine 59 (finished) created at:
  github.com/google/trillian/server.(*LogOperationManager).getLogsAndExecutePass()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:329 +0x6a6
  github.com/google/trillian/server.(*LogOperationManager).OperationLoop()
      /home/travis/gopath/src/github.com/google/trillian/server/log_operation_manager.go:358 +0xc4
  github.com/google/trillian/testonly/integration.NewLogEnv.func1()
      /home/travis/gopath/src/github.com/google/trillian/testonly/integration/clientserver.go:120 +0x76
==================

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions