]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Store source/target `node_counter`s in `DirectionalChannelInfo`
authorMatt Corallo <git@bluematt.me>
Fri, 8 Dec 2023 01:49:20 +0000 (01:49 +0000)
committerMatt Corallo <git@bluematt.me>
Wed, 10 Jul 2024 19:38:02 +0000 (19:38 +0000)
Because we now have some slack space in `PathBuildingHop`, we can
use it to cache some additional hot values. Here we use it to
cache the source and target `node_counter`s for public channels,
effectively prefetching the values from the channel state.

lightning/src/routing/gossip.rs
lightning/src/routing/router.rs

index 04aa174f362fef8b5dd9ca40da11f7619cfd197a..b0117cd68d39ba1e69da5749e32afd968732d68d 100644 (file)
@@ -1053,6 +1053,8 @@ impl Readable for ChannelInfo {
 pub struct DirectedChannelInfo<'a> {
        channel: &'a ChannelInfo,
        direction: &'a ChannelUpdateInfo,
+       source_counter: u32,
+       target_counter: u32,
        /// The direction this channel is in - if set, it indicates that we're traversing the channel
        /// from [`ChannelInfo::node_one`] to [`ChannelInfo::node_two`].
        from_node_one: bool,
@@ -1061,7 +1063,12 @@ pub struct DirectedChannelInfo<'a> {
 impl<'a> DirectedChannelInfo<'a> {
        #[inline]
        fn new(channel: &'a ChannelInfo, direction: &'a ChannelUpdateInfo, from_node_one: bool) -> Self {
-               Self { channel, direction, from_node_one }
+               let (source_counter, target_counter) = if from_node_one {
+                       (channel.node_one_counter, channel.node_two_counter)
+               } else {
+                       (channel.node_two_counter, channel.node_one_counter)
+               };
+               Self { channel, direction, from_node_one, source_counter, target_counter }
        }
 
        /// Returns information for the channel.
@@ -1104,12 +1111,12 @@ impl<'a> DirectedChannelInfo<'a> {
        pub fn target(&self) -> &'a NodeId { if self.from_node_one { &self.channel.node_two } else { &self.channel.node_one } }
 
        /// Returns the source node's counter
-       #[inline]
-       pub(super) fn source_counter(&self) -> u32 { if self.from_node_one { self.channel.node_one_counter } else { self.channel.node_two_counter } }
+       #[inline(always)]
+       pub(super) fn source_counter(&self) -> u32 { self.source_counter }
 
        /// Returns the target node's counter
-       #[inline]
-       pub(super) fn target_counter(&self) -> u32 { if self.from_node_one { self.channel.node_two_counter } else { self.channel.node_one_counter } }
+       #[inline(always)]
+       pub(super) fn target_counter(&self) -> u32 { self.target_counter }
 }
 
 impl<'a> fmt::Debug for DirectedChannelInfo<'a> {
index bbf73e531061684183a3c88e29e0ddc169e1fefa..58486c3da0f6c0e824fda3ecc597929f6af88e76 100644 (file)
@@ -1437,7 +1437,7 @@ impl<'a> CandidateRouteHop<'a> {
                }
        }
 
-       #[inline]
+       #[inline(always)]
        fn src_node_counter(&self) -> u32 {
                match self {
                        CandidateRouteHop::FirstHop(hop) => hop.payer_node_counter,