mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-07-31 13:22:46 +00:00
Global database connection pool (for monolith mode) (#2411)
* Allow monolith components to share a single database pool * Don't yell about missing connection strings * Rename field * Setup tweaks * Fix panic * Improve configuration checks * Update config * Fix lint errors * Update comments
This commit is contained in:
parent
979a551f1e
commit
4ad5f9c982
71 changed files with 345 additions and 240 deletions
51
internal/sqlutil/sqlutil.go
Normal file
51
internal/sqlutil/sqlutil.go
Normal file
|
@ -0,0 +1,51 @@
|
|||
package sqlutil
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"regexp"
|
||||
|
||||
"github.com/matrix-org/dendrite/setup/config"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Open opens a database specified by its database driver name and a driver-specific data source name,
|
||||
// usually consisting of at least a database name and connection information. Includes tracing driver
|
||||
// if DENDRITE_TRACE_SQL=1
|
||||
func Open(dbProperties *config.DatabaseOptions, writer Writer) (*sql.DB, error) {
|
||||
var err error
|
||||
var driverName, dsn string
|
||||
switch {
|
||||
case dbProperties.ConnectionString.IsSQLite():
|
||||
driverName = "sqlite3"
|
||||
dsn, err = ParseFileURI(dbProperties.ConnectionString)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ParseFileURI: %w", err)
|
||||
}
|
||||
case dbProperties.ConnectionString.IsPostgres():
|
||||
driverName = "postgres"
|
||||
dsn = string(dbProperties.ConnectionString)
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid database connection string %q", dbProperties.ConnectionString)
|
||||
}
|
||||
if tracingEnabled {
|
||||
// install the wrapped driver
|
||||
driverName += "-trace"
|
||||
}
|
||||
db, err := sql.Open(driverName, dsn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if driverName != "sqlite3" {
|
||||
logrus.WithFields(logrus.Fields{
|
||||
"MaxOpenConns": dbProperties.MaxOpenConns(),
|
||||
"MaxIdleConns": dbProperties.MaxIdleConns(),
|
||||
"ConnMaxLifetime": dbProperties.ConnMaxLifetime(),
|
||||
"dataSourceName": regexp.MustCompile(`://[^@]*@`).ReplaceAllLiteralString(dsn, "://"),
|
||||
}).Debug("Setting DB connection limits")
|
||||
db.SetMaxOpenConns(dbProperties.MaxOpenConns())
|
||||
db.SetMaxIdleConns(dbProperties.MaxIdleConns())
|
||||
db.SetConnMaxLifetime(dbProperties.ConnMaxLifetime())
|
||||
}
|
||||
return db, nil
|
||||
}
|
|
@ -16,19 +16,16 @@ package sqlutil
|
|||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/matrix-org/dendrite/setup/config"
|
||||
"github.com/ngrok/sqlmw"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
@ -96,47 +93,6 @@ func trackGoID(query string) {
|
|||
logrus.Warnf("unsafe goid %d: SQL executed not on an ExclusiveWriter: %s", thisGoID, q)
|
||||
}
|
||||
|
||||
// Open opens a database specified by its database driver name and a driver-specific data source name,
|
||||
// usually consisting of at least a database name and connection information. Includes tracing driver
|
||||
// if DENDRITE_TRACE_SQL=1
|
||||
func Open(dbProperties *config.DatabaseOptions) (*sql.DB, error) {
|
||||
var err error
|
||||
var driverName, dsn string
|
||||
switch {
|
||||
case dbProperties.ConnectionString.IsSQLite():
|
||||
driverName = "sqlite3"
|
||||
dsn, err = ParseFileURI(dbProperties.ConnectionString)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ParseFileURI: %w", err)
|
||||
}
|
||||
case dbProperties.ConnectionString.IsPostgres():
|
||||
driverName = "postgres"
|
||||
dsn = string(dbProperties.ConnectionString)
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid database connection string %q", dbProperties.ConnectionString)
|
||||
}
|
||||
if tracingEnabled {
|
||||
// install the wrapped driver
|
||||
driverName += "-trace"
|
||||
}
|
||||
db, err := sql.Open(driverName, dsn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if driverName != "sqlite3" {
|
||||
logrus.WithFields(logrus.Fields{
|
||||
"MaxOpenConns": dbProperties.MaxOpenConns(),
|
||||
"MaxIdleConns": dbProperties.MaxIdleConns(),
|
||||
"ConnMaxLifetime": dbProperties.ConnMaxLifetime(),
|
||||
"dataSourceName": regexp.MustCompile(`://[^@]*@`).ReplaceAllLiteralString(dsn, "://"),
|
||||
}).Debug("Setting DB connection limits")
|
||||
db.SetMaxOpenConns(dbProperties.MaxOpenConns())
|
||||
db.SetMaxIdleConns(dbProperties.MaxIdleConns())
|
||||
db.SetConnMaxLifetime(dbProperties.ConnMaxLifetime())
|
||||
}
|
||||
return db, nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerDrivers()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue