Browse code

Avoid controller/service lock AB/BA situation

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>

Jana Radhakrishnan authored on 2016/10/15 02:17:24
Showing 1 changed files
... ...
@@ -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()