Skip to content

Commit 22c9f57

Browse files
committed
feat(validator): add periodic metagraph refresh every 5 minutes
Previously metagraph was only synced at startup, so new miners registered after validator start would not be found when converting hotkey to UID. Now re-syncs metagraph every 5 minutes to pick up new miners.
1 parent 3cfbd77 commit 22c9f57

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

bins/validator-node/src/main.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)