Currently there is an instance of controller and service lock being
obtained in different order which causes the AB/BA deadlock. Do not ever
wrap controller lock around service lock.
Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
| ... | ... |
@@ -41,8 +41,15 @@ func newService(name string, id string, ingressPorts []*PortConfig, aliases []st |
| 41 | 41 |
|
| 42 | 42 |
func (c *controller) cleanupServiceBindings(cleanupNID string) {
|
| 43 | 43 |
var cleanupFuncs []func() |
| 44 |
+ |
|
| 44 | 45 |
c.Lock() |
| 46 |
+ services := make([]*service, 0, len(c.serviceBindings)) |
|
| 45 | 47 |
for _, s := range c.serviceBindings {
|
| 48 |
+ services = append(services, s) |
|
| 49 |
+ } |
|
| 50 |
+ c.Unlock() |
|
| 51 |
+ |
|
| 52 |
+ for _, s := range services {
|
|
| 46 | 53 |
s.Lock() |
| 47 | 54 |
for nid, lb := range s.loadBalancers {
|
| 48 | 55 |
if cleanupNID != "" && nid != cleanupNID {
|
| ... | ... |
@@ -67,7 +74,6 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) {
|
| 67 | 67 |
} |
| 68 | 68 |
s.Unlock() |
| 69 | 69 |
} |
| 70 |
- c.Unlock() |
|
| 71 | 70 |
|
| 72 | 71 |
for _, f := range cleanupFuncs {
|
| 73 | 72 |
f() |