From acf2f3fa32f3d19f47be0ca1a96dbadf9288bfe4 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Tue, 16 Jan 2024 16:49:39 +0400 Subject: [PATCH] fix: close pg PubSub listener to avoid race --- coderd/database/pubsub/pubsub.go | 36 +++++++++++++++------ helm/provisioner/charts/libcoder-0.1.0.tgz | Bin 3013 -> 3010 bytes 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/coderd/database/pubsub/pubsub.go b/coderd/database/pubsub/pubsub.go index f661e885c2848..731466efd78e2 100644 --- a/coderd/database/pubsub/pubsub.go +++ b/coderd/database/pubsub/pubsub.go @@ -162,13 +162,15 @@ func (q *msgQueue) dropped() { // Pubsub implementation using PostgreSQL. type pgPubsub struct { - ctx context.Context - cancel context.CancelFunc - listenDone chan struct{} - pgListener *pq.Listener - db *sql.DB - mut sync.Mutex - queues map[string]map[uuid.UUID]*msgQueue + ctx context.Context + cancel context.CancelFunc + listenDone chan struct{} + pgListener *pq.Listener + db *sql.DB + mut sync.Mutex + queues map[string]map[uuid.UUID]*msgQueue + closedListener bool + closeListenerErr error } // BufferSize is the maximum number of unhandled messages we will buffer @@ -240,15 +242,29 @@ func (p *pgPubsub) Publish(event string, message []byte) error { // Close closes the pubsub instance. func (p *pgPubsub) Close() error { p.cancel() - err := p.pgListener.Close() + err := p.closeListener() <-p.listenDone return err } +// closeListener closes the pgListener, unless it has already been closed. +func (p *pgPubsub) closeListener() error { + p.mut.Lock() + defer p.mut.Unlock() + if p.closedListener { + return p.closeListenerErr + } + p.closeListenerErr = p.pgListener.Close() + p.closedListener = true + return p.closeListenerErr +} + // listen begins receiving messages on the pq listener. func (p *pgPubsub) listen() { - defer close(p.listenDone) - defer p.pgListener.Close() + defer func() { + _ = p.closeListener() + close(p.listenDone) + }() var ( notif *pq.Notification diff --git a/helm/provisioner/charts/libcoder-0.1.0.tgz b/helm/provisioner/charts/libcoder-0.1.0.tgz index ce216fcde677866c1d4d1379c9fe2762356c2d05..e90f7d3038e1207ac28eb804aaa83d5640294331 100644 GIT binary patch delta 2367 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 delta 2370 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