From 84ade591bd19f6ec5a060cac693d05deefb5a1ad Mon Sep 17 00:00:00 2001 From: Faizan Qazi Date: Wed, 14 Aug 2024 01:40:45 +0000 Subject: [PATCH] sql: fix TestRandomSyntaxSchemaChangeDatabase flake Previously, TestRandomSyntaxSchemaChangeDatabase could flake because of contention from multiple Go routines executing SQL against the same database. Some of these schema changes were long-running, making this test unreliable. To address this, this patch creates multiple databases, so that every two connections will share the same database. Fixes: #128287 Release note: None --- pkg/sql/tests/rsg_test.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/pkg/sql/tests/rsg_test.go b/pkg/sql/tests/rsg_test.go index c8899781af17..dface7d12938 100644 --- a/pkg/sql/tests/rsg_test.go +++ b/pkg/sql/tests/rsg_test.go @@ -19,6 +19,7 @@ import ( "os" "regexp" "strings" + "sync/atomic" "testing" "time" @@ -511,16 +512,30 @@ func TestRandomSyntaxSchemaChangeDatabase(t *testing.T) { "drop_user_stmt", "alter_user_stmt", } - + // Create multiple databases, so that in concurrent scenarios two connections + // will always share the same database. + numDatabases := max(*flagRSGGoRoutines/2, 1) + databases := make([]string, 0, numDatabases) + for dbIdx := 0; dbIdx < numDatabases; dbIdx++ { + databases = append(databases, fmt.Sprintf("ident_%d", dbIdx)) + } + var nextDatabaseName atomic.Int64 testRandomSyntax(t, true, "ident", func(ctx context.Context, db *verifyFormatDB, r *rsg.RSG) error { if err := db.exec(t, ctx, "SET CLUSTER SETTING sql.catalog.descriptor_lease_duration = '30s'"); err != nil { return err } - return db.exec(t, ctx, `CREATE DATABASE ident;`) + for _, dbName := range databases { + if err := db.exec(t, ctx, fmt.Sprintf(`CREATE DATABASE %s;`, dbName)); err != nil { + return err + } + } + return nil }, func(ctx context.Context, db *verifyFormatDB, r *rsg.RSG) error { n := r.Intn(len(roots)) s := r.Generate(roots[n], 30) - return db.exec(t, ctx, s) + // Select a database and use it in the generated statement. + dbName := databases[nextDatabaseName.Add(1)%int64(len(databases))] + return db.exec(t, ctx, strings.Replace(s, "ident", dbName, -1)) }) }