From 2988086ab167e914ed2012c01736b9d440b37666 Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Wed, 29 Jun 2016 11:51:32 -0700 Subject: [PATCH] Do not remove service record while scaling down While scaling down, currently we are removing the service record even if the LB entry for the vip is not fully removed. This causes resolution issues when scaling down. Fixed it by removing the service record only if the LB for the vip is going away. Signed-off-by: Jana Radhakrishnan --- libnetwork/service_linux.go | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libnetwork/service_linux.go b/libnetwork/service_linux.go index 7e2dbd53f4..fc8e4fcbe6 100644 --- a/libnetwork/service_linux.go +++ b/libnetwork/service_linux.go @@ -145,22 +145,19 @@ func (c *controller) rmServiceBinding(name, sid, nid, eid string, vip net.IP, in n.(*network).deleteSvcRecords("tasks."+alias, ip, nil, false) } - // Make sure to remove the right IP since if vip is - // not valid we would have added a DNS RR record. - svcIP := vip - if len(svcIP) == 0 { - svcIP = ip - } - n.(*network).deleteSvcRecords(name, svcIP, nil, false) - for _, alias := range aliases { - n.(*network).deleteSvcRecords(alias, svcIP, nil, false) + // If we are doing DNS RR add the endpoint IP to DNS record + // right away. + if len(vip) == 0 { + n.(*network).deleteSvcRecords(name, ip, nil, false) + for _, alias := range aliases { + n.(*network).deleteSvcRecords(alias, ip, nil, false) + } } s.Lock() - defer s.Unlock() - lb, ok := s.loadBalancers[nid] if !ok { + s.Unlock() return nil } @@ -185,6 +182,15 @@ func (c *controller) rmServiceBinding(name, sid, nid, eid string, vip net.IP, in if len(vip) != 0 { n.(*network).rmLBBackend(ip, vip, lb.fwMark, ingressPorts, rmService) } + s.Unlock() + + // Remove the DNS record for VIP only if we are removing the service + if rmService && len(vip) != 0 { + n.(*network).deleteSvcRecords(name, vip, nil, false) + for _, alias := range aliases { + n.(*network).deleteSvcRecords(alias, vip, nil, false) + } + } return nil }