aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql
diff options
context:
space:
mode:
authorDaniel Theophanes <kardianos@gmail.com>2021-06-21 11:11:20 -0500
committerDaniel Theophanes <kardianos@gmail.com>2021-06-21 17:37:23 +0000
commit44f9a3566ce564f9a21b1b92940a520ea241e065 (patch)
treec7582db2836ad42503bb2bb4dd752128340320ed /src/database/sql
parent16e82be454cbf41299e6a055d54d489ca4612ee0 (diff)
downloadgo-44f9a3566ce564f9a21b1b92940a520ea241e065.tar.xz
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>
Diffstat (limited to 'src/database/sql')
-rw-r--r--src/database/sql/sql_test.go2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go
index 7d1cb9b85a..f771dee4a9 100644
--- a/src/database/sql/sql_test.go
+++ b/src/database/sql/sql_test.go
@@ -2841,7 +2841,6 @@ func TestTxStmtDeadlock(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
tx, err := db.BeginTx(ctx, nil)
- cancel()
if err != nil {
t.Fatal(err)
}
@@ -2850,6 +2849,7 @@ func TestTxStmtDeadlock(t *testing.T) {
if err != nil {
t.Fatal(err)
}
+ cancel()
// Run number of stmt queries to reproduce deadlock from context cancel
for i := 0; i < 1e3; i++ {
// Encounter any close related errors (e.g. ErrTxDone, stmt is closed)