mirror of
https://github.com/golang/go
synced 2024-11-26 11:58:07 -07:00
database/sql: fix deadlock test in prepare statement
The issue go#46783 correctly diagnosed the context timeout caused an intermittent failure when the context was canceled prior to the BeginTx call. However due to the asynchronous nature of canceling a Tx through a context on fast systems, the tx.Prepare also succeeded. On slower systems or if a time.Sleep was inserted between the BeginTx and Prepare, the Prepare would fail. Resolve this by moving the context cancel after the Prepare. This will still trigger the deadlock which I tested locally. In addition, I interspersed multiple time.Sleep calls and the test still functioned. Fixes #46852 Change-Id: I9cbf90d3c12b2555493a37799738772b615ae39d Reviewed-on: https://go-review.googlesource.com/c/go/+/329830 Run-TryBot: Daniel Theophanes <kardianos@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> Trust: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
parent
16e82be454
commit
44f9a3566c
@ -2841,7 +2841,6 @@ func TestTxStmtDeadlock(t *testing.T) {
|
|||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
tx, err := db.BeginTx(ctx, nil)
|
||||||
cancel()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -2850,6 +2849,7 @@ func TestTxStmtDeadlock(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
cancel()
|
||||||
// Run number of stmt queries to reproduce deadlock from context cancel
|
// Run number of stmt queries to reproduce deadlock from context cancel
|
||||||
for i := 0; i < 1e3; i++ {
|
for i := 0; i < 1e3; i++ {
|
||||||
// Encounter any close related errors (e.g. ErrTxDone, stmt is closed)
|
// Encounter any close related errors (e.g. ErrTxDone, stmt is closed)
|
||||||
|
Loading…
Reference in New Issue
Block a user