Skip to content

Commit d7790d2

Browse files
committed
ln: cache feerate by channel type for multi-channel updates
Add a cache by channel type for the cases where we're updating many channels at a time, to minimize calls to the fee estimator. We can't move this check out of the loop without duplicating the logic in holder_preferred_commitment_sat_per_1000_weight_for_type, so we settle for a cache to prevent duplicate queries.
1 parent 6849b77 commit d7790d2

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7223,6 +7223,7 @@ where
72237223
pub fn maybe_update_chan_fees(&self) {
72247224
PersistenceNotifierGuard::optionally_notify(self, || {
72257225
let mut should_persist = NotifyOption::SkipPersistNoEvents;
7226+
let mut feerate_cache = new_hash_map();
72267227

72277228
let per_peer_state = self.per_peer_state.read().unwrap();
72287229
for (_cp_id, peer_state_mutex) in per_peer_state.iter() {
@@ -7231,9 +7232,12 @@ where
72317232
for (chan_id, chan) in peer_state.channel_by_id.iter_mut()
72327233
.filter_map(|(chan_id, chan)| chan.as_funded_mut().map(|chan| (chan_id, chan)))
72337234
{
7234-
let new_feerate = selected_commitment_sat_per_1000_weight(
7235-
&self.fee_estimator, chan.funding.get_channel_type(),
7236-
);
7235+
let channel_type = chan.funding.get_channel_type();
7236+
let new_feerate = feerate_cache.get(channel_type).copied().or_else(|| {
7237+
let feerate = selected_commitment_sat_per_1000_weight(&self.fee_estimator, &channel_type);
7238+
feerate_cache.insert(channel_type.clone(), feerate);
7239+
Some(feerate)
7240+
}).unwrap();
72377241
let chan_needs_persist = self.update_channel_fee(chan_id, chan, new_feerate);
72387242
if chan_needs_persist == NotifyOption::DoPersist { should_persist = NotifyOption::DoPersist; }
72397243
}
@@ -7271,6 +7275,7 @@ where
72717275
let mut handle_errors: Vec<(Result<(), _>, _)> = Vec::new();
72727276
let mut timed_out_mpp_htlcs = Vec::new();
72737277
let mut pending_peers_awaiting_removal = Vec::new();
7278+
let mut feerate_cache = new_hash_map();
72747279

72757280
{
72767281
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -7282,9 +7287,12 @@ where
72827287
peer_state.channel_by_id.retain(|chan_id, chan| {
72837288
match chan.as_funded_mut() {
72847289
Some(funded_chan) => {
7285-
let new_feerate = selected_commitment_sat_per_1000_weight(
7286-
&self.fee_estimator, funded_chan.funding.get_channel_type(),
7287-
);
7290+
let channel_type = funded_chan.funding.get_channel_type();
7291+
let new_feerate = feerate_cache.get(channel_type).copied().or_else(|| {
7292+
let feerate = selected_commitment_sat_per_1000_weight(&self.fee_estimator, &channel_type);
7293+
feerate_cache.insert(channel_type.clone(), feerate);
7294+
Some(feerate)
7295+
}).unwrap();
72887296
let chan_needs_persist = self.update_channel_fee(chan_id, funded_chan, new_feerate);
72897297
if chan_needs_persist == NotifyOption::DoPersist { should_persist = NotifyOption::DoPersist; }
72907298

0 commit comments

Comments
 (0)