Skip to content

Commit c4df3c3

Browse files
committed
Cache the total points tracked in our historical liquidity data
When we go to score a channel using the historical liquidity data, the first thing we do is step through all the valid bucket combinations, multiply the min and max bucket, and then add them together to calculate the total number of points tracked. This isn't a free operation, and for scorers without much data it represents a large part of the total time spent scoring during routefinding. Thus, here we cache this value, updating it every time the buckets are updated.
1 parent 6d31c04 commit c4df3c3

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

lightning/src/routing/scoring.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1634,24 +1634,29 @@ mod bucketed_history {
16341634
pub(super) struct HistoricalLiquidityTracker {
16351635
min_liquidity_offset_history: HistoricalBucketRangeTracker,
16361636
max_liquidity_offset_history: HistoricalBucketRangeTracker,
1637+
total_valid_points_tracked: u64,
16371638
}
16381639

16391640
impl HistoricalLiquidityTracker {
16401641
pub(super) fn new() -> HistoricalLiquidityTracker {
16411642
HistoricalLiquidityTracker {
16421643
min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
16431644
max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1645+
total_valid_points_tracked: 0,
16441646
}
16451647
}
16461648

16471649
pub(super) fn from_min_max(
16481650
min_liquidity_offset_history: HistoricalBucketRangeTracker,
16491651
max_liquidity_offset_history: HistoricalBucketRangeTracker,
16501652
) -> HistoricalLiquidityTracker {
1651-
HistoricalLiquidityTracker {
1653+
let mut res = HistoricalLiquidityTracker {
16521654
min_liquidity_offset_history,
16531655
max_liquidity_offset_history,
1654-
}
1656+
total_valid_points_tracked: 0,
1657+
};
1658+
res.recalculate_valid_point_count();
1659+
res
16551660
}
16561661

16571662
pub(super) fn has_datapoints(&self) -> bool {
@@ -1667,6 +1672,16 @@ mod bucketed_history {
16671672
for bucket in self.max_liquidity_offset_history.buckets.iter_mut() {
16681673
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
16691674
}
1675+
self.recalculate_valid_point_count();
1676+
}
1677+
1678+
fn recalculate_valid_point_count(&mut self) {
1679+
self.total_valid_points_tracked = 0;
1680+
for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate() {
1681+
for max_bucket in self.max_liquidity_offset_history.buckets.iter().take(32 - min_idx) {
1682+
self.total_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1683+
}
1684+
}
16701685
}
16711686

16721687
pub(super) fn writeable_min_offset_history(&self) -> &HistoricalBucketRangeTracker {
@@ -1706,6 +1721,7 @@ mod bucketed_history {
17061721
self.tracker.max_liquidity_offset_history.track_datapoint(min_offset_msat, capacity_msat);
17071722
self.tracker.min_liquidity_offset_history.track_datapoint(max_offset_msat, capacity_msat);
17081723
}
1724+
self.tracker.recalculate_valid_point_count();
17091725
}
17101726
}
17111727

@@ -1746,11 +1762,15 @@ mod bucketed_history {
17461762
let max_liquidity_offset_history_buckets =
17471763
self.max_liquidity_offset_history_buckets();
17481764

1749-
let mut total_valid_points_tracked = 0;
1750-
for (min_idx, min_bucket) in min_liquidity_offset_history_buckets.iter().enumerate() {
1751-
for max_bucket in max_liquidity_offset_history_buckets.iter().take(32 - min_idx) {
1752-
total_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1765+
let total_valid_points_tracked = self.tracker.total_valid_points_tracked;
1766+
#[cfg(debug_assertions)] {
1767+
let mut actual_valid_points_tracked = 0;
1768+
for (min_idx, min_bucket) in min_liquidity_offset_history_buckets.iter().enumerate() {
1769+
for max_bucket in max_liquidity_offset_history_buckets.iter().take(32 - min_idx) {
1770+
actual_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1771+
}
17531772
}
1773+
assert_eq!(total_valid_points_tracked, actual_valid_points_tracked);
17541774
}
17551775

17561776
// If the total valid points is smaller than 1.0 (i.e. 32 in our fixed-point scheme),

0 commit comments

Comments
 (0)