Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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" + '
Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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('^' + ".*" + ' Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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('^' + ".*" + ' Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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" + ' Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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('^' + ".*" + ' Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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('^' + ".*" + ' Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino
, '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); } })(); })(); Avoid saturating channels before we split payments by TheBlueMatt · Pull Request #1605 · lightningdevkit/rust-lightning · GitHub
Skip to content

Avoid saturating channels before we split payments - #1605

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts
Jul 14, 2022
Merged

Avoid saturating channels before we split payments#1605
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-smaller-mpp-parts

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.

Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).

In a (somewhat optional, though I'd prefer it) second commit, we ensure we don't spuriously fail to find a route just because of the saturation limit, opting to remove the saturation limit during pathfinding if we stop finding new paths. This at least notably means we don't have to have a ton of test changes, as it makes the behavior almost entirely backwards compatible even across various edge cases.

@codecov-commenter

codecov-commenter commented Jul 9, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1605 (d2a8906) into main (4e5f74a) will increase coverage by 0.37%.
The diff coverage is 95.87%.

@@ Coverage Diff @@## main #1605 +/- ##
==========================================
+ Coverage 90.86% 91.23% +0.37% 
==========================================
Files 80 80 Lines 44437 47610 +3173 Branches 44437 47610 +3173 ==========================================
+ Hits 40377 43439 +3062 - Misses 4060 4171 +111 
Impacted FilesCoverage Δ
lightning/src/routing/gossip.rs91.72% <ø> (-0.23%)⬇️
lightning/src/routing/router.rs92.52% <95.45%> (+0.13%)⬆️
lightning/src/ln/functional_tests.rs96.80% <100.00%> (-0.31%)⬇️
lightning/src/ln/payment_tests.rs98.88% <100.00%> (ø)
lightning/src/util/events.rs39.25% <0.00%> (-0.29%)⬇️
lightning/src/ln/channel.rs89.41% <0.00%> (+0.66%)⬆️
lightning/src/routing/scoring.rs97.56% <0.00%> (+1.49%)⬆️
... and 2 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 4e5f74a...d2a8906. Read the comment docs.

(2, features, option),
(3, max_path_count, (default_value, DEFAULT_MAX_PATH_COUNT)),
(4, route_hints, vec_type),
(5, max_channel_saturation_power_of_half, (default_value, 1)),

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.

Curious why 5 was skipped before :)

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.

Odd and even numbers have different semantics (odds are ignored if an old version doesnt understand it, evens cause a read failure) so they aren't interchangeable.

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.

Ah of course, part of the "okay to be odd" rule.

@tnull
tnull self-requested a review July 9, 2022 13:51
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from de3e19e to dc3447aCompareJuly 9, 2022 15:26
@moneyball

Copy link
Copy Markdown
Contributor

Concept ACK

/// capacity, a value of one will only use up to half its capacity, two 1/4, etc.
///
/// Default value: 1
pub max_channel_saturation_power_of_half: u8,

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.

I think $\frac{1}{2}^x$ should generally work fine, but why don't we allow to just define a simple percentage or share $x \in [0,1]$ of the channel capacity here? Seems more straight forward and probably also more readable when not familiar with how this knob works?

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.

Cause I really hate the idea of doing a divide in the scorer. Divides are slow, man, shifts are cheap. Quite likely it doesn't actually matter, but still.

@tnulltnullJul 12, 2022

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.

Fair enough, I assumed this to be the main reason for it. While there might be ways to work around the floating point division, your solution is probably cleaner, even though it has the drawback that no saturation between 0.5 and 1.0 times the capacity can be specified.

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.

Yea, if anything I'm more worried about nothing between 1/8 and 1/4 than 1/2 and 1 :)

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs
@tnull

tnull commented Jul 11, 2022

Copy link
Copy Markdown
Contributor

I believe this preliminarily addresses #1276? Linking for now.

@tnulltnull linked an issue Jul 11, 2022 that may be closed by this pull request
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Indeed. Dunno if we should close #1276 after this or not, but its at least a huge step towards it.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from dc3447a to 6a60020CompareJuly 11, 2022 16:20
@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 12, 2022

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

First time reviewing this part of the codebase so you may want a more reassuring ACK from someone else. LGTM though, feel free to squash.

Comment threadlightning/src/routing/router.rs Outdated
tnull
tnull previously approved these changes Jul 13, 2022

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

LGTM

Comment threadlightning/src/routing/router.rs Outdated
Comment threadlightning/src/routing/router.rs Outdated
wpaulino
wpaulino previously approved these changes Jul 13, 2022
Currently we only opt to split a payment into an MPP if we have
completely and totally used a channel's available capacity (up to
the announced htlc_max or on-chain capacity, whichever is lower).
This is obviously destined to fail as channels are unlikely to have
their full capacity available.
Here we do the minimum viable fix by simply limiting channels to
only using up to a configurable power-of-1/2. We default this new
configuration knob to 1 (1/2 of the channel) so as to avoid a
substantial change but in the future we may consider changing this
to 2 (1/4) or even 3 (1/8).
In order to avoid failing to find paths due to the new channel
saturation limit, if we fail to find enough paths, we simply
disable the saturation limit for further path finding iterations.
Because we can now increase the maximum sent over a given channel
during routefinding, we may now generate redundant paths for the
same payment. Because this is wasteful in the network, we add an
additional pass during routefinding to merge redundant paths.
Note that two tests which previously attempted to send exactly the
available liquidity over a channel which charged an absolute fee
need updating - in those cases the router will first collect a path
that is saturation-limited, then attempt to collect a second path
without a saturation limit while stil honoring the existing
utilized capacity on the channel, causing failure as the absolute
fee must be included.
tnull
tnull previously approved these changes Jul 14, 2022
@TheBlueMatt
TheBlueMatt dismissed stale reviews from tnull and wpaulino via e6d40a7July 14, 2022 15:29
@TheBlueMatt
TheBlueMattforce-pushed the 2022-07-smaller-mpp-parts branch from d2a8906 to e6d40a7CompareJuly 14, 2022 15:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without further changes.

@TheBlueMatt
TheBlueMatt merged commit 5cca9a0 into lightningdevkit:mainJul 14, 2022
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.

Revisit MPP splitting heuristic

6 participants

@TheBlueMatt@codecov-commenter@moneyball@tnull@dunxen@wpaulino