From a2618b5b532a4a35fb242be087333fe0aa6e9490 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sat, 13 Aug 2022 02:49:02 +0000 Subject: [PATCH 1/2] chore: improve dump error output - Properly report the error that occurs during the DB connection retry loop. - Move the migration out of the retry loop. --- coderd/database/postgres/postgres.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/coderd/database/postgres/postgres.go b/coderd/database/postgres/postgres.go index d1ef7b3084197..129dd86b5e30b 100644 --- a/coderd/database/postgres/postgres.go +++ b/coderd/database/postgres/postgres.go @@ -123,27 +123,35 @@ func Open() (string, func(), error) { } pool.MaxWait = 120 * time.Second + + var ( + db *sql.DB + retryErr error + ) err = pool.Retry(func() error { - db, err := sql.Open("postgres", dbURL) + db, err = sql.Open("postgres", dbURL) if err != nil { - return xerrors.Errorf("open postgres: %w", err) + retryErr = xerrors.Errorf("open postgres: %w", err) + return retryErr } defer db.Close() err = db.Ping() if err != nil { - return xerrors.Errorf("ping postgres: %w", err) + retryErr = xerrors.Errorf("ping postgres: %w", err) + return retryErr } - err = database.MigrateUp(db) - if err != nil { - return xerrors.Errorf("migrate db: %w", err) - } - return nil }) if err != nil { - return "", nil, err + return "", nil, retryErr } + + err = database.MigrateUp(db) + if err != nil { + return "", nil, xerrors.Errorf("migrate db: %w", err) + } + return dbURL, func() { _ = pool.Purge(resource) _ = os.RemoveAll(tempDir) From 29d03838c7de0d5dab5ffd907d5cd3889cbdfa24 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sat, 13 Aug 2022 03:01:25 +0000 Subject: [PATCH 2/2] remove unused code --- coderd/database/postgres/postgres.go | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/coderd/database/postgres/postgres.go b/coderd/database/postgres/postgres.go index 129dd86b5e30b..a1637cfb0261c 100644 --- a/coderd/database/postgres/postgres.go +++ b/coderd/database/postgres/postgres.go @@ -9,6 +9,7 @@ import ( "sync" "time" + "github.com/cenkalti/backoff/v4" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" "golang.org/x/xerrors" @@ -124,12 +125,12 @@ func Open() (string, func(), error) { pool.MaxWait = 120 * time.Second - var ( - db *sql.DB - retryErr error - ) + // Record the error that occurs during the retry. + // The 'pool' pkg hardcodes a deadline error devoid + // of any useful context. + var retryErr error err = pool.Retry(func() error { - db, err = sql.Open("postgres", dbURL) + db, err := sql.Open("postgres", dbURL) if err != nil { retryErr = xerrors.Errorf("open postgres: %w", err) return retryErr @@ -141,17 +142,20 @@ func Open() (string, func(), error) { retryErr = xerrors.Errorf("ping postgres: %w", err) return retryErr } + + err = database.MigrateUp(db) + if err != nil { + retryErr = xerrors.Errorf("migrate db: %w", err) + // Only try to migrate once. + return backoff.Permanent(retryErr) + } + return nil }) if err != nil { return "", nil, retryErr } - err = database.MigrateUp(db) - if err != nil { - return "", nil, xerrors.Errorf("migrate db: %w", err) - } - return dbURL, func() { _ = pool.Purge(resource) _ = os.RemoveAll(tempDir)