From e18c1ffd0cd9e573a637874387ae7edf676d22b6 Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Fri, 14 Oct 2016 10:17:24 -0700 Subject: [PATCH] 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 --- libnetwork/service_linux.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libnetwork/service_linux.go b/libnetwork/service_linux.go index 5e3802a823..158411d140 100644 --- a/libnetwork/service_linux.go +++ b/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()