Просмотр исходного кода

Merge pull request #1507 from mrjana/lb

Avoid controller/service lock AB/BA situation
Madhu Venugopal 8 лет назад
Родитель
Сommit
0e08803d36
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) {
 	var cleanupFuncs []func()
+
 	c.Lock()
+	services := make([]*service, 0, len(c.serviceBindings))
 	for _, s := range c.serviceBindings {
+		services = append(services, s)
+	}
+	c.Unlock()
+
+	for _, s := range services {
 		s.Lock()
 		for nid, lb := range s.loadBalancers {
 			if cleanupNID != "" && nid != cleanupNID {
@@ -67,7 +74,6 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) {
 		}
 		s.Unlock()
 	}
-	c.Unlock()
 
 	for _, f := range cleanupFuncs {
 		f()