]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] database/sql: de-flake TestTxCannotCommitAfterRollback
authorDaniel Theophanes <kardianos@gmail.com>
Wed, 22 Apr 2020 19:45:44 +0000 (12:45 -0700)
committerDmitri Shuralyov <dmitshur@golang.org>
Thu, 8 Oct 2020 21:03:57 +0000 (21:03 +0000)
Do not cancel rows during test. Only cancel the Tx.
Correct the referenced issue number on the test.

Updates #38597.
Fixes #41815.

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>
(cherry picked from commit ed7888aea6021e25b0ea58bcad3f26da2b139432)
Reviewed-on: https://go-review.googlesource.com/c/go/+/259858
Trust: Dmitri Shuralyov <dmitshur@golang.org>
Trust: Emmanuel Odeke <emm.odeke@gmail.com>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/database/sql/sql.go
src/database/sql/sql_test.go

index a0b7ca8f0875a0e71355449b32ea4409300d78e5..74447d1945eb2dbe400830d2a7ecb73f6107e271 100644 (file)
@@ -2729,10 +2729,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 a9e18004fb4a308f5d4ff421924fb09e6e92309b..7be5fc917a32315bc10300e9fb34a3a5f0954f15 100644 (file)
@@ -2724,7 +2724,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)
@@ -2766,6 +2766,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
@@ -2776,6 +2779,7 @@ func TestTxCannotCommitAfterRollback(t *testing.T) {
        defer func() {
                hookTxGrabConn = nil
                rollbackHook = nil
+               bypassRowsAwaitDone = false
        }()
 
        err = tx.QueryRow("SELECT|tx_status|tx_status|").Scan(&txStatus)