Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Daemon: introduce a 5s connect timeout on opening Postgres connections #419

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 22 additions & 16 deletions pgwatch2/pgwatch2.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,36 +340,42 @@ func IsPostgresDBType(dbType string) bool {
}

func GetPostgresDBConnection(libPqConnString, host, port, dbname, user, password, sslmode, sslrootcert, sslcert, sslkey string) (*sqlx.DB, error) {
var err error
var db *sqlx.DB
var connStr string

//log.Debug("Connecting to: ", host, port, dbname, user, password)
if len(libPqConnString) > 0 {
if strings.Contains(strings.ToLower(libPqConnString), "sslmode") {
db, err = sqlx.Open("postgres", libPqConnString)
} else {
if strings.Contains(libPqConnString, "postgresql://") { // JDBC style
if strings.Contains(libPqConnString, "?") { // a bit simplistic, regex would be better
//log.Debug("Adding sslmode", libPqConnString+"&sslmode=disable")
db, err = sqlx.Open("postgres", libPqConnString+"&sslmode=disable")
connStr = libPqConnString
if !strings.Contains(strings.ToLower(connStr), "sslmode") {
if strings.Contains(connStr, "postgresql://") { // JDBC style
if strings.Contains(connStr, "?") { // has some extra params already
connStr += "&sslmode=disable" // defaulting to "disable" as Go driver doesn't support "prefer"
} else {
connStr += "?sslmode=disable"
}
} else { // LibPQ style
connStr += " sslmode=disable"
}
}
if !strings.Contains(strings.ToLower(connStr), "connect_timeout") {
if strings.Contains(connStr, "postgresql://") { // JDBC style
if strings.Contains(connStr, "?") { // has some extra params already
connStr += "&connect_timeout=5" // 5 seconds
} else {
//log.Debug("Adding sslmode", libPqConnString+"?sslmode=disable")
db, err = sqlx.Open("postgres", libPqConnString+"?sslmode=disable")
connStr += "?connect_timeout=5"
}
} else { // LibPQ style
db, err = sqlx.Open("postgres", libPqConnString+" sslmode=disable")
connStr += " connect_timeout=5"
}
}
Comment on lines +348 to 369
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy-Paste detected! :-)

It should be function call, e.g.

connStr = AddDefaultParam(connStr, "sslmode", "disable");
connStr = AddDefaultParam(connStr, "connect_timeout", "5");

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guilty as charged sadly :) Tons of refactoring probably required in many places...will one ever find time for that, that is the big question :)

} else {
conn_str := fmt.Sprintf("host=%s port=%s dbname='%s' sslmode=%s user=%s application_name=%s sslrootcert='%s' sslcert='%s' sslkey='%s'",
connStr = fmt.Sprintf("host=%s port=%s dbname='%s' sslmode=%s user=%s application_name=%s sslrootcert='%s' sslcert='%s' sslkey='%s' connect_timeout=5",
host, port, dbname, sslmode, user, APPLICATION_NAME, sslrootcert, sslcert, sslkey)
if password != "" { // having empty string as password effectively disables .pgpass so include only if password given
conn_str += fmt.Sprintf(" password='%s'", password)
connStr += fmt.Sprintf(" password='%s'", password)
}
db, err = sqlx.Open("postgres", conn_str)
}

return db, err
return sqlx.Open("postgres", connStr)
}

func StringToBoolOrFail(boolAsString, inputParamName string) bool {
Expand Down