diff --git a/nameserver/dns_test.go b/nameserver/dns_test.go index 74768715..74187f27 100644 --- a/nameserver/dns_test.go +++ b/nameserver/dns_test.go @@ -18,7 +18,7 @@ import ( func startServer(t *testing.T, upstream *dns.ClientConfig) (*DNSServer, *Nameserver, int, int) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, "") + nameserver := New(peername, "", func(router.PeerName) bool { return true }) dnsserver, err := NewDNSServer(nameserver, "weave.local.", "0.0.0.0:0", "", 30, 5*time.Second) require.Nil(t, err) udpPort := dnsserver.servers[0].PacketConn.LocalAddr().(*net.UDPAddr).Port diff --git a/nameserver/nameserver.go b/nameserver/nameserver.go index 19037804..48501db6 100644 --- a/nameserver/nameserver.go +++ b/nameserver/nameserver.go @@ -37,25 +37,21 @@ const ( // - Update is O(n) for now type Nameserver struct { sync.RWMutex - ourName router.PeerName - domain string - gossip router.Gossip - entries Entries - peers *router.Peers - quit chan struct{} + ourName router.PeerName + domain string + gossip router.Gossip + entries Entries + isKnownPeer func(router.PeerName) bool + quit chan struct{} } -func New(ourName router.PeerName, peers *router.Peers, domain string) *Nameserver { - ns := &Nameserver{ - ourName: ourName, - domain: dns.Fqdn(domain), - peers: peers, - quit: make(chan struct{}), +func New(ourName router.PeerName, domain string, isKnownPeer func(router.PeerName) bool) *Nameserver { + return &Nameserver{ + ourName: ourName, + domain: dns.Fqdn(domain), + isKnownPeer: isKnownPeer, + quit: make(chan struct{}), } - if peers != nil { - peers.OnGC(ns.PeerGone) - } - return ns } func (n *Nameserver) SetGossip(gossip router.Gossip) { @@ -147,12 +143,12 @@ func (n *Nameserver) ContainerDied(ident string) { } } -func (n *Nameserver) PeerGone(peer *router.Peer) { +func (n *Nameserver) PeerGone(peer router.PeerName) { n.infof("peer %s gone", peer.String()) n.Lock() defer n.Unlock() n.entries.filter(func(e *Entry) bool { - return e.Origin != peer.Name + return e.Origin != peer }) } @@ -219,11 +215,9 @@ func (n *Nameserver) receiveGossip(msg []byte) (router.GossipData, router.Gossip n.Lock() defer n.Unlock() - if n.peers != nil { - gossip.Entries.filter(func(e *Entry) bool { - return n.peers.Fetch(e.Origin) != nil - }) - } + gossip.Entries.filter(func(e *Entry) bool { + return n.isKnownPeer(e.Origin) + }) newEntries := n.entries.merge(gossip.Entries) if len(newEntries) > 0 { diff --git a/nameserver/nameserver_test.go b/nameserver/nameserver_test.go index 581fe321..dda9f1e5 100644 --- a/nameserver/nameserver_test.go +++ b/nameserver/nameserver_test.go @@ -17,13 +17,17 @@ import ( "github.com/weaveworks/weave/testing/gossip" ) +func makeNameserver(name router.PeerName) *Nameserver { + return New(name, "", func(router.PeerName) bool { return true }) +} + func makeNetwork(size int) ([]*Nameserver, *gossip.TestRouter) { gossipRouter := gossip.NewTestRouter(0.0) nameservers := make([]*Nameserver, size) for i := 0; i < size; i++ { name, _ := router.PeerNameFromString(fmt.Sprintf("%02d:00:00:02:00:00", i)) - nameserver := New(name, nil, "") + nameserver := makeNameserver(name) nameserver.SetGossip(gossipRouter.Connect(nameserver.ourName, nameserver)) nameserver.Start() nameservers[i] = nameserver @@ -205,7 +209,7 @@ func testNameservers(t *testing.T) { func TestContainerAndPeerDeath(t *testing.T) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, "") + nameserver := makeNameserver(peername) err = nameserver.AddEntry("hostname", "containerid", peername, address.Address(0)) require.Nil(t, err) @@ -218,7 +222,7 @@ func TestContainerAndPeerDeath(t *testing.T) { require.Nil(t, err) require.Equal(t, []address.Address{0}, nameserver.Lookup("hostname")) - nameserver.PeerGone(&router.Peer{Name: peername}) + nameserver.PeerGone(peername) require.Equal(t, []address.Address{}, nameserver.Lookup("hostname")) } @@ -229,7 +233,7 @@ func TestTombstoneDeletion(t *testing.T) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, "") + nameserver := makeNameserver(peername) err = nameserver.AddEntry("hostname", "containerid", peername, address.Address(0)) require.Nil(t, err) diff --git a/prog/weaver/main.go b/prog/weaver/main.go index bf85b916..32c7a40f 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -264,7 +264,11 @@ func main() { dnsserver *nameserver.DNSServer ) if !noDNS { - ns = nameserver.New(router.Ourself.Peer.Name, router.Peers, dnsDomain) + isKnownPeer := func(name weave.PeerName) bool { + return router.Peers.Fetch(name) != nil + } + ns = nameserver.New(router.Ourself.Peer.Name, dnsDomain, isKnownPeer) + router.Peers.OnGC(func(peer *weave.Peer) { ns.PeerGone(peer.Name) }) ns.SetGossip(router.NewGossip("nameserver", ns)) observeContainers(ns) ns.Start()