@@ -72,6 +72,8 @@ pub struct ProxyInner {
7272 kv_store : Arc < KvStore > ,
7373 /// WaveKV sync service for network synchronization
7474 pub ( crate ) wavekv_sync : Option < Arc < WaveKvSyncService > > ,
75+ /// HTTPS client config for mTLS (used for bootnode peer discovery)
76+ https_config : Option < HttpsClientConfig > ,
7577}
7678
7779#[ derive( Debug , Serialize , Deserialize , Default ) ]
@@ -189,7 +191,7 @@ impl ProxyInner {
189191
190192 // Create WaveKV sync service (only if sync is enabled)
191193 let wavekv_sync = if config. sync . enabled {
192- match WaveKvSyncService :: new ( & kv_store, & config. sync , https_config) {
194+ match WaveKvSyncService :: new ( & kv_store, & config. sync , https_config. clone ( ) ) {
193195 Ok ( sync_service) => Some ( Arc :: new ( sync_service) ) ,
194196 Err ( err) => {
195197 error ! ( "Failed to create WaveKV sync service: {err}" ) ;
@@ -266,6 +268,7 @@ impl ProxyInner {
266268 certbot,
267269 kv_store,
268270 wavekv_sync,
271+ https_config : Some ( https_config) ,
269272 } )
270273 }
271274
@@ -289,6 +292,7 @@ impl Proxy {
289292 start_certbot_task ( self . clone ( ) ) . await ;
290293 start_cert_store_watch_task ( self . clone ( ) ) ;
291294 start_zt_domain_watch_task ( self . clone ( ) ) ;
295+ start_bootnode_discovery_task ( self . clone ( ) ) ;
292296 Ok ( ( ) )
293297 }
294298
@@ -583,6 +587,48 @@ fn start_zt_domain_watch_task(proxy: Proxy) {
583587 info ! ( "ZT-Domain watch task started" ) ;
584588}
585589
590+ /// Periodically retry bootnode peer discovery if no peers are available
591+ fn start_bootnode_discovery_task ( proxy : Proxy ) {
592+ if !proxy. config . sync . enabled || proxy. config . sync . bootnode . is_empty ( ) {
593+ return ;
594+ }
595+
596+ let bootnode = proxy. config . sync . bootnode . clone ( ) ;
597+ let node_id = proxy. config . sync . node_id ;
598+ let kv_store = proxy. kv_store . clone ( ) ;
599+ let https_config = match & proxy. https_config {
600+ Some ( config) => config. clone ( ) ,
601+ None => return ,
602+ } ;
603+
604+ tokio:: spawn ( async move {
605+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
606+ loop {
607+ interval. tick ( ) . await ;
608+ // Check if we already have peers
609+ let n_peers = kv_store
610+ . load_all_node_statuses ( )
611+ . keys ( )
612+ . filter ( |& id| * id != node_id)
613+ . count ( ) ;
614+ if n_peers > 0 {
615+ info ! ( "bootnode peer discovery finished, {n_peers} peers found" ) ;
616+ break ;
617+ }
618+ // Try to fetch peers from bootnode
619+ debug ! ( "retrying bootnode peer discovery..." ) ;
620+ if let Err ( err) =
621+ fetch_peers_from_bootnode ( & bootnode, & kv_store, node_id, & https_config) . await
622+ {
623+ debug ! ( "bootnode discovery retry failed: {err}" ) ;
624+ } else {
625+ info ! ( "bootnode peer discovery succeeded" ) ;
626+ }
627+ }
628+ } ) ;
629+ info ! ( "Bootnode discovery task started (will retry every 10s if no peers)" ) ;
630+ }
631+
586632async fn start_wavekv_sync_task ( proxy : Proxy , wavekv_sync : Arc < WaveKvSyncService > ) {
587633 if !proxy. config . sync . enabled {
588634 info ! ( "WaveKV sync is disabled" ) ;
0 commit comments