Skip to content

Commit 9e360a5

Browse files
fix(dot/network): remove defer cancel() inside loop (#2248)
* feat: remove context create in a for loop * chore: fix the for loop condition * chore: rename time.Timer to timer * chore: stop and drain timer channel
1 parent e816e31 commit 9e360a5

File tree

1 file changed

+54
-35
lines changed

1 file changed

+54
-35
lines changed

dot/network/discovery.go

Lines changed: 54 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -60,34 +60,44 @@ func newDiscovery(ctx context.Context, h libp2phost.Host,
6060
}
6161
}
6262

63-
// start creates the DHT.
64-
func (d *discovery) start() error {
65-
if len(d.bootnodes) == 0 {
66-
// get all currently connected peers and use them to bootstrap the DHT
67-
peers := d.h.Network().Peers()
68-
69-
t := time.NewTicker(startDHTTimeout)
70-
defer t.Stop()
71-
for {
72-
if len(peers) > 0 {
73-
break
74-
}
63+
func (d *discovery) waitForPeers() (peers []peer.AddrInfo, err error) {
64+
// get all currently connected peers and use them to bootstrap the DHT
7565

76-
select {
77-
case <-t.C:
78-
logger.Debug("no peers yet, waiting to start DHT...")
79-
// wait for peers to connect before starting DHT, otherwise DHT bootstrap nodes
80-
// will be empty and we will fail to fill the routing table
81-
case <-d.ctx.Done():
82-
return nil
83-
}
66+
currentPeers := d.h.Network().Peers()
67+
68+
t := time.NewTicker(startDHTTimeout)
69+
defer t.Stop()
8470

85-
peers = d.h.Network().Peers()
71+
for len(currentPeers) == 0 {
72+
select {
73+
case <-t.C:
74+
logger.Debug("no peers yet, waiting to start DHT...")
75+
// wait for peers to connect before starting DHT, otherwise DHT bootstrap nodes
76+
// will be empty and we will fail to fill the routing table
77+
case <-d.ctx.Done():
78+
return nil, d.ctx.Err()
8679
}
8780

88-
for _, p := range peers {
89-
d.bootnodes = append(d.bootnodes, d.h.Peerstore().PeerInfo(p))
81+
currentPeers = d.h.Network().Peers()
82+
}
83+
84+
peers = make([]peer.AddrInfo, len(currentPeers))
85+
for idx, peer := range currentPeers {
86+
peers[idx] = d.h.Peerstore().PeerInfo(peer)
87+
}
88+
89+
return peers, nil
90+
}
91+
92+
// start creates the DHT.
93+
func (d *discovery) start() error {
94+
if len(d.bootnodes) == 0 {
95+
peers, err := d.waitForPeers()
96+
if err != nil {
97+
return fmt.Errorf("failed while waiting for peers: %w", err)
9098
}
99+
100+
d.bootnodes = peers
91101
}
92102

93103
logger.Debugf("starting DHT with bootnodes %v...", d.bootnodes)
@@ -141,8 +151,15 @@ func (d *discovery) advertise() {
141151
ttl := initialAdvertisementTimeout
142152

143153
for {
154+
timer := time.NewTimer(ttl)
155+
144156
select {
145-
case <-time.After(ttl):
157+
case <-d.ctx.Done():
158+
if !timer.Stop() {
159+
<-timer.C
160+
}
161+
return
162+
case <-timer.C:
146163
logger.Debug("advertising ourselves in the DHT...")
147164
err := d.dht.Bootstrap(d.ctx)
148165
if err != nil {
@@ -155,53 +172,55 @@ func (d *discovery) advertise() {
155172
logger.Warnf("failed to advertise in the DHT: %s", err)
156173
ttl = tryAdvertiseTimeout
157174
}
158-
case <-d.ctx.Done():
159-
return
160175
}
161176
}
162177
}
163178

164179
func (d *discovery) checkPeerCount() {
165-
t := time.NewTicker(connectToPeersTimeout)
166-
defer t.Stop()
180+
timer := time.NewTicker(connectToPeersTimeout)
181+
defer timer.Stop()
182+
167183
for {
168184
select {
169185
case <-d.ctx.Done():
170186
return
171-
case <-t.C:
187+
case <-timer.C:
172188
if len(d.h.Network().Peers()) > d.minPeers {
173189
continue
174190
}
175191

176-
ctx, cancel := context.WithTimeout(d.ctx, findPeersTimeout)
177-
defer cancel()
178-
d.findPeers(ctx)
192+
d.findPeers()
179193
}
180194
}
181195
}
182196

183-
func (d *discovery) findPeers(ctx context.Context) {
197+
func (d *discovery) findPeers() {
184198
logger.Debug("attempting to find DHT peers...")
185199
peerCh, err := d.rd.FindPeers(d.ctx, string(d.pid))
186200
if err != nil {
187201
logger.Warnf("failed to begin finding peers via DHT: %s", err)
188202
return
189203
}
190204

205+
timer := time.NewTimer(findPeersTimeout)
206+
defer timer.Stop()
207+
191208
for {
192209
select {
193-
case <-ctx.Done():
210+
case <-timer.C:
194211
return
195212
case peer := <-peerCh:
196213
if peer.ID == d.h.ID() || peer.ID == "" {
197214
continue
198215
}
199216

200217
logger.Tracef("found new peer %s via DHT", peer.ID)
201-
202218
d.h.Peerstore().AddAddrs(peer.ID, peer.Addrs, peerstore.PermanentAddrTTL)
203219
d.handler.AddPeer(0, peer.ID)
204220

221+
if !timer.Stop() {
222+
<-timer.C
223+
}
205224
}
206225
}
207226
}

0 commit comments

Comments
 (0)