Skip to content

Commit b1bee0f

Browse files
committed
Reconnect to all persisted peers after restart
While we previously took care of persisting peer details when a channel is opened and if the user signals to `connect` to have the connection persisted, our background task would still only try to reconnect to channel peers. Here, we fix this omission and add a regression test ensuring we'll see the proper behavior going forward.
1 parent f88de49 commit b1bee0f

File tree

3 files changed

+70
-24
lines changed

3 files changed

+70
-24
lines changed

src/lib.rs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
461461
});
462462
}
463463

464-
// Regularly reconnect to channel peers.
465-
let connect_cm = Arc::clone(&self.channel_manager);
464+
// Regularly reconnect to persisted peers.
466465
let connect_pm = Arc::clone(&self.peer_manager);
467466
let connect_logger = Arc::clone(&self.logger);
468467
let connect_peer_store = Arc::clone(&self.peer_store);
@@ -481,29 +480,23 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
481480
.iter()
482481
.map(|(peer, _addr)| *peer)
483482
.collect::<Vec<_>>();
484-
for node_id in connect_cm
485-
.list_channels()
486-
.iter()
487-
.map(|chan| chan.counterparty.node_id)
488-
.filter(|id| !pm_peers.contains(id))
489-
{
490-
if let Some(peer_info) = connect_peer_store.get_peer(&node_id) {
491-
let res = do_connect_peer(
492-
peer_info.node_id,
493-
peer_info.address,
494-
Arc::clone(&connect_pm),
495-
Arc::clone(&connect_logger),
496-
).await;
497-
match res {
498-
Ok(_) => {
499-
log_info!(connect_logger, "Successfully reconnected to peer {}", node_id);
500-
},
501-
Err(e) => {
502-
log_error!(connect_logger, "Failed to reconnect to peer {}: {}", node_id, e);
503-
}
504-
}
505-
}
483+
484+
for peer_info in connect_peer_store.list_peers().iter().filter(|info| !pm_peers.contains(&info.node_id)) {
485+
let res = do_connect_peer(
486+
peer_info.node_id,
487+
peer_info.address.clone(),
488+
Arc::clone(&connect_pm),
489+
Arc::clone(&connect_logger),
490+
).await;
491+
match res {
492+
Ok(_) => {
493+
log_info!(connect_logger, "Successfully reconnected to peer {}", peer_info.node_id);
494+
},
495+
Err(e) => {
496+
log_error!(connect_logger, "Failed to reconnect to peer {}: {}", peer_info.node_id, e);
506497
}
498+
}
499+
}
507500
}
508501
}
509502
}

tests/common.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ pub(crate) fn do_channel_full_cycle<K: KVStore + Sync + Send, E: ElectrumApi>(
355355
.unwrap();
356356

357357
assert_eq!(node_a.list_peers().first().unwrap().node_id, node_b.node_id());
358+
assert!(node_a.list_peers().first().unwrap().is_persisted);
358359
let funding_txo_a = expect_channel_pending_event!(node_a, node_b.node_id());
359360
let funding_txo_b = expect_channel_pending_event!(node_b, node_a.node_id());
360361
assert_eq!(funding_txo_a, funding_txo_b);

tests/integration_tests_rust.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,55 @@ fn sign_verify_msg() {
272272
let pkey = node.node_id();
273273
assert!(node.verify_signature(msg, sig.as_str(), &pkey));
274274
}
275+
276+
#[test]
277+
fn connection_restart_behavior() {
278+
do_connection_restart_behavior(true);
279+
do_connection_restart_behavior(false);
280+
}
281+
282+
fn do_connection_restart_behavior(persist: bool) {
283+
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
284+
let (node_a, node_b) = setup_two_nodes(&electrsd, false);
285+
286+
let node_id_a = node_a.node_id();
287+
let node_id_b = node_b.node_id();
288+
289+
let node_addr_b = node_b.listening_addresses().unwrap().first().unwrap().clone();
290+
std::thread::sleep(std::time::Duration::from_secs(1));
291+
node_a.connect(node_id_b, node_addr_b, persist).unwrap();
292+
293+
let peer_details_a = node_a.list_peers().first().unwrap().clone();
294+
assert_eq!(peer_details_a.node_id, node_id_b);
295+
assert_eq!(peer_details_a.is_persisted, persist);
296+
assert!(peer_details_a.is_connected);
297+
298+
let peer_details_b = node_b.list_peers().first().unwrap().clone();
299+
assert_eq!(peer_details_b.node_id, node_id_a);
300+
assert_eq!(peer_details_b.is_persisted, false);
301+
assert!(peer_details_a.is_connected);
302+
303+
// Restart nodes.
304+
node_a.stop().unwrap();
305+
node_b.stop().unwrap();
306+
node_b.start().unwrap();
307+
node_a.start().unwrap();
308+
309+
// Sleep a bit to allow for the reconnect to happen.
310+
std::thread::sleep(std::time::Duration::from_secs(5));
311+
312+
if persist {
313+
let peer_details_a = node_a.list_peers().first().unwrap().clone();
314+
assert_eq!(peer_details_a.node_id, node_id_b);
315+
assert_eq!(peer_details_a.is_persisted, persist);
316+
assert!(peer_details_a.is_connected);
317+
318+
let peer_details_b = node_b.list_peers().first().unwrap().clone();
319+
assert_eq!(peer_details_b.node_id, node_id_a);
320+
assert_eq!(peer_details_b.is_persisted, false);
321+
assert!(peer_details_a.is_connected);
322+
} else {
323+
assert!(node_a.list_peers().is_empty());
324+
assert!(node_b.list_peers().is_empty());
325+
}
326+
}

0 commit comments

Comments
 (0)