Skip to content

Commit 8179da7

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 c7ecab1 commit 8179da7

File tree

1 file changed

+78
-44
lines changed

1 file changed

+78
-44
lines changed

lightning/src/routing/scoring.rs

Lines changed: 78 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
})
@@ -1843,7 +1882,7 @@ impl Readable for ChannelLiquidity {
18431882

18441883
#[cfg(test)]
18451884
mod tests {
1846-
use super::{ChannelLiquidity, HistoricalBucketRangeTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
1885+
use super::{ChannelLiquidity, HistoricalLiquidityTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
18471886
use crate::blinded_path::{BlindedHop, BlindedPath, IntroductionNode};
18481887
use crate::util::config::UserConfig;
18491888

@@ -2016,15 +2055,13 @@ mod tests {
20162055
ChannelLiquidity {
20172056
min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
20182057
last_updated, offset_history_last_updated,
2019-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2020-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2058+
liquidity_history: HistoricalLiquidityTracker::new(),
20212059
})
20222060
.with_channel(43,
20232061
ChannelLiquidity {
20242062
min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
20252063
last_updated, offset_history_last_updated,
2026-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2027-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2064+
liquidity_history: HistoricalLiquidityTracker::new(),
20282065
});
20292066
let source = source_node_id();
20302067
let target = target_node_id();
@@ -2097,8 +2134,7 @@ mod tests {
20972134
ChannelLiquidity {
20982135
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
20992136
last_updated, offset_history_last_updated,
2100-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2101-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2137+
liquidity_history: HistoricalLiquidityTracker::new(),
21022138
});
21032139
let source = source_node_id();
21042140
let target = target_node_id();
@@ -2158,8 +2194,7 @@ mod tests {
21582194
ChannelLiquidity {
21592195
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
21602196
last_updated, offset_history_last_updated,
2161-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2162-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2197+
liquidity_history: HistoricalLiquidityTracker::new(),
21632198
});
21642199
let source = source_node_id();
21652200
let target = target_node_id();
@@ -2278,8 +2313,7 @@ mod tests {
22782313
ChannelLiquidity {
22792314
min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40,
22802315
last_updated, offset_history_last_updated,
2281-
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2282-
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2316+
liquidity_history: HistoricalLiquidityTracker::new(),
22832317
});
22842318
let source = source_node_id();
22852319

0 commit comments

Comments
 (0)