Skip to content

Randomize candidate paths during route selection. #1359

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

Merged
merged 2 commits into from
Mar 24, 2022

Conversation

tnull
Copy link
Contributor

@tnull tnull commented Mar 10, 2022

This PR is a follow-up to #1286: it implements a 'real random shuffle' to randomize candidate payment paths during route selection. I played with a few variants of this and now ended up generating a number of unique permutations.

During testing it became apparent that the behavior of Step (7) was indeterministic and dependent on the input order of paths when they were of equal value_msat, which broke htlc_minimum_overpay_test. I now addressed this by pre-sorting the paths according to their total_fee_paid_msat, which should drop more expensive paths first, i.e., always prefer lower-fee paths of equal value.

Closes #869.

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from a36e655 to ba73f3e Compare March 12, 2022 13:32
@codecov-commenter
Copy link

codecov-commenter commented Mar 12, 2022

Codecov Report

Merging #1359 (d5a0738) into main (5ed2985) will increase coverage by 0.05%.
The diff coverage is 91.66%.

❗ Current head d5a0738 differs from pull request most recent head ff7ec0c. Consider uploading reports for the commit ff7ec0c to get more accurate results

@@            Coverage Diff             @@
##             main    #1359      +/-   ##
==========================================
+ Coverage   90.75%   90.81%   +0.05%     
==========================================
  Files          73       73              
  Lines       40884    41215     +331     
  Branches    40884    41215     +331     
==========================================
+ Hits        37106    37428     +322     
- Misses       3778     3787       +9     
Impacted Files Coverage Δ
lightning/src/routing/router.rs 92.62% <91.66%> (+0.25%) ⬆️
lightning-net-tokio/src/lib.rs 75.88% <0.00%> (-0.81%) ⬇️
lightning/src/debug_sync.rs 94.79% <0.00%> (-0.27%) ⬇️
lightning/src/util/events.rs 33.21% <0.00%> (-0.24%) ⬇️
lightning-invoice/src/de.rs 81.06% <0.00%> (-0.21%) ⬇️
lightning/src/ln/functional_tests.rs 97.06% <0.00%> (-0.10%) ⬇️
lightning/src/routing/scoring.rs 94.29% <0.00%> (ø)
lightning/src/routing/network_graph.rs 89.54% <0.00%> (+0.01%) ⬆️
lightning/src/ln/channelmanager.rs 84.85% <0.00%> (+0.05%) ⬆️
... and 4 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5ed2985...ff7ec0c. Read the comment docs.

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from ba73f3e to 0b238c0 Compare March 15, 2022 23:04
// In order to do so, we pre-sort by total fees paid, so that in case of equal
// values we prefer lower cost paths.
// (Descending order, so we drop higher-fee paths first)
cur_route.sort_by_key(|path| path.get_total_fee_paid_msat());
Copy link
Collaborator

Choose a reason for hiding this comment

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

This should include the scoring results, too, no?

Copy link
Contributor Author

@tnull tnull Mar 17, 2022

Choose a reason for hiding this comment

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

Yes, you're probably right. Maybe also htlc_minimum_msat? Do you have a suggestion how we would prioritize values, total fees, penalties, and HTLC minima?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Hmm, right, yea, the issue with htlc min is it really just kicks in after a threshold. Maybe the way to address that is loop at the reduction stage and if we hit htlc min try the next path instead of just reducing and moving on. Then we could just sort by score+fee here (which is all designed to be added, so we always just add for that).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm now considering the score with 9175523. Not sure if the additional complexity needed to incorporate htlc_minimum_msat is worth the gain?

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from 0b238c0 to 84fa714 Compare March 17, 2022 14:17
@@ -1522,7 +1522,7 @@ where L::Target: Logger {
// Now, subtract the overpaid value from the most-expensive path.
// TODO: this could also be optimized by also sorting by feerate_per_sat_routed,
Copy link
Contributor Author

@tnull tnull Mar 17, 2022

Choose a reason for hiding this comment

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

I'm not fully sure how to address this TODO while I'm here. What would we gain if we multisort here again? Don't we want to just optimize for fees at this point?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Right, the TODO here notes that sorting by the path value isn't optimizing for fees, optimizing for a real feerate would be, instead of just feerate ignoring base fee.

Copy link
Contributor Author

@tnull tnull Mar 21, 2022

Choose a reason for hiding this comment

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

I'm probably missing something here, but isn't this what sorting once more by get_total_fees_paid_msat() would do?

@tnull
Copy link
Contributor Author

tnull commented Mar 21, 2022

Added a simple refactor and will probably also try to address this TODO in router "while im here".

Copy link
Collaborator

@TheBlueMatt TheBlueMatt left a comment

Choose a reason for hiding this comment

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

LGTM, can you clean up the git log somewhat?

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from 0a322d3 to 9a2b8f2 Compare March 21, 2022 22:57
@tnull
Copy link
Contributor Author

tnull commented Mar 21, 2022

LGTM, can you clean up the git log somewhat?

Squashed without changes.

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from 9a2b8f2 to 013954e Compare March 21, 2022 23:02
@TheBlueMatt
Copy link
Collaborator

Hmm, it would be kinda nice if the unrelated changes are in a different commit, eg the wrapping adds and sort changes could be a separate commit.

@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from 013954e to 90474d2 Compare March 21, 2022 23:14
TheBlueMatt
TheBlueMatt previously approved these changes Mar 21, 2022
@jkczyz jkczyz self-requested a review March 21, 2022 23:50
Copy link
Contributor

@jkczyz jkczyz left a comment

Choose a reason for hiding this comment

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

LGTM. Just some nits.

Copy link
Contributor

@jkczyz jkczyz left a comment

Choose a reason for hiding this comment

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

Will need to insert the last commit between the first two commits given it's a fixup for the first commit and will be squashed into it whereas the second commit is independent. I typically use git rebase -i when needing to interleave fixups.

tnull added 2 commits March 24, 2022 09:12
- `sort_by_key` to `sort_unstable_by_key`
- `checked_add() .. max_value()` to `saturating_add()`
- Some typos and nits
@tnull tnull force-pushed the 2022-03-real-random-shuffle branch from d5a0738 to ff7ec0c Compare March 24, 2022 15:13
@TheBlueMatt TheBlueMatt self-assigned this Mar 24, 2022
Sign up for free to 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.

Change route selection algorithm to be actually (pseudo-)random
4 participants