diff --git a/libnetwork/endpoint.go b/libnetwork/endpoint.go index f15645d648..4d9ec451d9 100644 --- a/libnetwork/endpoint.go +++ b/libnetwork/endpoint.go @@ -567,9 +567,8 @@ func (ep *Endpoint) sbJoin(sb *Sandbox, options ...EndpointOption) (err error) { func (ep *Endpoint) rename(name string) error { var ( - err error - netWatch *netWatch - ok bool + err error + ok bool ) n := ep.getNetwork() @@ -591,12 +590,13 @@ func (ep *Endpoint) rename(name string) error { } } else { c.mu.Lock() - netWatch, ok = c.nmap[n.ID()] + _, ok = c.nmap[n.ID()] c.mu.Unlock() if !ok { + // FIXME(thaJeztah): what is this check for, or is this to prevent a race condition (network removed)? return fmt.Errorf("watch null for network %q", n.Name()) } - n.updateSvcRecord(ep, c.getLocalEps(netWatch), false) + n.updateSvcRecord(ep, false) } oldName := ep.name @@ -621,13 +621,13 @@ func (ep *Endpoint) rename(name string) error { } }() } else { - n.updateSvcRecord(ep, c.getLocalEps(netWatch), true) + n.updateSvcRecord(ep, true) defer func() { if err != nil { - n.updateSvcRecord(ep, c.getLocalEps(netWatch), false) + n.updateSvcRecord(ep, false) ep.name = oldName ep.anonymous = oldAnonymous - n.updateSvcRecord(ep, c.getLocalEps(netWatch), true) + n.updateSvcRecord(ep, true) } }() } diff --git a/libnetwork/network.go b/libnetwork/network.go index 3787e9dc32..c765616563 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -1296,7 +1296,7 @@ func (n *Network) EndpointByID(id string) (*Endpoint, error) { return ep, nil } -func (n *Network) updateSvcRecord(ep *Endpoint, localEps []*Endpoint, isAdd bool) { +func (n *Network) updateSvcRecord(ep *Endpoint, isAdd bool) { var ipv6 net.IP epName := ep.Name() if iface := ep.Iface(); iface != nil && iface.Address() != nil { diff --git a/libnetwork/store.go b/libnetwork/store.go index 7002da9bfd..10e75b60c8 100644 --- a/libnetwork/store.go +++ b/libnetwork/store.go @@ -192,20 +192,7 @@ retry: } type netWatch struct { - localEps map[string]*Endpoint - remoteEps map[string]*Endpoint -} - -func (c *Controller) getLocalEps(nw *netWatch) []*Endpoint { - c.mu.Lock() - defer c.mu.Unlock() - - var epl []*Endpoint - for _, ep := range nw.localEps { - epl = append(epl, ep) - } - - return epl + localEps map[string]*Endpoint } func (c *Controller) watchSvcRecord(ep *Endpoint) { @@ -216,7 +203,7 @@ func (c *Controller) unWatchSvcRecord(ep *Endpoint) { c.unWatchCh <- ep } -func (c *Controller) processEndpointCreate(nmap map[string]*netWatch, ep *Endpoint) { +func (c *Controller) processEndpointCreate(ep *Endpoint) { n := ep.getNetwork() if !c.isDistributedControl() && n.Scope() == scope.Swarm && n.driverIsMultihost() { return @@ -225,42 +212,20 @@ func (c *Controller) processEndpointCreate(nmap map[string]*netWatch, ep *Endpoi networkID := n.ID() endpointID := ep.ID() - c.mu.Lock() - nw, ok := nmap[networkID] - c.mu.Unlock() - - if ok { - // Update the svc db for the local endpoint join right away - n.updateSvcRecord(ep, c.getLocalEps(nw), true) - - c.mu.Lock() - nw.localEps[endpointID] = ep - - // If we had learned that from the kv store remove it - // from remote ep list now that we know that this is - // indeed a local endpoint - delete(nw.remoteEps, endpointID) - c.mu.Unlock() - return - } - - nw = &netWatch{ - localEps: make(map[string]*Endpoint), - remoteEps: make(map[string]*Endpoint), - } - // Update the svc db for the local endpoint join right away // Do this before adding this ep to localEps so that we don't // try to update this ep's container's svc records - n.updateSvcRecord(ep, c.getLocalEps(nw), true) - + n.updateSvcRecord(ep, true) c.mu.Lock() - nw.localEps[endpointID] = ep - nmap[networkID] = nw + _, ok := c.nmap[networkID] + if !ok { + c.nmap[networkID] = &netWatch{localEps: make(map[string]*Endpoint)} + } + c.nmap[networkID].localEps[endpointID] = ep c.mu.Unlock() } -func (c *Controller) processEndpointDelete(nmap map[string]*netWatch, ep *Endpoint) { +func (c *Controller) processEndpointDelete(ep *Endpoint) { n := ep.getNetwork() if !c.isDistributedControl() && n.Scope() == scope.Swarm && n.driverIsMultihost() { return @@ -270,24 +235,21 @@ func (c *Controller) processEndpointDelete(nmap map[string]*netWatch, ep *Endpoi endpointID := ep.ID() c.mu.Lock() - nw, ok := nmap[networkID] - - if ok { + if nw, ok := c.nmap[networkID]; ok { delete(nw.localEps, endpointID) c.mu.Unlock() // Update the svc db about local endpoint leave right away // Do this after we remove this ep from localEps so that we // don't try to remove this svc record from this ep's container. - n.updateSvcRecord(ep, c.getLocalEps(nw), false) + n.updateSvcRecord(ep, false) c.mu.Lock() if len(nw.localEps) == 0 { // This is the last container going away for the network. Destroy // this network's svc db entry delete(c.svcRecords, networkID) - - delete(nmap, networkID) + delete(c.nmap, networkID) } } c.mu.Unlock() @@ -297,9 +259,9 @@ func (c *Controller) watchLoop() { for { select { case ep := <-c.watchCh: - c.processEndpointCreate(c.nmap, ep) + c.processEndpointCreate(ep) case ep := <-c.unWatchCh: - c.processEndpointDelete(c.nmap, ep) + c.processEndpointDelete(ep) } } }