diff --git a/.gitignore b/.gitignore index e3307a1b..462e5304 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ yarn-error.log* # vscode __debug_bin +.idea diff --git a/api/database/mysql.go b/api/database/mysql.go index da51a168..5f11cb14 100644 --- a/api/database/mysql.go +++ b/api/database/mysql.go @@ -1,12 +1,15 @@ package database import ( + "context" "database/sql" "log" "net/url" "os" "time" + "github.com/pkg/errors" + // Load mysql driver _ "github.com/go-sql-driver/mysql" @@ -18,15 +21,15 @@ import ( ) // SetupDatabase connects to the database using environment variables -func SetupDatabase() *sql.DB { +func SetupDatabase() (*sql.DB, error) { address, err := url.Parse(os.Getenv("MYSQL_URL")) if err != nil { - log.Fatalf("Could not parse mysql url: %s\n", err) + return nil, errors.Wrapf(err, "Could not parse mysql url") } if address.String() == "" { - log.Fatalln("ERROR: Environment variable MYSQL_URL missing, exiting") + return nil, errors.New("Environment variable MYSQL_URL missing, exiting") } queryValues := address.Query() @@ -49,33 +52,23 @@ func SetupDatabase() *sql.DB { time.Sleep(time.Second) continue } else { - log.Fatalln("ERROR: Could not connect to database, exiting") + return nil, errors.New("Could not connect to database, exiting") } } break } - tryCount = 0 + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() - for { - if err := db.Ping(); err != nil { - if tryCount < 4 { - tryCount++ - log.Printf("Could not ping database: %s. Will retry after 1 second", err.Error()) - time.Sleep(time.Second) - continue - } else { - log.Fatalln("ERROR: Could not ping database, exiting") - } - } - - break + if err := db.PingContext(ctx); err != nil { + return nil, errors.Wrap(err, "Could not ping database, exiting") } db.SetMaxOpenConns(80) - return db + return db, nil } func MigrateDatabase(db *sql.DB) error { diff --git a/api/server.go b/api/server.go index 0977acc9..f4f94fb1 100644 --- a/api/server.go +++ b/api/server.go @@ -30,7 +30,10 @@ func main() { devMode := os.Getenv("DEVELOPMENT") == "1" - db := database.SetupDatabase() + db, err := database.SetupDatabase() + if err != nil { + log.Panicf("Could not connect to database: %s\n", err) + } defer db.Close() // Migrate database @@ -96,5 +99,5 @@ func main() { } - log.Fatal(http.ListenAndServe(":"+apiListenUrl.Port(), rootRouter)) + log.Panic(http.ListenAndServe(":"+apiListenUrl.Port(), rootRouter)) }