smart_status: move channel write outside lock to avoid deadlock
The smartStatusOutput.done channel is read from a goroutine that locks smartStatusOutput.lock. If the goroutine that writes to smartStatusOutput.done is holding smartStatusOutput.lock it can lead to an AB-BA deadlock. Call stopActionTableTick from outside the lock. Fixes: 143558785 Test: none Change-Id: I93a10ef9ff16c3953a1c5ccb102b024158358fe4
This commit is contained in:
parent
765fe7a501
commit
8cc19911b1
|
@ -170,6 +170,13 @@ func (s *smartStatusOutput) FinishAction(result status.ActionResult, counts stat
|
|||
}
|
||||
|
||||
func (s *smartStatusOutput) Flush() {
|
||||
if s.tableMode {
|
||||
// Stop the action table tick outside of the lock to avoid lock ordering issues between s.done and
|
||||
// s.lock, the goroutine in startActionTableTick can get blocked on the lock and be unable to read
|
||||
// from the channel.
|
||||
s.stopActionTableTick()
|
||||
}
|
||||
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
|
||||
|
@ -180,8 +187,6 @@ func (s *smartStatusOutput) Flush() {
|
|||
s.runningActions = nil
|
||||
|
||||
if s.tableMode {
|
||||
s.stopActionTableTick()
|
||||
|
||||
// Update the table after clearing runningActions to clear it
|
||||
s.actionTable()
|
||||
|
||||
|
|
Loading…
Reference in New Issue