Fix race between err chan send and re-queue

Signed-off-by: Monis Khan <mok@vmware.com>
This commit is contained in:
Monis Khan 2021-03-11 10:13:07 -05:00
parent 32b038c639
commit 7b1ecf79a6
No known key found for this signature in database
GPG Key ID: 52C90ADA01B269B8
1 changed files with 8 additions and 6 deletions

View File

@ -378,16 +378,18 @@ func (c *impersonatorConfigController) ensureImpersonatorIsStarted(syncCtx contr
} }
c.serverStopCh = make(chan struct{}) c.serverStopCh = make(chan struct{})
c.errorCh = make(chan error) // use a buffered channel so that startImpersonatorFunc can send
// on it without coordinating with the main controller go routine
c.errorCh = make(chan error, 1)
// startImpersonatorFunc will block until the server shuts down (or fails to start), so run it in the background. // startImpersonatorFunc will block until the server shuts down (or fails to start), so run it in the background.
go func() { go func() {
startOrStopErr := startImpersonatorFunc(c.serverStopCh) // The server has stopped, so enqueue ourselves for another sync,
// The server has stopped, so enqueue ourselves for another sync, so we can // so we can try to start the server again as quickly as possible.
// try to start the server again as quickly as possible. defer syncCtx.Queue.AddRateLimited(syncCtx.Key)
syncCtx.Queue.AddRateLimited(syncCtx.Key) // TODO this a race because the main controller go routine could run and complete before we send on the err chan
// Forward any errors returned by startImpersonatorFunc on the errorCh. // Forward any errors returned by startImpersonatorFunc on the errorCh.
c.errorCh <- startOrStopErr c.errorCh <- startImpersonatorFunc(c.serverStopCh)
}() }()
return nil return nil