Skip to content

Commit 27cf31a

Browse files
authored
Merge pull request #4132 from TheBlueMatt/2025-09-async-bp-consts
Make background-processor `NO_*` constants actually `Send` + `Sync`
2 parents 19a9dbd + e040fcd commit 27cf31a

File tree

1 file changed

+100
-56
lines changed
  • lightning-background-processor/src

1 file changed

+100
-56
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 100 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -331,52 +331,60 @@ fn update_scorer<'a, S: Deref<Target = SC> + Send + Sync, SC: 'a + WriteableScor
331331
true
332332
}
333333

334+
#[cfg(all(not(c_bindings), feature = "std"))]
335+
type ScorerWrapper<T> = std::sync::RwLock<T>;
336+
337+
#[cfg(all(not(c_bindings), not(feature = "std")))]
338+
type ScorerWrapper<T> = core::cell::RefCell<T>;
339+
334340
#[cfg(not(c_bindings))]
335341
type DynRouter = lightning::routing::router::DefaultRouter<
336-
&'static NetworkGraph<&'static dyn Logger>,
337-
&'static dyn Logger,
338-
&'static dyn EntropySource,
339-
&'static core::cell::RefCell<
342+
&'static NetworkGraph<&'static (dyn Logger + Send + Sync)>,
343+
&'static (dyn Logger + Send + Sync),
344+
&'static (dyn EntropySource + Send + Sync),
345+
&'static ScorerWrapper<
340346
lightning::routing::scoring::ProbabilisticScorer<
341-
&'static NetworkGraph<&'static dyn Logger>,
342-
&'static dyn Logger,
347+
&'static NetworkGraph<&'static (dyn Logger + Send + Sync)>,
348+
&'static (dyn Logger + Send + Sync),
343349
>,
344350
>,
345351
lightning::routing::scoring::ProbabilisticScoringFeeParameters,
346352
lightning::routing::scoring::ProbabilisticScorer<
347-
&'static NetworkGraph<&'static dyn Logger>,
348-
&'static dyn Logger,
353+
&'static NetworkGraph<&'static (dyn Logger + Send + Sync)>,
354+
&'static (dyn Logger + Send + Sync),
349355
>,
350356
>;
351357

352358
#[cfg(not(c_bindings))]
353359
type DynMessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
354-
&'static NetworkGraph<&'static dyn Logger>,
355-
&'static dyn Logger,
356-
&'static dyn EntropySource,
360+
&'static NetworkGraph<&'static (dyn Logger + Send + Sync)>,
361+
&'static (dyn Logger + Send + Sync),
362+
&'static (dyn EntropySource + Send + Sync),
357363
>;
358364

359365
#[cfg(all(not(c_bindings), not(taproot)))]
360-
type DynSignerProvider =
361-
dyn lightning::sign::SignerProvider<EcdsaSigner = lightning::sign::InMemorySigner>;
366+
type DynSignerProvider = dyn lightning::sign::SignerProvider<EcdsaSigner = lightning::sign::InMemorySigner>
367+
+ Send
368+
+ Sync;
362369

363370
#[cfg(all(not(c_bindings), taproot))]
364-
type DynSignerProvider = dyn lightning::sign::SignerProvider<
371+
type DynSignerProvider = (dyn lightning::sign::SignerProvider<
365372
EcdsaSigner = lightning::sign::InMemorySigner,
366373
TaprootSigner = lightning::sign::InMemorySigner,
367-
>;
374+
> + Send
375+
+ Sync);
368376

369377
#[cfg(not(c_bindings))]
370378
type DynChannelManager = lightning::ln::channelmanager::ChannelManager<
371-
&'static dyn chain::Watch<lightning::sign::InMemorySigner>,
372-
&'static dyn BroadcasterInterface,
373-
&'static dyn EntropySource,
374-
&'static dyn lightning::sign::NodeSigner,
379+
&'static (dyn chain::Watch<lightning::sign::InMemorySigner> + Send + Sync),
380+
&'static (dyn BroadcasterInterface + Send + Sync),
381+
&'static (dyn EntropySource + Send + Sync),
382+
&'static (dyn lightning::sign::NodeSigner + Send + Sync),
375383
&'static DynSignerProvider,
376-
&'static dyn FeeEstimator,
384+
&'static (dyn FeeEstimator + Send + Sync),
377385
&'static DynRouter,
378386
&'static DynMessageRouter,
379-
&'static dyn Logger,
387+
&'static (dyn Logger + Send + Sync),
380388
>;
381389

382390
/// When initializing a background processor without an onion messenger, this can be used to avoid
@@ -385,12 +393,12 @@ type DynChannelManager = lightning::ln::channelmanager::ChannelManager<
385393
pub const NO_ONION_MESSENGER: Option<
386394
Arc<
387395
dyn AOnionMessenger<
388-
EntropySource = dyn EntropySource,
389-
ES = &dyn EntropySource,
390-
NodeSigner = dyn lightning::sign::NodeSigner,
391-
NS = &dyn lightning::sign::NodeSigner,
392-
Logger = dyn Logger,
393-
L = &'static dyn Logger,
396+
EntropySource = dyn EntropySource + Send + Sync,
397+
ES = &(dyn EntropySource + Send + Sync),
398+
NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync,
399+
NS = &(dyn lightning::sign::NodeSigner + Send + Sync),
400+
Logger = dyn Logger + Send + Sync,
401+
L = &'static (dyn Logger + Send + Sync),
394402
NodeIdLookUp = DynChannelManager,
395403
NL = &'static DynChannelManager,
396404
MessageRouter = DynMessageRouter,
@@ -414,20 +422,22 @@ pub const NO_ONION_MESSENGER: Option<
414422
pub const NO_LIQUIDITY_MANAGER: Option<
415423
Arc<
416424
dyn ALiquidityManager<
417-
EntropySource = dyn EntropySource,
418-
ES = &dyn EntropySource,
419-
NodeSigner = dyn lightning::sign::NodeSigner,
420-
NS = &dyn lightning::sign::NodeSigner,
425+
EntropySource = dyn EntropySource + Send + Sync,
426+
ES = &(dyn EntropySource + Send + Sync),
427+
NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync,
428+
NS = &(dyn lightning::sign::NodeSigner + Send + Sync),
421429
AChannelManager = DynChannelManager,
422430
CM = &DynChannelManager,
423-
Filter = dyn chain::Filter,
424-
C = &dyn chain::Filter,
425-
KVStore = dyn lightning::util::persist::KVStore,
426-
K = &dyn lightning::util::persist::KVStore,
427-
TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider,
428-
TP = &dyn lightning_liquidity::utils::time::TimeProvider,
429-
BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface,
430-
T = &dyn BroadcasterInterface,
431+
Filter = dyn chain::Filter + Send + Sync,
432+
C = &(dyn chain::Filter + Send + Sync),
433+
KVStore = dyn lightning::util::persist::KVStore + Send + Sync,
434+
K = &(dyn lightning::util::persist::KVStore + Send + Sync),
435+
TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync,
436+
TP = &(dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync),
437+
BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface
438+
+ Send
439+
+ Sync,
440+
T = &(dyn BroadcasterInterface + Send + Sync),
431441
> + Send
432442
+ Sync,
433443
>,
@@ -439,20 +449,22 @@ pub const NO_LIQUIDITY_MANAGER: Option<
439449
pub const NO_LIQUIDITY_MANAGER_SYNC: Option<
440450
Arc<
441451
dyn ALiquidityManagerSync<
442-
EntropySource = dyn EntropySource,
443-
ES = &dyn EntropySource,
444-
NodeSigner = dyn lightning::sign::NodeSigner,
445-
NS = &dyn lightning::sign::NodeSigner,
452+
EntropySource = dyn EntropySource + Send + Sync,
453+
ES = &(dyn EntropySource + Send + Sync),
454+
NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync,
455+
NS = &(dyn lightning::sign::NodeSigner + Send + Sync),
446456
AChannelManager = DynChannelManager,
447457
CM = &DynChannelManager,
448-
Filter = dyn chain::Filter,
449-
C = &dyn chain::Filter,
450-
KVStoreSync = dyn lightning::util::persist::KVStoreSync,
451-
KS = &dyn lightning::util::persist::KVStoreSync,
452-
TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider,
453-
TP = &dyn lightning_liquidity::utils::time::TimeProvider,
454-
BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface,
455-
T = &dyn BroadcasterInterface,
458+
Filter = dyn chain::Filter + Send + Sync,
459+
C = &(dyn chain::Filter + Send + Sync),
460+
KVStoreSync = dyn lightning::util::persist::KVStoreSync + Send + Sync,
461+
KS = &(dyn lightning::util::persist::KVStoreSync + Send + Sync),
462+
TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync,
463+
TP = &(dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync),
464+
BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface
465+
+ Send
466+
+ Sync,
467+
T = &(dyn BroadcasterInterface + Send + Sync),
456468
> + Send
457469
+ Sync,
458470
>,
@@ -3582,15 +3594,13 @@ mod tests {
35823594
r2.unwrap()
35833595
}
35843596

3585-
#[test]
3597+
#[tokio::test]
35863598
#[cfg(not(c_bindings))]
3587-
fn test_no_consts() {
3599+
async fn test_no_consts() {
35883600
// Compile-test the NO_* constants can be used.
35893601
let (_, nodes) = create_nodes(1, "test_no_consts");
3590-
let data_dir = nodes[0].kv_store.get_data_dir();
3591-
let persister = Arc::new(Persister::new(data_dir));
35923602
let bg_processor = BackgroundProcessor::start(
3593-
persister,
3603+
Arc::clone(&nodes[0].kv_store),
35943604
move |_: Event| Ok(()),
35953605
Arc::clone(&nodes[0].chain_monitor),
35963606
Arc::clone(&nodes[0].node),
@@ -3606,5 +3616,39 @@ mod tests {
36063616
if !std::thread::panicking() {
36073617
bg_processor.stop().unwrap();
36083618
}
3619+
3620+
let kv_store = KVStoreSyncWrapper(Arc::clone(&nodes[0].kv_store));
3621+
let (exit_sender, exit_receiver) = tokio::sync::watch::channel(());
3622+
let sweeper_async: &'static OutputSweeper<_, _, _, _, _, _, _> = unsafe {
3623+
&*(nodes[0].sweeper.sweeper_async() as *const OutputSweeper<_, _, _, _, _, _, _>)
3624+
as &'static OutputSweeper<_, _, _, _, _, _, _>
3625+
};
3626+
let bp_future = super::process_events_async(
3627+
kv_store,
3628+
move |_: Event| async move { Ok(()) },
3629+
Arc::clone(&nodes[0].chain_monitor),
3630+
Arc::clone(&nodes[0].node),
3631+
crate::NO_ONION_MESSENGER,
3632+
nodes[0].no_gossip_sync(),
3633+
Arc::clone(&nodes[0].peer_manager),
3634+
crate::NO_LIQUIDITY_MANAGER,
3635+
Some(sweeper_async),
3636+
Arc::clone(&nodes[0].logger),
3637+
Some(Arc::clone(&nodes[0].scorer)),
3638+
move |dur: Duration| {
3639+
let mut exit_receiver = exit_receiver.clone();
3640+
Box::pin(async move {
3641+
tokio::select! {
3642+
_ = tokio::time::sleep(dur) => false,
3643+
_ = exit_receiver.changed() => true,
3644+
}
3645+
})
3646+
},
3647+
false,
3648+
|| Some(Duration::ZERO),
3649+
);
3650+
let t1 = tokio::spawn(bp_future);
3651+
exit_sender.send(()).unwrap();
3652+
t1.await.unwrap().unwrap();
36093653
}
36103654
}

0 commit comments

Comments
 (0)