-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
routerrpc: add a default value for timeout_seconds in SendPaymentV2 #9359
routerrpc: add a default value for timeout_seconds in SendPaymentV2 #9359
Conversation
Important Review skippedAuto reviews are limited to specific labels. 🏷️ Labels to auto review (1)
Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
c5537ef
to
18d4ff0
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR. A few suggestions to complete the change,
- we should update the
SendpaymentRequest
inrouter.proto
and make the fieldtimeout_seconds
optional, also need to update the docs there to make it clear that this field is now optional. - we then update both the
cli
and the RPC to not check the timeout value. - we should also update some of the itests to validate the new behavior that we don't check for timeout values, which can be any of the cases that use
TimeoutSeconds: 60
when making a payment, and we can simply remove it there to validate the new behavior.
Hey @yyforyongyu, thanks for the review! I made some modifications based on your feedback. Could you please check if everything is covered, or if I need to check anything further? |
cc: @yyforyongyu @guggero, just pinging again in case the last message was missed. |
|
lnrpc/routerrpc/router.proto
Outdated
An optional upper limit on the amount of time we should spend when | ||
attempting to fulfill the payment. This is expressed in seconds. If we | ||
cannot make a successful payment within this time frame, an error will be | ||
returned. This field must be non-zero. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we should also mention the default value of 60s is used when the field is not set, and when setting the field, a value of 0 is not allowed, and we should change the below field to optional int32 timeout_seconds = 6
.
Then when we check it, we first check if the field is set by checking if it's nil, if set, we require it to be not zero, otherwise, use the default 60s.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since timeout_seconds
is of type int32
and not a pointer, its default value will be 0
if it is not set. Therefore, whether timeout_seconds
is not specified or explicitly set to 0
, I have implemented logic to default it to 60 seconds
.
Please let me know if there is anything else I need to address.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you run make rpc
first? Then you'll know what i meant
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Thanks for the help! I will make sure to learn from this and avoid making the same mistake in the future.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wanted to comment about backward compatibility of changing the behavior of the field. But doesn't seem to be an issue, according to this: https://stackoverflow.com/a/76375904
So that seems to be the right approach indeed for this situation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm now that you mention it I think there still might be a compatibility issue re the new optional field, as it may break users' Go code since it now expects TimeoutSeconds
to be a pointer? If they haven't set the field then it's fine I think.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think, while proto3 can be backward compatible in terms of the field being optional or not, the change in Go's generated code (from a value type to a pointer type) could lead to issues if the code depends on the non-pointer representation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could lead to issues if the code depends on the non-pointer representation.
yeah good point - in that case think we cannot use the optional
field for compatibility reasons, we gotta change it back and sorry for the initial suggestion😢
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So if timeout_seconds is 0 (explicitly or default), should we use 60 seconds instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think there's an easy way to distinguish the empty value 0 from explicitly setting it to 0 - so we use 60 seconds when it's zero.
7866d62
to
a6bd8c1
Compare
d858578
to
2c4b55c
Compare
Hey @yyforyongyu, I’ve made the required modifications. Please take a look. |
@yyforyongyu: review reminder |
Hey @yyforyongyu, just following up to see if there are any additional reviews pending on this PR? |
lnrpc/routerrpc/router.proto
Outdated
An optional upper limit on the amount of time we should spend when | ||
attempting to fulfill the payment. This is expressed in seconds. If we | ||
cannot make a successful payment within this time frame, an error will be | ||
returned. This field must be non-zero. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm now that you mention it I think there still might be a compatibility issue re the new optional field, as it may break users' Go code since it now expects TimeoutSeconds
to be a pointer? If they haven't set the field then it's fine I think.
2c4b55c
to
89d2ab5
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One last comment, then it should be good to go!
lnrpc/routerrpc/router.proto
Outdated
An optional limit on the amount of time before new payment attempts are | ||
submitted, expressed in seconds. If the timeout is reached, an ongoing | ||
payment attempt with pending HTLCs might still be in flight. However, the | ||
SendPaymentV2 call will return. If the field is not set or is set to zero, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I dont think SendPaymentV2
will return if there are inflight HTLCs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the correct definition for timeout_seconds
?
An optional limit on the time, expressed in seconds, before new payment attempts are submitted. If the timeout is
reached, ongoing payment attempts with pending HTLCs may continue, and the SendPaymentV2 call will remain
active until all HTLCs are resolved or the payment succeeds or fails. If a successful payment cannot be completed
within this time frame, an error will be returned. If the field is not set or explicitly set to zero, the default value of 60
seconds will be applied.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's a bit complicated, since we are here, also related to #5461. In short the timeout here has little effect once the HTLCs are sent, as the final state of the payment is determined by the end results of the HTLCs. The only time the timeout takes effect is when the payment has made zero HTLC attempts, which could happen, say, we fail to find a route for the first HTLC in 60s, then the whole payment flow will exit with a timeout error. A more common case is, that when the payment times out, it still has inflight HTLCs, which may be settled or failed eventually, and the SendPaymentV2
will wait until the final outcomes of the HTLCs are reported back. Even if the payment is timed out now, it can still be considered settled if all the HTLCs are settled after 60s.
So I think the accurate description is "the time to wait before attempting the first HTLC. Once HTLCs are inflight, the payment won't be aborted until the HTLCs are settled or failed". I don't think we need to mention SendPaymentV2
, as this is also used in send to route RPC.
If timeout_seconds is not set or is 0, the default value of 60 seconds will be used. Signed-off-by: Nishant Bansal <[email protected]>
Signed-off-by: Nishant Bansal <[email protected]>
Signed-off-by: Nishant Bansal <[email protected]>
89d2ab5
to
3a3002e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 🌺
Change Description
Description of change / link to associated issue.
This PR introduces a default value of 60 seconds for the
timeout_seconds
field in theSendPaymentV2
RPC call in therouterrpc.SendPaymentRequest
.Fixes: #9282
Steps to Test
Test with explicit timeout_seconds values:
Test without timeout_seconds:
Pull Request Checklist
Testing
Code Style and Documentation
[skip ci]
in the commit message for small changes.📝 Please see our Contribution Guidelines for further guidance.