浏览代码

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 8 年之前
父节点
当前提交
e18c1ffd0c
共有 1 个文件被更改,包括 7 次插入1 次删除
  1. 7 1
      libnetwork/service_linux.go

+ 7 - 1
libnetwork/service_linux.go

@@ -41,8 +41,15 @@ func newService(name string, id string, ingressPorts []*PortConfig, aliases []st
 
 
 func (c *controller) cleanupServiceBindings(cleanupNID string) {
 func (c *controller) cleanupServiceBindings(cleanupNID string) {
 	var cleanupFuncs []func()
 	var cleanupFuncs []func()
+
 	c.Lock()
 	c.Lock()
+	services := make([]*service, 0, len(c.serviceBindings))
 	for _, s := range c.serviceBindings {
 	for _, s := range c.serviceBindings {
+		services = append(services, s)
+	}
+	c.Unlock()
+
+	for _, s := range services {
 		s.Lock()
 		s.Lock()
 		for nid, lb := range s.loadBalancers {
 		for nid, lb := range s.loadBalancers {
 			if cleanupNID != "" && nid != cleanupNID {
 			if cleanupNID != "" && nid != cleanupNID {
@@ -67,7 +74,6 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) {
 		}
 		}
 		s.Unlock()
 		s.Unlock()
 	}
 	}
-	c.Unlock()
 
 
 	for _, f := range cleanupFuncs {
 	for _, f := range cleanupFuncs {
 		f()
 		f()