Skip to content

Commit 92f27f4

Browse files
author
Chris Vermeulen
authored
Attempt to connect database a few times before timing out (#241)
1 parent 60c4f68 commit 92f27f4

File tree

8 files changed

+55
-12
lines changed

8 files changed

+55
-12
lines changed

cmd/migrate.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"context"
45
"github.com/compliance-framework/configuration-service/internal/config"
56
"github.com/compliance-framework/configuration-service/internal/service"
67
"github.com/spf13/cobra"
@@ -50,8 +51,8 @@ func migrateUp(cmd *cobra.Command, args []string) {
5051
defer zapLogger.Sync() // flushes buffer, if any
5152

5253
cfg := config.NewConfig(sugar)
53-
54-
db, err := service.ConnectSQLDb(cfg, sugar)
54+
ctx := context.Background()
55+
db, err := service.ConnectSQLDb(ctx, cfg, sugar)
5556
if err != nil {
5657
panic("failed to connect database")
5758
}
@@ -71,8 +72,8 @@ func migrateDown(cmd *cobra.Command, args []string) {
7172
defer zapLogger.Sync() // flushes buffer, if any
7273

7374
cfg := config.NewConfig(sugar)
74-
75-
db, err := service.ConnectSQLDb(cfg, sugar)
75+
ctx := context.Background()
76+
db, err := service.ConnectSQLDb(ctx, cfg, sugar)
7677
if err != nil {
7778
panic("failed to connect database")
7879
}

cmd/oscal/import.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package oscal
22

33
import (
4+
"context"
45
"encoding/json"
56
"github.com/compliance-framework/configuration-service/internal/service/relational"
67
oscalTypes_1_1_3 "github.com/defenseunicorns/go-oscal/src/types/oscal-1-1-3"
@@ -45,7 +46,7 @@ func importOscal(cmd *cobra.Command, args []string) {
4546
panic(err)
4647
}
4748

48-
db, err := service.ConnectSQLDb(config, sugar)
49+
db, err := service.ConnectSQLDb(context.Background(), config, sugar)
4950
if err != nil {
5051
panic("failed to connect database")
5152
}

cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func RunServer(cmd *cobra.Command, args []string) {
3434

3535
config := config.NewConfig(sugar)
3636

37-
db, err := service.ConnectSQLDb(config, sugar)
37+
db, err := service.ConnectSQLDb(ctx, config, sugar)
3838
if err != nil {
3939
sugar.Fatal("Failed to connect to SQL database", "err", err)
4040
}

cmd/seed/evidence.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package seed
22

33
import (
4+
"context"
45
"fmt"
56
"github.com/compliance-framework/configuration-service/internal"
67
"github.com/compliance-framework/configuration-service/internal/service/relational"
@@ -59,7 +60,7 @@ func generateEvidence(cmd *cobra.Command, args []string) {
5960
defer zapLogger.Sync() // flushes buffer, if any
6061

6162
cmdConfig := config.NewConfig(sugar)
62-
db, err := service.ConnectSQLDb(cmdConfig, sugar)
63+
db, err := service.ConnectSQLDb(context.Background(), cmdConfig, sugar)
6364
if err != nil {
6465
panic("failed to connect database")
6566
}

cmd/seed/heartbeat.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package seed
22

33
import (
4+
"context"
45
"github.com/google/uuid"
56
"github.com/schollz/progressbar/v3"
67
"log"
@@ -53,7 +54,7 @@ func generateHeartbeats(cmd *cobra.Command, args []string) {
5354
defer zapLogger.Sync() // flushes buffer, if any
5455

5556
cmdConfig := config.NewConfig(sugar)
56-
db, err := service.ConnectSQLDb(cmdConfig, sugar)
57+
db, err := service.ConnectSQLDb(context.Background(), cmdConfig, sugar)
5758
if err != nil {
5859
panic("failed to connect database")
5960
}

cmd/users/create.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package users
22

33
import (
4+
"context"
45
"crypto/rand"
56
"errors"
67
"github.com/compliance-framework/configuration-service/internal/config"
@@ -34,13 +35,14 @@ func newUserAddCmd() *cobra.Command {
3435
}
3536

3637
func addUser(cmd *cobra.Command, args []string) {
38+
ctx := context.Background()
3739
logger, err := zap.NewProduction()
3840
cobra.CheckErr(err)
3941
defer logger.Sync() // flushes buffer, if any
4042
sugar := logger.Sugar()
4143

4244
config := config.NewConfig(sugar)
43-
db, err := service.ConnectSQLDb(config, sugar)
45+
db, err := service.ConnectSQLDb(ctx, config, sugar)
4446

4547
if err != nil {
4648
sugar.Errorw("Failed to connect to database", "error", err)

cmd/users/update.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package users
22

33
import (
4+
"context"
45
"github.com/compliance-framework/configuration-service/internal/config"
56
"github.com/compliance-framework/configuration-service/internal/service"
67
"github.com/compliance-framework/configuration-service/internal/service/relational"
@@ -33,13 +34,14 @@ func updateUserCmd() *cobra.Command {
3334
}
3435

3536
func updateUser(cmd *cobra.Command, args []string) {
37+
ctx := context.Background()
3638
logger, err := zap.NewProduction()
3739
cobra.CheckErr(err)
3840
defer logger.Sync() // flushes buffer, if any
3941
sugar := logger.Sugar()
4042

4143
config := config.NewConfig(sugar)
42-
db, err := service.ConnectSQLDb(config, sugar)
44+
db, err := service.ConnectSQLDb(ctx, config, sugar)
4345

4446
if err != nil {
4547
sugar.Errorw("Failed to connect to database", "error", err)

internal/service/connector.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package service
22

33
import (
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

Comments
 (0)