Merge pull request #1632 from slingamn/mysql_safety

fix #1622
This commit is contained in:
Shivaram Lingamneni 2021-04-25 23:14:40 -04:00 committed by GitHub
commit 317720bfc8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 0 deletions

View File

@ -748,6 +748,9 @@ datastore:
password: "hunter2" password: "hunter2"
history-database: "oragono_history" history-database: "oragono_history"
timeout: 3s timeout: 3s
max-conns: 4
# this may be necessary to prevent middleware from closing your connections:
#conn-max-lifetime: 180s
# languages config # languages config
languages: languages:

View File

@ -18,6 +18,7 @@ import (
"path/filepath" "path/filepath"
"reflect" "reflect"
"regexp" "regexp"
"runtime"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -1481,6 +1482,12 @@ func LoadConfig(filename string) (config *Config, err error) {
config.Datastore.MySQL.ExpireTime = time.Duration(config.History.Restrictions.ExpireTime) config.Datastore.MySQL.ExpireTime = time.Duration(config.History.Restrictions.ExpireTime)
config.Datastore.MySQL.TrackAccountMessages = config.History.Retention.EnableAccountIndexing config.Datastore.MySQL.TrackAccountMessages = config.History.Retention.EnableAccountIndexing
if config.Datastore.MySQL.MaxConns == 0 {
// #1622: not putting an upper limit on the number of MySQL connections is
// potentially dangerous. as a naive heuristic, assume they're running on the
// same machine:
config.Datastore.MySQL.MaxConns = runtime.NumCPU()
}
config.Server.Cloaks.Initialize() config.Server.Cloaks.Initialize()
if config.Server.Cloaks.Enabled { if config.Server.Cloaks.Enabled {

View File

@ -17,6 +17,8 @@ type Config struct {
Password string Password string
HistoryDatabase string `yaml:"history-database"` HistoryDatabase string `yaml:"history-database"`
Timeout time.Duration Timeout time.Duration
MaxConns int `yaml:"max-conns"`
ConnMaxLifetime time.Duration `yaml:"conn-max-lifetime"`
// XXX these are copied from elsewhere in the config: // XXX these are copied from elsewhere in the config:
ExpireTime time.Duration ExpireTime time.Duration

View File

@ -100,6 +100,14 @@ func (m *MySQL) Open() (err error) {
return err return err
} }
if m.config.MaxConns != 0 {
m.db.SetMaxOpenConns(m.config.MaxConns)
m.db.SetMaxIdleConns(m.config.MaxConns)
}
if m.config.ConnMaxLifetime != 0 {
m.db.SetConnMaxLifetime(m.config.ConnMaxLifetime)
}
err = m.fixSchemas() err = m.fixSchemas()
if err != nil { if err != nil {
return err return err

View File

@ -721,6 +721,9 @@ datastore:
password: "hunter2" password: "hunter2"
history-database: "oragono_history" history-database: "oragono_history"
timeout: 3s timeout: 3s
max-conns: 4
# this may be necessary to prevent middleware from closing your connections:
#conn-max-lifetime: 180s
# languages config # languages config
languages: languages: