From 1c04e1980dfd6debab6e43d9db672c0f01528868 Mon Sep 17 00:00:00 2001 From: Flavio Crisciani Date: Thu, 12 Oct 2017 21:41:29 -0700 Subject: [PATCH] Handle cleanup DNS for attachable container Attachable containers they are tasks with no service associated their cleanup was not done properly so it was possible to have a leak of their name resolution if that was the last container on the network. Cleanupservicebindings was not able to do the cleanup because there is no service, while also the notification of the delete arrives after that the network is already being cleaned Signed-off-by: Flavio Crisciani --- controller.go | 1 + network.go | 4 ++++ networkdb/networkdb.go | 5 ++++- service_common.go | 22 +++++++++++++--------- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/controller.go b/controller.go index 801097ab99..236095c8ac 100644 --- a/controller.go +++ b/controller.go @@ -341,6 +341,7 @@ func (c *controller) clusterAgentInit() { // should still be present when cleaning up // service bindings c.agentClose() + c.cleanupServiceDiscovery("") c.cleanupServiceBindings("") c.agentStopComplete() diff --git a/network.go b/network.go index 3f44553b9d..1ad4706ff8 100644 --- a/network.go +++ b/network.go @@ -995,6 +995,10 @@ func (n *network) delete(force bool) error { logrus.Errorf("Failed leaving network %s from the agent cluster: %v", n.Name(), err) } + // Cleanup the service discovery for this network + c.cleanupServiceDiscovery(n.ID()) + + // Cleanup the load balancer c.cleanupServiceBindings(n.ID()) removeFromStore: diff --git a/networkdb/networkdb.go b/networkdb/networkdb.go index 02502cb483..45bd9cc931 100644 --- a/networkdb/networkdb.go +++ b/networkdb/networkdb.go @@ -499,7 +499,10 @@ func (nDB *NetworkDB) deleteNodeNetworkEntries(nid, node string) { // without doing a delete of all the objects entry.ltime++ } - nDB.createOrUpdateEntry(nid, tname, key, entry) + + if !oldEntry.deleting { + nDB.createOrUpdateEntry(nid, tname, key, entry) + } } else { // the local node is leaving the network, all the entries of remote nodes can be safely removed nDB.deleteEntry(nid, tname, key) diff --git a/service_common.go b/service_common.go index fe54ea30c5..4411c9700f 100644 --- a/service_common.go +++ b/service_common.go @@ -161,6 +161,19 @@ func (c *controller) getLBIndex(sid, nid string, ingressPorts []*PortConfig) int return int(lb.fwMark) } +// cleanupServiceDiscovery when the network is being deleted, erase all the associated service discovery records +func (c *controller) cleanupServiceDiscovery(cleanupNID string) { + c.Lock() + defer c.Unlock() + if cleanupNID == "" { + logrus.Debugf("cleanupServiceDiscovery for all networks") + c.svcRecords = make(map[string]svcInfo) + return + } + logrus.Debugf("cleanupServiceDiscovery for network:%s", cleanupNID) + delete(c.svcRecords, cleanupNID) +} + func (c *controller) cleanupServiceBindings(cleanupNID string) { var cleanupFuncs []func() @@ -184,15 +197,6 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) { continue } - // The network is being deleted, erase all the associated service discovery records - // TODO(fcrisciani) separate the Load Balancer from the Service discovery, this operation - // can be done safely here, but the rmServiceBinding is still keeping consistency in the - // data structures that are tracking the endpoint to IP mapping. - c.Lock() - logrus.Debugf("cleanupServiceBindings erasing the svcRecords for %s", nid) - delete(c.svcRecords, nid) - c.Unlock() - for eid, ip := range lb.backEnds { epID := eid epIP := ip