diff --git a/libnetwork/service_common.go b/libnetwork/service_common.go index 05f4e4ad4a..4c30e465e2 100644 --- a/libnetwork/service_common.go +++ b/libnetwork/service_common.go @@ -225,6 +225,13 @@ func makeServiceCleanupFunc(c *controller, s *service, nID, eID string, vip net. func (c *controller) addServiceBinding(svcName, svcID, nID, eID, containerName string, vip net.IP, ingressPorts []*PortConfig, serviceAliases, taskAliases []string, ip net.IP, method string) error { var addService bool + // Failure to lock the network ID on add can result in racing + // racing against network deletion resulting in inconsistent + // state in the c.serviceBindings map and it's sub-maps. Also, + // always lock network ID before services to avoid deadlock. + c.networkLocker.Lock(nID) + defer c.networkLocker.Unlock(nID) + n, err := c.NetworkByID(nID) if err != nil { return err