diff --git a/libnetwork/agent.go b/libnetwork/agent.go index 7b68fd7c06..5a7e028cd6 100644 --- a/libnetwork/agent.go +++ b/libnetwork/agent.go @@ -468,7 +468,10 @@ func (n *network) addDriverWatches() { } c.agent.networkDB.WalkTable(tableName, func(nid, key string, value []byte) bool { - d.EventNotify(driverapi.Create, n.ID(), tableName, key, value) + if nid == n.ID() { + d.EventNotify(driverapi.Create, nid, tableName, key, value) + } + return false }) } diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index 78c8e8890e..4b4c0c417f 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -637,6 +637,10 @@ func (n *network) watchMiss(nlSock *nl.NetlinkSocket) { continue } + if !n.driver.isSerfAlive() { + continue + } + mac, IPmask, vtep, err := n.driver.resolvePeer(n.id, neigh.IP) if err != nil { logrus.Errorf("could not resolve peer %q: %v", neigh.IP, err) diff --git a/libnetwork/drivers/overlay/peerdb.go b/libnetwork/drivers/overlay/peerdb.go index d6502c27cd..c9808f692a 100644 --- a/libnetwork/drivers/overlay/peerdb.go +++ b/libnetwork/drivers/overlay/peerdb.go @@ -168,14 +168,14 @@ func (d *driver) peerDbAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask } func (d *driver) peerDbDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, - peerMac net.HardwareAddr, vtep net.IP) { + peerMac net.HardwareAddr, vtep net.IP) bool { peerDbWg.Wait() d.peerDb.Lock() pMap, ok := d.peerDb.mp[nid] if !ok { d.peerDb.Unlock() - return + return false } d.peerDb.Unlock() @@ -185,8 +185,20 @@ func (d *driver) peerDbDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPM } pMap.Lock() + + if pEntry, ok := pMap.mp[pKey.String()]; ok { + // Mismatched endpoint ID(possibly outdated). Do not + // delete peerdb + if pEntry.eid != eid { + pMap.Unlock() + return false + } + } + delete(pMap.mp, pKey.String()) pMap.Unlock() + + return true } func (d *driver) peerDbUpdateSandbox(nid string) { @@ -301,7 +313,9 @@ func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMas } if updateDb { - d.peerDbDelete(nid, eid, peerIP, peerIPMask, peerMac, vtep) + if !d.peerDbDelete(nid, eid, peerIP, peerIPMask, peerMac, vtep) { + return nil + } } n := d.network(nid)