Skip to content

Commit 65992bd

Browse files
author
James DeFelice
committed
avoid deadlock on Stop() or Abort() invoked from within a Scheduler callback
1 parent 47c9a45 commit 65992bd

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

scheduler/scheduler.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -1101,14 +1101,19 @@ func (driver *MesosSchedulerDriver) _stop(cause error, stopStatus mesos.Status)
11011101
default:
11021102
}
11031103
close(driver.stopCh)
1104-
if cause != nil {
1105-
log.V(1).Infof("Sending error via withScheduler: %v", cause)
1106-
driver.withScheduler(func(s Scheduler) { s.Error(driver, cause.Error()) })
1107-
} else {
1108-
// send a noop func, withScheduler needs to see that stopCh is closed
1109-
log.V(1).Infof("Sending kill signal to withScheduler")
1110-
driver.withScheduler(func(_ Scheduler) {})
1111-
}
1104+
// decouple to avoid deadlock (avoid nested withScheduler() invocations)
1105+
go func() {
1106+
driver.eventLock.Lock()
1107+
defer driver.eventLock.Unlock()
1108+
if cause != nil {
1109+
log.V(1).Infof("Sending error via withScheduler: %v", cause)
1110+
driver.withScheduler(func(s Scheduler) { s.Error(driver, cause.Error()) })
1111+
} else {
1112+
// send a noop func, withScheduler needs to see that stopCh is closed
1113+
log.V(1).Infof("Sending kill signal to withScheduler")
1114+
driver.withScheduler(func(_ Scheduler) {})
1115+
}
1116+
}()
11121117
}()
11131118
driver.status = stopStatus
11141119
driver.connected = false

0 commit comments

Comments
 (0)