aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2023-03-22 09:21:32 +0100
committerGitHub <noreply@github.com>2023-03-22 09:21:32 +0100
commit5e85a00cb36c3d343cd5b6f6a18435989724a135 (patch)
treeb22c34dd0a6cdc04025b90086843f9084a876412 /internal
parentec6879e5ae2919c903707475ce8d72244b2a6847 (diff)
Remove `BaseDendrite` (#3023)
Removes `BaseDendrite` to, hopefully, make testing and composing of components easier in the future.
Diffstat (limited to 'internal')
-rw-r--r--internal/sqlutil/connection_manager.go31
-rw-r--r--internal/sqlutil/connection_manager_test.go8
2 files changed, 30 insertions, 9 deletions
diff --git a/internal/sqlutil/connection_manager.go b/internal/sqlutil/connection_manager.go
index cefd9f80..934a2954 100644
--- a/internal/sqlutil/connection_manager.go
+++ b/internal/sqlutil/connection_manager.go
@@ -19,15 +19,21 @@ import (
"fmt"
"github.com/matrix-org/dendrite/setup/config"
+ "github.com/matrix-org/dendrite/setup/process"
)
type Connections struct {
- db *sql.DB
- writer Writer
+ db *sql.DB
+ writer Writer
+ globalConfig config.DatabaseOptions
+ processContext *process.ProcessContext
}
-func NewConnectionManager() Connections {
- return Connections{}
+func NewConnectionManager(processCtx *process.ProcessContext, globalConfig config.DatabaseOptions) Connections {
+ return Connections{
+ globalConfig: globalConfig,
+ processContext: processCtx,
+ }
}
func (c *Connections) Connection(dbProperties *config.DatabaseOptions) (*sql.DB, Writer, error) {
@@ -35,14 +41,29 @@ func (c *Connections) Connection(dbProperties *config.DatabaseOptions) (*sql.DB,
if dbProperties.ConnectionString.IsSQLite() {
writer = NewExclusiveWriter()
}
+ var err error
+ if dbProperties.ConnectionString == "" {
+ // if no connectionString was provided, try the global one
+ dbProperties = &c.globalConfig
+ }
if dbProperties.ConnectionString != "" || c.db == nil {
- var err error
// Open a new database connection using the supplied config.
c.db, err = Open(dbProperties, writer)
if err != nil {
return nil, nil, err
}
c.writer = writer
+ go func() {
+ if c.processContext == nil {
+ return
+ }
+ // If we have a ProcessContext, start a component and wait for
+ // Dendrite to shut down to cleanly close the database connection.
+ c.processContext.ComponentStarted()
+ <-c.processContext.WaitForShutdown()
+ _ = c.db.Close()
+ c.processContext.ComponentFinished()
+ }()
return c.db, c.writer, nil
}
if c.db != nil && c.writer != nil {
diff --git a/internal/sqlutil/connection_manager_test.go b/internal/sqlutil/connection_manager_test.go
index 610629d5..a9ac8d57 100644
--- a/internal/sqlutil/connection_manager_test.go
+++ b/internal/sqlutil/connection_manager_test.go
@@ -13,9 +13,9 @@ func TestConnectionManager(t *testing.T) {
test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
conStr, close := test.PrepareDBConnectionString(t, dbType)
t.Cleanup(close)
- cm := sqlutil.NewConnectionManager()
+ cm := sqlutil.NewConnectionManager(nil, config.DatabaseOptions{})
- dbProps := &config.DatabaseOptions{ConnectionString: config.DataSource(string(conStr))}
+ dbProps := &config.DatabaseOptions{ConnectionString: config.DataSource(conStr)}
db, writer, err := cm.Connection(dbProps)
if err != nil {
t.Fatal(err)
@@ -47,8 +47,8 @@ func TestConnectionManager(t *testing.T) {
}
// test invalid connection string configured
- cm = sqlutil.NewConnectionManager()
- _, _, err = cm.Connection(&config.DatabaseOptions{ConnectionString: "http://"})
+ cm2 := sqlutil.NewConnectionManager(nil, config.DatabaseOptions{})
+ _, _, err = cm2.Connection(&config.DatabaseOptions{ConnectionString: "http://"})
if err == nil {
t.Fatal("expected an error but got none")
}