@@ -59,6 +59,7 @@ use crate::utils::{
59
59
use futures:: future;
60
60
use futures:: future:: Either :: { A , B } ;
61
61
use futures:: prelude:: * ;
62
+ use futures:: stream;
62
63
use network_core:: gossip:: { Gossip , Node } ;
63
64
use poldercast:: StrikeReason ;
64
65
use rand:: seq:: SliceRandom ;
@@ -133,30 +134,6 @@ impl GlobalState {
133
134
topology : P2pTopology ,
134
135
logger : Logger ,
135
136
) -> Self {
136
- let mut topology = topology;
137
- topology. set_poldercast_modules ( ) ;
138
- topology. set_custom_modules ( & config) ;
139
- topology. set_policy ( config. policy . clone ( ) ) ;
140
-
141
- // inject the trusted peers as initial gossips, this will make the node
142
- // gossip with them at least at the beginning
143
- topology. accept_gossips (
144
- ( * config. profile . id ( ) ) . into ( ) ,
145
- config
146
- . trusted_peers
147
- . clone ( )
148
- . into_iter ( )
149
- . map ( |tp| {
150
- let mut builder = poldercast:: NodeProfileBuilder :: new ( ) ;
151
- builder. id ( tp. id . into ( ) ) ;
152
- builder. address ( tp. address . into ( ) ) ;
153
- builder. build ( )
154
- } )
155
- . map ( p2p:: Gossip :: from)
156
- . collect :: < Vec < p2p:: Gossip > > ( )
157
- . into ( ) ,
158
- ) ;
159
-
160
137
let peers = Peers :: new (
161
138
config. max_connections ,
162
139
config. max_connections_threshold ,
@@ -259,15 +236,7 @@ pub fn start(
259
236
Either :: B ( future:: ok ( ( ) ) )
260
237
} ;
261
238
262
- let initial_nodes = global_state. topology . view ( poldercast:: Selection :: Any ) ;
263
- let self_node = global_state. topology . node ( ) ;
264
- for node in initial_nodes {
265
- let self_node_copy = self_node. clone ( ) ;
266
- connect_and_propagate_with ( node, global_state. clone ( ) , channels. clone ( ) , move |comms| {
267
- let gossip = Gossip :: from_nodes ( iter:: once ( self_node_copy. into ( ) ) ) ;
268
- comms. set_pending_gossip ( gossip) ;
269
- } ) ;
270
- }
239
+ global_state. spawn ( start_gossiping ( global_state. clone ( ) , channels. clone ( ) ) ) ;
271
240
272
241
let handle_cmds = handle_network_input ( input, global_state. clone ( ) , channels. clone ( ) ) ;
273
242
@@ -281,7 +250,7 @@ pub fn start(
281
250
. map_err ( move |e| {
282
251
error ! ( reset_err_logger, "interval timer error: {:?}" , e) ;
283
252
} )
284
- . for_each ( move |_| Ok ( tp2p. force_reset_layers ( ) ) ) ,
253
+ . for_each ( move |_| tp2p. force_reset_layers ( ) ) ,
285
254
) ;
286
255
}
287
256
@@ -348,18 +317,27 @@ fn handle_propagation_msg(
348
317
channels : Channels ,
349
318
) -> impl Future < Item = ( ) , Error = ( ) > {
350
319
trace ! ( state. logger( ) , "to propagate: {:?}" , & msg) ;
320
+ let prop_state = state. clone ( ) ;
351
321
let send_to_peers = match msg {
352
322
PropagateMsg :: Block ( ref header) => {
353
- let nodes = state. topology . view ( poldercast:: Selection :: Topic {
354
- topic : p2p:: topic:: BLOCKS ,
355
- } ) ;
356
- A ( state. peers . propagate_block ( nodes, header. clone ( ) ) )
323
+ let header = header. clone ( ) ;
324
+ let future = state
325
+ . topology
326
+ . view ( poldercast:: Selection :: Topic {
327
+ topic : p2p:: topic:: BLOCKS ,
328
+ } )
329
+ . and_then ( move |view| prop_state. peers . propagate_block ( view. peers , header) ) ;
330
+ A ( future)
357
331
}
358
332
PropagateMsg :: Fragment ( ref fragment) => {
359
- let nodes = state. topology . view ( poldercast:: Selection :: Topic {
360
- topic : p2p:: topic:: MESSAGES ,
361
- } ) ;
362
- B ( state. peers . propagate_fragment ( nodes, fragment. clone ( ) ) )
333
+ let fragment = fragment. clone ( ) ;
334
+ let future = state
335
+ . topology
336
+ . view ( poldercast:: Selection :: Topic {
337
+ topic : p2p:: topic:: MESSAGES ,
338
+ } )
339
+ . and_then ( move |view| prop_state. peers . propagate_fragment ( view. peers , fragment) ) ;
340
+ B ( future)
363
341
}
364
342
} ;
365
343
// If any nodes selected for propagation are not in the
@@ -384,23 +362,73 @@ fn handle_propagation_msg(
384
362
} )
385
363
}
386
364
387
- fn send_gossip ( state : GlobalStateR , channels : Channels ) -> impl Future < Item = ( ) , Error = ( ) > {
388
- let nodes = state. topology . view ( poldercast:: Selection :: Any ) ;
389
-
390
- tokio:: prelude:: stream:: iter_ok ( nodes) . for_each ( move |node| {
391
- let gossip = Gossip :: from ( state. topology . initiate_gossips ( node. id ( ) ) ) ;
392
- let send_to_peer = state. peers . propagate_gossip_to ( node. id ( ) , gossip) ;
393
- let state_err = state. clone ( ) ;
394
- let channels_err = channels. clone ( ) ;
395
- send_to_peer. then ( move |res| {
396
- if let Err ( gossip) = res {
397
- connect_and_propagate_with ( node, state_err, channels_err, |comms| {
398
- comms. set_pending_gossip ( gossip)
365
+ fn start_gossiping ( state : GlobalStateR , channels : Channels ) -> impl Future < Item = ( ) , Error = ( ) > {
366
+ let config = & state. config ;
367
+ let topology = state. topology . clone ( ) ;
368
+ let conn_state = state. clone ( ) ;
369
+ // inject the trusted peers as initial gossips, this will make the node
370
+ // gossip with them at least at the beginning
371
+ topology
372
+ . accept_gossips (
373
+ ( * config. profile . id ( ) ) . into ( ) ,
374
+ config
375
+ . trusted_peers
376
+ . iter ( )
377
+ . map ( |tp| {
378
+ let mut builder = poldercast:: NodeProfileBuilder :: new ( ) ;
379
+ builder. id ( tp. id . clone ( ) . into ( ) ) ;
380
+ builder. address ( tp. address . clone ( ) . into ( ) ) ;
381
+ builder. build ( )
399
382
} )
383
+ . map ( p2p:: Gossip :: from)
384
+ . collect :: < Vec < p2p:: Gossip > > ( )
385
+ . into ( ) ,
386
+ )
387
+ . and_then ( move |( ) | topology. view ( poldercast:: Selection :: Any ) )
388
+ . and_then ( move |view| {
389
+ for node in view. peers {
390
+ let self_node = view. self_node . clone ( ) ;
391
+ let gossip = Gossip :: from_nodes ( iter:: once ( self_node. into ( ) ) ) ;
392
+ connect_and_propagate_with (
393
+ node,
394
+ conn_state. clone ( ) ,
395
+ channels. clone ( ) ,
396
+ move |comms| {
397
+ comms. set_pending_gossip ( gossip) ;
398
+ } ,
399
+ ) ;
400
400
}
401
401
Ok ( ( ) )
402
402
} )
403
- } )
403
+ }
404
+
405
+ fn send_gossip ( state : GlobalStateR , channels : Channels ) -> impl Future < Item = ( ) , Error = ( ) > {
406
+ let topology = state. topology . clone ( ) ;
407
+ topology
408
+ . view ( poldercast:: Selection :: Any )
409
+ . and_then ( move |view| {
410
+ stream:: iter_ok ( view. peers ) . for_each ( move |node| {
411
+ let peer_id = node. id ( ) ;
412
+ let state_prop = state. clone ( ) ;
413
+ let state_err = state. clone ( ) ;
414
+ let channels_err = channels. clone ( ) ;
415
+ topology
416
+ . initiate_gossips ( peer_id)
417
+ . and_then ( move |gossips| {
418
+ state_prop
419
+ . peers
420
+ . propagate_gossip_to ( peer_id, Gossip :: from ( gossips) )
421
+ } )
422
+ . then ( move |res| {
423
+ if let Err ( gossip) = res {
424
+ connect_and_propagate_with ( node, state_err, channels_err, |comms| {
425
+ comms. set_pending_gossip ( gossip)
426
+ } )
427
+ }
428
+ Ok ( ( ) )
429
+ } )
430
+ } )
431
+ } )
404
432
}
405
433
406
434
fn connect_and_propagate_with < F > (
@@ -425,7 +453,7 @@ fn connect_and_propagate_with<F>(
425
453
let node_id = node. id ( ) ;
426
454
assert_ne ! (
427
455
node_id,
428
- ( * state. topology. node ( ) . id ( ) ) . into ( ) ,
456
+ state. topology. node_id ( ) ,
429
457
"topology tells the node to connect to itself"
430
458
) ;
431
459
let peer = Peer :: new ( addr, Protocol :: Grpc ) ;
@@ -461,8 +489,12 @@ fn connect_and_propagate_with<F>(
461
489
}
462
490
} ;
463
491
if !benign {
464
- conn_err_state. topology . report_node ( node_id, StrikeReason :: CannotConnect ) ;
465
- A ( conn_err_state. peers . remove_peer ( node_id) . and_then ( |_| future:: err ( ( ) ) ) )
492
+ let future = conn_err_state
493
+ . topology
494
+ . report_node ( node_id, StrikeReason :: CannotConnect )
495
+ . join ( conn_err_state. peers . remove_peer ( node_id) )
496
+ . and_then ( |_| future:: err ( ( ) ) ) ;
497
+ A ( future)
466
498
} else {
467
499
B ( future:: err ( ( ) ) )
468
500
}
@@ -474,8 +506,12 @@ fn connect_and_propagate_with<F>(
474
506
client. logger( ) ,
475
507
"peer node ID differs from the expected {}" , node_id
476
508
) ;
477
- state. topology . report_node ( node_id, StrikeReason :: InvalidPublicId ) ;
478
- A ( state. peers . remove_peer ( node_id) . and_then ( |_| future:: err ( ( ) ) ) )
509
+ let future = state
510
+ . topology
511
+ . report_node ( node_id, StrikeReason :: InvalidPublicId )
512
+ . join ( state. peers . remove_peer ( node_id) )
513
+ . and_then ( |_| future:: err ( ( ) ) ) ;
514
+ A ( future)
479
515
} else {
480
516
B ( future:: ok ( client) )
481
517
}
0 commit comments