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)