@@ -1875,45 +1875,49 @@ func BuildLogger(inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (slog.
1875
1875
}, nil
1876
1876
}
1877
1877
1878
- func ConnectToPostgres (ctx context.Context , logger slog.Logger , driver string , dbURL string ) (* sql.DB , error ) {
1878
+ func ConnectToPostgres (ctx context.Context , logger slog.Logger , driver string , dbURL string ) (sqlDB * sql.DB , err error ) {
1879
1879
logger .Debug (ctx , "connecting to postgresql" )
1880
1880
1881
1881
// Try to connect for 30 seconds.
1882
1882
ctx , cancel := context .WithTimeout (ctx , 30 * time .Second )
1883
1883
defer cancel ()
1884
1884
1885
- var (
1886
- sqlDB * sql.DB
1887
- err error
1888
- ok = false
1889
- tries int
1890
- )
1885
+ defer func () {
1886
+ if err == nil {
1887
+ return
1888
+ }
1889
+ if sqlDB != nil {
1890
+ _ = sqlDB .Close ()
1891
+ sqlDB = nil
1892
+ }
1893
+ logger .Error (ctx , "connect to postgres failed" , slog .Error (err ))
1894
+ }()
1895
+
1896
+ var tries int
1891
1897
for r := retry .New (time .Second , 3 * time .Second ); r .Wait (ctx ); {
1892
1898
tries ++
1893
1899
1894
1900
sqlDB , err = sql .Open (driver , dbURL )
1895
1901
if err != nil {
1896
- logger .Warn (ctx , "connect to postgres; retrying" , slog .Error (err ), slog .F ("try" , tries ))
1902
+ logger .Warn (ctx , "connect to postgres: retrying" , slog .Error (err ), slog .F ("try" , tries ))
1897
1903
continue
1898
1904
}
1899
1905
1900
1906
err = pingPostgres (ctx , sqlDB )
1901
1907
if err != nil {
1902
- logger .Warn (ctx , "ping postgres; retrying" , slog .Error (err ), slog .F ("try" , tries ))
1908
+ logger .Warn (ctx , "ping postgres: retrying" , slog .Error (err ), slog .F ("try" , tries ))
1909
+ _ = sqlDB .Close ()
1910
+ sqlDB = nil
1903
1911
continue
1904
1912
}
1905
1913
1906
1914
break
1907
1915
}
1908
- // Make sure we close the DB in case it opened but the ping failed for some
1909
- // reason.
1910
- defer func () {
1911
- if ! ok && sqlDB != nil {
1912
- _ = sqlDB .Close ()
1913
- }
1914
- }()
1916
+ if err == nil {
1917
+ err = ctx .Err ()
1918
+ }
1915
1919
if err != nil {
1916
- return nil , xerrors .Errorf ("connect to postgres; tries %d; last error: %w" , tries , err )
1920
+ return nil , xerrors .Errorf ("unable to connect after %d tries ; last error: %w" , tries , err )
1917
1921
}
1918
1922
1919
1923
// Ensure the PostgreSQL version is >=13.0.0!
@@ -1958,7 +1962,6 @@ func ConnectToPostgres(ctx context.Context, logger slog.Logger, driver string, d
1958
1962
// of connection churn.
1959
1963
sqlDB .SetMaxIdleConns (3 )
1960
1964
1961
- ok = true
1962
1965
return sqlDB , nil
1963
1966
}
1964
1967
0 commit comments