Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 05da1e9

Browse files
authored
Fix pubsub goroutines in tests (coder#7677)
Signed-off-by: Spike Curtis <[email protected]>
1 parent 67cc196 commit 05da1e9

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

coderd/database/pubsub.go

+7
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ func (p *pgPubsub) SubscribeWithErr(event string, listener ListenerWithErr) (can
185185
func (p *pgPubsub) subscribeQueue(event string, newQ *msgQueue) (cancel func(), err error) {
186186
p.mut.Lock()
187187
defer p.mut.Unlock()
188+
defer func() {
189+
if err != nil {
190+
// if we hit an error, we need to close the queue so we don't
191+
// leak its goroutine.
192+
newQ.close()
193+
}
194+
}()
188195

189196
err = p.pgListener.Listen(event)
190197
if errors.Is(err, pq.ErrChannelAlreadyOpen) {

enterprise/replicasync/replicasync_test.go

+22-8
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ func TestReplica(t *testing.T) {
3838
})
3939
require.NoError(t, err)
4040
defer cancel()
41-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, nil)
41+
ctx, cancelCtx := context.WithCancel(context.Background())
42+
defer cancelCtx()
43+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, nil)
4244
require.NoError(t, err)
4345
<-closeChan
4446
_ = server.Close()
@@ -62,7 +64,9 @@ func TestReplica(t *testing.T) {
6264
RelayAddress: srv.URL,
6365
})
6466
require.NoError(t, err)
65-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
67+
ctx, cancelCtx := context.WithCancel(context.Background())
68+
defer cancelCtx()
69+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
6670
RelayAddress: "http://169.254.169.254",
6771
})
6872
require.NoError(t, err)
@@ -102,7 +106,9 @@ func TestReplica(t *testing.T) {
102106
RelayAddress: srv.URL,
103107
})
104108
require.NoError(t, err)
105-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
109+
ctx, cancelCtx := context.WithCancel(context.Background())
110+
defer cancelCtx()
111+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
106112
RelayAddress: "http://169.254.169.254",
107113
TLSConfig: tlsConfig,
108114
})
@@ -125,7 +131,9 @@ func TestReplica(t *testing.T) {
125131
RelayAddress: "http://127.0.0.1:1",
126132
})
127133
require.NoError(t, err)
128-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
134+
ctx, cancelCtx := context.WithCancel(context.Background())
135+
defer cancelCtx()
136+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
129137
PeerTimeout: 1 * time.Millisecond,
130138
RelayAddress: "http://127.0.0.1:1",
131139
})
@@ -140,13 +148,15 @@ func TestReplica(t *testing.T) {
140148
// Refresh when a new replica appears!
141149
t.Parallel()
142150
db, pubsub := dbtestutil.NewDB(t)
143-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, nil)
151+
ctx, cancelCtx := context.WithCancel(context.Background())
152+
defer cancelCtx()
153+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, nil)
144154
require.NoError(t, err)
145155
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
146156
w.WriteHeader(http.StatusOK)
147157
}))
148158
defer srv.Close()
149-
peer, err := db.InsertReplica(context.Background(), database.InsertReplicaParams{
159+
peer, err := db.InsertReplica(ctx, database.InsertReplicaParams{
150160
ID: uuid.New(),
151161
RelayAddress: srv.URL,
152162
UpdatedAt: database.Now(),
@@ -170,7 +180,9 @@ func TestReplica(t *testing.T) {
170180
UpdatedAt: database.Now().Add(-time.Hour),
171181
})
172182
require.NoError(t, err)
173-
server, err := replicasync.New(context.Background(), slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
183+
ctx, cancelCtx := context.WithCancel(context.Background())
184+
defer cancelCtx()
185+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
174186
RelayAddress: "google.com",
175187
CleanupInterval: time.Millisecond,
176188
})
@@ -184,6 +196,8 @@ func TestReplica(t *testing.T) {
184196
// Ensures that twenty concurrent replicas can spawn and all
185197
// discover each other in parallel!
186198
t.Parallel()
199+
ctx, cancelCtx := context.WithCancel(context.Background())
200+
defer cancelCtx()
187201
// This doesn't use the database fake because creating
188202
// this many PostgreSQL connections takes some
189203
// configuration tweaking.
@@ -198,7 +212,7 @@ func TestReplica(t *testing.T) {
198212
count := 20
199213
wg.Add(count)
200214
for i := 0; i < count; i++ {
201-
server, err := replicasync.New(context.Background(), logger, db, pubsub, &replicasync.Options{
215+
server, err := replicasync.New(ctx, logger, db, pubsub, &replicasync.Options{
202216
RelayAddress: srv.URL,
203217
})
204218
require.NoError(t, err)

0 commit comments

Comments
 (0)