diff --git a/router/local_peer.go b/router/local_peer.go index c7218ea6..2e4398fe 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -228,6 +228,8 @@ func (peer *LocalPeer) handleDeleteConnection(conn Connection) { peer.broadcastPeerUpdate() } +// helpers + func (peer *LocalPeer) broadcastPeerUpdate(peers ...*Peer) { peer.router.Routes.Recalculate() peer.router.TopologyGossip.GossipBroadcast(NewTopologyGossipData(peer.router.Peers, append(peers, peer.Peer)...)) @@ -235,8 +237,34 @@ func (peer *LocalPeer) broadcastPeerUpdate(peers ...*Peer) { func (peer *LocalPeer) checkConnectionLimit() error { limit := peer.router.ConnLimit - if 0 != limit && peer.ConnectionCount() >= limit { + if 0 != limit && peer.connectionCount() >= limit { return fmt.Errorf("Connection limit reached (%v)", limit) } return nil } + +func (peer *LocalPeer) addConnection(conn Connection) { + peer.Lock() + defer peer.Unlock() + peer.connections[conn.Remote().Name] = conn + peer.version++ +} + +func (peer *LocalPeer) deleteConnection(conn Connection) { + peer.Lock() + defer peer.Unlock() + delete(peer.connections, conn.Remote().Name) + peer.version++ +} + +func (peer *LocalPeer) connectionEstablished(conn Connection) { + peer.Lock() + defer peer.Unlock() + peer.version++ +} + +func (peer *LocalPeer) connectionCount() int { + peer.RLock() + defer peer.RUnlock() + return len(peer.connections) +} diff --git a/router/mocks_test.go b/router/mocks_test.go index cd58a08c..7168034a 100644 --- a/router/mocks_test.go +++ b/router/mocks_test.go @@ -14,7 +14,7 @@ import ( func (peers *Peers) AddTestConnection(p *Peer) { toPeer := NewPeer(p.Name, "", p.UID, 0) peers.FetchWithDefault(toPeer) // Has side-effect of incrementing refcount - conn := newMockConnection(peers.ourself, toPeer) + conn := newMockConnection(peers.ourself.Peer, toPeer) peers.ourself.addConnection(conn) peers.ourself.connectionEstablished(conn) } diff --git a/router/peer.go b/router/peer.go index 086e6e44..a497a9a6 100644 --- a/router/peer.go +++ b/router/peer.go @@ -66,12 +66,6 @@ func (peer *Peer) IsLocallyReferenced() bool { return peer.localRefCount != 0 } -func (peer *Peer) ConnectionCount() int { - peer.RLock() - defer peer.RUnlock() - return len(peer.connections) -} - func (peer *Peer) ConnectionTo(name PeerName) (Connection, bool) { peer.RLock() defer peer.RUnlock() @@ -96,26 +90,6 @@ func (peer *Peer) SetVersionAndConnections(version uint64, connections map[PeerN peer.connections = connections } -func (peer *Peer) addConnection(conn Connection) { - peer.Lock() - defer peer.Unlock() - peer.connections[conn.Remote().Name] = conn - peer.version++ -} - -func (peer *Peer) deleteConnection(conn Connection) { - peer.Lock() - defer peer.Unlock() - delete(peer.connections, conn.Remote().Name) - peer.version++ -} - -func (peer *Peer) connectionEstablished(conn Connection) { - peer.Lock() - defer peer.Unlock() - peer.version++ -} - // Calculate the routing table from this peer to all peers reachable // from it, returning a "next hop" map of PeerNameX -> PeerNameY, // which says "in order to send a message to X, the peer should send diff --git a/router/peers.go b/router/peers.go index ff75c0c2..fff0cd84 100644 --- a/router/peers.go +++ b/router/peers.go @@ -10,7 +10,7 @@ import ( type Peers struct { sync.RWMutex - ourself *Peer + ourself *LocalPeer table map[PeerName]*Peer onGC func(*Peer) } @@ -39,7 +39,7 @@ type ConnectionSummary struct { Established bool } -func NewPeers(ourself *Peer, onGC func(*Peer)) *Peers { +func NewPeers(ourself *LocalPeer, onGC func(*Peer)) *Peers { return &Peers{ ourself: ourself, table: make(map[PeerName]*Peer), @@ -250,7 +250,7 @@ func (peers *Peers) applyUpdate(decodedUpdate []*Peer, decodedConns [][]Connecti // guaranteed to find peer in the peers.table peer := peers.table[name] if peer != newPeer && - (peer == peers.ourself || peer.Version() >= newPeer.Version()) { + (peer == peers.ourself.Peer || peer.Version() >= newPeer.Version()) { // Nobody but us updates us. And if we know more about a // peer than what's in the the update, we ignore the // latter. diff --git a/router/peers_test.go b/router/peers_test.go index 5fe8745c..c38e6588 100644 --- a/router/peers_test.go +++ b/router/peers_test.go @@ -17,10 +17,10 @@ import ( // - non-gc of peers that are only referenced locally func newNode(name PeerName) (*Peer, *Peers) { - peer := NewPeer(name, "", 0, 0) + peer := NewLocalPeer(name, "", nil) peers := NewPeers(peer, func(*Peer) {}) - peers.FetchWithDefault(peer) - return peer, peers + peers.FetchWithDefault(peer.Peer) + return peer.Peer, peers } // Check that ApplyUpdate copies the whole topology from peers @@ -29,7 +29,7 @@ func checkApplyUpdate(t *testing.T, peers *Peers) { // We need a new node outside of the network, with a connection // into it. _, testBedPeers := newNode(dummyName) - testBedPeers.AddTestConnection(peers.ourself) + testBedPeers.AddTestConnection(peers.ourself.Peer) testBedPeers.ApplyUpdate(peers.EncodePeers(peers.Names())) checkTopologyPeers(t, true, testBedPeers.allPeersExcept(dummyName), peers.allPeers()...) diff --git a/router/router.go b/router/router.go index 0df6a813..dcd33f44 100644 --- a/router/router.go +++ b/router/router.go @@ -64,7 +64,7 @@ func NewRouter(config RouterConfig, name PeerName, nickName string) *Router { } router.Ourself = NewLocalPeer(name, nickName, router) router.Macs = NewMacCache(macMaxAge, onMacExpiry) - router.Peers = NewPeers(router.Ourself.Peer, onPeerGC) + router.Peers = NewPeers(router.Ourself, onPeerGC) router.Peers.FetchWithDefault(router.Ourself.Peer) router.Routes = NewRoutes(router.Ourself.Peer, router.Peers) router.ConnectionMaker = NewConnectionMaker(router.Ourself, router.Peers, router.Port)