Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino
, '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

Drop futures dependency from lightning-block-sync - #2141

Merged
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust
Mar 31, 2023
Merged

Drop futures dependency from lightning-block-sync#2141
wpaulino merged 4 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-03-fuck-rust

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some how I'd understood that futures had reasonable MSRV guarantees (e.g. at least Debian stable), but apparently that isn't actually the case, as they bumped it to upgrade to syn (with apparently no actual features or bugfixes added as a result?) with no minor version bump or any available alternative (unlike Tokio, which does LTS releases).

Luckily its relatively easy to just drop the futures dependency - it means a new connection for each request, which is annoying, but certainly not the end of the world, and its easier than trying to deal with pinning futures.

See rust-lang/futures-rs#2733

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Note, as an alternative, default-features = false would also fix this, but I'm a bit weary of them just breaking things again because they apparently don't have any MSRV guarantees (somehow I'd thought they did, but I guess I'd confused them simply being conservative int he past for having guarantees).

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

As a further alternative, we could use sync mutexes with an Optional client, using it as a cache, which I think in the common case would avoid fresh connections every time, while avoiding a fresh connection on every call when there's only one call at a time (which is normal).

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).
Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.
See rust-lang/futures-rs#2733
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Actually, went ahead and did the second because its super trivial.

Comment threadlightning-block-sync/src/rpc.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grr, also need to replace the futures usages in the async BP. I think its quite doable though.

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Ok, removed it from BP wholesale in two commits. Honestly dunno why we were relying on a whole mess of proc macro in the futures crate to implement select lol.

In general, only one request will be in flight at a time in
`lightning-block-sync`. Ideally we'd only have one connection, but
without using the `futures` mutex type.
Here we solve this narrowly for the one-request-at-a-time case by
caching the connection and takeing the connection out of the cache
while we work on it.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

That said, I'm open to pushback on the last commit (or the second one) - it does add a trivial use of unsafe, which is trivial, but technically its not required to fix MSRV, it just leaves us open to futures breaking us again in the future.

wpaulino
wpaulino previously approved these changes Mar 30, 2023
Comment threadlightning-background-processor/src/lib.rs Outdated

const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }

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.

what would not introducing this unsafe look like?

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.

Using another crate which has the unsafe in it instead. There's no way to poll a future in rust with zero unsafe. Now, we could consider coming up with some other way to do no-std timers inside an async context outside of polling a timer future, but I'm not 100% sure what is cleaner for users.

Comment threadlightning-background-processor/src/lib.rs
@codecov-commenter

codecov-commenter commented Mar 30, 2023

Copy link
Copy Markdown

Codecov Report

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

Comparison is base (783e818) 91.38% compared to head (491100d) 91.37%.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2141 +/- ##
==========================================
- Coverage 91.38% 91.37% -0.02% 
==========================================
Files 102 102 Lines 49759 49767 +8 Branches 49759 49767 +8 ==========================================
+ Hits 45472 45474 +2 - Misses 4287 4293 +6 
Impacted FilesCoverage Δ
lightning-background-processor/src/lib.rs77.80% <0.00%> (-0.50%)⬇️
lightning-block-sync/src/rest.rs67.18% <100.00%> (+1.61%)⬆️
lightning-block-sync/src/rpc.rs77.24% <100.00%> (+0.31%)⬆️

... and 2 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

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

`futures` recently broke our MSRV by bumping the `syn` major
version in a patch release. This makes it impractical for us to
use, instead here we replace the usage of its `select_biased` macro
with a trivial enum.
Given its simplicity we likely should have done this without ever
taking the dependency.
As `futures` apparently makes no guarantees on MSRVs even in patch
releases we really can't rely on it at all, and while it currently
has an acceptable MSRV without the macros feature, its best to just
remove it wholesale.
Luckily, removing it is relatively trivial, even if it requires
the most trivial of unsafe tags.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Addressed arik's comments and squashed.

// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
// but sadly there's a good bit of boilerplate here.
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
fn dummy_waker_action(_: *const ()) { }

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.

given these are dummies, would it make sense to insert some unreachable!s?

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 quite, they're still called, but they're no-op's.

@wpaulino
wpaulino merged commit 0e28bcb into lightningdevkit:mainMar 31, 2023
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.

4 participants

@TheBlueMatt@codecov-commenter@arik-so@wpaulino