diff --git a/crm/start.go b/crm/start.go index c761438ef..78518dc57 100644 --- a/crm/start.go +++ b/crm/start.go @@ -10,10 +10,10 @@ import ( "github.com/SentimensRG/ctx" "github.com/SentimensRG/ctx/sigctx" "github.com/pkg/errors" - "github.com/titpetric/factory" "github.com/titpetric/factory/resputil" migrate "github.com/crusttech/crust/crm/db" + "github.com/crusttech/crust/internal/db" systemService "github.com/crusttech/crust/system/service" "github.com/crusttech/crust/crm/service" @@ -46,15 +46,9 @@ func Init() error { mail.SetupDialer(flags.smtp) // start/configure database connection - factory.Database.Add("default", flags.db.DSN) - db := factory.Database.MustGet() - - // @todo: profiling as an external service? - switch flags.db.Profiler { - case "stdout": - db.Profiler = &factory.Database.ProfilerStdout - default: - log.Println("No database query profiler selected") + db, err := db.TryToConnect(flags.db.DSN, flags.db.Profiler) + if err != nil { + return errors.Wrap(err, "could not connect to database") } // migrate database schema diff --git a/internal/db/connector.go b/internal/db/connector.go new file mode 100644 index 000000000..74945d411 --- /dev/null +++ b/internal/db/connector.go @@ -0,0 +1,34 @@ +package db + +import ( + "log" + "time" + + "github.com/titpetric/factory" +) + +func TryToConnect(dsn, profiler string) (db *factory.DB, err error) { + factory.Database.Add("default", dsn) + var try = 0 + +connect: + try++ + db, err = factory.Database.Get() + + if err != nil { + delay := time.Second * 5 + log.Printf("Failed to connect, try %d, error: %v, retry in %.0fs", try, err, delay.Seconds()) + time.Sleep(delay) + goto connect + } + + // @todo: profiling as an external service? + switch profiler { + case "stdout": + db.Profiler = &factory.Database.ProfilerStdout + default: + log.Println("No database query profiler selected") + } + + return +} diff --git a/sam/start.go b/sam/start.go index d34ab565d..249bf486e 100644 --- a/sam/start.go +++ b/sam/start.go @@ -10,9 +10,9 @@ import ( "github.com/SentimensRG/ctx" "github.com/SentimensRG/ctx/sigctx" "github.com/pkg/errors" - "github.com/titpetric/factory" "github.com/titpetric/factory/resputil" + "github.com/crusttech/crust/internal/db" migrate "github.com/crusttech/crust/sam/db" systemService "github.com/crusttech/crust/system/service" @@ -46,15 +46,9 @@ func Init() error { mail.SetupDialer(flags.smtp) // start/configure database connection - factory.Database.Add("default", flags.db.DSN) - db := factory.Database.MustGet() - - // @todo: profiling as an external service? - switch flags.db.Profiler { - case "stdout": - db.Profiler = &factory.Database.ProfilerStdout - default: - log.Println("No database query profiler selected") + db, err := db.TryToConnect(flags.db.DSN, flags.db.Profiler) + if err != nil { + return errors.Wrap(err, "could not connect to database") } // migrate database schema diff --git a/system/start.go b/system/start.go index 813807d7c..f69f47cc7 100644 --- a/system/start.go +++ b/system/start.go @@ -10,9 +10,9 @@ import ( "github.com/SentimensRG/ctx" "github.com/SentimensRG/ctx/sigctx" "github.com/pkg/errors" - "github.com/titpetric/factory" "github.com/titpetric/factory/resputil" + "github.com/crusttech/crust/internal/db" migrate "github.com/crusttech/crust/system/db" systemService "github.com/crusttech/crust/system/service" @@ -45,15 +45,9 @@ func Init() error { mail.SetupDialer(flags.smtp) // start/configure database connection - factory.Database.Add("default", flags.db.DSN) - db := factory.Database.MustGet() - - // @todo: profiling as an external service? - switch flags.db.Profiler { - case "stdout": - db.Profiler = &factory.Database.ProfilerStdout - default: - log.Println("No database query profiler selected") + db, err := db.TryToConnect(flags.db.DSN, flags.db.Profiler) + if err != nil { + return errors.Wrap(err, "could not connect to database") } // migrate database schema