@@ -191,6 +191,7 @@ pub use types::{
191191} ;
192192pub use vss_client;
193193
194+ use crate :: config:: { LIQUIDITY_DISCOVERY_RETRY_INITIAL_DELAY , LIQUIDITY_DISCOVERY_RETRY_MAX_DELAY } ;
194195use crate :: ffi:: maybe_wrap;
195196use crate :: liquidity:: Liquidity ;
196197use crate :: scoring:: setup_background_pathfinding_scores_sync;
@@ -755,33 +756,7 @@ impl Node {
755756 let logger = Arc :: clone ( & discovery_logger) ;
756757 let ls = Arc :: clone ( & liquidity_handler) ;
757758 discovery_set. spawn ( async move {
758- if let Err ( e) = cm. connect_peer_if_necessary ( node_id, address. clone ( ) ) . await {
759- log_error ! (
760- logger,
761- "Failed to connect to LSP {} for protocol discovery: {}" ,
762- node_id,
763- e
764- ) ;
765- return ;
766- }
767- match ls. discover_lsp_protocols ( & node_id) . await {
768- Ok ( protocols) => {
769- log_info ! (
770- logger,
771- "Discovered protocols for LSP {}: {:?}" ,
772- node_id,
773- protocols
774- ) ;
775- } ,
776- Err ( e) => {
777- log_error ! (
778- logger,
779- "Failed to discover protocols for LSP {}: {:?}" ,
780- node_id,
781- e
782- ) ;
783- } ,
784- }
759+ connect_and_discover_lsp ( & cm, & ls, & logger, node_id, address) . await ;
785760 } ) ;
786761 }
787762
@@ -811,6 +786,39 @@ impl Node {
811786 }
812787 } ) ;
813788
789+ // Retry protocol discovery for any LSPs that failed the startup batch, backing off up to a
790+ // cap and then retrying at that cap until every configured LSP has been discovered.
791+ let mut stop_retry = self . stop_sender . subscribe ( ) ;
792+ let retry_ls = Arc :: clone ( & self . liquidity_source ) ;
793+ let retry_logger = Arc :: clone ( & self . logger ) ;
794+ let retry_cm = Arc :: clone ( & self . connection_manager ) ;
795+ self . runtime . spawn_cancellable_background_task ( async move {
796+ let mut backoff = LIQUIDITY_DISCOVERY_RETRY_INITIAL_DELAY ;
797+ loop {
798+ tokio:: select! {
799+ _ = stop_retry. changed( ) => return ,
800+ _ = tokio:: time:: sleep( backoff) => { } ,
801+ }
802+
803+ let undiscovered_lsps = retry_ls. get_undiscovered_lsps ( ) ;
804+ if undiscovered_lsps. is_empty ( ) {
805+ break ;
806+ }
807+
808+ let mut discovery_set = tokio:: task:: JoinSet :: new ( ) ;
809+ for ( node_id, address) in undiscovered_lsps {
810+ let cm = Arc :: clone ( & retry_cm) ;
811+ let ls = Arc :: clone ( & retry_ls) ;
812+ let logger = Arc :: clone ( & retry_logger) ;
813+ discovery_set. spawn ( async move {
814+ connect_and_discover_lsp ( & cm, & ls, & logger, node_id, address) . await ;
815+ } ) ;
816+ }
817+ discovery_set. join_all ( ) . await ;
818+ backoff = ( backoff * 2 ) . min ( LIQUIDITY_DISCOVERY_RETRY_MAX_DELAY ) ;
819+ }
820+ } ) ;
821+
814822 log_info ! ( self . logger, "Startup complete." ) ;
815823 * is_running_lock = true ;
816824 Ok ( ( ) )
@@ -2485,6 +2493,23 @@ pub(crate) fn new_channel_anchor_reserve_sats(
24852493 }
24862494}
24872495
2496+ async fn connect_and_discover_lsp (
2497+ connection_manager : & ConnectionManager < Arc < Logger > > ,
2498+ liquidity_source : & LiquiditySource < Arc < Logger > > , logger : & Logger , node_id : PublicKey ,
2499+ address : SocketAddress ,
2500+ ) {
2501+ if let Err ( e) = connection_manager. connect_peer_if_necessary ( node_id, address) . await {
2502+ log_debug ! ( logger, "Failed to connect to LSP {} for protocol discovery: {}" , node_id, e) ;
2503+ return ;
2504+ }
2505+ match liquidity_source. discover_lsp_protocols ( & node_id) . await {
2506+ Ok ( protocols) => {
2507+ log_info ! ( logger, "Discovered protocols for LSP {}: {:?}" , node_id, protocols)
2508+ } ,
2509+ Err ( e) => log_debug ! ( logger, "Protocol discovery failed for LSP {}: {:?}" , node_id, e) ,
2510+ }
2511+ }
2512+
24882513#[ cfg( test) ]
24892514mod tests {
24902515 use lightning:: util:: ser:: { Readable , Writeable } ;
0 commit comments