Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Delay RAA-after-next processing until PaymentSent is are handled by TheBlueMatt · Pull Request #2112 · lightningdevkit/rust-lightning · GitHub
Skip to content

Delay RAA-after-next processing until PaymentSent is are handled - #2112

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order
Aug 21, 2023
Merged

Delay RAA-after-next processing until PaymentSent is are handled#2112
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-sent-persist-order

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator
In 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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 0ad1f4c943bdc9037d0c43d1b74c745befa065f0 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.

Depends on #2111, is just the last commit on it. See discussion there for merge-ordering.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 5 times, most recently from 6789818 to 6cb3b5eCompareMarch 17, 2023 07:04
@codecov-commenter

codecov-commenter commented Mar 17, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 99.53% and project coverage change: +0.39% 🎉

Comparison is base (d4ad826) 90.40% compared to head (097fc94) 90.79%.

❗ Current head 097fc94 differs from pull request most recent head 31049ed. Consider uploading reports for the commit 31049ed to get more accurate results

❗ 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 
Files ChangedCoverage Δ
lightning/src/events/mod.rs44.44% <ø> (+1.92%)⬆️
lightning/src/ln/channelmanager.rs88.37% <97.22%> (+2.84%)⬆️
lightning-invoice/src/utils.rs97.67% <100.00%> (-0.03%)⬇️
lightning/src/chain/chainmonitor.rs95.01% <100.00%> (-0.03%)⬇️
lightning/src/ln/chanmon_update_fail_tests.rs98.71% <100.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs91.42% <100.00%> (+1.95%)⬆️
lightning/src/ln/functional_test_utils.rs89.30% <100.00%> (+0.48%)⬆️
lightning/src/ln/functional_tests.rs98.26% <100.00%> (+0.11%)⬆️
lightning/src/ln/monitor_tests.rs98.52% <100.00%> (-0.01%)⬇️
lightning/src/ln/outbound_payment.rs91.93% <100.00%> (+1.68%)⬆️
... and 3 more

... and 27 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 6cb3b5e to 26e3e00CompareMarch 17, 2023 21:09
@wpaulino
wpaulino self-requested a review March 21, 2023 20:02
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from c7e8f27 to f94de18CompareMarch 28, 2023 22:01
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from e34dab6 to 031bd1bCompareApril 6, 2023 18:09
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 7 times, most recently from 578ca9b to 3ff2911CompareApril 17, 2023 20:55
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch 3 times, most recently from 422f630 to efde36cCompareMay 4, 2023 01:43
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from efde36c to 9a36e4aCompareMay 4, 2023 21:28
Comment threadlightning/src/ln/chanmon_update_fail_tests.rs Outdated
Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_test_utils.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from ba1207a to 097fc94CompareJuly 28, 2023 05:51

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

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!

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 097fc94 to 3df2604CompareJuly 28, 2023 22:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

payment_hash,
path,
}, None));
}, Some(ev_completion_action)));

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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.

wpaulino
wpaulino previously approved these changes Aug 14, 2023
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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: use expect

Copy link
Copy Markdown
Contributor

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.

Copy link
Copy Markdown
CollaboratorAuthor

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...

Copy link
Copy Markdown
CollaboratorAuthor

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 :)

valentinewallace
valentinewallace previously approved these changes Aug 16, 2023
wpaulino
wpaulino previously approved these changes Aug 16, 2023
@wpaulino

Copy link
Copy Markdown
Contributor

Ah, needs a rebase to fix some test compile errors.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from 233b8ec to dcfd5d7CompareAugust 16, 2023 22:45
@TheBlueMatt

TheBlueMatt commented Aug 16, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Rebased with the following additional diff:

$ git diff
diff --git a/lightning/src/ln/functional_tests.rs b/lightning/src/ln/functional_tests.rs
index 2aecf72d4..440d9df3e 100644
--- a/lightning/src/ln/functional_tests.rs
+++ b/lightning/src/ln/functional_tests.rs
@@ -10096,8 +10096,8 @@ fn do_test_multi_post_event_actions(do_reload: bool) {
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
- reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
- reconnect_nodes(&nodes[0], &nodes[2], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
+ reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[2]));
}
let events = nodes[0].node.get_and_clear_pending_events();
diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs
index 44d7566b0..fe5bd37df 100644
--- a/lightning/src/ln/payment_tests.rs
+++ b/lightning/src/ln/payment_tests.rs
@@ -3746,7 +3746,7 @@ fn do_test_custom_tlvs_consistency(first_tlvs: Vec<(u64, Vec<u8>)>, second_tlvs:
}
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
- expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true);
+ expect_payment_sent(&nodes[0], our_payment_preimage, Some(Some(2000)), true, true);
} else {
// Expect fail back
let expected_destinations = vec![HTLCDestination::FailedPayment { payment_hash: our_payment_hash }];

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-sent-persist-order branch from dcfd5d7 to 4e93462CompareAugust 16, 2023 22:47
wpaulino
wpaulino previously approved these changes Aug 16, 2023
valentinewallace
valentinewallace previously approved these changes Aug 17, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

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.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMatt merged commit cb923c6 into lightningdevkit:mainAug 21, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@wpaulino@valentinewallace