From 8a2828d57d4938d7a9852cb33d0cd6fb433ffd22 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 5 Apr 2015 10:17:16 +0100 Subject: [PATCH] add "representation of received update" to return of Peers.ApplyUpdate --- router/peers.go | 14 +++++++++----- router/router.go | 12 ++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/router/peers.go b/router/peers.go index 2ade26bd..059e41c3 100644 --- a/router/peers.go +++ b/router/peers.go @@ -69,15 +69,15 @@ func (peers *Peers) ForEach(fun func(*Peer)) { // // We add peers hitherto unknown to us, and update peers for which the // update contains a more recent version than known to us. The return -// value is an "improved" update containing just these new/updated -// elements. -func (peers *Peers) ApplyUpdate(update []byte) (PeerNameSet, error) { +// value is a) a representation of the received update, and b) an +// "improved" update containing just these new/updated elements. +func (peers *Peers) ApplyUpdate(update []byte) (PeerNameSet, PeerNameSet, error) { peers.Lock() newPeers, decodedUpdate, decodedConns, err := peers.decodeUpdate(update) if err != nil { peers.Unlock() - return nil, err + return nil, nil, err } // By this point, we know the update doesn't refer to any peers we @@ -97,7 +97,11 @@ func (peers *Peers) ApplyUpdate(update []byte) (PeerNameSet, error) { // Don't need to hold peers lock any longer peers.Unlock() - return setFromPeersMap(newUpdate), nil + updateNames := make(PeerNameSet) + for _, peer := range decodedUpdate { + updateNames[peer.Name] = void + } + return updateNames, setFromPeersMap(newUpdate), nil } func (peers *Peers) Names() PeerNameSet { diff --git a/router/router.go b/router/router.go index 756d39b7..5ba48d7c 100644 --- a/router/router.go +++ b/router/router.go @@ -386,29 +386,29 @@ func (router *Router) Gossip() GossipData { } func (router *Router) OnGossip(update []byte) (GossipData, error) { - newUpdate, err := router.applyTopologyUpdate(update) + _, newUpdate, err := router.applyTopologyUpdate(update) if err != nil || len(newUpdate) == 0 { return nil, err } return &TopologyGossipData{peers: router.Peers, update: newUpdate}, nil } -func (router *Router) applyTopologyUpdate(update []byte) (PeerNameSet, error) { - newUpdate, err := router.Peers.ApplyUpdate(update) +func (router *Router) applyTopologyUpdate(update []byte) (PeerNameSet, PeerNameSet, error) { + origUpdate, newUpdate, err := router.Peers.ApplyUpdate(update) if _, ok := err.(UnknownPeerError); err != nil && ok { // That update contained a reference to a peer which wasn't // itself included in the update, and we didn't know about // already. We ignore this; eventually we should receive an // update containing a complete topology. log.Println("Topology gossip:", err) - return nil, nil + return nil, nil, nil } if err != nil { - return nil, err + return nil, nil, err } if len(newUpdate) > 0 { router.ConnectionMaker.Refresh() router.Routes.Recalculate() } - return newUpdate, nil + return origUpdate, newUpdate, nil }