Skip to content

Commit 6c69b9d

Browse files
committed
f only look up node details when relevant, and read addresses more efficiently
1 parent a7e8a83 commit 6c69b9d

File tree

1 file changed

+53
-52
lines changed

1 file changed

+53
-52
lines changed

lightning-rapid-gossip-sync/src/processing.rs

+53-52
Original file line numberDiff line numberDiff line change
@@ -143,65 +143,66 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
143143
let current_node_id = NodeId::from_pubkey(&current_pubkey);
144144
node_ids.push(current_pubkey);
145145

146-
let mut synthetic_node_announcement = UnsignedNodeAnnouncement {
147-
features: NodeFeatures::empty(),
148-
timestamp: backdated_timestamp,
149-
node_id: current_node_id,
150-
rgb: [0, 0, 0],
151-
alias: NodeAlias([0u8; 32]),
152-
addresses: Vec::new(),
153-
excess_address_data: Vec::new(),
154-
excess_data: Vec::new(),
155-
};
156-
157-
read_only_network_graph.nodes()
158-
.get(&current_node_id)
159-
.and_then(|node| node.announcement_info.as_ref())
160-
.map(|info| {
161-
synthetic_node_announcement.features = info.features().clone();
162-
synthetic_node_announcement.rgb = info.rgb().clone();
163-
synthetic_node_announcement.alias = info.alias().clone();
164-
synthetic_node_announcement.addresses = info.addresses().clone();
165-
});
166-
167-
if has_address_details {
168-
let address_count: u8 = Readable::read(read_cursor)?;
169-
let mut node_addresses: Vec<SocketAddress> = Vec::new();
170-
for address_index in 0..address_count {
171-
let current_byte_count: u8 = Readable::read(read_cursor)?;
172-
let mut address_reader = FixedLengthReader::new(&mut read_cursor, current_byte_count as u64);
173-
let mut address_bytes = Vec::new();
174-
address_reader.read_to_end(&mut address_bytes)?;
175-
176-
let mut address_cursor = io::Cursor::new(&address_bytes);
177-
if let Ok(current_address) = Readable::read(&mut address_cursor) {
178-
node_addresses.push(current_address);
179-
} else {
180-
// Do not crash to allow future socket address forwards compatibility
181-
log_gossip!(
146+
147+
if has_address_details || feature_detail_marker > 0 {
148+
let mut synthetic_node_announcement = UnsignedNodeAnnouncement {
149+
features: NodeFeatures::empty(),
150+
timestamp: backdated_timestamp,
151+
node_id: current_node_id,
152+
rgb: [0, 0, 0],
153+
alias: NodeAlias([0u8; 32]),
154+
addresses: Vec::new(),
155+
excess_address_data: Vec::new(),
156+
excess_data: Vec::new(),
157+
};
158+
159+
read_only_network_graph.nodes()
160+
.get(&current_node_id)
161+
.and_then(|node| node.announcement_info.as_ref())
162+
.map(|info| {
163+
synthetic_node_announcement.features = info.features().clone();
164+
synthetic_node_announcement.rgb = info.rgb().clone();
165+
synthetic_node_announcement.alias = info.alias().clone();
166+
synthetic_node_announcement.addresses = info.addresses().clone();
167+
});
168+
169+
if has_address_details {
170+
let address_count: u8 = Readable::read(read_cursor)?;
171+
let mut node_addresses: Vec<SocketAddress> = Vec::new();
172+
for address_index in 0..address_count {
173+
let current_byte_count: u8 = Readable::read(read_cursor)?;
174+
let mut address_reader = FixedLengthReader::new(&mut read_cursor, current_byte_count as u64);
175+
if let Ok(current_address) = Readable::read(&mut address_reader) {
176+
node_addresses.push(current_address);
177+
if address_reader.bytes_remain() {
178+
return Err(DecodeError::ShortRead.into());
179+
}
180+
} else {
181+
// Do not crash to allow future socket address forwards compatibility
182+
log_gossip!(
182183
self.logger,
183-
"Failure to parse address at index {} for node ID {}: {:?}",
184-
address_index, current_node_id, address_bytes
184+
"Failure to parse address at index {} for node ID {}",
185+
address_index, current_node_id
185186
);
187+
address_reader.eat_remaining()?;
188+
}
186189
}
190+
synthetic_node_announcement.addresses = node_addresses;
187191
}
188-
synthetic_node_announcement.addresses = node_addresses;
189-
}
190192

191-
if feature_detail_marker > 0 {
192-
if feature_detail_marker < 7 {
193-
let feature_index = (feature_detail_marker - 1) as usize;
194-
synthetic_node_announcement.features = default_node_features
195-
.get(feature_index)
196-
.ok_or(DecodeError::InvalidValue)?
197-
.clone();
198-
} else {
199-
let node_features: NodeFeatures = Readable::read(read_cursor)?;
200-
synthetic_node_announcement.features = node_features;
193+
if feature_detail_marker > 0 {
194+
if feature_detail_marker < 7 {
195+
let feature_index = (feature_detail_marker - 1) as usize;
196+
synthetic_node_announcement.features = default_node_features
197+
.get(feature_index)
198+
.ok_or(DecodeError::InvalidValue)?
199+
.clone();
200+
} else {
201+
let node_features: NodeFeatures = Readable::read(read_cursor)?;
202+
synthetic_node_announcement.features = node_features;
203+
}
201204
}
202-
}
203205

204-
if feature_detail_marker > 0 || has_address_details {
205206
node_modifications.push(synthetic_node_announcement);
206207
}
207208

0 commit comments

Comments
 (0)