Skip to content

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@ldk-claude-review-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Expose async monitor persistence for tests by tnull · Pull Request #4665 · lightningdevkit/rust-lightning · GitHub
Skip to content

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@ldk-claude-review-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose async monitor persistence for tests by tnull · Pull Request #4665 · lightningdevkit/rust-lightning · GitHub
Skip to content

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

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

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

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

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@ldk-claude-review-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose async monitor persistence for tests by tnull · Pull Request #4665 · lightningdevkit/rust-lightning · GitHub
Skip to content

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@ldk-claude-review-bot@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose async monitor persistence for tests by tnull · Pull Request #4665 · lightningdevkit/rust-lightning · GitHub
Skip to content

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

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

Expose async monitor persistence for tests - #4665

Closed
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier
Closed

Expose async monitor persistence for tests#4665
tnull wants to merge 1 commit into
lightningdevkit:mainfrom
tnull:2026-06-async-persister-test-notifier

Conversation

@tnull

@tnulltnull commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future.

Co-Authored-By: HAL 9000

Downstream tests need to exercise the same async monitor persistence
path used by ChainMonitor::new_async_beta without reimplementing
Persist.
Add test-only constructors that let TestChainMonitor and AsyncPersister
share the wake notifier so async completions drive the monitor update
future.
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Jun 8, 2026

Copy link
Copy Markdown

👋 I see @joostjager was un-assigned.
If you'd like another reviewer assignment, please click here.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

I've re-examined the full PR including the surrounding code that the diff touches: the AsyncPersister struct and its Persist impl, new_async_beta (which the test-only path mirrors), and the Notifier wiring through with_event_notifier / with_deferred_and_event_notifier.

The notifier plumbing in the test-only constructors faithfully matches the production new_async_beta wiring (event_notifier: Arc::clone(...) shared between the ChainMonitor and the AsyncPersister). The cfg gating is consistent: new_with_event_notifier on both ChainMonitor and TestChainMonitor are gated on _test_utils, and the private with_deferred_and_event_notifier helper handles both compilation paths so no Some(notifier) can reach a non-test build. The Arc::strong_count assertions in the test (2 after new_test, 3 after new_with_event_notifier) are correct given the wiring.

No issues found.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

@tnull

tnull commented Jun 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Hmm, its not entirely clear to me why this is needed? Can you spell out what kind of test you want to write and why it needs this? In general downstream tests (and, really, any tests) should just block the KVStore write they want to block, IMO.

Yes see here: lightningdevkit/ldk-node#919 (comment)

This will allow us to do:

typeTestMonitorPersister<K> = MonitorUpdatingPersisterAsync<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;typeTestAsyncPersister<K> = lightning::chain::chainmonitor::AsyncPersister<TestStoreRef<K>,TestFutureSpawner,&'static test_utils::TestLogger,&'static test_utils::TestKeysInterface,&'static test_utils::TestKeysInterface,&'static test_utils::TestBroadcaster,&'static test_utils::TestFeeEstimator,>;(..)let monitor_persister = TestMonitorPersister::new(
store,TestFutureSpawner::new(Arc::clone(&runtime)),&chanmon_cfg.logger,
max_pending_updates,&chanmon_cfg.keys_manager,&chanmon_cfg.keys_manager,&chanmon_cfg.tx_broadcaster,&chanmon_cfg.fee_estimator,);let event_notifier = Arc::new(Notifier::new());let persister = lightning::chain::chainmonitor::AsyncPersister::new_test(
monitor_persister,Arc::clone(&event_notifier),);(...)test_utils::TestChainMonitor::new_with_event_notifier(Some(&chanmon_cfg.chain_source),&chanmon_cfg.tx_broadcaster,&chanmon_cfg.logger,&chanmon_cfg.fee_estimator,&persister.persister,&chanmon_cfg.keys_manager,Arc::clone(&persister.event_notifier),)

.. rather than duplicating code via our custom TestMonitorUpdatePersister we have in that PR branch currently (which doesn't actually exercise the MonitorUpdatingPersister we have in prod):

https://github.com/tnull/ldk-node/blob/9e095d154babc6a37ecbe8a967eceadf4bf4a3a6/src/io/test_utils.rs#L41-L158

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Are there some specific tests in LDK Node that need that struct vs just using the MonitorUpdatingPersister you use in prod and hooking any writes to pause/resume them at the KVStore layer?

@joostjager
joostjager removed their request for review June 9, 2026 10:54
@tnulltnull self-assigned this Jun 11, 2026
@tnulltnull moved this to Goal: Merge in Weekly GoalsJun 11, 2026
@tnull
tnullforce-pushed the 2026-06-async-persister-test-notifier branch from 8b5d23a to 64b065aCompareJune 11, 2026 16:43
@tnull

Copy link
Copy Markdown
ContributorAuthor

Updated to line-wrap commit messages.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

@tnull

Copy link
Copy Markdown
ContributorAuthor

Still left with the above question. I don't love exposing this if there's an alternative way to do it downstream.

Excuse the delay! We use this in our SqliteStore/PostgresStore tests, see https://github.com/tnull/ldk-node/blob/a3e7653bb41a43e4bb2e5b1c5f55bae0ee8d1880/src/io/test_utils.rs#L276, which is basically an async version of https://github.com/lightningdevkit/rust-lightning/blob/main/lightning-persister/src/test_utils.rs#L162.

AFAIU, having a test-only path to allow constructing async-persisted variants of TestChainMonitors would also be required if we'd ever update our test coverage of the async-monitor path in general, but in particular also if we'd want to add coverage for the async path for the FilesystemStore tests, which seems like good end-to-end coverage to have (and of course eventually we'll want to upstream all of these stores to lightning-persister, so it would be good to reuse the same test utils / not have too much LDK Node custom code that we'll need to drop then anyways).

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I'm still confused. I can't try to play with this cause not sure what TestStoreRef and TestFutureSpawner are, but I don't see why you can't use new_async_beta and just build a normal ChainMonitor and use that. Why do you want the TestChainMonitor at all? And if you do, we could expose a way to build an async monitor in it (TestChainMonitor isn't really set up to support an underlying async monitor, though its certainly possible it mostly works).

@ldk-reviews-bot

Copy link
Copy Markdown

Hi @tnull,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/4665

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:tnull/2026-06-async-persister-test-notifier. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsJul 3, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@ldk-claude-review-bot@TheBlueMatt