]> git.bitcoin.ninja Git - rust-lightning/commit
Add a `RAAMonitorUpdateBlockingAction::ClaimedMPPPayment`
authorMatt Corallo <git@bluematt.me>
Tue, 14 May 2024 00:03:39 +0000 (00:03 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 8 Jul 2024 19:06:59 +0000 (19:06 +0000)
commit8933a71aed0e277f071eda86ad08fe3958481f1e
tree41121abad1f9b4411f4865a02e03c5dda9b9b504
parent453ed11f80b40f28b6e95a74b1f7ed2cd7f012ad
Add a `RAAMonitorUpdateBlockingAction::ClaimedMPPPayment`

If we claim an MPP payment and only persist some of the
`ChannelMonitorUpdate`s which include the preimage prior to
shutting down, we may be in a state where some of our
`ChannelMonitor`s have the preimage for a payment while others do
not.

This, it turns out, is actually mostly safe - on startup
`ChanelManager` will detect there's a payment it has as unclaimed
but there's a corresponding payment preimage in a `ChannelMonitor`
and go claim the other MPP parts. This works so long as the
`ChannelManager` has been persisted after the payment has been
received but prior to the `PaymentClaimable` event being processed
(and the claim itself occurring). This is not always true and
certainly not required on our API, but our
`lightning-background-processor` today does persist prior to event
handling so is generally true subject to some race conditions.

In order to address this race we need to use copy payment preimages
across channels irrespective of the `ChannelManager`'s payment
state, but this introduces another wrinkle - if one channel makes
substantial progress while other channel(s) are still waiting to
get the payment preimage in `ChannelMonitor`(s) while the
`ChannelManager` hasn't been persisted after the payment was
received, we may end up without the preimage on disk.

Here, we address this issue with a new
`RAAMonitorUpdateBlockingAction` variant for this specific case. We
block persistence of an RAA `ChannelMonitorUpdate` which may remove
the preimage from disk until all channels have had the preimage
added to their `ChannelMonitor`.

We do this only in-memory (and not on disk) as we can recreate this
blocker during the startup re-claim logic.

This will enable us to claim MPP parts without using the
`ChannelManager`'s payment state in later work.
lightning/src/ln/channelmanager.rs