mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
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 <flavio.crisciani@docker.com>
This commit is contained in:
parent
d9299e99ea
commit
1732ab426d
4 changed files with 22 additions and 10 deletions
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue