Skip to content

Commit 83c6263

Browse files
committed
Store both min and max historical buckets in one, new, struct
In the coming commits we'll isolate historical bucket logic slightly further, allowing us to cache some state. This is the first step towards that, storing the historical liquidity information in a new `HistoricalLiquidityTracker` rather than in the general `ChannelLiquidity`.
1 parent dcc84de commit 83c6263

File tree

1 file changed

+79
-44
lines changed

1 file changed

+79
-44
lines changed

lightning/src/routing/scoring.rs

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -790,8 +790,7 @@ struct ChannelLiquidity {
790790
/// Upper channel liquidity bound in terms of an offset from the effective capacity.
791791
max_liquidity_offset_msat: u64,
792792

793-
min_liquidity_offset_history: HistoricalBucketRangeTracker,
794-
max_liquidity_offset_history: HistoricalBucketRangeTracker,
793+
liquidity_history: HistoricalLiquidityTracker,
795794

796795
/// Time when either liquidity bound was last modified as an offset since the unix epoch.
797796
last_updated: Duration,
@@ -982,8 +981,7 @@ impl ChannelLiquidity {
982981
Self {
983982
min_liquidity_offset_msat: 0,
984983
max_liquidity_offset_msat: 0,
985-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
986-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
984+
liquidity_history: HistoricalLiquidityTracker::new(),
987985
last_updated,
988986
offset_history_last_updated: last_updated,
989987
}
@@ -994,22 +992,18 @@ impl ChannelLiquidity {
994992
fn as_directed(
995993
&self, source: &NodeId, target: &NodeId, capacity_msat: u64,
996994
) -> DirectedChannelLiquidity<&u64, &HistoricalBucketRangeTracker, &Duration> {
997-
let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
998-
if source < target {
999-
(&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat,
1000-
&self.min_liquidity_offset_history, &self.max_liquidity_offset_history)
995+
let source_less_than_target = source < target;
996+
let (min_liquidity_offset_msat, max_liquidity_offset_msat) =
997+
if source_less_than_target {
998+
(&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat)
1001999
} else {
1002-
(&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat,
1003-
&self.max_liquidity_offset_history, &self.min_liquidity_offset_history)
1000+
(&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat)
10041001
};
10051002

10061003
DirectedChannelLiquidity {
10071004
min_liquidity_offset_msat,
10081005
max_liquidity_offset_msat,
1009-
liquidity_history: HistoricalMinMaxBuckets {
1010-
min_liquidity_offset_history,
1011-
max_liquidity_offset_history,
1012-
},
1006+
liquidity_history: self.liquidity_history.as_directed(source_less_than_target),
10131007
capacity_msat,
10141008
last_updated: &self.last_updated,
10151009
offset_history_last_updated: &self.offset_history_last_updated,
@@ -1021,22 +1015,18 @@ impl ChannelLiquidity {
10211015
fn as_directed_mut(
10221016
&mut self, source: &NodeId, target: &NodeId, capacity_msat: u64,
10231017
) -> DirectedChannelLiquidity<&mut u64, &mut HistoricalBucketRangeTracker, &mut Duration> {
1024-
let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
1025-
if source < target {
1026-
(&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat,
1027-
&mut self.min_liquidity_offset_history, &mut self.max_liquidity_offset_history)
1018+
let source_less_than_target = source < target;
1019+
let (min_liquidity_offset_msat, max_liquidity_offset_msat) =
1020+
if source_less_than_target {
1021+
(&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat)
10281022
} else {
1029-
(&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat,
1030-
&mut self.max_liquidity_offset_history, &mut self.min_liquidity_offset_history)
1023+
(&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat)
10311024
};
10321025

10331026
DirectedChannelLiquidity {
10341027
min_liquidity_offset_msat,
10351028
max_liquidity_offset_msat,
1036-
liquidity_history: HistoricalMinMaxBuckets {
1037-
min_liquidity_offset_history,
1038-
max_liquidity_offset_history,
1039-
},
1029+
liquidity_history: self.liquidity_history.as_directed_mut(source_less_than_target),
10401030
capacity_msat,
10411031
last_updated: &mut self.last_updated,
10421032
offset_history_last_updated: &mut self.offset_history_last_updated,
@@ -1462,18 +1452,18 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ScoreUpdate for Probabilistic
14621452
let half_life = decay_params.historical_no_updates_half_life.as_secs_f64();
14631453
if half_life != 0.0 {
14641454
let divisor = powf64(2048.0, elapsed_time.as_secs_f64() / half_life) as u64;
1465-
for bucket in liquidity.min_liquidity_offset_history.buckets.iter_mut() {
1455+
for bucket in liquidity.liquidity_history.min_liquidity_offset_history.buckets.iter_mut() {
14661456
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
14671457
}
1468-
for bucket in liquidity.max_liquidity_offset_history.buckets.iter_mut() {
1458+
for bucket in liquidity.liquidity_history.max_liquidity_offset_history.buckets.iter_mut() {
14691459
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
14701460
}
14711461
liquidity.offset_history_last_updated = duration_since_epoch;
14721462
}
14731463
}
14741464
liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 ||
1475-
liquidity.min_liquidity_offset_history.buckets != [0; 32] ||
1476-
liquidity.max_liquidity_offset_history.buckets != [0; 32]
1465+
liquidity.liquidity_history.min_liquidity_offset_history.buckets != [0; 32] ||
1466+
liquidity.liquidity_history.max_liquidity_offset_history.buckets != [0; 32]
14771467
});
14781468
}
14791469
}
@@ -1648,6 +1638,54 @@ mod bucketed_history {
16481638
impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
16491639
impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
16501640

1641+
1642+
#[derive(Clone, Copy)]
1643+
pub(super) struct HistoricalLiquidityTracker {
1644+
pub(super) min_liquidity_offset_history: HistoricalBucketRangeTracker,
1645+
pub(super) max_liquidity_offset_history: HistoricalBucketRangeTracker,
1646+
}
1647+
1648+
impl HistoricalLiquidityTracker {
1649+
pub(super) fn new() -> HistoricalLiquidityTracker {
1650+
HistoricalLiquidityTracker {
1651+
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1652+
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1653+
}
1654+
}
1655+
1656+
pub(super) fn from_min_max(
1657+
min_liquidity_offset_history: HistoricalBucketRangeTracker,
1658+
max_liquidity_offset_history: HistoricalBucketRangeTracker,
1659+
) -> HistoricalLiquidityTracker {
1660+
HistoricalLiquidityTracker {
1661+
min_liquidity_offset_history,
1662+
max_liquidity_offset_history,
1663+
}
1664+
}
1665+
1666+
pub(super) fn as_directed<'a>(&'a self, source_less_than_target: bool)
1667+
-> HistoricalMinMaxBuckets<&'a HistoricalBucketRangeTracker> {
1668+
let (min_liquidity_offset_history, max_liquidity_offset_history) =
1669+
if source_less_than_target {
1670+
(&self.min_liquidity_offset_history, &self.max_liquidity_offset_history)
1671+
} else {
1672+
(&self.max_liquidity_offset_history, &self.min_liquidity_offset_history)
1673+
};
1674+
HistoricalMinMaxBuckets { min_liquidity_offset_history, max_liquidity_offset_history }
1675+
}
1676+
1677+
pub(super) fn as_directed_mut<'a>(&'a mut self, source_less_than_target: bool)
1678+
-> HistoricalMinMaxBuckets<&'a mut HistoricalBucketRangeTracker> {
1679+
let (min_liquidity_offset_history, max_liquidity_offset_history) =
1680+
if source_less_than_target {
1681+
(&mut self.min_liquidity_offset_history, &mut self.max_liquidity_offset_history)
1682+
} else {
1683+
(&mut self.max_liquidity_offset_history, &mut self.min_liquidity_offset_history)
1684+
};
1685+
HistoricalMinMaxBuckets { min_liquidity_offset_history, max_liquidity_offset_history }
1686+
}
1687+
}
1688+
16511689
/// A set of buckets representing the history of where we've seen the minimum- and maximum-
16521690
/// liquidity bounds for a given channel.
16531691
pub(super) struct HistoricalMinMaxBuckets<D: Deref<Target = HistoricalBucketRangeTracker>> {
@@ -1745,7 +1783,7 @@ mod bucketed_history {
17451783
}
17461784
}
17471785
}
1748-
use bucketed_history::{LegacyHistoricalBucketRangeTracker, HistoricalBucketRangeTracker, HistoricalMinMaxBuckets};
1786+
use bucketed_history::{LegacyHistoricalBucketRangeTracker, HistoricalBucketRangeTracker, HistoricalMinMaxBuckets, HistoricalLiquidityTracker};
17491787

17501788
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> Writeable for ProbabilisticScorer<G, L> where L::Target: Logger {
17511789
#[inline]
@@ -1786,8 +1824,8 @@ impl Writeable for ChannelLiquidity {
17861824
(2, self.max_liquidity_offset_msat, required),
17871825
// 3 was the max_liquidity_offset_history in octile form
17881826
(4, self.last_updated, required),
1789-
(5, Some(self.min_liquidity_offset_history), option),
1790-
(7, Some(self.max_liquidity_offset_history), option),
1827+
(5, self.liquidity_history.min_liquidity_offset_history, required),
1828+
(7, self.liquidity_history.max_liquidity_offset_history, required),
17911829
(9, self.offset_history_last_updated, required),
17921830
});
17931831
Ok(())
@@ -1833,8 +1871,9 @@ impl Readable for ChannelLiquidity {
18331871
Ok(Self {
18341872
min_liquidity_offset_msat,
18351873
max_liquidity_offset_msat,
1836-
min_liquidity_offset_history: min_liquidity_offset_history.unwrap(),
1837-
max_liquidity_offset_history: max_liquidity_offset_history.unwrap(),
1874+
liquidity_history: HistoricalLiquidityTracker::from_min_max(
1875+
min_liquidity_offset_history.unwrap(), max_liquidity_offset_history.unwrap()
1876+
),
18381877
last_updated,
18391878
offset_history_last_updated: offset_history_last_updated.unwrap_or(last_updated),
18401879
})
@@ -1844,7 +1883,8 @@ impl Readable for ChannelLiquidity {
18441883
#[cfg(test)]
18451884
mod tests {
18461885
use super::{ChannelLiquidity, HistoricalBucketRangeTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
1847-
use crate::blinded_path::BlindedHop;
1886+
use super::{ChannelLiquidity, HistoricalLiquidityTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
1887+
use crate::blinded_path::{BlindedHop, BlindedPath, IntroductionNode};
18481888
use crate::util::config::UserConfig;
18491889

18501890
use crate::ln::channelmanager;
@@ -2016,15 +2056,13 @@ mod tests {
20162056
ChannelLiquidity {
20172057
min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
20182058
last_updated, offset_history_last_updated,
2019-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2020-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2059+
liquidity_history: HistoricalLiquidityTracker::new(),
20212060
})
20222061
.with_channel(43,
20232062
ChannelLiquidity {
20242063
min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
20252064
last_updated, offset_history_last_updated,
2026-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2027-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2065+
liquidity_history: HistoricalLiquidityTracker::new(),
20282066
});
20292067
let source = source_node_id();
20302068
let target = target_node_id();
@@ -2097,8 +2135,7 @@ mod tests {
20972135
ChannelLiquidity {
20982136
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
20992137
last_updated, offset_history_last_updated,
2100-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2101-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2138+
liquidity_history: HistoricalLiquidityTracker::new(),
21022139
});
21032140
let source = source_node_id();
21042141
let target = target_node_id();
@@ -2158,8 +2195,7 @@ mod tests {
21582195
ChannelLiquidity {
21592196
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
21602197
last_updated, offset_history_last_updated,
2161-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2162-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2198+
liquidity_history: HistoricalLiquidityTracker::new(),
21632199
});
21642200
let source = source_node_id();
21652201
let target = target_node_id();
@@ -2278,8 +2314,7 @@ mod tests {
22782314
ChannelLiquidity {
22792315
min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40,
22802316
last_updated, offset_history_last_updated,
2281-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2282-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2317+
liquidity_history: HistoricalLiquidityTracker::new(),
22832318
});
22842319
let source = source_node_id();
22852320

0 commit comments

Comments
 (0)