@@ -60,34 +60,44 @@ func newDiscovery(ctx context.Context, h libp2phost.Host,
60
60
}
61
61
}
62
62
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
75
65
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 ()
84
70
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 ()
86
79
}
87
80
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 )
90
98
}
99
+
100
+ d .bootnodes = peers
91
101
}
92
102
93
103
logger .Debugf ("starting DHT with bootnodes %v..." , d .bootnodes )
@@ -141,8 +151,15 @@ func (d *discovery) advertise() {
141
151
ttl := initialAdvertisementTimeout
142
152
143
153
for {
154
+ timer := time .NewTimer (ttl )
155
+
144
156
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 :
146
163
logger .Debug ("advertising ourselves in the DHT..." )
147
164
err := d .dht .Bootstrap (d .ctx )
148
165
if err != nil {
@@ -155,53 +172,55 @@ func (d *discovery) advertise() {
155
172
logger .Warnf ("failed to advertise in the DHT: %s" , err )
156
173
ttl = tryAdvertiseTimeout
157
174
}
158
- case <- d .ctx .Done ():
159
- return
160
175
}
161
176
}
162
177
}
163
178
164
179
func (d * discovery ) checkPeerCount () {
165
- t := time .NewTicker (connectToPeersTimeout )
166
- defer t .Stop ()
180
+ timer := time .NewTicker (connectToPeersTimeout )
181
+ defer timer .Stop ()
182
+
167
183
for {
168
184
select {
169
185
case <- d .ctx .Done ():
170
186
return
171
- case <- t .C :
187
+ case <- timer .C :
172
188
if len (d .h .Network ().Peers ()) > d .minPeers {
173
189
continue
174
190
}
175
191
176
- ctx , cancel := context .WithTimeout (d .ctx , findPeersTimeout )
177
- defer cancel ()
178
- d .findPeers (ctx )
192
+ d .findPeers ()
179
193
}
180
194
}
181
195
}
182
196
183
- func (d * discovery ) findPeers (ctx context. Context ) {
197
+ func (d * discovery ) findPeers () {
184
198
logger .Debug ("attempting to find DHT peers..." )
185
199
peerCh , err := d .rd .FindPeers (d .ctx , string (d .pid ))
186
200
if err != nil {
187
201
logger .Warnf ("failed to begin finding peers via DHT: %s" , err )
188
202
return
189
203
}
190
204
205
+ timer := time .NewTimer (findPeersTimeout )
206
+ defer timer .Stop ()
207
+
191
208
for {
192
209
select {
193
- case <- ctx . Done () :
210
+ case <- timer . C :
194
211
return
195
212
case peer := <- peerCh :
196
213
if peer .ID == d .h .ID () || peer .ID == "" {
197
214
continue
198
215
}
199
216
200
217
logger .Tracef ("found new peer %s via DHT" , peer .ID )
201
-
202
218
d .h .Peerstore ().AddAddrs (peer .ID , peer .Addrs , peerstore .PermanentAddrTTL )
203
219
d .handler .AddPeer (0 , peer .ID )
204
220
221
+ if ! timer .Stop () {
222
+ <- timer .C
223
+ }
205
224
}
206
225
}
207
226
}
0 commit comments