Skip to content

Commit dff6f63

Browse files
committed
fix(server): retry initial connection to postgres
1 parent 8d1f163 commit dff6f63

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

cli/server.go

+32-12
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ import (
8888
"github.com/coder/coder/provisionersdk"
8989
sdkproto "github.com/coder/coder/provisionersdk/proto"
9090
"github.com/coder/coder/tailnet"
91+
"github.com/coder/retry"
9192
"github.com/coder/wgtunnel/tunnelsdk"
9293
)
9394

@@ -1733,26 +1734,45 @@ func BuildLogger(inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (slog.
17331734

17341735
func connectToPostgres(ctx context.Context, logger slog.Logger, driver string, dbURL string) (*sql.DB, error) {
17351736
logger.Debug(ctx, "connecting to postgresql")
1736-
sqlDB, err := sql.Open(driver, dbURL)
1737+
1738+
// Try to connect for 30 seconds.
1739+
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
1740+
defer cancel()
1741+
1742+
var (
1743+
sqlDB *sql.DB
1744+
err error
1745+
ok = false
1746+
tries int
1747+
)
1748+
for r := retry.New(time.Second, 3*time.Second); r.Wait(ctx); {
1749+
tries++
1750+
1751+
sqlDB, err = sql.Open(driver, dbURL)
1752+
if err != nil {
1753+
continue
1754+
}
1755+
1756+
pingCtx, pingCancel := context.WithTimeout(ctx, 5*time.Second)
1757+
err = sqlDB.PingContext(pingCtx)
1758+
if err != nil {
1759+
pingCancel()
1760+
continue
1761+
}
1762+
pingCancel()
1763+
1764+
err = nil
1765+
}
17371766
if err != nil {
1738-
return nil, xerrors.Errorf("dial postgres: %w", err)
1767+
return nil, xerrors.Errorf("connect to postgres; tries %d; last error: %w", tries, err)
17391768
}
17401769

1741-
ok := false
17421770
defer func() {
1743-
if !ok {
1771+
if !ok && sqlDB != nil {
17441772
_ = sqlDB.Close()
17451773
}
17461774
}()
17471775

1748-
pingCtx, pingCancel := context.WithTimeout(ctx, 15*time.Second)
1749-
defer pingCancel()
1750-
1751-
err = sqlDB.PingContext(pingCtx)
1752-
if err != nil {
1753-
return nil, xerrors.Errorf("ping postgres: %w", err)
1754-
}
1755-
17561776
// Ensure the PostgreSQL version is >=13.0.0!
17571777
version, err := sqlDB.QueryContext(ctx, "SHOW server_version_num;")
17581778
if err != nil {

0 commit comments

Comments
 (0)