@@ -571,45 +571,49 @@ pub(crate) mod futures_util {
571571 unsafe { Waker :: from_raw ( RawWaker :: new ( core:: ptr:: null ( ) , & DUMMY_WAKER_VTABLE ) ) }
572572 }
573573
574- enum JoinerResult < E , F : Future < Output = Result < ( ) , E > > + Unpin > {
574+ enum JoinerResult < ERR , F : Future < Output = Result < ( ) , ERR > > + Unpin > {
575575 Pending ( Option < F > ) ,
576- Ready ( Result < ( ) , E > ) ,
576+ Ready ( Result < ( ) , ERR > ) ,
577577 }
578578
579579 pub ( crate ) struct Joiner <
580- E ,
581- A : Future < Output = Result < ( ) , E > > + Unpin ,
582- B : Future < Output = Result < ( ) , E > > + Unpin ,
583- C : Future < Output = Result < ( ) , E > > + Unpin ,
584- 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 ,
585586 > {
586- a : JoinerResult < E , A > ,
587- b : JoinerResult < E , B > ,
588- c : JoinerResult < E , C > ,
589- 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 > ,
590592 }
591593
592594 impl <
593- E ,
594- A : Future < Output = Result < ( ) , E > > + Unpin ,
595- B : Future < Output = Result < ( ) , E > > + Unpin ,
596- C : Future < Output = Result < ( ) , E > > + Unpin ,
597- D : Future < Output = Result < ( ) , E > > + Unpin ,
598- > 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 >
599602 {
600603 pub ( crate ) fn new ( ) -> Self {
601604 Self {
602605 a : JoinerResult :: Pending ( None ) ,
603606 b : JoinerResult :: Pending ( None ) ,
604607 c : JoinerResult :: Pending ( None ) ,
605608 d : JoinerResult :: Pending ( None ) ,
609+ e : JoinerResult :: Pending ( None ) ,
606610 }
607611 }
608612
609613 pub ( crate ) fn set_a ( & mut self , fut : A ) {
610614 self . a = JoinerResult :: Pending ( Some ( fut) ) ;
611615 }
612- pub ( crate ) fn set_a_res ( & mut self , res : Result < ( ) , E > ) {
616+ pub ( crate ) fn set_a_res ( & mut self , res : Result < ( ) , ERR > ) {
613617 self . a = JoinerResult :: Ready ( res) ;
614618 }
615619 pub ( crate ) fn set_b ( & mut self , fut : B ) {
@@ -621,19 +625,23 @@ pub(crate) mod futures_util {
621625 pub ( crate ) fn set_d ( & mut self , fut : D ) {
622626 self . d = JoinerResult :: Pending ( Some ( fut) ) ;
623627 }
628+ pub ( crate ) fn set_e ( & mut self , fut : E ) {
629+ self . e = JoinerResult :: Pending ( Some ( fut) ) ;
630+ }
624631 }
625632
626633 impl <
627- E ,
628- A : Future < Output = Result < ( ) , E > > + Unpin ,
629- B : Future < Output = Result < ( ) , E > > + Unpin ,
630- C : Future < Output = Result < ( ) , E > > + Unpin ,
631- D : Future < Output = Result < ( ) , E > > + Unpin ,
632- > 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 >
633641 where
634- Joiner < E , A , B , C , D > : Unpin ,
642+ Joiner < ERR , A , B , C , D , E > : Unpin ,
635643 {
636- type Output = [ Result < ( ) , E > ; 4 ] ;
644+ type Output = [ Result < ( ) , ERR > ; 5 ] ;
637645 fn poll ( mut self : Pin < & mut Self > , ctx : & mut core:: task:: Context < ' _ > ) -> Poll < Self :: Output > {
638646 let mut all_complete = true ;
639647 macro_rules! handle {
@@ -642,7 +650,7 @@ pub(crate) mod futures_util {
642650 JoinerResult :: Pending ( None ) => {
643651 self . $val = JoinerResult :: Ready ( Ok ( ( ) ) ) ;
644652 } ,
645- JoinerResult :: <E , _>:: Pending ( Some ( ref mut val) ) => {
653+ JoinerResult :: <ERR , _>:: Pending ( Some ( ref mut val) ) => {
646654 match Pin :: new( val) . poll( ctx) {
647655 Poll :: Ready ( res) => {
648656 self . $val = JoinerResult :: Ready ( res) ;
@@ -660,9 +668,10 @@ pub(crate) mod futures_util {
660668 handle ! ( b) ;
661669 handle ! ( c) ;
662670 handle ! ( d) ;
671+ handle ! ( e) ;
663672
664673 if all_complete {
665- let mut res = [ Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) ] ;
674+ let mut res = [ Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) , Ok ( ( ) ) ] ;
666675 if let JoinerResult :: Ready ( ref mut val) = & mut self . a {
667676 core:: mem:: swap ( & mut res[ 0 ] , val) ;
668677 }
@@ -675,6 +684,9 @@ pub(crate) mod futures_util {
675684 if let JoinerResult :: Ready ( ref mut val) = & mut self . d {
676685 core:: mem:: swap ( & mut res[ 3 ] , val) ;
677686 }
687+ if let JoinerResult :: Ready ( ref mut val) = & mut self . e {
688+ core:: mem:: swap ( & mut res[ 4 ] , val) ;
689+ }
678690 Poll :: Ready ( res)
679691 } else {
680692 Poll :: Pending
@@ -1003,7 +1015,7 @@ where
10031015 OptionalSelector { optional_future : None }
10041016 } ;
10051017 let lm_fut = if let Some ( lm) = liquidity_manager. as_ref ( ) {
1006- let fut = lm. get_lm ( ) . get_pending_msgs_future ( ) ;
1018+ let fut = lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ;
10071019 OptionalSelector { optional_future : Some ( fut) }
10081020 } else {
10091021 OptionalSelector { optional_future : None }
@@ -1206,6 +1218,17 @@ where
12061218 None => { } ,
12071219 }
12081220
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+
12091232 // Run persistence tasks in parallel and exit if any of them returns an error.
12101233 for res in futures. await {
12111234 res?;
@@ -1562,7 +1585,7 @@ impl BackgroundProcessor {
15621585 & channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
15631586 & chain_monitor. get_update_future ( ) ,
15641587 & om. get_om ( ) . get_update_future ( ) ,
1565- & lm. get_lm ( ) . get_pending_msgs_future ( ) ,
1588+ & lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ,
15661589 ) ,
15671590 ( Some ( om) , None ) => Sleeper :: from_three_futures (
15681591 & channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
@@ -1572,7 +1595,7 @@ impl BackgroundProcessor {
15721595 ( None , Some ( lm) ) => Sleeper :: from_three_futures (
15731596 & channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
15741597 & chain_monitor. get_update_future ( ) ,
1575- & lm. get_lm ( ) . get_pending_msgs_future ( ) ,
1598+ & lm. get_lm ( ) . get_pending_msgs_or_needs_persist_future ( ) ,
15761599 ) ,
15771600 ( None , None ) => Sleeper :: from_two_futures (
15781601 & channel_manager. get_cm ( ) . get_event_or_persistence_needed_future ( ) ,
@@ -1606,6 +1629,13 @@ impl BackgroundProcessor {
16061629 log_trace ! ( logger, "Done persisting ChannelManager." ) ;
16071630 }
16081631
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+
16091639 // Note that we want to run a graph prune once not long after startup before
16101640 // falling back to our usual hourly prunes. This avoids short-lived clients never
16111641 // pruning their network graph. We run once 60 seconds after startup before
0 commit comments