11package service
22
33import (
4+ "context"
45 "errors"
6+ "strings"
7+ "time"
58
69 "github.com/compliance-framework/configuration-service/internal/config"
710 "github.com/compliance-framework/configuration-service/internal/logging"
@@ -11,7 +14,7 @@ import (
1114 "gorm.io/gorm/logger"
1215)
1316
14- func ConnectSQLDb (config * config.Config , sugar * zap.SugaredLogger ) (* gorm.DB , error ) {
17+ func ConnectSQLDb (ctx context. Context , config * config.Config , sugar * zap.SugaredLogger ) (* gorm.DB , error ) {
1518 gormLogLevel := logger .Warn
1619 if config .DBDebug {
1720 gormLogLevel = logger .Info
@@ -25,10 +28,42 @@ func ConnectSQLDb(config *config.Config, sugar *zap.SugaredLogger) (*gorm.DB, er
2528
2629 switch config .DBDriver {
2730 case "postgres" :
28- db , err = gorm .Open (postgres .Open (config .DBConnectionString ), & gorm.Config {
31+ dialect := postgres .New (postgres.Config {
32+ DSN : config .DBConnectionString ,
33+ })
34+ db , err = gorm .Open (dialect , & gorm.Config {
35+ DisableAutomaticPing : true ,
2936 DisableForeignKeyConstraintWhenMigrating : true ,
3037 Logger : logging .NewZapGormLogger (sugar , gormLogLevel ),
3138 })
39+
40+ pdb , err := db .DB ()
41+ if err != nil {
42+ return nil , err
43+ }
44+
45+ timeoutCtx , cancel := context .WithTimeout (ctx , time .Second * 10 )
46+ defer cancel ()
47+
48+ for true {
49+ err = pdb .Ping ()
50+ if err == nil {
51+ sugar .Warn ("Connected to database" )
52+ break
53+ }
54+
55+ if strings .Contains (err .Error (), "failed to connect" ) {
56+ // The connection failed, we should see if we have timed out and return
57+ if errors .Is (timeoutCtx .Err (), context .DeadlineExceeded ) {
58+ sugar .Warn ("Timed out trying to connect to database. Returning" )
59+ return nil , err
60+ }
61+ } else {
62+ return nil , err
63+ }
64+ sugar .Warn ("Failed to connect to database. Retrying in 0.5 seconds" )
65+ time .Sleep (time .Millisecond * 500 )
66+ }
3267 default :
3368 return nil , errors .New ("unsupported DB driver: " + config .DBDriver )
3469 }
0 commit comments