@@ -69,6 +69,8 @@ use lightning::util::wakers::Sleeper;
69
69
use lightning_rapid_gossip_sync:: RapidGossipSync ;
70
70
71
71
use lightning_liquidity:: ALiquidityManager ;
72
+ #[ cfg( feature = "std" ) ]
73
+ use lightning_liquidity:: ALiquidityManagerSync ;
72
74
73
75
use core:: ops:: Deref ;
74
76
use core:: time:: Duration ;
@@ -424,6 +426,31 @@ pub const NO_LIQUIDITY_MANAGER: Option<
424
426
CM = & DynChannelManager ,
425
427
Filter = dyn chain:: Filter ,
426
428
C = & dyn chain:: Filter ,
429
+ KVStore = dyn lightning:: util:: persist:: KVStore ,
430
+ K = & dyn lightning:: util:: persist:: KVStore ,
431
+ TimeProvider = dyn lightning_liquidity:: utils:: time:: TimeProvider ,
432
+ TP = & dyn lightning_liquidity:: utils:: time:: TimeProvider ,
433
+ > + Send
434
+ + Sync ,
435
+ > ,
436
+ > = None ;
437
+
438
+ /// When initializing a background processor without a liquidity manager, this can be used to avoid
439
+ /// specifying a concrete `LiquidityManagerSync` type.
440
+ #[ cfg( all( not( c_bindings) , feature = "std" ) ) ]
441
+ pub const NO_LIQUIDITY_MANAGER_SYNC : Option <
442
+ Arc <
443
+ dyn ALiquidityManagerSync <
444
+ EntropySource = dyn EntropySource ,
445
+ ES = & dyn EntropySource ,
446
+ NodeSigner = dyn lightning:: sign:: NodeSigner ,
447
+ NS = & dyn lightning:: sign:: NodeSigner ,
448
+ AChannelManager = DynChannelManager ,
449
+ CM = & DynChannelManager ,
450
+ Filter = dyn chain:: Filter ,
451
+ C = & dyn chain:: Filter ,
452
+ KVStoreSync = dyn lightning:: util:: persist:: KVStoreSync ,
453
+ KS = & dyn lightning:: util:: persist:: KVStoreSync ,
427
454
TimeProvider = dyn lightning_liquidity:: utils:: time:: TimeProvider ,
428
455
TP = & dyn lightning_liquidity:: utils:: time:: TimeProvider ,
429
456
> + Send
@@ -544,45 +571,49 @@ pub(crate) mod futures_util {
544
571
unsafe { Waker :: from_raw ( RawWaker :: new ( core:: ptr:: null ( ) , & DUMMY_WAKER_VTABLE ) ) }
545
572
}
546
573
547
- enum JoinerResult < E , F : Future < Output = Result < ( ) , E > > + Unpin > {
574
+ enum JoinerResult < ERR , F : Future < Output = Result < ( ) , ERR > > + Unpin > {
548
575
Pending ( Option < F > ) ,
549
- Ready ( Result < ( ) , E > ) ,
576
+ Ready ( Result < ( ) , ERR > ) ,
550
577
}
551
578
552
579
pub ( crate ) struct Joiner <
553
- E ,
554
- A : Future < Output = Result < ( ) , E > > + Unpin ,
555
- B : Future < Output = Result < ( ) , E > > + Unpin ,
556
- C : Future < Output = Result < ( ) , E > > + Unpin ,
557
- D : Future < Output = Result < ( ) , E > > + Unpin ,
580
+ ERR ,
581
+ A : Future < Output = Result < ( ) , ERR > > + Unpin ,
582
+ B : Future < Output = Result < ( ) , ERR > > + Unpin ,
583
+ C : Future < Output = Result < ( ) , ERR > > + Unpin ,
584
+ D : Future < Output = Result < ( ) , ERR > > + Unpin ,
585
+ E : Future < Output = Result < ( ) , ERR > > + Unpin ,
558
586
> {
559
- a : JoinerResult < E , A > ,
560
- b : JoinerResult < E , B > ,
561
- c : JoinerResult < E , C > ,
562
- d : JoinerResult < E , D > ,
587
+ a : JoinerResult < ERR , A > ,
588
+ b : JoinerResult < ERR , B > ,
589
+ c : JoinerResult < ERR , C > ,
590
+ d : JoinerResult < ERR , D > ,
591
+ e : JoinerResult < ERR , E > ,
563
592
}
564
593
565
594
impl <
566
- E ,
567
- A : Future < Output = Result < ( ) , E > > + Unpin ,
568
- B : Future < Output = Result < ( ) , E > > + Unpin ,
569
- C : Future < Output = Result < ( ) , E > > + Unpin ,
570
- D : Future < Output = Result < ( ) , E > > + Unpin ,
571
- > Joiner < E , A , B , C , D >
595
+ ERR ,
596
+ A : Future < Output = Result < ( ) , ERR > > + Unpin ,
597
+ B : Future < Output = Result < ( ) , ERR > > + Unpin ,
598
+ C : Future < Output = Result < ( ) , ERR > > + Unpin ,
599
+ D : Future < Output = Result < ( ) , ERR > > + Unpin ,
600
+ E : Future < Output = Result < ( ) , ERR > > + Unpin ,
601
+ > Joiner < ERR , A , B , C , D , E >
572
602
{
573
603
pub ( crate ) fn new ( ) -> Self {
574
604
Self {
575
605
a : JoinerResult :: Pending ( None ) ,
576
606
b : JoinerResult :: Pending ( None ) ,
577
607
c : JoinerResult :: Pending ( None ) ,
578
608
d : JoinerResult :: Pending ( None ) ,
609
+ e : JoinerResult :: Pending ( None ) ,
579
610
}
580
611
}
581
612
582
613
pub ( crate ) fn set_a ( & mut self , fut : A ) {
583
614
self . a = JoinerResult :: Pending ( Some ( fut) ) ;
584
615
}
585
- pub ( crate ) fn set_a_res ( & mut self , res : Result < ( ) , E > ) {
616
+ pub ( crate ) fn set_a_res ( & mut self , res : Result < ( ) , ERR > ) {
586
617
self . a = JoinerResult :: Ready ( res) ;
587
618
}
588
619
pub ( crate ) fn set_b ( & mut self , fut : B ) {
@@ -594,19 +625,23 @@ pub(crate) mod futures_util {
594
625
pub ( crate ) fn set_d ( & mut self , fut : D ) {
595
626
self . d = JoinerResult :: Pending ( Some ( fut) ) ;
596
627
}
628
+ pub ( crate ) fn set_e ( & mut self , fut : E ) {
629
+ self . e = JoinerResult :: Pending ( Some ( fut) ) ;
630
+ }
597
631
}
598
632
599
633
impl <
600
- E ,
601
- A : Future < Output = Result < ( ) , E > > + Unpin ,
602
- B : Future < Output = Result < ( ) , E > > + Unpin ,
603
- C : Future < Output = Result < ( ) , E > > + Unpin ,
604
- D : Future < Output = Result < ( ) , E > > + Unpin ,
605
- > Future for Joiner < E , A , B , C , D >
634
+ ERR ,
635
+ A : Future < Output = Result < ( ) , ERR > > + Unpin ,
636
+ B : Future < Output = Result < ( ) , ERR > > + Unpin ,
637
+ C : Future < Output = Result < ( ) , ERR > > + Unpin ,
638
+ D : Future < Output = Result < ( ) , ERR > > + Unpin ,
639
+ E : Future < Output = Result < ( ) , ERR > > + Unpin ,
640
+ > Future for Joiner < ERR , A , B , C , D , E >
606
641
where
607
- Joiner < E , A , B , C , D > : Unpin ,
642
+ Joiner < ERR , A , B , C , D , E > : Unpin ,
608
643
{
609
- type Output = [ Result < ( ) , E > ; 4 ] ;
644
+ type Output = [ Result < ( ) , ERR > ; 5 ] ;
610
645
fn poll ( mut self : Pin < & mut Self > , ctx : & mut core:: task:: Context < ' _ > ) -> Poll < Self :: Output > {
611
646
let mut all_complete = true ;
612
647
macro_rules! handle {
@@ -615,7 +650,7 @@ pub(crate) mod futures_util {
615
650
JoinerResult :: Pending ( None ) => {
616
651
self . $val = JoinerResult :: Ready ( Ok ( ( ) ) ) ;
617
652
} ,
618
- JoinerResult :: <E , _>:: Pending ( Some ( ref mut val) ) => {
653
+ JoinerResult :: <ERR , _>:: Pending ( Some ( ref mut val) ) => {
619
654
match Pin :: new( val) . poll( ctx) {
620
655
Poll :: Ready ( res) => {
621
656
self . $val = JoinerResult :: Ready ( res) ;
@@ -633,9 +668,10 @@ pub(crate) mod futures_util {
633
668
handle ! ( b) ;
634
669
handle ! ( c) ;
635
670
handle ! ( d) ;
671
+ handle ! ( e) ;
636
672
637
673
if all_complete {
638
- let mut res = [ Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) ] ;
674
+ let mut res = [ Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) ] ;
639
675
if let JoinerResult :: Ready ( ref mut val) = & mut self . a {
640
676
core:: mem:: swap ( & mut res[ 0 ] , val) ;
641
677
}
@@ -648,6 +684,9 @@ pub(crate) mod futures_util {
648
684
if let JoinerResult :: Ready ( ref mut val) = & mut self . d {
649
685
core:: mem:: swap ( & mut res[ 3 ] , val) ;
650
686
}
687
+ if let JoinerResult :: Ready ( ref mut val) = & mut self . e {
688
+ core:: mem:: swap ( & mut res[ 4 ] , val) ;
689
+ }
651
690
Poll :: Ready ( res)
652
691
} else {
653
692
Poll :: Pending
@@ -731,7 +770,7 @@ use futures_util::{dummy_waker, Joiner, OptionalSelector, Selector, SelectorOutp
731
770
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
732
771
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
733
772
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
734
- /// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<DefaultTimeProvider>>;
773
+ /// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<Store>, Arc< DefaultTimeProvider>>;
735
774
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
736
775
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, StoreSync>;
737
776
/// # type OutputSweeper<B, D, FE, F, O> = lightning::util::sweep::OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<Store>, Arc<Logger>, Arc<O>>;
@@ -976,7 +1015,7 @@ where
976
1015
OptionalSelector { optional_future : None }
977
1016
} ;
978
1017
let lm_fut = if let Some ( lm) = liquidity_manager. as_ref ( ) {
979
- let fut = lm. get_lm ( ) . get_pending_msgs_future ( ) ;
1018
+ let fut = lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ;
980
1019
OptionalSelector { optional_future : Some ( fut) }
981
1020
} else {
982
1021
OptionalSelector { optional_future : None }
@@ -1179,6 +1218,17 @@ where
1179
1218
None => { } ,
1180
1219
}
1181
1220
1221
+ if let Some ( liquidity_manager) = liquidity_manager. as_ref ( ) {
1222
+ log_trace ! ( logger, "Persisting LiquidityManager..." ) ;
1223
+ let fut = async {
1224
+ liquidity_manager. get_lm ( ) . persist ( ) . await . map_err ( |e| {
1225
+ log_error ! ( logger, "Persisting LiquidityManager failed: {}" , e) ;
1226
+ e
1227
+ } )
1228
+ } ;
1229
+ futures. set_e ( Box :: pin ( fut) ) ;
1230
+ }
1231
+
1182
1232
// Run persistence tasks in parallel and exit if any of them returns an error.
1183
1233
for res in futures. await {
1184
1234
res?;
@@ -1450,7 +1500,7 @@ impl BackgroundProcessor {
1450
1500
CM :: Target : AChannelManager ,
1451
1501
OM :: Target : AOnionMessenger ,
1452
1502
PM :: Target : APeerManager ,
1453
- LM :: Target : ALiquidityManager ,
1503
+ LM :: Target : ALiquidityManagerSync ,
1454
1504
D :: Target : ChangeDestinationSourceSync ,
1455
1505
O :: Target : ' static + OutputSpender ,
1456
1506
K :: Target : ' static + KVStoreSync ,
@@ -1535,7 +1585,7 @@ impl BackgroundProcessor {
1535
1585
& channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
1536
1586
& chain_monitor. get_update_future ( ) ,
1537
1587
& om. get_om ( ) . get_update_future ( ) ,
1538
- & lm. get_lm ( ) . get_pending_msgs_future ( ) ,
1588
+ & lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ,
1539
1589
) ,
1540
1590
( Some ( om) , None ) => Sleeper :: from_three_futures (
1541
1591
& channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
@@ -1545,7 +1595,7 @@ impl BackgroundProcessor {
1545
1595
( None , Some ( lm) ) => Sleeper :: from_three_futures (
1546
1596
& channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
1547
1597
& chain_monitor. get_update_future ( ) ,
1548
- & lm. get_lm ( ) . get_pending_msgs_future ( ) ,
1598
+ & lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ,
1549
1599
) ,
1550
1600
( None , None ) => Sleeper :: from_two_futures (
1551
1601
& channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
@@ -1579,6 +1629,13 @@ impl BackgroundProcessor {
1579
1629
log_trace ! ( logger, "Done persisting ChannelManager." ) ;
1580
1630
}
1581
1631
1632
+ if let Some ( liquidity_manager) = liquidity_manager. as_ref ( ) {
1633
+ log_trace ! ( logger, "Persisting LiquidityManager..." ) ;
1634
+ let _ = liquidity_manager. get_lm ( ) . persist ( ) . map_err ( |e| {
1635
+ log_error ! ( logger, "Persisting LiquidityManager failed: {}" , e) ;
1636
+ } ) ;
1637
+ }
1638
+
1582
1639
// Note that we want to run a graph prune once not long after startup before
1583
1640
// falling back to our usual hourly prunes. This avoids short-lived clients never
1584
1641
// pruning their network graph. We run once 60 seconds after startup before
@@ -1793,7 +1850,7 @@ mod tests {
1793
1850
use lightning:: util:: test_utils;
1794
1851
use lightning:: { get_event, get_event_msg} ;
1795
1852
use lightning_liquidity:: utils:: time:: DefaultTimeProvider ;
1796
- use lightning_liquidity:: LiquidityManager ;
1853
+ use lightning_liquidity:: { ALiquidityManagerSync , LiquidityManagerSync } ;
1797
1854
use lightning_persister:: fs_store:: FilesystemStore ;
1798
1855
use lightning_rapid_gossip_sync:: RapidGossipSync ;
1799
1856
use std:: collections:: VecDeque ;
@@ -1890,11 +1947,12 @@ mod tests {
1890
1947
IgnoringMessageHandler ,
1891
1948
> ;
1892
1949
1893
- type LM = LiquidityManager <
1950
+ type LM = LiquidityManagerSync <
1894
1951
Arc < KeysManager > ,
1895
1952
Arc < KeysManager > ,
1896
1953
Arc < ChannelManager > ,
1897
1954
Arc < dyn Filter + Sync + Send > ,
1955
+ Arc < Persister > ,
1898
1956
Arc < DefaultTimeProvider > ,
1899
1957
> ;
1900
1958
@@ -2342,15 +2400,19 @@ mod tests {
2342
2400
Arc :: clone ( & logger) ,
2343
2401
Arc :: clone ( & keys_manager) ,
2344
2402
) ) ;
2345
- let liquidity_manager = Arc :: new ( LiquidityManager :: new (
2346
- Arc :: clone ( & keys_manager) ,
2347
- Arc :: clone ( & keys_manager) ,
2348
- Arc :: clone ( & manager) ,
2349
- None ,
2350
- None ,
2351
- None ,
2352
- None ,
2353
- ) ) ;
2403
+ let liquidity_manager = Arc :: new (
2404
+ LiquidityManagerSync :: new (
2405
+ Arc :: clone ( & keys_manager) ,
2406
+ Arc :: clone ( & keys_manager) ,
2407
+ Arc :: clone ( & manager) ,
2408
+ None ,
2409
+ None ,
2410
+ Arc :: clone ( & kv_store) ,
2411
+ None ,
2412
+ None ,
2413
+ )
2414
+ . unwrap ( ) ,
2415
+ ) ;
2354
2416
let node = Node {
2355
2417
node : manager,
2356
2418
p2p_gossip_sync,
@@ -2727,7 +2789,7 @@ mod tests {
2727
2789
Some ( Arc :: clone ( & nodes[ 0 ] . messenger ) ) ,
2728
2790
nodes[ 0 ] . rapid_gossip_sync ( ) ,
2729
2791
Arc :: clone ( & nodes[ 0 ] . peer_manager ) ,
2730
- Some ( Arc :: clone ( & nodes[ 0 ] . liquidity_manager ) ) ,
2792
+ Some ( nodes[ 0 ] . liquidity_manager . get_lm_async ( ) ) ,
2731
2793
Some ( nodes[ 0 ] . sweeper . sweeper_async ( ) ) ,
2732
2794
Arc :: clone ( & nodes[ 0 ] . logger ) ,
2733
2795
Some ( Arc :: clone ( & nodes[ 0 ] . scorer ) ) ,
@@ -3236,7 +3298,7 @@ mod tests {
3236
3298
Some ( Arc :: clone ( & nodes[ 0 ] . messenger ) ) ,
3237
3299
nodes[ 0 ] . rapid_gossip_sync ( ) ,
3238
3300
Arc :: clone ( & nodes[ 0 ] . peer_manager ) ,
3239
- Some ( Arc :: clone ( & nodes[ 0 ] . liquidity_manager ) ) ,
3301
+ Some ( nodes[ 0 ] . liquidity_manager . get_lm_async ( ) ) ,
3240
3302
Some ( nodes[ 0 ] . sweeper . sweeper_async ( ) ) ,
3241
3303
Arc :: clone ( & nodes[ 0 ] . logger ) ,
3242
3304
Some ( Arc :: clone ( & nodes[ 0 ] . scorer ) ) ,
@@ -3451,7 +3513,7 @@ mod tests {
3451
3513
Some ( Arc :: clone ( & nodes[ 0 ] . messenger ) ) ,
3452
3514
nodes[ 0 ] . no_gossip_sync ( ) ,
3453
3515
Arc :: clone ( & nodes[ 0 ] . peer_manager ) ,
3454
- Some ( Arc :: clone ( & nodes[ 0 ] . liquidity_manager ) ) ,
3516
+ Some ( nodes[ 0 ] . liquidity_manager . get_lm_async ( ) ) ,
3455
3517
Some ( nodes[ 0 ] . sweeper . sweeper_async ( ) ) ,
3456
3518
Arc :: clone ( & nodes[ 0 ] . logger ) ,
3457
3519
Some ( Arc :: clone ( & nodes[ 0 ] . scorer ) ) ,
@@ -3500,7 +3562,7 @@ mod tests {
3500
3562
crate :: NO_ONION_MESSENGER ,
3501
3563
nodes[ 0 ] . no_gossip_sync ( ) ,
3502
3564
Arc :: clone ( & nodes[ 0 ] . peer_manager ) ,
3503
- crate :: NO_LIQUIDITY_MANAGER ,
3565
+ crate :: NO_LIQUIDITY_MANAGER_SYNC ,
3504
3566
Some ( Arc :: clone ( & nodes[ 0 ] . sweeper ) ) ,
3505
3567
Arc :: clone ( & nodes[ 0 ] . logger ) ,
3506
3568
Some ( Arc :: clone ( & nodes[ 0 ] . scorer ) ) ,
0 commit comments