Skip to content

Commit 2bc55b2

Browse files
committed
Make BP's not_pruning_network_graph_until... test dual async-sync
1 parent f0b928b commit 2bc55b2

File tree

1 file changed

+94
-44
lines changed
  • lightning-background-processor/src

1 file changed

+94
-44
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 94 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,62 +1361,112 @@ mod tests {
13611361
}
13621362
}
13631363

1364+
macro_rules! do_test_not_pruning_network_graph_until_graph_sync_completion {
1365+
($nodes: expr, $receive: expr, $sleep: expr) => {
1366+
let features = ChannelFeatures::empty();
1367+
$nodes[0].network_graph.add_channel_from_partial_announcement(
1368+
42, 53, features, $nodes[0].node.get_our_node_id(), $nodes[1].node.get_our_node_id()
1369+
).expect("Failed to update channel from partial announcement");
1370+
let original_graph_description = $nodes[0].network_graph.to_string();
1371+
assert!(original_graph_description.contains("42: features: 0000, node_one:"));
1372+
assert_eq!($nodes[0].network_graph.read_only().channels().len(), 1);
1373+
1374+
loop {
1375+
$sleep;
1376+
let log_entries = $nodes[0].logger.lines.lock().unwrap();
1377+
let loop_counter = "Calling ChannelManager's timer_tick_occurred".to_string();
1378+
if *log_entries.get(&("lightning_background_processor".to_string(), loop_counter))
1379+
.unwrap_or(&0) > 1
1380+
{
1381+
// Wait until the loop has gone around at least twice.
1382+
break
1383+
}
1384+
}
1385+
1386+
let initialization_input = vec![
1387+
76, 68, 75, 1, 111, 226, 140, 10, 182, 241, 179, 114, 193, 166, 162, 70, 174, 99, 247,
1388+
79, 147, 30, 131, 101, 225, 90, 8, 156, 104, 214, 25, 0, 0, 0, 0, 0, 97, 227, 98, 218,
1389+
0, 0, 0, 4, 2, 22, 7, 207, 206, 25, 164, 197, 231, 230, 231, 56, 102, 61, 250, 251,
1390+
187, 172, 38, 46, 79, 247, 108, 44, 155, 48, 219, 238, 252, 53, 192, 6, 67, 2, 36, 125,
1391+
157, 176, 223, 175, 234, 116, 94, 248, 201, 225, 97, 235, 50, 47, 115, 172, 63, 136,
1392+
88, 216, 115, 11, 111, 217, 114, 84, 116, 124, 231, 107, 2, 158, 1, 242, 121, 152, 106,
1393+
204, 131, 186, 35, 93, 70, 216, 10, 237, 224, 183, 89, 95, 65, 3, 83, 185, 58, 138,
1394+
181, 64, 187, 103, 127, 68, 50, 2, 201, 19, 17, 138, 136, 149, 185, 226, 156, 137, 175,
1395+
110, 32, 237, 0, 217, 90, 31, 100, 228, 149, 46, 219, 175, 168, 77, 4, 143, 38, 128,
1396+
76, 97, 0, 0, 0, 2, 0, 0, 255, 8, 153, 192, 0, 2, 27, 0, 0, 0, 1, 0, 0, 255, 2, 68,
1397+
226, 0, 6, 11, 0, 1, 2, 3, 0, 0, 0, 2, 0, 40, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 3, 232,
1398+
0, 0, 0, 1, 0, 0, 0, 0, 58, 85, 116, 216, 255, 8, 153, 192, 0, 2, 27, 0, 0, 25, 0, 0,
1399+
0, 1, 0, 0, 0, 125, 255, 2, 68, 226, 0, 6, 11, 0, 1, 5, 0, 0, 0, 0, 29, 129, 25, 192,
1400+
];
1401+
$nodes[0].rapid_gossip_sync.update_network_graph_no_std(&initialization_input[..], Some(1642291930)).unwrap();
1402+
1403+
// this should have added two channels
1404+
assert_eq!($nodes[0].network_graph.read_only().channels().len(), 3);
1405+
1406+
$receive.expect("Network graph not pruned within deadline");
1407+
1408+
// all channels should now be pruned
1409+
assert_eq!($nodes[0].network_graph.read_only().channels().len(), 0);
1410+
}
1411+
}
1412+
13641413
#[test]
13651414
fn test_not_pruning_network_graph_until_graph_sync_completion() {
1415+
let (sender, receiver) = std::sync::mpsc::sync_channel(1);
1416+
13661417
let nodes = create_nodes(2, "test_not_pruning_network_graph_until_graph_sync_completion".to_string());
13671418
let data_dir = nodes[0].persister.get_data_dir();
1368-
let (sender, receiver) = std::sync::mpsc::sync_channel(1);
13691419
let persister = Arc::new(Persister::new(data_dir).with_graph_persistence_notifier(sender));
1370-
let network_graph = nodes[0].network_graph.clone();
1371-
let features = ChannelFeatures::empty();
1372-
network_graph.add_channel_from_partial_announcement(42, 53, features, nodes[0].node.get_our_node_id(), nodes[1].node.get_our_node_id())
1373-
.expect("Failed to update channel from partial announcement");
1374-
let original_graph_description = network_graph.to_string();
1375-
assert!(original_graph_description.contains("42: features: 0000, node_one:"));
1376-
assert_eq!(network_graph.read_only().channels().len(), 1);
13771420

13781421
let event_handler = |_: _| {};
13791422
let background_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].rapid_gossip_sync(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()));
13801423

1381-
loop {
1382-
let log_entries = nodes[0].logger.lines.lock().unwrap();
1383-
let loop_counter = "Calling ChannelManager's timer_tick_occurred".to_string();
1384-
if *log_entries.get(&("lightning_background_processor".to_string(), loop_counter))
1385-
.unwrap_or(&0) > 1
1386-
{
1387-
// Wait until the loop has gone around at least twice.
1388-
break
1389-
}
1390-
}
1391-
1392-
let initialization_input = vec![
1393-
76, 68, 75, 1, 111, 226, 140, 10, 182, 241, 179, 114, 193, 166, 162, 70, 174, 99, 247,
1394-
79, 147, 30, 131, 101, 225, 90, 8, 156, 104, 214, 25, 0, 0, 0, 0, 0, 97, 227, 98, 218,
1395-
0, 0, 0, 4, 2, 22, 7, 207, 206, 25, 164, 197, 231, 230, 231, 56, 102, 61, 250, 251,
1396-
187, 172, 38, 46, 79, 247, 108, 44, 155, 48, 219, 238, 252, 53, 192, 6, 67, 2, 36, 125,
1397-
157, 176, 223, 175, 234, 116, 94, 248, 201, 225, 97, 235, 50, 47, 115, 172, 63, 136,
1398-
88, 216, 115, 11, 111, 217, 114, 84, 116, 124, 231, 107, 2, 158, 1, 242, 121, 152, 106,
1399-
204, 131, 186, 35, 93, 70, 216, 10, 237, 224, 183, 89, 95, 65, 3, 83, 185, 58, 138,
1400-
181, 64, 187, 103, 127, 68, 50, 2, 201, 19, 17, 138, 136, 149, 185, 226, 156, 137, 175,
1401-
110, 32, 237, 0, 217, 90, 31, 100, 228, 149, 46, 219, 175, 168, 77, 4, 143, 38, 128,
1402-
76, 97, 0, 0, 0, 2, 0, 0, 255, 8, 153, 192, 0, 2, 27, 0, 0, 0, 1, 0, 0, 255, 2, 68,
1403-
226, 0, 6, 11, 0, 1, 2, 3, 0, 0, 0, 2, 0, 40, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 3, 232,
1404-
0, 0, 0, 1, 0, 0, 0, 0, 58, 85, 116, 216, 255, 8, 153, 192, 0, 2, 27, 0, 0, 25, 0, 0,
1405-
0, 1, 0, 0, 0, 125, 255, 2, 68, 226, 0, 6, 11, 0, 1, 5, 0, 0, 0, 0, 29, 129, 25, 192,
1406-
];
1407-
nodes[0].rapid_gossip_sync.update_network_graph_no_std(&initialization_input[..], Some(1642291930)).unwrap();
1408-
1409-
// this should have added two channels
1410-
assert_eq!(network_graph.read_only().channels().len(), 3);
1411-
1412-
receiver
1413-
.recv_timeout(Duration::from_secs(super::FIRST_NETWORK_PRUNE_TIMER * 5))
1414-
.expect("Network graph not pruned within deadline");
1424+
do_test_not_pruning_network_graph_until_graph_sync_completion!(nodes,
1425+
receiver.recv_timeout(Duration::from_secs(super::FIRST_NETWORK_PRUNE_TIMER * 5)),
1426+
std::thread::sleep(Duration::from_millis(1)));
14151427

14161428
background_processor.stop().unwrap();
1429+
}
1430+
1431+
#[tokio::test]
1432+
#[cfg(feature = "futures")]
1433+
async fn test_not_pruning_network_graph_until_graph_sync_completion_async() {
1434+
let (sender, receiver) = std::sync::mpsc::sync_channel(1);
1435+
1436+
let nodes = create_nodes(2, "test_not_pruning_network_graph_until_graph_sync_completion_async".to_string());
1437+
let data_dir = nodes[0].persister.get_data_dir();
1438+
let persister = Arc::new(Persister::new(data_dir).with_graph_persistence_notifier(sender));
14171439

1418-
// all channels should now be pruned
1419-
assert_eq!(network_graph.read_only().channels().len(), 0);
1440+
let (exit_sender, exit_receiver) = tokio::sync::watch::channel(());
1441+
let bp_future = super::process_events_async(
1442+
persister, |_: _| {async {}}, nodes[0].chain_monitor.clone(), nodes[0].node.clone(),
1443+
nodes[0].rapid_gossip_sync(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(),
1444+
Some(nodes[0].scorer.clone()), move |dur: Duration| {
1445+
let mut exit_receiver = exit_receiver.clone();
1446+
Box::pin(async move {
1447+
tokio::select! {
1448+
_ = tokio::time::sleep(dur) => false,
1449+
_ = exit_receiver.changed() => true,
1450+
}
1451+
})
1452+
}, false,
1453+
);
1454+
// TODO: Drop _local and simply spawn after #2003
1455+
let local_set = tokio::task::LocalSet::new();
1456+
local_set.spawn_local(bp_future);
1457+
local_set.spawn_local(async move {
1458+
do_test_not_pruning_network_graph_until_graph_sync_completion!(nodes, {
1459+
let mut i = 0;
1460+
loop {
1461+
tokio::time::sleep(Duration::from_secs(super::FIRST_NETWORK_PRUNE_TIMER)).await;
1462+
if let Ok(()) = receiver.try_recv() { break Ok::<(), ()>(()); }
1463+
assert!(i < 5);
1464+
i += 1;
1465+
}
1466+
}, tokio::time::sleep(Duration::from_millis(1)).await);
1467+
exit_sender.send(()).unwrap();
1468+
});
1469+
local_set.await;
14201470
}
14211471

14221472
macro_rules! do_test_payment_path_scoring {

0 commit comments

Comments
 (0)