@cryptotaxi247 / kubo / commits / 87a293f68

fix(peering): fix a race condition

Steven Allen committed May 25, 2020 at 20:09 UTC 87a293f6801b176d9a947c3bf49c511e3dd98dce
1 file changed +20 -6
peering/peering.go
+20 -6
@@ -47,6 +47,24 @@ type peerHandler struct {
47 nextDelay time.Duration
48 }
49
50 +// setAddrs sets the addresses for this peer.
51 +func (ph *peerHandler) setAddrs(addrs []multiaddr.Multiaddr) {
52 + // Not strictly necessary, but it helps to not trust the calling code.
53 + addrCopy := make([]multiaddr.Multiaddr, len(addrs))
54 + copy(addrCopy, addrs)
55 +
56 + ph.mu.Lock()
57 + defer ph.mu.Unlock()
58 + ph.addrs = addrCopy
59 +}
60 +
61 +// getAddrs returns a shared slice of addresses for this peer. Do not modify.
62 +func (ph *peerHandler) getAddrs() []multiaddr.Multiaddr {
63 + ph.mu.Lock()
64 + defer ph.mu.Unlock()
65 + return ph.addrs
66 +}
67 +
68 // stop permanently stops the peer handler.
69 func (ph *peerHandler) stop() {
70 ph.cancel()
@@ -69,11 +87,7 @@ func (ph *peerHandler) nextBackoff() time.Duration {
87
88 func (ph *peerHandler) reconnect() {
89 // Try connecting
72 -
73 - ph.mu.Lock()
74 - addrs := append(([]multiaddr.Multiaddr)(nil), ph.addrs...)
75 - ph.mu.Unlock()
76 -
90 + addrs := ph.getAddrs()
91 logger.Debugw("reconnecting", "peer", ph.peer, "addrs", addrs)
92
93 err := ph.host.Connect(ph.ctx, peer.AddrInfo{ID: ph.peer, Addrs: addrs})
@@ -193,7 +207,7 @@ func (ps *PeeringService) AddPeer(info peer.AddrInfo) {
207
208 if handler, ok := ps.peers[info.ID]; ok {
209 logger.Infow("updating addresses", "peer", info.ID, "addrs", info.Addrs)
196 - handler.addrs = info.Addrs
210 + handler.setAddrs(info.Addrs)
211 } else {
212 logger.Infow("peer added", "peer", info.ID, "addrs", info.Addrs)
213 ps.host.ConnManager().Protect(info.ID, connmgrTag)