@@ -16666,51 +16666,16 @@ where
16666
16666
);
16667
16667
match htlc_source {
16668
16668
HTLCSource::PreviousHopData(prev_hop_data) => {
16669
- let pending_forward_matches_htlc = |info: &PendingAddHTLCInfo| {
16670
- info.prev_funding_outpoint == prev_hop_data.outpoint
16671
- && info.prev_htlc_id == prev_hop_data.htlc_id
16672
- };
16673
- // The ChannelMonitor is now responsible for this HTLC's
16674
- // failure/success and will let us know what its outcome is. If we
16675
- // still have an entry for this HTLC in `forward_htlcs` or
16676
- // `pending_intercepted_htlcs`, we were apparently not persisted after
16677
- // the monitor was when forwarding the payment.
16678
- decode_update_add_htlcs.retain(|scid, update_add_htlcs| {
16679
- update_add_htlcs.retain(|update_add_htlc| {
16680
- let matches = *scid == prev_hop_data.short_channel_id &&
16681
- update_add_htlc.htlc_id == prev_hop_data.htlc_id;
16682
- if matches {
16683
- log_info!(logger, "Removing pending to-decode HTLC with hash {} as it was forwarded to the closed channel {}",
16684
- &htlc.payment_hash, &monitor.channel_id());
16685
- }
16686
- !matches
16687
- });
16688
- !update_add_htlcs.is_empty()
16689
- });
16690
- forward_htlcs.retain(|_, forwards| {
16691
- forwards.retain(|forward| {
16692
- if let HTLCForwardInfo::AddHTLC(htlc_info) = forward {
16693
- if pending_forward_matches_htlc(&htlc_info) {
16694
- log_info!(logger, "Removing pending to-forward HTLC with hash {} as it was forwarded to the closed channel {}",
16695
- &htlc.payment_hash, &monitor.channel_id());
16696
- false
16697
- } else { true }
16698
- } else { true }
16699
- });
16700
- !forwards.is_empty()
16701
- });
16702
- pending_intercepted_htlcs.as_mut().unwrap().retain(|intercepted_id, htlc_info| {
16703
- if pending_forward_matches_htlc(&htlc_info) {
16704
- log_info!(logger, "Removing pending intercepted HTLC with hash {} as it was forwarded to the closed channel {}",
16705
- &htlc.payment_hash, &monitor.channel_id());
16706
- pending_events_read.retain(|(event, _)| {
16707
- if let Event::HTLCIntercepted { intercept_id: ev_id, .. } = event {
16708
- intercepted_id != ev_id
16709
- } else { true }
16710
- });
16711
- false
16712
- } else { true }
16713
- });
16669
+ channel_monitor_recovery_internal(
16670
+ &mut forward_htlcs,
16671
+ &mut pending_events_read,
16672
+ &mut pending_intercepted_htlcs,
16673
+ &mut decode_update_add_htlcs,
16674
+ prev_hop_data,
16675
+ &logger,
16676
+ htlc.payment_hash,
16677
+ monitor.channel_id(),
16678
+ );
16714
16679
},
16715
16680
HTLCSource::TrampolineForward { .. } => todo!(),
16716
16681
HTLCSource::OutboundRoute {
@@ -17482,6 +17447,60 @@ where
17482
17447
}
17483
17448
}
17484
17449
17450
+ fn channel_monitor_recovery_internal(
17451
+ forward_htlcs: &mut HashMap<u64, Vec<HTLCForwardInfo>>,
17452
+ pending_events_read: &mut VecDeque<(Event, Option<EventCompletionAction>)>,
17453
+ pending_intercepted_htlcs: &mut Option<HashMap<InterceptId, PendingAddHTLCInfo>>,
17454
+ decode_update_add_htlcs: &mut HashMap<u64, Vec<msgs::UpdateAddHTLC>>,
17455
+ prev_hop_data: HTLCPreviousHopData, logger: &impl Logger, payment_hash: PaymentHash,
17456
+ channel_id: ChannelId,
17457
+ ) {
17458
+ let pending_forward_matches_htlc = |info: &PendingAddHTLCInfo| {
17459
+ info.prev_funding_outpoint == prev_hop_data.outpoint
17460
+ && info.prev_htlc_id == prev_hop_data.htlc_id
17461
+ };
17462
+ // The ChannelMonitor is now responsible for this HTLC's
17463
+ // failure/success and will let us know what its outcome is. If we
17464
+ // still have an entry for this HTLC in `forward_htlcs` or
17465
+ // `pending_intercepted_htlcs`, we were apparently not persisted after
17466
+ // the monitor was when forwarding the payment.
17467
+ decode_update_add_htlcs.retain(|scid, update_add_htlcs| {
17468
+ update_add_htlcs.retain(|update_add_htlc| {
17469
+ let matches = *scid == prev_hop_data.short_channel_id && update_add_htlc.htlc_id == prev_hop_data.htlc_id;
17470
+ if matches {
17471
+ log_info!(logger, "Removing pending to-decode HTLC with hash {} as it was forwarded to the closed channel {}",
17472
+ payment_hash, channel_id);
17473
+ }
17474
+ !matches
17475
+ });
17476
+ !update_add_htlcs.is_empty()
17477
+ });
17478
+ forward_htlcs.retain(|_, forwards| {
17479
+ forwards.retain(|forward| {
17480
+ if let HTLCForwardInfo::AddHTLC(htlc_info) = forward {
17481
+ if pending_forward_matches_htlc(&htlc_info) {
17482
+ log_info!(logger, "Removing pending to-forward HTLC with hash {} as it was forwarded to the closed channel {}",
17483
+ payment_hash, channel_id);
17484
+ false
17485
+ } else { true }
17486
+ } else { true }
17487
+ });
17488
+ !forwards.is_empty()
17489
+ });
17490
+ pending_intercepted_htlcs.as_mut().unwrap().retain(|intercepted_id, htlc_info| {
17491
+ if pending_forward_matches_htlc(&htlc_info) {
17492
+ log_info!(logger, "Removing pending intercepted HTLC with hash {} as it was forwarded to the closed channel {}",
17493
+ payment_hash, channel_id);
17494
+ pending_events_read.retain(|(event, _)| {
17495
+ if let Event::HTLCIntercepted { intercept_id: ev_id, .. } = event {
17496
+ intercepted_id != ev_id
17497
+ } else { true }
17498
+ });
17499
+ false
17500
+ } else { true }
17501
+ });
17502
+ }
17503
+
17485
17504
#[cfg(test)]
17486
17505
mod tests {
17487
17506
use crate::events::{ClosureReason, Event, HTLCHandlingFailureType};
0 commit comments