Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages - #916

Merged
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements
May 15, 2021
Merged

Avoid persisting a ChannelManager after each timer tick and send update_channel re-enable messages#916
TheBlueMatt merged 6 commits into
lightningdevkit:mainfrom
TheBlueMatt:2021-05-fix-disabled-announcements

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Only somewhat-related commits here, but they touch the same code.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 1dabdc0 to cad69f4CompareMay 8, 2021 14:55
@codecov

codecovBot commented May 8, 2021

Copy link
Copy Markdown

Codecov Report

Merging #916 (ee36d64) into main (0ac3b44) will increase coverage by 0.08%.
The diff coverage is 92.17%.

Impacted file tree graph

@@ Coverage Diff @@## main #916 +/- ##
==========================================
+ Coverage 90.46% 90.55% +0.08% 
==========================================
Files 59 59 Lines 29788 29911 +123 ==========================================
+ Hits 26948 27086 +138 + Misses 2840 2825 -15 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.25% <71.42%> (-0.18%)⬇️
lightning/src/ln/functional_tests.rs97.00% <87.50%> (+0.19%)⬆️
lightning/src/ln/channelmanager.rs83.49% <98.71%> (+0.16%)⬆️
lightning-block-sync/src/rest.rs65.45% <0.00%> (-1.79%)⬇️
lightning-block-sync/src/rpc.rs78.37% <0.00%> (-1.11%)⬇️
lightning-block-sync/src/poll.rs91.66% <0.00%> (-0.38%)⬇️
lightning-block-sync/src/lib.rs95.18% <0.00%> (-0.20%)⬇️
lightning-net-tokio/src/lib.rs76.25% <0.00%> (-0.17%)⬇️
lightning-block-sync/src/init.rs93.56% <0.00%> (-0.15%)⬇️
... and 3 more

Continue to review full report at Codecov.

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

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from 8d7a09f to 9b69e1eCompareMay 8, 2021 21:20

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

Cool! I like how it sets a foundation for removing other unnecessary persists in the future too

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 9b69e1e to ba7a0c0CompareMay 11, 2021 15:43
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment on lines +7635 to +7639
let short_id = msg.contents.short_channel_id;
// Check generated channel_update match list in PendingChannelUpdate
if short_id != short_id_1 && short_id != short_id_2 && short_id != short_id_3 {
panic!("Generated ChannelUpdate for wrong chan!");
}

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.

Not sure I understand the value of this check. There aren't any other channels to update and it doesn't guarantee all channels are covered. Would the test suffice using one channel instead?

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.

Hmm, possibly? From a black-box point-of-view, its somewhat nice to ensure that it works in any direction - inbound or outbound and across multiple channels, though given the implementation I agree it'd be hard to screw that up. I went ahead and simplified this check, though.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Currently, we only send an update_channel message after
disconnecting a peer and waiting some time. We do not send a
followup when the peer has been reconnected for some time.
This changes that behavior to make the disconnect and reconnect
channel updates symmetric, and also simplifies the state machine
somewhat to make it more clear.
Finally, it serializes the current announcement state so that we
usually know when we need to send a new update_channel.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch 2 times, most recently from e981c57 to 4edd86dCompareMay 14, 2021 01:42
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

@jkczyz

Copy link
Copy Markdown
Contributor

Pushed two different approaches to cleaning up the notifierguard, see the two fixup commits.

I was hoping with the closure-based approach, the guarded code could go into the closure. But I guess that gets messy if you also need to return a value. Seems ok as is then.

For naming, I'd say the methods and enums are about notifying persisters rather than persisting itself, so should be named in such a manner (e.g., notify_on_drop).

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 4edd86d to 0a448b3CompareMay 14, 2021 20:35
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

I was hoping with the closure-based approach, the guarded code could go into the closure.

Ah! Indeed we could.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0a448b3 to 0f24e79CompareMay 14, 2021 20:54
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +545 to +549
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> PersistenceGuardOption> {
PersistenceNotifierGuard::optionally_notify(lock, notifier, || -> PersistenceGuardOption { PersistenceGuardOption::DoPersist })
}

fn optionally_notify<F: Fn() -> PersistenceGuardOption>(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier, persist_check: F) -> PersistenceNotifierGuard<'a, F> {

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.

Would Self for the return type work for these?

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.

No, we could move it into its own impl block and use Self, but notify_on_drop always has to be in a concrete impl block and return something else. I figured it was easier to just put them both in a concrete impl block (with concrete types that we don't care about) and then make the return types explicit.

@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 0f24e79 to 533eef8CompareMay 14, 2021 21:25
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 533eef8 to 39bd883CompareMay 14, 2021 22:37
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes from 533eef8 to 39bd883.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated

impl<'a> PersistenceNotifierGuard<'a> {
fn new(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> Self {
impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused

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.

nit: it's
Also a bit confused by this comment because it is used here, isn't it?

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.

No, the concrete type here is a function pointer (ie fn() -> NotifyOption), but we don't actually ever use a PersistenceNotifierGuard with a function pointer, only closures.

Currently, when a user calls `ChannelManager::timer_tick_occurred`
we always set the persister's update flag to true. This results in
a ChannelManager persistence after each timer tick, even when
nothing happened.
Instead, we add a new flag to `PersistenceNotifierGuard` to
indicate if we should skip setting the update flag.
When we had a event which caused us to set the persist flag in a
PersistenceNotifier in between wait calls, we will still wait,
potentially not persisting a ChannelManager when we should.
Worse, for wait_timeout, this caused us to always wait up to the
timeout, but then always return true that a persistence is needed.
Instead, we simply check the persist flag before waiting, returning
immediately if it is set.
@TheBlueMatt
TheBlueMattforce-pushed the 2021-05-fix-disabled-announcements branch from 39bd883 to ee36d64CompareMay 14, 2021 23:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Fixed two minor typos, will merge after CI:

$ git diff-tree -U1 39bd883e ee36d647
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 1e99cb72..92291293 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -537,3 +537,3 @@ enum NotifyOption {
///
-/// We allow callers to either always notify by constructing with `notify_on_drop` or chose to
+/// We allow callers to either always notify by constructing with `notify_on_drop` or choose to
/// notify or not based on whether relevant changes have been made, providing a closure to
@@ -547,3 +547,3 @@ struct PersistenceNotifierGuard<'a, F: Fn() -> NotifyOption> {
-impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, its unused
+impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> { // We don't care what the concrete F is here, it's unused
fn notify_on_drop(lock: &'a RwLock<()>, notifier: &'a PersistenceNotifier) -> PersistenceNotifierGuard<'a, impl Fn() -> NotifyOption> {
$

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TheBlueMatt@jkczyz@valentinewallace