Skip to content

Commit 7828343

Browse files
Track persistent_monitor_events flag in Channel{Monitor,Mgr}
Also add provided_monitor_event_ids tracking in ChannelMonitor, which is in-memory only.
1 parent b2d15a2 commit 7828343

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

lightning/src/chain/channelmonitor.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,12 @@ pub(crate) struct ChannelMonitorImpl<Signer: EcdsaChannelSigner> {
12911291
// we further MUST NOT generate events during block/transaction-disconnection.
12921292
pending_monitor_events: Vec<(u64, MonitorEvent)>,
12931293
next_monitor_event_id: u64,
1294+
/// Tracks which monitor events have already been returned to the caller during this runtime
1295+
/// session. In-memory only — on restart this is empty, so all unacked events are re-provided.
1296+
provided_monitor_event_ids: HashSet<u64>,
1297+
/// When set, monitor events are retained until explicitly acked rather than cleared on read.
1298+
/// In-memory only.
1299+
persistent_events_enabled: bool,
12941300

12951301
pub(super) pending_events: Vec<Event>,
12961302
pub(super) is_processing_pending_events: bool,
@@ -1774,6 +1780,7 @@ pub(crate) fn write_chanmon_internal<Signer: EcdsaChannelSigner, W: Writer>(
17741780
(37, channel_monitor.funding_seen_onchain, required),
17751781
(39, channel_monitor.next_monitor_event_id, required),
17761782
(41, monitor_event_ids, required_vec),
1783+
(43, channel_monitor.persistent_events_enabled, required),
17771784
});
17781785

17791786
Ok(())
@@ -1958,6 +1965,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
19581965
payment_preimages: new_hash_map(),
19591966
pending_monitor_events: Vec::new(),
19601967
next_monitor_event_id: 0,
1968+
provided_monitor_event_ids: new_hash_set(),
1969+
persistent_events_enabled: false,
19611970
pending_events: Vec::new(),
19621971
is_processing_pending_events: false,
19631972

@@ -6563,6 +6572,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
65636572
let mut funding_seen_onchain = RequiredWrapper(None);
65646573
let mut next_monitor_event_id = RequiredWrapper(None);
65656574
let mut monitor_event_ids: Option<Vec<u64>> = None;
6575+
let mut persistent_events_enabled = false;
65666576
read_tlv_fields!(reader, {
65676577
(1, funding_spend_confirmed, option),
65686578
(3, htlcs_resolved_on_chain, optional_vec),
@@ -6587,6 +6597,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
65876597
(37, funding_seen_onchain, (default_value, true)),
65886598
(39, next_monitor_event_id, (default_value, 0u64)),
65896599
(41, monitor_event_ids, optional_vec),
6600+
(43, persistent_events_enabled, (default_value, false)),
65906601
});
65916602
// Note that `payment_preimages_with_info` was added (and is always written) in LDK 0.1, so
65926603
// we can use it to determine if this monitor was last written by LDK 0.1 or later.
@@ -6755,6 +6766,8 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
67556766
payment_preimages,
67566767
pending_monitor_events,
67576768
next_monitor_event_id,
6769+
provided_monitor_event_ids: new_hash_set(),
6770+
persistent_events_enabled,
67586771
pending_events,
67596772
is_processing_pending_events: false,
67606773

lightning/src/ln/channelmanager.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2994,6 +2994,9 @@ pub struct ChannelManager<
29942994
/// offer they resolve to to the given one.
29952995
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
29962996

2997+
/// When set, new monitors will have persistent events enabled.
2998+
persistent_monitor_events: bool,
2999+
29973000
#[cfg(test)]
29983001
pub(super) entropy_source: ES,
29993002
#[cfg(not(test))]
@@ -3683,6 +3686,8 @@ impl<
36833686

36843687
logger,
36853688

3689+
persistent_monitor_events: false,
3690+
36863691
#[cfg(feature = "_test_utils")]
36873692
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
36883693
}
@@ -18092,6 +18097,7 @@ impl<
1809218097
(17, in_flight_monitor_updates, option),
1809318098
(19, peer_storage_dir, optional_vec),
1809418099
(21, WithoutLength(&self.flow.writeable_async_receive_offer_cache()), required),
18100+
(23, self.persistent_monitor_events, required),
1809518101
});
1809618102

1809718103
// Remove the SpliceFailed and DiscardFunding events added earlier.
@@ -18185,6 +18191,7 @@ pub(super) struct ChannelManagerData<SP: SignerProvider> {
1818518191
forward_htlcs_legacy: HashMap<u64, Vec<HTLCForwardInfo>>,
1818618192
pending_intercepted_htlcs_legacy: HashMap<InterceptId, PendingAddHTLCInfo>,
1818718193
decode_update_add_htlcs_legacy: HashMap<u64, Vec<msgs::UpdateAddHTLC>>,
18194+
persistent_monitor_events: bool,
1818818195
// The `ChannelManager` version that was written.
1818918196
version: u8,
1819018197
}
@@ -18370,6 +18377,7 @@ impl<'a, ES: EntropySource, SP: SignerProvider, L: Logger>
1837018377
let mut inbound_payment_id_secret = None;
1837118378
let mut peer_storage_dir: Option<Vec<(PublicKey, Vec<u8>)>> = None;
1837218379
let mut async_receive_offer_cache: AsyncReceiveOfferCache = AsyncReceiveOfferCache::new();
18380+
let mut persistent_monitor_events = false;
1837318381
read_tlv_fields!(reader, {
1837418382
(1, pending_outbound_payments_no_retry, option),
1837518383
(2, pending_intercepted_htlcs_legacy, option),
@@ -18388,6 +18396,7 @@ impl<'a, ES: EntropySource, SP: SignerProvider, L: Logger>
1838818396
(17, in_flight_monitor_updates, option),
1838918397
(19, peer_storage_dir, optional_vec),
1839018398
(21, async_receive_offer_cache, (default_value, async_receive_offer_cache)),
18399+
(23, persistent_monitor_events, (default_value, false)),
1839118400
});
1839218401

1839318402
// Merge legacy pending_outbound_payments fields into a single HashMap.
@@ -18506,6 +18515,7 @@ impl<'a, ES: EntropySource, SP: SignerProvider, L: Logger>
1850618515
peer_storage_dir: peer_storage_dir.unwrap_or_default(),
1850718516
async_receive_offer_cache,
1850818517
version,
18518+
persistent_monitor_events,
1850918519
})
1851018520
}
1851118521
}
@@ -18807,6 +18817,7 @@ impl<
1880718817
mut in_flight_monitor_updates,
1880818818
peer_storage_dir,
1880918819
async_receive_offer_cache,
18820+
persistent_monitor_events,
1881018821
version: _version,
1881118822
} = data;
1881218823

@@ -20072,6 +20083,8 @@ impl<
2007220083
logger: args.logger,
2007320084
config: RwLock::new(args.config),
2007420085

20086+
persistent_monitor_events,
20087+
2007520088
#[cfg(feature = "_test_utils")]
2007620089
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
2007720090
};

0 commit comments

Comments
 (0)