-
Notifications
You must be signed in to change notification settings - Fork 405
Delay RAA-after-next processing until PaymentSent is are handled #2112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Delay RAA-after-next processing until PaymentSent is are handled #2112
Conversation
6789818
to
6cb3b5e
Compare
Codecov ReportPatch coverage:
❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more. Additional details and impacted files@@ Coverage Diff @@
## main #2112 +/- ##
==========================================
+ Coverage 90.40% 90.79% +0.39%
==========================================
Files 106 106
Lines 56268 59332 +3064
Branches 56268 59332 +3064
==========================================
+ Hits 50868 53871 +3003
- Misses 5400 5461 +61
☔ View full report in Codecov by Sentry. |
6cb3b5e
to
26e3e00
Compare
c7e8f27
to
f94de18
Compare
e34dab6
to
031bd1b
Compare
578ca9b
to
3ff2911
Compare
422f630
to
efde36c
Compare
efde36c
to
9a36e4a
Compare
ba1207a
to
097fc94
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good to me pending a second reviewer!
097fc94
to
3df2604
Compare
Squashed without further changes. |
@@ -1152,7 +1152,7 @@ impl OutboundPayments { | |||
payment_id, | |||
payment_hash, | |||
path, | |||
}, None)); | |||
}, Some(ev_completion_action))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does PaymentPathSuccessful
also need the completion action? There's no coverage here, setting it to None
and all tests pass.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having it there means we won't lose PaymentPathSuccessful
events on a rare restart edge case, but currently isn't externally visible and will only have an impact if we change event handling (eg where event handling can return an err) - because users always have to handle all events in one big batch before we remove them, you either fully handle events or you don't handle any events. If we move to event handling being able to return an err, a user could handle one event and not the other and lose PaymentPathSuccessful
events, maybe. It doesn't matter much, really, but I'd prefer to leave it.
@@ -5928,10 +5938,16 @@ where | |||
let peer_state = &mut *peer_state_lock; | |||
match peer_state.channel_by_id.entry(msg.channel_id) { | |||
hash_map::Entry::Occupied(mut chan) => { | |||
let funding_txo = chan.get().context.get_funding_txo(); | |||
let (htlcs_to_fail, monitor_update_opt) = try_chan_entry!(self, chan.get_mut().revoke_and_ack(&msg, &self.fee_estimator, &self.logger), chan); | |||
let funding_txo_opt = chan.get().context.get_funding_txo(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: use expect
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It should have been added to this line, no? No big deal though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, unwraping on this line is unsafe and can panic, as we could receive an RAA message for a channel that isnt yet funded, and wouldnt fail until we call into channel...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, or would have, in the version of LDK when this code was written - before the channel split :)
3df2604
to
233b8ec
Compare
Ah, needs a rebase to fix some test compile errors. |
dcfd5d7
233b8ec
to
dcfd5d7
Compare
Rebased with the following additional diff:
|
dcfd5d7
to
4e93462
Compare
Needs rebase :( |
This is a trivial refactor which will be used in the next commit.
In 0ad1f4c we fixed a nasty bug where a failure to persist a `ChannelManager` faster than a `ChannelMonitor` could result in the loss of a `PaymentSent` event, eventually resulting in a `PaymentFailed` instead! As noted in that commit, there's still some risk, though its been substantially reduced - if we receive an `update_fulfill_htlc` message for an outbound payment, and persist the initial removal `ChannelMonitorUpdate`, then respond with our own `commitment_signed` + `revoke_and_ack`, followed by receiving our peer's final `revoke_and_ack`, and then persist the `ChannelMonitorUpdate` generated from that, all prior to completing a `ChannelManager` persistence, we'll still forget the HTLC and eventually trigger a `PaymentFailed` rather than the correct `PaymentSent`. Here we fully fix the issue by delaying the final `ChannelMonitorUpdate` persistence until the `PaymentSent` event has been processed and document the fact that a spurious `PaymentFailed` event can still be generated for a sent payment. The original fix in 0ad1f4c is still incredibly useful here, allowing us to avoid blocking the first `ChannelMonitorUpdate` until the event processing completes, as this would cause us to add event-processing delay in our general commitment update latency. Instead, we ultimately race the user handling the `PaymentSent` event with how long it takes our `revoke_and_ack` + `commitment_signed` to make it to our counterparty and receive the response `revoke_and_ack`. This should give the user plenty of time to handle the event before we need to make progress. Sadly, because we change our `ChannelMonitorUpdate` semantics, this change requires a number of test changes, avoiding checking for a post-RAA `ChannelMonitorUpdate` until after we process a `PaymentSent` event. Note that this does not apply to payments we learned the preimage for on-chain - ensuring `PaymentSent` events from such resolutions will be addressed in a future PR. Thus, tests which resolve payments on-chain switch to a direct call to the `expect_payment_sent` function with the claim-expected flag unset.
Rebased. |
4e93462
to
31049ed
Compare
Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.