Skip to content

Commit 1ea4843

Browse files
committed
Avoid persisting on same counterparty's ChannelUpdate
Some nodes may rebroadcast their `ChannelUpdate` to their counterparty on every connection establishment, which leads to us doing an additional persist most of the time when nothing has changed. Now, we'll only persist if we receive an update that changes anything.
1 parent 082a19b commit 1ea4843

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

lightning/src/ln/channel.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5537,14 +5537,17 @@ impl<SP: Deref> Channel<SP> where
55375537
}
55385538
}
55395539

5540-
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) -> Result<(), ChannelError> {
5540+
/// Applies the `ChannelUpdate` and returns a boolean indicating whether a change actually
5541+
/// happened.
5542+
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) -> Result<bool, ChannelError> {
5543+
let prev_forwarding_info = self.context.counterparty_forwarding_info();
55415544
self.context.counterparty_forwarding_info = Some(CounterpartyForwardingInfo {
55425545
fee_base_msat: msg.contents.fee_base_msat,
55435546
fee_proportional_millionths: msg.contents.fee_proportional_millionths,
55445547
cltv_expiry_delta: msg.contents.cltv_expiry_delta
55455548
});
55465549

5547-
Ok(())
5550+
Ok(prev_forwarding_info != self.context.counterparty_forwarding_info)
55485551
}
55495552

55505553
/// Begins the shutdown process, getting a message for the remote peer and returning all
@@ -8140,7 +8143,7 @@ mod tests {
81408143
},
81418144
signature: Signature::from(unsafe { FFISignature::new() })
81428145
};
8143-
node_a_chan.channel_update(&update).unwrap();
8146+
assert!(node_a_chan.channel_update(&update).unwrap());
81448147

81458148
// The counterparty can send an update with a higher minimum HTLC, but that shouldn't
81468149
// change our official htlc_minimum_msat.
@@ -8153,6 +8156,8 @@ mod tests {
81538156
},
81548157
None => panic!("expected counterparty forwarding info to be Some")
81558158
}
8159+
8160+
assert!(!node_a_chan.channel_update(&update).unwrap());
81568161
}
81578162

81588163
#[cfg(feature = "_test_vectors")]

lightning/src/ln/channelmanager.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6757,7 +6757,12 @@ where
67576757
return Ok(NotifyOption::SkipPersistNoEvents);
67586758
} else {
67596759
log_debug!(self.logger, "Received channel_update {:?} for channel {}.", msg, chan_id);
6760-
try_chan_phase_entry!(self, chan.channel_update(&msg), chan_phase_entry);
6760+
let did_change = try_chan_phase_entry!(self, chan.channel_update(&msg), chan_phase_entry);
6761+
// If nothing changed after applying their update, we don't need to bother
6762+
// persisting.
6763+
if !did_change {
6764+
return Ok(NotifyOption::SkipPersistNoEvents);
6765+
}
67616766
}
67626767
} else {
67636768
return try_chan_phase_entry!(self, Err(ChannelError::Close(

0 commit comments

Comments
 (0)