Skip to content

Commit e510185

Browse files
TheBlueMattclaude
andcommitted
Make Event::PersistClaimInfo optional
While downstream code can always ignore `Event::PersistClaimInfo`, the generation of them can be somewhat expensive, so we thus allow downstream logic to disable them entirely here. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 937f854 commit e510185

14 files changed

Lines changed: 63 additions & 6 deletions

File tree

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ impl TestChainMonitor {
282282
Arc::clone(&persister),
283283
Arc::clone(&keys),
284284
keys.get_peer_storage_key(),
285+
false,
285286
)),
286287
logger,
287288
keys,

fuzz/src/full_stack.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger + MaybeSend + MaybeSync>
603603
Arc::new(TestPersister { update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed) }),
604604
Arc::clone(&keys_manager),
605605
keys_manager.get_peer_storage_key(),
606+
false,
606607
));
607608

608609
let network = Network::Bitcoin;

fuzz/src/lsps_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub fn do_test(data: &[u8]) {
5959
Arc::clone(&kv_store),
6060
Arc::clone(&keys_manager),
6161
keys_manager.get_peer_storage_key(),
62+
false,
6263
));
6364
let best_block = BestBlock::from_network(network);
6465
let params = ChainParameters { network, best_block };

lightning-background-processor/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,6 +2444,7 @@ mod tests {
24442444
Arc::clone(&kv_store),
24452445
Arc::clone(&keys_manager),
24462446
keys_manager.get_peer_storage_key(),
2447+
false,
24472448
));
24482449
let best_block = BestBlock::from_network(network);
24492450
let params = ChainParameters { network, best_block };

lightning-persister/src/fs_store/v1.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ mod tests {
217217
&chanmon_cfgs[0].fee_estimator,
218218
&store,
219219
node_cfgs[0].keys_manager,
220+
false,
220221
);
221222
node_cfgs[0].chain_monitor = chain_mon_0;
222223
let node_chanmgrs = create_node_chanmgrs(1, &node_cfgs, &[None]);

lightning-persister/src/test_utils.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ pub(crate) fn do_test_store<K: KVStoreSync + Sync>(store_0: &K, store_1: &K) {
120120
&chanmon_cfgs[0].fee_estimator,
121121
store_0,
122122
node_cfgs[0].keys_manager,
123+
false,
123124
);
124125
let chain_mon_1 = test_utils::TestChainMonitor::new(
125126
Some(&chanmon_cfgs[1].chain_source),
@@ -128,6 +129,7 @@ pub(crate) fn do_test_store<K: KVStoreSync + Sync>(store_0: &K, store_1: &K) {
128129
&chanmon_cfgs[1].fee_estimator,
129130
store_1,
130131
node_cfgs[1].keys_manager,
132+
false,
131133
);
132134
node_cfgs[0].chain_monitor = chain_mon_0;
133135
node_cfgs[1].chain_monitor = chain_mon_1;

lightning/src/chain/chainmonitor.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,9 @@ pub struct ChainMonitor<
371371

372372
#[cfg(peer_storage)]
373373
our_peerstorage_encryption_key: PeerStorageKey,
374+
375+
/// If false, claim info persistence events are swallowed.
376+
offload_claim_info: bool,
374377
}
375378

376379
impl<
@@ -397,7 +400,7 @@ where
397400
pub fn new_async_beta(
398401
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F,
399402
persister: MonitorUpdatingPersisterAsync<K, S, L, ES, SP, T, F>, _entropy_source: ES,
400-
_our_peerstorage_encryption_key: PeerStorageKey,
403+
_our_peerstorage_encryption_key: PeerStorageKey, offload_claim_info: bool,
401404
) -> Self {
402405
let event_notifier = Arc::new(Notifier::new());
403406
Self {
@@ -414,6 +417,7 @@ where
414417
pending_send_only_events: Mutex::new(Vec::new()),
415418
#[cfg(peer_storage)]
416419
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
420+
offload_claim_info,
417421
}
418422
}
419423
}
@@ -590,6 +594,15 @@ where
590594
/// always need to fetch full blocks absent another means for determining which blocks contain
591595
/// transactions relevant to the watched channels.
592596
///
597+
/// If `offload_claim_info` is set to `true`, [`Event::PersistClaimInfo`] events will be
598+
/// surfaced, allowing callers to offload claim information from [`ChannelMonitor`]s to reduce
599+
/// their size. If set to `false`, these events will be silently ignored and the claim
600+
/// information will remain in-memory and in each [`ChannelMonitor`] on disk.
601+
///
602+
/// Note that no matter the value of `offload_claim_info`, [`Event::ClaimInfoRequest`]s will be
603+
/// surfaced if needed. If [`Event::PersistClaimInfo`]s have never been surfaced/handled for a
604+
/// node, no [`Event::ClaimInfoRequest`] will be generated.
605+
///
593606
/// # Note
594607
/// `our_peerstorage_encryption_key` must be obtained from [`NodeSigner::get_peer_storage_key`].
595608
/// This key is used to encrypt peer storage backups.
@@ -601,9 +614,12 @@ where
601614
/// [`NodeSigner`]: crate::sign::NodeSigner
602615
/// [`NodeSigner::get_peer_storage_key`]: crate::sign::NodeSigner::get_peer_storage_key
603616
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
617+
/// [`Event::PersistClaimInfo`]: crate::events::Event::PersistClaimInfo
618+
/// [`Event::ClaimInfoRequest`]: crate::events::Event::ClaimInfoRequest
604619
pub fn new(
605620
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
606621
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey,
622+
offload_claim_info: bool,
607623
) -> Self {
608624
Self {
609625
monitors: RwLock::new(new_hash_map()),
@@ -619,6 +635,7 @@ where
619635
pending_send_only_events: Mutex::new(Vec::new()),
620636
#[cfg(peer_storage)]
621637
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
638+
offload_claim_info,
622639
}
623640
}
624641

@@ -880,7 +897,17 @@ where
880897
self.monitors.read().unwrap().get(&channel_id).map(|m| &m.monitor),
881898
self.logger,
882899
ev,
883-
handler(ev).await
900+
{
901+
if !self.offload_claim_info {
902+
if let Event::PersistClaimInfo { .. } = &ev {
903+
Ok(())
904+
} else {
905+
handler(ev).await
906+
}
907+
} else {
908+
handler(ev).await
909+
}
910+
}
884911
) {
885912
Ok(()) => {},
886913
Err(ReplayEvent()) => {
@@ -1539,8 +1566,16 @@ where
15391566
where
15401567
H::Target: EventHandler,
15411568
{
1569+
let filtering_handler = |event: events::Event| {
1570+
if !self.offload_claim_info {
1571+
if let events::Event::PersistClaimInfo { .. } = &event {
1572+
return Ok(());
1573+
}
1574+
}
1575+
handler.handle_event(event)
1576+
};
15421577
for monitor_state in self.monitors.read().unwrap().values() {
1543-
match monitor_state.monitor.process_pending_events(&handler, &self.logger) {
1578+
match monitor_state.monitor.process_pending_events(&&filtering_handler, &self.logger) {
15441579
Ok(()) => {},
15451580
Err(ReplayEvent()) => {
15461581
self.event_notifier.notify();

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ fn test_monitor_and_persister_update_fail() {
108108
&chanmon_cfgs[0].fee_estimator,
109109
&persister,
110110
&node_cfgs[0].keys_manager,
111+
false,
111112
);
112113
assert_eq!(
113114
chain_mon.watch_channel(chan.2, new_monitor),
@@ -4931,6 +4932,7 @@ fn native_async_persist() {
49314932
native_async_persister,
49324933
Arc::clone(&keys_manager),
49334934
keys_manager.get_peer_storage_key(),
4935+
false,
49344936
);
49354937

49364938
// Write the initial ChannelMonitor async, testing primarily that the `MonitorEvent::Completed`

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21259,7 +21259,7 @@ pub mod bench {
2125921259

2126021260
let seed_a = [1u8; 32];
2126121261
let keys_manager_a = KeysManager::new(&seed_a, 42, 42, true);
21262-
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a, &keys_manager_a, keys_manager_a.get_peer_storage_key());
21262+
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a, &keys_manager_a, keys_manager_a.get_peer_storage_key(), false);
2126321263
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &message_router, &logger_a, &keys_manager_a, &keys_manager_a, &keys_manager_a, config.clone(), ChainParameters {
2126421264
network,
2126521265
best_block: BestBlock::from_network(network),
@@ -21269,7 +21269,7 @@ pub mod bench {
2126921269
let logger_b = test_utils::TestLogger::with_id("node a".to_owned());
2127021270
let seed_b = [2u8; 32];
2127121271
let keys_manager_b = KeysManager::new(&seed_b, 42, 42, true);
21272-
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b, &keys_manager_b, keys_manager_b.get_peer_storage_key());
21272+
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b, &keys_manager_b, keys_manager_b.get_peer_storage_key(), false);
2127321273
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &message_router, &logger_b, &keys_manager_b, &keys_manager_b, &keys_manager_b, config.clone(), ChainParameters {
2127421274
network,
2127521275
best_block: BestBlock::from_network(network),

lightning/src/ln/functional_test_utils.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
929929
&feeest,
930930
&persister,
931931
&self.keys_manager,
932+
false,
932933
);
933934
for deserialized_monitor in deserialized_monitors.drain(..) {
934935
let channel_id = deserialized_monitor.channel_id();
@@ -1444,6 +1445,7 @@ macro_rules! _reload_node_inner {
14441445
$node.fee_estimator,
14451446
&$persister,
14461447
&$node.keys_manager,
1448+
false,
14471449
);
14481450
$node.chain_monitor = &$new_chain_monitor;
14491451

@@ -4644,6 +4646,7 @@ where
46444646
&cfg.fee_estimator,
46454647
persisters[i],
46464648
&cfg.keys_manager,
4649+
false,
46474650
);
46484651

46494652
let seed = [i as u8; 32];

0 commit comments

Comments
 (0)