From 818d9edb2af1404e63ed1ee5fdc586ce362d217d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Fri, 29 Sep 2023 09:24:09 +0200 Subject: [PATCH] Fix data race in Postgres engine on connection close (#32650) * Fix data race in Postgres engine. * Use channel instead of `sync.WaitGroup`. --- lib/srv/db/postgres/engine.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/srv/db/postgres/engine.go b/lib/srv/db/postgres/engine.go index f76c63c7dafd..84adb2c22681 100644 --- a/lib/srv/db/postgres/engine.go +++ b/lib/srv/db/postgres/engine.go @@ -418,8 +418,11 @@ func (e *Engine) receiveFromServer(serverConn *pgconn.PgConn, serverErrCh chan<- copyReader, copyWriter := io.Pipe() defer copyWriter.Close() + closeChan := make(chan struct{}) + go func() { defer copyReader.Close() + defer close(closeChan) // server will never be used to write to server, // which is why we pass io.Discard instead of e.rawServerConn @@ -455,6 +458,8 @@ func (e *Engine) receiveFromServer(serverConn *pgconn.PgConn, serverErrCh chan<- log.WithError(err).Warn("Server -> Client copy finished with unexpected error.") } + <-closeChan + serverErrCh <- trace.Wrap(err) log.Debugf("Stopped receiving from server. Transferred %v bytes.", total) }