mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
Fix socket leak, clean up single use postgres databases (#2413)
* Fix socket leak, clean up single use postgres databases Signed-off-by: Spike Curtis <spike@coder.com> * Move migrate close defer until after we know it is not nil Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"embed"
|
||||
"errors"
|
||||
@ -17,12 +18,21 @@ import (
|
||||
var migrations embed.FS
|
||||
|
||||
func migrateSetup(db *sql.DB) (source.Driver, *migrate.Migrate, error) {
|
||||
ctx := context.Background()
|
||||
sourceDriver, err := iofs.New(migrations, "migrations")
|
||||
if err != nil {
|
||||
return nil, nil, xerrors.Errorf("create iofs: %w", err)
|
||||
}
|
||||
|
||||
dbDriver, err := postgres.WithInstance(db, &postgres.Config{})
|
||||
// there is a postgres.WithInstance() method that takes the DB instance,
|
||||
// but, when you close the resulting Migrate, it closes the DB, which
|
||||
// we don't want. Instead, create just a connection that will get closed
|
||||
// when migration is done.
|
||||
conn, err := db.Conn(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, xerrors.Errorf("postgres connection: %w", err)
|
||||
}
|
||||
dbDriver, err := postgres.WithConnection(ctx, conn, &postgres.Config{})
|
||||
if err != nil {
|
||||
return nil, nil, xerrors.Errorf("wrap postgres connection: %w", err)
|
||||
}
|
||||
@ -36,11 +46,22 @@ func migrateSetup(db *sql.DB) (source.Driver, *migrate.Migrate, error) {
|
||||
}
|
||||
|
||||
// MigrateUp runs SQL migrations to ensure the database schema is up-to-date.
|
||||
func MigrateUp(db *sql.DB) error {
|
||||
func MigrateUp(db *sql.DB) (retErr error) {
|
||||
_, m, err := migrateSetup(db)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("migrate setup: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
srcErr, dbErr := m.Close()
|
||||
if retErr != nil {
|
||||
return
|
||||
}
|
||||
if dbErr != nil {
|
||||
retErr = dbErr
|
||||
return
|
||||
}
|
||||
retErr = srcErr
|
||||
}()
|
||||
|
||||
err = m.Up()
|
||||
if err != nil {
|
||||
|
@ -44,7 +44,13 @@ func Open() (string, func(), error) {
|
||||
return "", nil, xerrors.Errorf("create db: %w", err)
|
||||
}
|
||||
|
||||
return "postgres://postgres:postgres@127.0.0.1:5432/" + dbName + "?sslmode=disable", func() {}, nil
|
||||
deleteDB := func() {
|
||||
ddb, _ := sql.Open("postgres", dbURL)
|
||||
defer ddb.Close()
|
||||
_, _ = ddb.Exec("DROP DATABASE " + dbName)
|
||||
}
|
||||
|
||||
return "postgres://postgres:postgres@127.0.0.1:5432/" + dbName + "?sslmode=disable", deleteDB, nil
|
||||
}
|
||||
|
||||
pool, err := dockertest.NewPool("")
|
||||
|
Reference in New Issue
Block a user