Commit graph

96 commits

Author SHA1 Message Date
Matt Corallo
d986329734 Fix (and test) threaded payment retries
The new in-`ChannelManager` retries logic does retries as two
separate steps, under two separate locks - first it calculates
the amount that needs to be retried, then it actually sends it.
Because the first step doesn't udpate the amount, a second thread
may come along and calculate the same amount and end up retrying
duplicatively.

Because we generally shouldn't ever be processing retries at the
same time, the fix is trivial - simply take a lock at the top of
the retry loop and hold it until we're done.
2023-02-16 21:35:25 +00:00
Valentine Wallace
a2b956d46e
Remove pending probes on update_fail
Previously we had a memory leak where probes would not be removed from
outbound_payments on htlc fail
2023-02-15 23:30:46 -05:00
Valentine Wallace
da34ada8d4
Reword and fix grammar in PartialFailure docs 2023-02-15 17:59:44 -05:00
Valentine Wallace
5c6d8a7cb8
Remove retry_payments method
We're no longer supporting manual retries since
ChannelManager::send_payment_with_retry can be parameterized by a retry
strategy

This commit also updates all docs related to retry_payment and abandon_payment.
Since these docs frequently overlap with changes in preceding commits where we
start abandoning payments on behalf of the user, all the docs are updated in
one go.
2023-02-15 17:59:39 -05:00
Valentine Wallace
13e60da7fa
When processing pending htlcs, abandon outbounds that are not retryable 2023-02-15 17:57:13 -05:00
Valentine Wallace
82e0880442
Abandon payment on behalf of the user on payment path failure
Removed retry_single_path_payment, it's replaced by automatic_retries with
AutoRetry::Success
2023-02-15 17:46:30 -05:00
Valentine Wallace
07dd8b2794
Abandon payment if retry fails in process_pending_htlcs 2023-02-15 15:55:00 -05:00
Valentine Wallace
f8712106d2
Pass pending events to outbound_payments::abandon_payment
This makes it uniform with the outbound payment methods that generate events
and set us up for abandoning payments on behalf of the user.
2023-02-14 22:51:28 -05:00
Valentine Wallace
8d0c08c155
Fix indentation in outbound payment mark_abandoned 2023-02-14 21:29:34 -05:00
Valentine Wallace
825ea9d062
Fix computing in-flight HTLCs in between retries + test 2023-02-14 14:20:49 -05:00
Valentine Wallace
aa4b429eb2
test_utils: parameterize TestRouter by TestScorer
This allows us set scoring expectations and ensure in-flight htlcs are factored
into scoring
2023-02-14 14:20:48 -05:00
Valentine Wallace
9f01092eae
Spontaneous payments: make preimage construction more concise 2023-02-03 10:44:31 -05:00
Valentine Wallace
6b49af1563
Support spontaneous payment retries in ChannelManager 2023-02-02 19:30:25 -05:00
Valentine Wallace
c863350507
Store keysend preimage in outbound payments
This sets us up for spontaneous payment retries in ChannelManager.

Currently, retrying spontaneous payments is broken in InvoicePayer because it
does not include the keysend preimage on retry.
2023-02-02 19:30:22 -05:00
Matt Corallo
071297234a Use only the failed amount when retrying payments, not the full amt
When we landed the initial in-`ChannelManager` payment retries, we
stored the `RouteParameters` in the payment info, and then re-use
it as-is for new payments. `RouteParameters` is intended to store
the information specific to the *route*, `PaymentParameters` exists
to store information specific to a payment.

Worse, because we don't recalculate the amount stored in the
`RouteParameters` before fetching a new route with it, we end up
attempting to retry the full payment amount, rather than only the
failed part.

This issue brought to you by having redundant data in
datastructures, part 5,001.
2023-02-01 21:16:18 +00:00
Matt Corallo
8af05e0172 Move retry-limiting to retry_payment_with_route
The documentation for `Retry` is very clear that it counts the
number of failed paths, not discrete retries. When we added
retries internally in `ChannelManager`, we switched to counting
the number if discrete retries, even if multiple paths failed and
were replace with multiple MPP HTLCs.

Because we are now rewriting retries, we take this opportunity to
reduce the places where retries are analyzed, specifically a good
chunk of code is removed from `pay_internal`.

Because we now retry multiple failed paths with one single retry,
we keep the new behavior, updating the docs on `Retry` to describe
the new behavior.
2023-02-01 21:16:18 +00:00
Matt Corallo
ddde63ee12 Log more information when retrying a payment attempt fails 2023-02-01 21:16:18 +00:00
Matt Corallo
5ce4bfc1f6 Test the RouteParameters passed to TestRouter
`TestRouter` allows us to simply select the `Route` that will be
returned in the next `find_route` call, but it does so without any
checking of what was *requested* for the call. This makes it a
somewhat dubious test utility as it very helpfully ensures we
ignore errors in the routes we're looking for.

Instead, we require users of `TestRouter` pass a `RouteParameters`
to `expect_find_route`, which we compare against the requested
parameters passed to `find_route`.
2023-02-01 21:16:18 +00:00
Matt Corallo
2b135578e8 Use the PaymentParameter final CLTV delta over RouteParameters
`PaymentParams` is all about the parameters for a payment, i.e. the
parameters which are static across all the paths of a paymet.
`RouteParameters` is about the information specific to a given
`Route` (i.e. a set of paths, among multiple potential sets of
paths for a payment). The CLTV delta thus doesn't belong in
`RouterParameters` but instead in `PaymentParameters`.

Worse, because `RouteParameters` is built from the information in
the last hops of a `Route`, when we deliberately inflate the CLTV
delta in path-finding, retries of the payment will have the final
CLTV delta double-inflated as it inflates starting from the final
CLTV delta used in the last attempt.

When we calculate the `final_cltv_expiry_delta` to put in the
`RouteParameters` returned via events after a payment failure, we
should re-use the new one in the `PaymentParameters`, rather than
the one that was in the route itself.
2023-02-01 21:16:18 +00:00
Matt Corallo
fbc08477e8 Move the final CLTV delta to PaymentParameters from RouteParams
`PaymentParams` is all about the parameters for a payment, i.e. the
parameters which are static across all the paths of a paymet.
`RouteParameters` is about the information specific to a given
`Route` (i.e. a set of paths, among multiple potential sets of
paths for a payment). The CLTV delta thus doesn't belong in
`RouterParameters` but instead in `PaymentParameters`.

Worse, because `RouteParameters` is built from the information in
the last hops of a `Route`, when we deliberately inflate the CLTV
delta in path-finding, retries of the payment will have the final
CLTV delta double-inflated as it inflates starting from the final
CLTV delta used in the last attempt.

By moving the CLTV delta to `PaymentParameters` we avoid this
issue, leaving only the sought amount in the `RouteParameters`.
2023-02-01 17:50:24 +00:00
Valentine Wallace
6d819796f2
Disambiguate send_payment_internal from pay_internal 2023-01-25 14:44:10 -05:00
Valentine Wallace
2f49c8170c
Test ChannelManager automatic retries 2023-01-25 14:44:10 -05:00
Valentine Wallace
acf9292d58
Support sending payments with a retry strategy in ChannelManager 2023-01-25 14:44:10 -05:00
Valentine Wallace
d776dee3a5
Retry HTLCs in process_pending_htlc_forwards 2023-01-25 14:44:07 -05:00
Valentine Wallace
72a7da8d51
Remove AllPathsFailed outbounds at send_payment_internal callsites instead
This makes it easier to retry payments if all paths fail on initial send, in
in which case we'll want to hold off on removing the pending payment
2023-01-25 14:44:07 -05:00
Valentine Wallace
686ef08316
Generate PendingHTLCsForwardable upon retryable payment 2023-01-25 14:44:07 -05:00
Valentine Wallace
6351a99935
Decode onion fail outside of outbound_payments lock
It's not ideal to do all this computation while the lock is held. We also want
to decode the failure *before* taking the lock, so we can store the failed scid
in the relevant outbound for retry in the next commit(s).
2023-01-25 14:44:07 -05:00
Valentine Wallace
c0a22f7174
Store retry data in PendingOutboundPayment::Retryable
Used in upcoming commit(s) to automatically retry HTLCs in ChannelManager
2023-01-25 14:44:03 -05:00
Valentine Wallace
ae34533932
Parameterize add_new_pending_payment with retry strategy and route params 2023-01-24 14:12:04 -05:00
Valentine Wallace
cbb75e27b2
Copy Retry from invoice module to outbound_payment module
Also configure it such that in std tests, it will use SinceEpoch instead of
Instant so time can be manually advanced.
2023-01-24 14:11:59 -05:00
Valentine Wallace
948ebc67f0
Copy PaymentAttempts from invoice module to outbound_payment module 2023-01-23 15:12:09 -05:00
Matt Corallo
ce6bcf68a1
Merge pull request #1950 from tnull/2023-01-fix-doc-warnings-and-nits
Fix doc warnings and doc cleanup in `msgs.rs`/`ser.rs`
2023-01-15 07:03:14 +00:00
Elias Rohrer
defa2f6811
Fix misc. warnings from --document-private-items 2023-01-13 18:26:09 -06:00
Arik Sosman
72183bd932
Split up generic parameters that used to comprise KeysInterface. 2023-01-12 16:10:35 -08:00
Arik Sosman
5824e226ca
Remove KeysInterface trait. 2023-01-12 09:18:08 -08:00
Valentine Wallace
cc60fd601f
outbound_payment: put method signature closing paren on next line
in long method signatures
2022-12-21 16:26:55 -05:00
Valentine Wallace
60492d769a
Fix cfg(test) indentation 2022-12-20 21:23:54 -05:00
Valentine Wallace
8d5f7c87cb
Make add_new_pending_payment private to module
And expose it in testing only, for safety
2022-12-20 21:23:54 -05:00
Valentine Wallace
1ded1d21bd
Fix main build 2022-12-20 17:55:06 -05:00
Valentine Wallace
afdaa64b44
Rename send_payment and retry_payment for retries
Once ChannelManager supports payment retries, it will make more sense for its
current send_payment method to be named send_payment_with_route because
retrying should be the default. Here we get a head start on this by making the
rename in outbound_payment, but not changing the public interface yet.
2022-12-19 21:08:08 -05:00
Valentine Wallace
3e89cc7e08
Reduce visibility of outbound payment methods 2022-12-19 21:08:08 -05:00
Valentine Wallace
ec55730959
Start parameters on a newline if they don't fit
Separating out this commit to keep the main refactor move-only
2022-12-19 21:08:03 -05:00
Valentine Wallace
e69a4c2636
Remove unnecessary mut in finalize_claims 2022-12-19 21:04:58 -05:00
Valentine Wallace
afd31507d9
Swap pending_outbound_payments for OutboundPayments struct
This allows us to move a lot of outbound payment logic out of ChannelManager
and into the new outbound_payment module, and helps avoid growing
ChannelManager when we add retry logic to it in upcoming work.
2022-12-19 21:04:53 -05:00
Valentine Wallace
278ebd208a
Move PaymentSendFailure into outbound_payment module
And re-export it in channelmanager.rs so it can remain public
2022-12-19 14:10:03 -05:00
Valentine Wallace
070832643f
Move PendingOutboundPayment to new outbound_payment module
We want to move all outbound payment-related things to this new module, to help
break up ChannelManager so future payment retries work doesn't increase the
size of ChannelManager.
2022-12-19 14:09:59 -05:00