From deb2fd9f4fc43aac703fc11ac0c3bc41b45d6d3f Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Thu, 30 Apr 2020 15:00:18 +0200 Subject: [PATCH] Improve mysql connection retry on ping fail --- api/database/mysql.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/api/database/mysql.go b/api/database/mysql.go index 68e28d3c..c5d19129 100644 --- a/api/database/mysql.go +++ b/api/database/mysql.go @@ -41,31 +41,32 @@ func SetupDatabase() (*sql.DB, error) { log.Printf("Connecting to database: %s", address) var db *sql.DB + + db, err = sql.Open("mysql", address.String()) + if err != nil { + return nil, errors.New("Could not connect to database, exiting") + } + tryCount := 0 for { - db, err = sql.Open("mysql", address.String()) - if err != nil { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := db.PingContext(ctx); err != nil { if tryCount < 4 { tryCount++ - log.Printf("WARN: Could not connect to database: %s. Will retry after 1 second", err.Error()) + log.Printf("WARN: Could not ping database: %s, Will retry after 1 second", err) time.Sleep(time.Second) continue } else { - return nil, errors.New("Could not connect to database, exiting") + return nil, errors.Wrap(err, "Could not ping database, exiting") } } break } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - if err := db.PingContext(ctx); err != nil { - return nil, errors.Wrap(err, "Could not ping database, exiting") - } - db.SetMaxOpenConns(80) return db, nil