mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
fix: select on context to avoid leak in logFollower (#7792)
Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@ -300,6 +300,9 @@ func newLogFollower(
|
||||
}
|
||||
|
||||
func (f *logFollower) follow() {
|
||||
var cancel context.CancelFunc
|
||||
f.ctx, cancel = context.WithCancel(f.ctx)
|
||||
defer cancel()
|
||||
// note that we only need to subscribe to updates if the job is not yet
|
||||
// complete.
|
||||
if !f.complete {
|
||||
@ -405,17 +408,28 @@ func (f *logFollower) follow() {
|
||||
}
|
||||
|
||||
func (f *logFollower) listener(_ context.Context, message []byte, err error) {
|
||||
// in this function we always pair writes to channels with a select on the context
|
||||
// otherwise we could block a goroutine if the follow() method exits.
|
||||
if err != nil {
|
||||
f.errors <- err
|
||||
select {
|
||||
case <-f.ctx.Done():
|
||||
case f.errors <- err:
|
||||
}
|
||||
return
|
||||
}
|
||||
var n provisionersdk.ProvisionerJobLogsNotifyMessage
|
||||
err = json.Unmarshal(message, &n)
|
||||
if err != nil {
|
||||
f.errors <- err
|
||||
select {
|
||||
case <-f.ctx.Done():
|
||||
case f.errors <- err:
|
||||
}
|
||||
return
|
||||
}
|
||||
f.notifications <- n
|
||||
select {
|
||||
case <-f.ctx.Done():
|
||||
case f.notifications <- n:
|
||||
}
|
||||
}
|
||||
|
||||
// query fetches the latest job logs from the database and writes them to the
|
||||
|
Reference in New Issue
Block a user