From 7bde4e719808e49a6c8b6635d69f1f4a57f118bd Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Mon, 24 Mar 2025 14:27:46 -0700 Subject: [PATCH] integration-tests/go-sql-server-driver: Improve the robustness of TestConcurrentGC a bit. --- .../concurrent_gc_test.go | 71 +++++++++++++------ 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/integration-tests/go-sql-server-driver/concurrent_gc_test.go b/integration-tests/go-sql-server-driver/concurrent_gc_test.go index dc90e5405e..55817749e0 100644 --- a/integration-tests/go-sql-server-driver/concurrent_gc_test.go +++ b/integration-tests/go-sql-server-driver/concurrent_gc_test.go @@ -38,7 +38,7 @@ func TestConcurrentGC(t *testing.T) { } commits := dimension{ names: []string{"NoCommits", "WithCommits"}, - factors: func(base gcTest) []gcTest{ + factors: func(base gcTest) []gcTest { no, yes := base, base no.commit = false yes.commit = true @@ -47,16 +47,16 @@ func TestConcurrentGC(t *testing.T) { } full := dimension{ names: []string{"NotFull", "Full"}, - factors: func(base gcTest) []gcTest{ + factors: func(base gcTest) []gcTest { no, yes := base, base no.full = false yes.full = true return []gcTest{no, yes} }, } - safepoint := dimension { + safepoint := dimension{ names: []string{"KillConnections", "SessionAware"}, - factors: func(base gcTest) []gcTest{ + factors: func(base gcTest) []gcTest { no, yes := base, base no.sessionAware = false yes.sessionAware = true @@ -64,7 +64,7 @@ func TestConcurrentGC(t *testing.T) { }, } var doDimensions func(t *testing.T, base gcTest, dims []dimension) - doDimensions = func (t *testing.T, base gcTest, dims []dimension) { + doDimensions = func(t *testing.T, base gcTest, dims []dimension) { if len(dims) == 0 { base.run(t) return @@ -80,8 +80,8 @@ func TestConcurrentGC(t *testing.T) { } dimensions := []dimension{commits, full, safepoint} doDimensions(t, gcTest{ - numThreads: 8, - duration: 10 * time.Second, + numThreads: 8, + duration: 10 * time.Second, }, dimensions) } @@ -123,7 +123,16 @@ func (gct gcTest) doUpdate(t *testing.T, ctx context.Context, db *sql.DB, i int) return nil } defer conn.Close() - _, err = conn.ExecContext(ctx, "update vals set val = val+1 where id = ?", i) + tx, err := conn.BeginTx(ctx, nil) + if gct.sessionAware { + assert.NoError(t, err) + } + if err != nil { + // Ignore and try with a different connection... + return nil + } + defer tx.Rollback() + _, err = tx.ExecContext(ctx, "update vals set val = val+1 where id = ?", i) if gct.sessionAware { assert.NoError(t, err) } else if err != nil { @@ -138,21 +147,39 @@ func (gct gcTest) doUpdate(t *testing.T, ctx context.Context, db *sql.DB, i int) } t.Logf("err in Exec update: %v", err) } - if gct.commit { - _, err = conn.ExecContext(ctx, fmt.Sprintf("call dolt_commit('-am', 'increment vals id = %d')", i)) - if gct.sessionAware { - assert.NoError(t, err) - } else if err != nil { - if !assert.NotContains(t, err.Error(), "dangling ref") { - return err + if err == nil { + if gct.commit { + _, err = tx.ExecContext(ctx, fmt.Sprintf("call dolt_commit('-am', 'increment vals id = %d')", i)) + if gct.sessionAware { + assert.NoError(t, err) + } else if err != nil { + if !assert.NotContains(t, err.Error(), "dangling ref") { + return err + } + if !assert.NotContains(t, err.Error(), "is unexpected noms value") { + return err + } + if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") { + return err + } + t.Logf("err in Exec call dolt_commit: %v", err) } - if !assert.NotContains(t, err.Error(), "is unexpected noms value") { - return err + } else { + err = tx.Commit() + if gct.sessionAware { + assert.NoError(t, err) + } else if err != nil { + if !assert.NotContains(t, err.Error(), "dangling ref") { + return err + } + if !assert.NotContains(t, err.Error(), "is unexpected noms value") { + return err + } + if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") { + return err + } + t.Logf("err in tx commit: %v", err) } - if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") { - return err - } - t.Logf("err in Exec call dolt_commit: %v", err) } } return nil @@ -243,7 +270,7 @@ func (gct gcTest) run(t *testing.T) { require.NoError(t, err) srvSettings := &driver.Server{ - Args: []string{"-P", `{{get_port "server_port"}}`}, + Args: []string{"-P", `{{get_port "server_port"}}`}, DynamicPort: "server_port", } if gct.sessionAware {