@@ -583,6 +583,7 @@ async fn main() -> Result<()> {
583583 let subtensor_signer: Option < Arc < BittensorSigner > > ;
584584 let subtensor_client: Option < Arc < RwLock < SubtensorClient > > > ;
585585 let mut block_rx: Option < tokio:: sync:: mpsc:: Receiver < BlockSyncEvent > > = None ;
586+ let bittensor_client_for_metagraph: Option < Arc < BittensorClient > > ;
586587
587588 if !args. no_bittensor {
588589 info ! (
@@ -642,7 +643,9 @@ async fn main() -> Result<()> {
642643 let rx = sync. take_event_receiver ( ) ;
643644
644645 let bittensor_client = Arc :: new ( bittensor_client) ;
645- if let Err ( e) = sync. connect ( bittensor_client) . await {
646+ let bittensor_client_for_sync = bittensor_client. clone ( ) ;
647+ bittensor_client_for_metagraph = Some ( bittensor_client. clone ( ) ) ;
648+ if let Err ( e) = sync. connect ( bittensor_client_for_sync) . await {
646649 warn ! ( "Block sync connect failed: {}" , e) ;
647650 } else {
648651 tokio:: spawn ( async move {
@@ -659,13 +662,15 @@ async fn main() -> Result<()> {
659662 subtensor = None ;
660663 subtensor_signer = None ;
661664 subtensor_client = None ;
665+ bittensor_client_for_metagraph = None ;
662666 }
663667 }
664668 } else {
665669 info ! ( "Bittensor: disabled" ) ;
666670 subtensor = None ;
667671 subtensor_signer = None ;
668672 subtensor_client = None ;
673+ bittensor_client_for_metagraph = None ;
669674 }
670675
671676 info ! ( "Validator running. Ctrl+C to stop." ) ;
@@ -675,6 +680,7 @@ async fn main() -> Result<()> {
675680 let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 60 ) ) ;
676681 let mut metrics_interval = tokio:: time:: interval ( Duration :: from_secs ( 5 ) ) ;
677682 let mut challenge_refresh_interval = tokio:: time:: interval ( Duration :: from_secs ( 60 ) ) ;
683+ let mut metagraph_refresh_interval = tokio:: time:: interval ( Duration :: from_secs ( 300 ) ) ; // 5 minutes
678684
679685 // Store challenges in Arc<RwLock> for periodic refresh
680686 let cached_challenges: Arc < RwLock < Vec < ChallengeInfo > > > = Arc :: new ( RwLock :: new (
@@ -738,6 +744,22 @@ async fn main() -> Result<()> {
738744 }
739745 }
740746
747+ _ = metagraph_refresh_interval. tick( ) => {
748+ // Re-sync metagraph to pick up new miners
749+ if let ( Some ( ref bt_client) , Some ( ref st_client) ) = ( & bittensor_client_for_metagraph, & subtensor_client) {
750+ match sync_metagraph( bt_client, netuid) . await {
751+ Ok ( mg) => {
752+ info!( "Metagraph refreshed: {} neurons" , mg. n) ;
753+ let mut client = st_client. write( ) ;
754+ client. set_metagraph( mg) ;
755+ }
756+ Err ( e) => {
757+ warn!( "Metagraph refresh failed: {}" , e) ;
758+ }
759+ }
760+ }
761+ }
762+
741763 _ = tokio:: signal:: ctrl_c( ) => {
742764 info!( "Shutting down..." ) ;
743765 break ;
0 commit comments