Skip to content

Commit a82c0eb

Browse files
authored
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>
1 parent eab5c15 commit a82c0eb

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ test: test-clean
115115
.PHONY: test-postgres
116116
test-postgres: test-clean
117117
DB=ci gotestsum --junitfile="gotests.xml" --packages="./..." -- \
118-
-covermode=atomic -coverprofile="gotests.coverage" -timeout=10m \
118+
-covermode=atomic -coverprofile="gotests.coverage" -timeout=30m \
119119
-coverpkg=./...,github.com/coder/coder/codersdk \
120-
-count=1 -parallel=1 -race -failfast
120+
-count=1 -race -failfast
121121

122122

123123
.PHONY: test-postgres-docker

cli/list_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"testing"
66
"time"
77

8-
"github.com/stretchr/testify/require"
8+
"github.com/stretchr/testify/assert"
99

1010
"github.com/coder/coder/cli/clitest"
1111
"github.com/coder/coder/coderd/coderdtest"
@@ -30,13 +30,15 @@ func TestList(t *testing.T) {
3030
pty := ptytest.New(t)
3131
cmd.SetIn(pty.Input())
3232
cmd.SetOut(pty.Output())
33-
errC := make(chan error)
33+
done := make(chan any)
3434
go func() {
35-
errC <- cmd.ExecuteContext(ctx)
35+
errC := cmd.ExecuteContext(ctx)
36+
assert.NoError(t, errC)
37+
close(done)
3638
}()
3739
pty.ExpectMatch(workspace.Name)
3840
pty.ExpectMatch("Running")
3941
cancelFunc()
40-
require.NoError(t, <-errC)
42+
<-done
4143
})
4244
}

coderd/database/migrate.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package database
22

33
import (
4+
"context"
45
"database/sql"
56
"embed"
67
"errors"
@@ -17,12 +18,21 @@ import (
1718
var migrations embed.FS
1819

1920
func migrateSetup(db *sql.DB) (source.Driver, *migrate.Migrate, error) {
21+
ctx := context.Background()
2022
sourceDriver, err := iofs.New(migrations, "migrations")
2123
if err != nil {
2224
return nil, nil, xerrors.Errorf("create iofs: %w", err)
2325
}
2426

25-
dbDriver, err := postgres.WithInstance(db, &postgres.Config{})
27+
// there is a postgres.WithInstance() method that takes the DB instance,
28+
// but, when you close the resulting Migrate, it closes the DB, which
29+
// we don't want. Instead, create just a connection that will get closed
30+
// when migration is done.
31+
conn, err := db.Conn(ctx)
32+
if err != nil {
33+
return nil, nil, xerrors.Errorf("postgres connection: %w", err)
34+
}
35+
dbDriver, err := postgres.WithConnection(ctx, conn, &postgres.Config{})
2636
if err != nil {
2737
return nil, nil, xerrors.Errorf("wrap postgres connection: %w", err)
2838
}
@@ -36,11 +46,22 @@ func migrateSetup(db *sql.DB) (source.Driver, *migrate.Migrate, error) {
3646
}
3747

3848
// MigrateUp runs SQL migrations to ensure the database schema is up-to-date.
39-
func MigrateUp(db *sql.DB) error {
49+
func MigrateUp(db *sql.DB) (retErr error) {
4050
_, m, err := migrateSetup(db)
4151
if err != nil {
4252
return xerrors.Errorf("migrate setup: %w", err)
4353
}
54+
defer func() {
55+
srcErr, dbErr := m.Close()
56+
if retErr != nil {
57+
return
58+
}
59+
if dbErr != nil {
60+
retErr = dbErr
61+
return
62+
}
63+
retErr = srcErr
64+
}()
4465

4566
err = m.Up()
4667
if err != nil {

coderd/database/postgres/postgres.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,13 @@ func Open() (string, func(), error) {
4444
return "", nil, xerrors.Errorf("create db: %w", err)
4545
}
4646

47-
return "postgres://postgres:postgres@127.0.0.1:5432/" + dbName + "?sslmode=disable", func() {}, nil
47+
deleteDB := func() {
48+
ddb, _ := sql.Open("postgres", dbURL)
49+
defer ddb.Close()
50+
_, _ = ddb.Exec("DROP DATABASE " + dbName)
51+
}
52+
53+
return "postgres://postgres:postgres@127.0.0.1:5432/" + dbName + "?sslmode=disable", deleteDB, nil
4854
}
4955

5056
pool, err := dockertest.NewPool("")

0 commit comments

Comments
 (0)