Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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" + '
Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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('^' + ".*" + ' Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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('^' + ".*" + ' Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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" + ' Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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('^' + ".*" + ' Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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('^' + ".*" + ' Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev
, '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); } })(); })(); Move in-flight ChannelMonitorUpdates to ChannelManager by TheBlueMatt · Pull Request #2362 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move in-flight ChannelMonitorUpdates to ChannelManager - #2362

Merged
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager
Jun 23, 2023
Merged

Move in-flight ChannelMonitorUpdates to ChannelManager#2362
TheBlueMatt merged 9 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-06-unblocked-mons-in-manager

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Jun 19, 2023

Copy link
Copy Markdown
Collaborator

Because ChannelMonitorUpdates can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a Channel
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.

Instead, here, we move to storing in-flight
ChannelMonitorUpdates to the ChannelManager, leaving
blocked ChannelMonitorUpdates in the Channel as they
were.

This is the first (and largest) step towards #2168, and after this we're at least clear of the serialization-breaking parts, so could in theory cut a test version even without fully fixing 2168 (which needs fixing for 116 though).

Most of the work for #2317

@TheBlueMattTheBlueMatt added this to the 0.0.116 milestone Jun 19, 2023
@TheBlueMattTheBlueMatt linked an issue Jun 19, 2023 that may be closed by this pull request
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 486a65e to f732734CompareJune 20, 2023 02:23
@codecov-commenter

codecov-commenter commented Jun 20, 2023

Copy link
Copy Markdown

Codecov Report

Patch coverage: 83.20% and project coverage change: -0.02⚠️

Comparison is base (15b1c9b) 90.30% compared to head (9c3ad28) 90.29%.

❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.

Additional details and impacted files
@@ Coverage Diff @@## main #2362 +/- ##
==========================================
- Coverage 90.30% 90.29% -0.02% 
==========================================
Files 106 106 Lines 54747 54920 +173 Branches 54747 54920 +173 ==========================================
+ Hits 49441 49591 +150 - Misses 5306 5329 +23 
Impacted FilesCoverage Δ
lightning/src/util/ser.rs85.07% <0.00%> (-0.14%)⬇️
lightning/src/ln/channel.rs89.42% <83.33%> (-0.08%)⬇️
lightning/src/ln/channelmanager.rs86.19% <83.96%> (-0.11%)⬇️

... and 13 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

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

Concept ACK. Just reviewing f52ed23 a bit more in-depth.

@TheBlueMattTheBlueMatt modified the milestones: 0.0.116, 0.0.116alphaJun 20, 2023
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch 4 times, most recently from 32a31af to 3fe91e1CompareJune 21, 2023 00:06

@dunxendunxen 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. Can't see anything else glaringly wrong from my knowledge of monitor updates.

Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it only correct to call last() if we actually pushed an update above?

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.

I mean if the vec contains something then it should also be safe?

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hmmmm, yea, maybe, I updated the code to handle it. We shouldn't be double-calling, but indeed I think there's maybe a case where we have two background updates to apply and we just apply the last() twice.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 3fe91e1 to e721025CompareJune 21, 2023 20:55

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

Was mostly just absorbing the context here, nothing outstanding to comment on

Comment threadlightning/src/ln/channelmanager.rs
In the coming commits we'll move to storing in-flight
`ChannelMonitorUpdate`s in the `ChannelManager` rather in the
`Channel` (which will then only retain `ChannelMonitorUpdate`s
which have not yet been released/are blocked.
This will simplify handling of pending `ChannelMonitorUpdate` after
a channel has closed by not having to move them into the
`ChannelManager`.
Most of the calls to the `handle_new_monitor_update` macro had the
exact same pattern - calling `update_monitor` followed by the
macro. Given that common pattern will grow to first pushing the
new monitor onto an in-flight set and then calling `update_monitor`
unifying the pattern into a single macro now avoids more code churn
in the coming commits.
By giving up on a tiny bit of parallelism and tweaking the return
types, we can make the `handle_new_monitor_update` macro a bit
clearer - now the only cases where its called after a monitor was
updated was when the monitor was initially committed.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e721025 to 2704bf3CompareJune 21, 2023 22:52
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
// filter for uniqueness here.
in_flight_updates.push($update);
}
let update_res = $self.chain_monitor.update_channel($funding_txo, in_flight_updates.last().unwrap());

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.

Isn't it possible that we've already called update_channel with the last() monitor update, though?

@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 2704bf3 to 653c606CompareJune 22, 2023 20:49

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM after this.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from 653c606 to d18668bCompareJune 23, 2023 17:53

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

Feel free to squash.

highest_applied_update_id, channel.get().context.get_latest_monitor_update_id());
let remaining_in_flight =
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
pending.retain(|upd| upd.update_id > highest_applied_update_id);

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.

If there are multiple updates in flight, would you call channel_monitor_updated once after they're all done, or after each one is done? If the latter, and they complete out of order, it seems this doesn't work?

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.

Only after they're all done, this is implemented in ChainMonitor. We should probably move to doing it per-update, but we previously didn't track the updates in-flight so couldn't.

Comment threadlightning/src/ln/channelmanager.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from d18668b to cd76e97CompareJune 23, 2023 18:24
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed spelling and squashed:

$ git diff-tree -U1 d18668b4 cd76e97c
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 942998840..cff623caa 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -8399,3 +8399,3 @@ where
//
- // Because tha actual handling of the in-flight updates is the same, its macro'ized here:+ // Because the actual handling of the in-flight updates is the same, it's macro'ized here:
let mut pending_background_events = Vec::new();

wpaulino
wpaulino previously approved these changes Jun 23, 2023
valentinewallace
valentinewallace previously approved these changes Jun 23, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from cd76e97 to e089a40CompareJune 23, 2023 18:43
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, fixed one more bug @wpaulino pointed out that got introduced in one of the fixups:

$ git diff-tree -U1 cd76e97c e089a404
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 36260f1d2..69a69e7a1 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -865,3 +865,3 @@ pub(super) struct ChannelContext<Signer: ChannelSigner> {
/// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we
-	/// store it here and only release it to [`ChannelManager`] once it asks for it.+	/// store it here and only release it to the `ChannelManager` once it asks for it.
blocked_monitor_updates: Vec<PendingChannelMonitorUpdate>,
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index cff623caa..f38c6c13d 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -1923,3 +1923,3 @@ macro_rules! handle_new_monitor_update {
{
- in_flight_updates.pop();+ let _ = in_flight_updates.remove(idx);
if in_flight_updates.is_empty() && $chan.blocked_monitor_updates_pending() == 0 {

Because `ChannelMonitorUpdate`s can be generated for a
channel which is already closed, and must still be tracked
through their completion, storing them in a `Channel`
doesn't make sense - we'd have to have a redundant place to
put them post-closure and handle both storage locations
equivalently.
Instead, here, we move to storing in-flight
`ChannelMonitorUpdate`s to the `ChannelManager`, leaving
blocked `ChannelMonitorUpdate`s in the `Channel` as they
were.
Now that all `ChannelMonitorUpdate`s stored in `Channel` are
blocked we don't need a bool to track it.
`Channel::get_latest_complete_monitor_update_id` no longer refers
to complete updates, but rather ones which were passed to the
`ChannelManager` and which the `CHannel` no longer knows about.
Thus, we rename it `get_latest_unblocked_monitor_update_id`.
To differentiate between in-flight pending completion and blocked
updates.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-06-unblocked-mons-in-manager branch from e089a40 to 9c3ad28CompareJune 23, 2023 19:25
@TheBlueMatt

TheBlueMatt commented Jun 23, 2023

Copy link
Copy Markdown
CollaboratorAuthor

Grr, intermediate commit had intermediate state, had to shuffle around one line diff, but no total change:

$ git diff-tree -U1 e089a404 9c3ad28f
$

@TheBlueMatt
TheBlueMatt merged commit f833448 into lightningdevkit:mainJun 23, 2023
@TheBlueMattTheBlueMatt modified the milestones: 0.0.116alpha, 0.0.116Jun 24, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@codecov-commenter@dunxen@wpaulino@valentinewallace@alecchendev