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 ce216fcde6778..e90f7d3038e12 100644 Binary files a/helm/provisioner/charts/libcoder-0.1.0.tgz and b/helm/provisioner/charts/libcoder-0.1.0.tgz differ