From 21ad5625ddabbe1def149f0fabb3717240447f63 Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Thu, 6 Jul 2023 20:44:12 +0000 Subject: [PATCH] fix(coderd): remove `CREATE INDEX CONCURRENTLY` from migrations This seems to cause deadlocks with parallel migrations, which is why migrations seem to fail with multiple coderds. ``` coder-db-1 | 2023-07-06 20:15:04.322 UTC [90] ERROR: deadlock detected coder-db-1 | 2023-07-06 20:15:04.322 UTC [90] DETAIL: Process 90 waits for ExclusiveLock on advisory lock [16384,0,4187539795,1]; blocked by process 89. coder-db-1 | Process 89 waits for ShareLock on virtual transaction 4/15; blocked by process 90. coder-db-1 | Process 90: SELECT pg_advisory_lock($1) coder-db-1 | Process 89: CREATE INDEX CONCURRENTLY workspace_resources_job_id_idx ON workspace_resources USING btree (job_id); coder-db-1 | coder-db-1 | 2023-07-06 20:15:04.322 UTC [90] HINT: See server log for query details. coder-db-1 | 2023-07-06 20:15:04.322 UTC [90] STATEMENT: SELECT pg_advisory_lock($1) ``` --- ...0074_workspace_resources_job_id_idx.up.sql | 2 +- coderd/database/migrations/migrate_test.go | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/coderd/database/migrations/000074_workspace_resources_job_id_idx.up.sql b/coderd/database/migrations/000074_workspace_resources_job_id_idx.up.sql index 29bd6798b4750..36abc7dab8893 100644 --- a/coderd/database/migrations/000074_workspace_resources_job_id_idx.up.sql +++ b/coderd/database/migrations/000074_workspace_resources_job_id_idx.up.sql @@ -1 +1 @@ -CREATE INDEX CONCURRENTLY workspace_resources_job_id_idx ON workspace_resources USING btree (job_id); +CREATE INDEX workspace_resources_job_id_idx ON workspace_resources USING btree (job_id); diff --git a/coderd/database/migrations/migrate_test.go b/coderd/database/migrations/migrate_test.go index 3c71dd5029613..5726b65609ac2 100644 --- a/coderd/database/migrations/migrate_test.go +++ b/coderd/database/migrations/migrate_test.go @@ -20,6 +20,7 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/goleak" "golang.org/x/exp/slices" + "golang.org/x/sync/errgroup" "github.com/coder/coder/coderd/database/migrations" "github.com/coder/coder/coderd/database/postgres" @@ -47,6 +48,22 @@ func TestMigrate(t *testing.T) { require.NoError(t, err) }) + t.Run("Parallel", func(t *testing.T) { + t.Parallel() + + db := testSQLDB(t) + eg := errgroup.Group{} + + eg.Go(func() error { + return migrations.Up(db) + }) + eg.Go(func() error { + return migrations.Up(db) + }) + + require.NoError(t, eg.Wait()) + }) + t.Run("Twice", func(t *testing.T) { t.Parallel() @@ -86,6 +103,13 @@ func testSQLDB(t testing.TB) *sql.DB { require.NoError(t, err) t.Cleanup(func() { _ = db.Close() }) + // postgres.Open automatically runs migrations, but we want to actually test + // migration behavior in this package. + _, err = db.Exec(`DROP SCHEMA public CASCADE`) + require.NoError(t, err) + _, err = db.Exec(`CREATE SCHEMA public`) + require.NoError(t, err) + return db }