@@ -4,12 +4,7 @@ pub mod message_broker;
4
4
pub mod peer_guide;
5
5
mod transaction_id_pool;
6
6
7
- use crate :: {
8
- dht_service:: dht_server:: DhtServer ,
9
- domain_knowledge:: { NodeId , TransactionId } ,
10
- message:: Krpc ,
11
- our_error:: OurError ,
12
- } ;
7
+ use crate :: { dht_service:: dht_server:: DhtServer , domain_knowledge:: NodeId , our_error:: OurError } ;
13
8
14
9
use message_broker:: MessageBroker ;
15
10
use peer_guide:: PeerGuide ;
@@ -111,28 +106,6 @@ impl DhtV4 {
111
106
let client = DhtHandle :: new ( message_broker. clone ( ) , peer_guide. clone ( ) , our_id) ;
112
107
let client = Arc :: new ( client) ;
113
108
114
- // ask all the known nodes for ourselves
115
- let mut bootstrap_join_set = JoinSet :: new ( ) ;
116
-
117
- for contact in known_nodes {
118
- bootstrap_join_set
119
- . build_task ( )
120
- . name ( & * format ! ( "bootstrap with {contact}" ) )
121
- . spawn ( Self :: bootstrap_from ( client. clone ( ) , contact) )
122
- . unwrap ( ) ;
123
- }
124
-
125
- while let Some ( _) = bootstrap_join_set. join_next ( ) . await { }
126
-
127
- // info!(
128
- // "DHT bootstrapped, routing table has {} nodes",
129
- // peer_guide.read().await.node_count()
130
- // );
131
- drop ( bootstrap_join_set) ;
132
-
133
- // TODO: huh, since when this this make sense?
134
- //
135
- // only spawn the server after the bootstrap has completed
136
109
let server = DhtServer :: new ( our_id. clone ( ) , peer_guide. clone ( ) , message_broker. clone ( ) ) ;
137
110
let server = Arc :: new ( server) ;
138
111
@@ -150,6 +123,23 @@ impl DhtV4 {
150
123
helper_tasks : join_set,
151
124
} ;
152
125
126
+ // ask all the known nodes for ourselves
127
+ let mut bootstrap_join_set = JoinSet :: new ( ) ;
128
+
129
+ for contact in known_nodes {
130
+ bootstrap_join_set
131
+ . build_task ( )
132
+ . name ( & * format ! ( "bootstrap with {contact}" ) )
133
+ . spawn ( Self :: bootstrap_from ( client. clone ( ) , contact) )
134
+ . unwrap ( ) ;
135
+ }
136
+
137
+ while let Some ( _) = bootstrap_join_set. join_next ( ) . await { }
138
+ drop ( bootstrap_join_set) ;
139
+
140
+ println ! ( "I should be done" ) ;
141
+ info ! ( "DHT bootstrapped, routing table has {} nodes" , peer_guide. node_count( ) ) ;
142
+
153
143
Ok ( dht)
154
144
}
155
145
@@ -167,43 +157,20 @@ impl DhtV4 {
167
157
#[ instrument( skip_all) ]
168
158
async fn bootstrap_from ( dht : Arc < DhtHandle > , peer : SocketAddrV4 ) -> Result < ( ) , OurError > {
169
159
let our_id = dht. our_id . clone ( ) ;
170
- let txn_id = dht. transaction_id_pool . next ( ) ;
171
- let query = Krpc :: new_find_node_query ( TransactionId :: from ( txn_id) , our_id, our_id) ;
172
160
173
161
info ! ( "bootstrapping with {peer}" ) ;
174
162
let response = timeout ( Duration :: from_secs ( 5 ) , async {
175
- dht. send_and_wait ( query, peer) . await . expect ( "failure to send message" )
163
+ let node_id = dht. ping ( peer) . await ?;
164
+ dht. routing_table . add ( node_id, peer) ;
165
+
166
+ dht. find_node ( our_id) . await ;
167
+ println ! ( "done finding node" ) ;
168
+
169
+ Ok :: < ( ) , eyre:: Report > ( ( ) )
176
170
} )
177
171
. await ?;
178
172
179
- // TODO: use ensure!
180
- if let Krpc :: FindNodeGetPeersResponse ( response) = response {
181
- let mut nodes = response. nodes ( ) . clone ( ) ;
182
- nodes. sort_unstable_by_key ( |node| node. contact ( ) . 0 ) ;
183
- nodes. dedup ( ) ;
184
-
185
- for node in nodes {
186
- let dht = dht. clone ( ) ;
187
- let contact = node. contact ( ) . 0 ;
188
- let our_id = dht. our_id ;
189
- let txn_id = dht. transaction_id_pool . next ( ) ;
190
- let find_ourself = Krpc :: new_find_node_query ( TransactionId :: from ( txn_id) , our_id, node. id ( ) ) ;
191
-
192
- TskBuilder :: new ( )
193
- . name ( & * format ! ( "leave level bootstrap to {}" , contact) )
194
- . spawn ( async move {
195
- let _response = timeout ( Duration :: from_secs ( 5 ) , async {
196
- dht. send_and_wait ( find_ourself, contact)
197
- . await
198
- . expect ( "failure to send message" )
199
- } )
200
- . await ?;
201
- Ok :: < _ , OurError > ( ( ) )
202
- } )
203
- . unwrap ( ) ;
204
- }
205
- info ! ( "bootstrapping with {peer} succeeded" ) ;
206
- }
173
+ info ! ( "{peer} bootstrap success" ) ;
207
174
Ok ( ( ) )
208
175
}
209
176
@@ -237,21 +204,21 @@ mod tests {
237
204
238
205
fn set_up_tracing ( ) {
239
206
let _ = color_eyre:: install ( ) ;
240
- // let fmt_layer = fmt::layer()
241
- // .compact()
242
- // .with_line_number(true)
243
- // .with_filter(LevelFilter::DEBUG);
244
- //
207
+ let fmt_layer = fmt:: layer ( )
208
+ . compact ( )
209
+ . with_line_number ( true )
210
+ . with_filter ( LevelFilter :: DEBUG ) ;
211
+
245
212
// global::set_text_map_propagator(opentelemetry_jaeger::Propagator::new());
246
213
// let tracer = opentelemetry_jaeger::new_pipeline().install_simple().unwrap();
247
- //
214
+
248
215
// let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
249
- //
250
- // tracing_subscriber::registry()
251
- // .with(console_subscriber::spawn())
252
- // .with(telemetry)
253
- // .with(fmt_layer)
254
- // .init();
216
+
217
+ tracing_subscriber:: registry ( )
218
+ . with ( console_subscriber:: spawn ( ) )
219
+ // .with(telemetry)
220
+ . with ( fmt_layer)
221
+ . init ( ) ;
255
222
}
256
223
257
224
#[ tokio:: test( flavor = "multi_thread" ) ]
@@ -261,7 +228,7 @@ mod tests {
261
228
let external_ip = public_ip:: addr_v4 ( ) . await . unwrap ( ) ;
262
229
263
230
let dht = DhtV4 :: bootstrap_with_random_id (
264
- SocketAddrV4 :: from_str ( "0.0.0.0:51413 " ) . unwrap ( ) ,
231
+ SocketAddrV4 :: from_str ( "0.0.0.0:44444 " ) . unwrap ( ) ,
265
232
external_ip,
266
233
vec ! [
267
234
// dht.tansmissionbt.com
@@ -292,7 +259,6 @@ mod tests {
292
259
rng. fill_bytes ( & mut bytes) ;
293
260
294
261
let node = client. find_node ( NodeId ( bytes) ) . await ;
295
- println ! ( "{node:?}" ) ;
296
262
if let Ok ( node) = node {
297
263
println ! ( "found node {:?}" , node) ;
298
264
} else {
0 commit comments