Skip to content

Commit aa71e8c

Browse files
committed
accelerate local syncing mechanism to first take all announcements, and then all updates
1 parent 01056d3 commit aa71e8c

File tree

3 files changed

+52
-45
lines changed

3 files changed

+52
-45
lines changed

lightning-graph-sync/src/lib.rs

+29-3
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ where
5454

5555
#[cfg(test)]
5656
mod tests {
57-
use bitcoin::blockdata::constants::genesis_block;
57+
use std::time::Instant;
58+
use bitcoin::blockdata::constants::genesis_block;
5859
use bitcoin::Network;
5960

60-
use lightning::routing::network_graph::NetworkGraph;
61+
use lightning::routing::network_graph::NetworkGraph;
6162

6263
use crate::error::GraphSyncError;
63-
use crate::sync_network_graph_with_url;
64+
use crate::{sync_network_graph_with_file_path, sync_network_graph_with_url};
6465

6566

6667

@@ -92,4 +93,29 @@ mod tests {
9293

9394
assert!(sync_result.is_ok())
9495
}
96+
97+
#[test]
98+
fn test_file_load() {
99+
let block_hash = genesis_block(Network::Bitcoin).block_hash();
100+
let network_graph = NetworkGraph::new(block_hash);
101+
102+
let chain_source: Option<Box<dyn lightning::chain::Access>> = None;
103+
104+
let start = Instant::now();
105+
106+
let path = "/Users/arik/Developer/rust-lightning/lightning-graph-sync/res/full_compressed.lngossip";
107+
// let path = "/Users/arik/Developer/rust-lightning/lightning-graph-sync/res/one_day.lngossip";
108+
// let path = "/Users/arik/Developer/rust-lightning/lightning-graph-sync/res/one_week.lngossip";
109+
110+
let sync_result = sync_network_graph_with_file_path(
111+
&network_graph,
112+
path,
113+
&chain_source,
114+
);
115+
116+
let duration = start.elapsed();
117+
let elapsed_time = format!("{:?}", duration);
118+
119+
println!("sync result: {}, time: {}", sync_result.is_ok(), elapsed_time);
120+
}
95121
}

lightning-graph-sync/src/processing.rs

+21-41
Original file line numberDiff line numberDiff line change
@@ -50,48 +50,28 @@ where
5050

5151
// shadow variable for ownership release after length-restricted reads
5252
let mut read_cursor = read_cursor;
53-
loop {
54-
let message_length_result = Readable::read(read_cursor);
55-
let message_length: BigSize = if let Ok(message_length) = message_length_result {
56-
message_length
57-
} else if let Err(msgs::DecodeError::ShortRead) = message_length_result {
58-
break;
59-
} else {
60-
return Err(message_length_result.err().unwrap().into());
61-
};
62-
// let mut restricted_cursor = FixedLengthReader::new(&read_cursor, message_length.0);
63-
let mut restricted_cursor = read_cursor.take(message_length.0);
64-
65-
let message_type: u16 = Readable::read(&mut restricted_cursor)?;
66-
67-
let update_result = match message_type {
68-
msgs::ChannelAnnouncement::TYPE => {
69-
let channel_announcement: msgs::UnsignedChannelAnnouncement =
70-
Readable::read(&mut restricted_cursor).unwrap();
71-
network_graph
72-
.update_channel_from_unsigned_announcement(&channel_announcement, &chain_source)
73-
}
74-
msgs::NodeAnnouncement::TYPE => {
75-
let node_announcement: msgs::UnsignedNodeAnnouncement =
76-
Readable::read(&mut restricted_cursor)?;
77-
network_graph.update_node_from_unsigned_announcement(&node_announcement)
78-
}
79-
msgs::ChannelUpdate::TYPE => {
80-
let channel_update: msgs::UnsignedChannelUpdate =
81-
Readable::read(&mut restricted_cursor)?;
82-
network_graph.update_channel_unsigned(&channel_update)
83-
}
84-
_ => {
85-
let error_string = format!("Unexpected graph sync message type: {}", message_type);
86-
return Err(GraphSyncError::ProcessingError(error_string));
87-
}
88-
};
8953

90-
// propagate the error
91-
let _update = update_result?;
92-
93-
read_cursor = restricted_cursor.into_inner();
94-
}
54+
let announcement_count: BigSize = Readable::read(read_cursor)?;
55+
for _ in 0..announcement_count.0 {
56+
let message_length: BigSize = Readable::read(read_cursor)?;
57+
let mut restricted_cursor = read_cursor.take(message_length.0);
58+
let channel_announcement: msgs::UnsignedChannelAnnouncement =
59+
Readable::read(&mut restricted_cursor).unwrap();
60+
network_graph.update_channel_from_unsigned_announcement(&channel_announcement, &chain_source)?;
61+
62+
read_cursor = restricted_cursor.into_inner();
63+
}
64+
65+
let update_count: BigSize = Readable::read(read_cursor)?;
66+
for _ in 0..update_count.0 {
67+
let message_length: BigSize = Readable::read(read_cursor)?;
68+
let mut restricted_cursor = read_cursor.take(message_length.0);
69+
let channel_update: msgs::UnsignedChannelUpdate =
70+
Readable::read(&mut restricted_cursor).unwrap();
71+
network_graph.update_channel_unsigned(&channel_update)?;
72+
73+
read_cursor = restricted_cursor.into_inner();
74+
}
9575

9676
Ok(())
9777
}

lightning/src/ln/wire.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ pub(crate) fn write<M: Type + Writeable, W: Writer>(message: &M, buffer: &mut W)
242242
message.write(buffer)
243243
}
244244

245-
mod encode {
245+
/// Encode module (should really be private, but exposure necessary for graph sync)
246+
pub mod encode {
246247
/// Defines a constant type identifier for reading messages from the wire.
247248
pub trait Encode {
248249
/// The type identifying the message payload.

0 commit comments

Comments
 (0)