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 zcmV-F3BdNn7s3~iO@Fp9u)ukfY`55KTR7=1igvG{rLoNmC8{Ll#FzTJANbJIvg5Wv zySEn=Xk=<;IPc+*WONkr2u1f~N`wmLBxaB9`|0(1z2n0}^S9UQHUIVwo*q5gJ3Knt zJ3cx(K0bWZ+dJs>_8&p--Z^P`GO37o)cfkWn!^2;JS3&RqkoW;Cw-Xhdn8SZpS@r& z=y?&!P|#GFp%d*Y!01R2F^5pQj5p;m_F<}2D*N5;gsN#a3PK)ttzVh{y_nEM5t^Wo zeXj!;6UzD^voz&G{lma$91kENnw*{J62oc28J|#;PvAuo1|C2rSUFvR*$sK3NT@uE zpS!iE=BfRuIe+$Mb=khR^8W%)5&sI~lo5rp`@t&p{!+mm@qe^`aL|bVqrIoShxq>% z&+TmoA{^5M!Owjmh%jY*9%G^cl`k=HbVudN^r68WQw5{MqtWlNGy#yvio$x zvqafBB{B>Z7gh@~QQ`EwqLx<0n@}HG@U1NfjN9PSI ztg%E3&40ok`l;H)Yopbid(dj1XONT3tz_O&%xH*%Fw_QlnY(PAW*x{lFnofK8CO`c zDNrX8^_nvp&igQ6*JLiewR)m4nP8A+j9p+TP*wD0KD{o#^w)dyv%0_6^ruk7G%@;k zE=Y*4QBWRTV91k5_TjjDg|l4Ae>r&nGbTL33l~f! zaCNkt^PZ;Ex;x?dYN%rJ+W41G8CK;@*GCKvSeD3ziOZid^%lc%?ja~Ga=xM7x=7W{E2;U;q^3Yw1|1wT3 zh=0Zkc^s1@(q>wjiyTZvz55zfpyZhdQLaTUpql86jxn5v4A-I;P)&4+VJ4`WYgfY? zwYtnT0Go7{m1`a9H=QGmS8d`+HDi8_Gc9|?rvBuzJ8{{)b-`1tbuMb9pnbjbnZ;wH zHAjQWiX{kq)uQT7W7ReFHP&j;`Lemb_kYs(f8uHD|E9=N6jGbzUglWe|LyG`^?J?z z@8J0Oq5u09&+Tn@*E_pOb)8aEG+7Mz*u0zloxt1eHWEU$kE zFFCdea3$Xcrer)7G*M&le~_IYbXKhLZ{J-NfKR5cBO!wS|33I1{Lhx9SZUfE?0NsE zA2@vlFJE24;Pey*FW)ehgKw-NJWy+6}uraBoeL0S`EnKm?yc&E7)Zf zHmAtqKu){HP;J~f3kL1WkmcUERf?1d)#2kiq&MYloO{Bc*d1-BS!^$A#Vnyzs(wXD z%T!{LkO@Ye(Y&rACdmbDnJp1mjqY(PU!4e?bobh zP_a3T1&`r5Re`^}VrgYwV9H^!=&$&!+4xi>ukAb;%zl{p%d+mQQT^rl1zH^K~g{**s&Q4fu6Pd)?_c37- z8+~Mzu?9j3-drlKRLG19p6C`2W<*deyIilHnO_Mz{0Q5P*sSU>*a2UQXiz%&$-%4B zv*Cx!^NSB>F9$!JpLt;YtnXl300*b1!?TNv3S=)Z|N74k4-eWfPJhmZmmhw9QKNo) z3xXsQgvT_xc><41qd@=1yN#yP(AeO@V)5km*6Fm1D(p(hx*-ZB-I>bmZH@e5(bWV) zp-Nk{asBJr+rJ#sS2(XSU2&!rewD{62}6_;-VD!I`ICbj7{E8f^Dpu&Q;?KOrB@3G zJyc6S#aUFdCd!nUoPQn2Sr~*YlS-F69ul@nLfc1MVW{cxR)&lPJ*QGtg}Wn}Xeej& z&oOr;#x$+Yl0AL1nXLzG?^%8{b*u_pD}`;Dr1VRRwalJzEytkEdIfhO>FBQ&4sF}L zDT_-@dW}b|;faE6hDn1Zx1+WLy&SZ)mv>;Rgm&oC1;PRkMo+wE+oQOye>^ch@^zlSv720T+|I2{?bJOZ)#1_dmbU(|XWn9H2M| zZOv$n1IcSHu1u%<8bxe-#ZISoglcG#Oij6<|2A1XxO!%HP4mOmA!qodN2-fOr{JNJ zY9>69F?+_|0g}?^x*Y38mhan35#=#Fyz^5YNjE-2F>mK!}yv2Te5`Xb_jGaTYr)6Px5Mnn&wk`KN%3;cgg>-K#;ZS~*W-uQO)zxVX%{!;xv zI((@A-{R3R(bY|J%iSH_T{Ez+>YBsb!Efh9qaaN;&NHQ(ecgEplo?aH?KHiaB3A|m zh!A9MdsBhvI=noC=PjFCY*$C!JhdAM+}$FOupOaPt{vRD3vEOs!nUm}JIn1y>$RnP zA9-AazY#(jwOn(Cb?ClsDJJoYW(>U!^=1AEcRQB(t l;>ygnHCTl|P5$9})x-1fJUq?kKLG#$|Nr4ESqK0+008?tuU7y7 delta 2370 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 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy