Allow retrying a connection on startup (#695)
* Allow retrying a connection on startup * Remove unused vars * Add an extra comment * Restructure retry logic a bit * Update retry logic * Fix comment * Update comment * Change type for RetryCount and RetryDelay to uint * Extra test cases * Tweak
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"log"
|
||||
neturl "net/url"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -21,6 +22,18 @@ import (
|
||||
"github.com/sosedoff/pgweb/pkg/statements"
|
||||
)
|
||||
|
||||
var (
|
||||
regexErrAuthFailed = regexp.MustCompile(`(authentication failed|role "(.*)" does not exist)`)
|
||||
regexErrConnectionRefused = regexp.MustCompile(`(connection|actively) refused`)
|
||||
regexErrDatabaseNotExist = regexp.MustCompile(`database "(.*)" does not exist`)
|
||||
)
|
||||
|
||||
var (
|
||||
ErrAuthFailed = errors.New("authentication failed")
|
||||
ErrConnectionRefused = errors.New("connection refused")
|
||||
ErrDatabaseNotExist = errors.New("database does not exist")
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
db *sqlx.DB
|
||||
tunnel *Tunnel
|
||||
@@ -179,7 +192,28 @@ func (client *Client) setServerVersion() {
|
||||
}
|
||||
|
||||
func (client *Client) Test() error {
|
||||
return client.db.Ping()
|
||||
// NOTE: This is a different timeout defined in CLI OpenTimeout
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
err := client.db.PingContext(ctx)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
errMsg := err.Error()
|
||||
|
||||
if regexErrConnectionRefused.MatchString(errMsg) {
|
||||
return ErrConnectionRefused
|
||||
}
|
||||
if regexErrAuthFailed.MatchString(errMsg) {
|
||||
return ErrAuthFailed
|
||||
}
|
||||
if regexErrDatabaseNotExist.MatchString(errMsg) {
|
||||
return ErrDatabaseNotExist
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (client *Client) TestWithTimeout(timeout time.Duration) (result error) {
|
||||
|
||||
Reference in New Issue
Block a user