]> Cypherpunks.ru repositories - gostls13.git/commitdiff
database/sql: de-flake TestTxCannotCommitAfterRollback
authorDaniel Theophanes <kardianos@gmail.com>
Wed, 22 Apr 2020 19:45:44 +0000 (12:45 -0700)
committerDaniel Theophanes <kardianos@gmail.com>
Wed, 22 Apr 2020 22:10:09 +0000 (22:10 +0000)
Do not cancel rows during test. Only cancel the Tx.
Correct the referenced issue number on the test.

Fixes #38597

Change-Id: I0e8ba1bf2a8ba638d121c9c6938501fec1d5e961
Reviewed-on: https://go-review.googlesource.com/c/go/+/229478
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/database/sql/sql.go
src/database/sql/sql_test.go

index 6e317144451ac94566200b4d4b06eabf7ed78e8c..374dd98b00f9467e9d0f230f9ad7b88bac39795f 100644 (file)
@@ -2793,10 +2793,17 @@ func (rs *Rows) lasterrOrErrLocked(err error) error {
        return err
 }
 
+// bypassRowsAwaitDone is only used for testing.
+// If true, it will not close the Rows automatically from the context.
+var bypassRowsAwaitDone = false
+
 func (rs *Rows) initContextClose(ctx, txctx context.Context) {
        if ctx.Done() == nil && (txctx == nil || txctx.Done() == nil) {
                return
        }
+       if bypassRowsAwaitDone {
+               return
+       }
        ctx, rs.cancel = context.WithCancel(ctx)
        go rs.awaitDone(ctx, txctx)
 }
index 00a67c79ee073a8c21ac8c26ac895b9704c14d85..5727f0d8aa64183423e7d203e3470f5fb1345419 100644 (file)
@@ -2742,7 +2742,7 @@ func TestManyErrBadConn(t *testing.T) {
        }
 }
 
-// Issue 34755: Ensure that a Tx cannot commit after a rollback.
+// Issue 34775: Ensure that a Tx cannot commit after a rollback.
 func TestTxCannotCommitAfterRollback(t *testing.T) {
        db := newTestDB(t, "tx_status")
        defer closeDB(t, db)
@@ -2784,6 +2784,9 @@ func TestTxCannotCommitAfterRollback(t *testing.T) {
        // 2. (A) Start a query, (B) begin Tx rollback through a ctx cancel.
        // 3. Check if 2.A has committed in Tx (pass) or outside of Tx (fail).
        sendQuery := make(chan struct{})
+       // The Tx status is returned through the row results, ensure
+       // that the rows results are not cancelled.
+       bypassRowsAwaitDone = true
        hookTxGrabConn = func() {
                cancel()
                <-sendQuery
@@ -2794,6 +2797,7 @@ func TestTxCannotCommitAfterRollback(t *testing.T) {
        defer func() {
                hookTxGrabConn = nil
                rollbackHook = nil
+               bypassRowsAwaitDone = false
        }()
 
        err = tx.QueryRow("SELECT|tx_status|tx_status|").Scan(&txStatus)