@@ -290,7 +290,10 @@ fn do_connection_restart_behavior(persist: bool) {
290
290
let node_id_b = node_b. node_id ( ) ;
291
291
292
292
let node_addr_b = node_b. listening_addresses ( ) . unwrap ( ) . first ( ) . unwrap ( ) . clone ( ) ;
293
+
294
+ // Sleep a second to allow node_b's listener task to spawn and bind before we try connecting.
293
295
std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
296
+
294
297
node_a. connect ( node_id_b, node_addr_b, persist) . unwrap ( ) ;
295
298
296
299
let peer_details_a = node_a. list_peers ( ) . first ( ) . unwrap ( ) . clone ( ) ;
@@ -327,3 +330,32 @@ fn do_connection_restart_behavior(persist: bool) {
327
330
assert ! ( node_b. list_peers( ) . is_empty( ) ) ;
328
331
}
329
332
}
333
+
334
+ #[ test]
335
+ fn concurrent_connections_succeed ( ) {
336
+ let ( _bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
337
+ let ( node_a, node_b) = setup_two_nodes ( & electrsd, false ) ;
338
+
339
+ let node_a = Arc :: new ( node_a) ;
340
+ let node_b = Arc :: new ( node_b) ;
341
+
342
+ let node_id_b = node_b. node_id ( ) ;
343
+ let node_addr_b = node_b. listening_addresses ( ) . unwrap ( ) . first ( ) . unwrap ( ) . clone ( ) ;
344
+
345
+ // Sleep a second to allow node_b's listener task to spawn and bind before we try connecting.
346
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
347
+
348
+ let mut handles = Vec :: new ( ) ;
349
+ for _ in 0 ..10 {
350
+ let thread_node = Arc :: clone ( & node_a) ;
351
+ let thread_addr = node_addr_b. clone ( ) ;
352
+ let handle = std:: thread:: spawn ( move || {
353
+ thread_node. connect ( node_id_b, thread_addr, false ) . unwrap ( ) ;
354
+ } ) ;
355
+ handles. push ( handle) ;
356
+ }
357
+
358
+ for h in handles {
359
+ h. join ( ) . unwrap ( ) ;
360
+ }
361
+ }
0 commit comments