diff --git a/seaweed-volume/src/main.rs b/seaweed-volume/src/main.rs index 9fa3c4c51..f180392db 100644 --- a/seaweed-volume/src/main.rs +++ b/seaweed-volume/src/main.rs @@ -269,27 +269,6 @@ async fn run( store.data_center = config.data_center.clone(); store.rack = config.rack.clone(); - // Add disk locations - for (i, dir) in config.folders.iter().enumerate() { - let idx_dir = if config.idx_folder.is_empty() { - dir.as_str() - } else { - config.idx_folder.as_str() - }; - let max_volumes = config.folder_max_limits[i]; - let disk_type = DiskType::from_string(&config.disk_types[i]); - let tags = config.folder_tags.get(i).cloned().unwrap_or_default(); - - info!( - "Adding storage location: {} (max_volumes={}, disk_type={:?})", - dir, max_volumes, disk_type - ); - let min_free_space = config.min_free_spaces[i].clone(); - store - .add_location(dir, idx_dir, max_volumes, disk_type, min_free_space, tags) - .map_err(|e| format!("Failed to add storage location {}: {}", dir, e))?; - } - // Build shared state let guard = Guard::new( &config.white_list, @@ -348,6 +327,43 @@ async fn run( cli_white_list, }); + if !config.masters.is_empty() { + let hb_config = seaweed_volume::server::heartbeat::HeartbeatConfig { + ip: config.ip.clone(), + port: config.port, + grpc_port: config.grpc_port, + public_url: config.public_url.clone(), + data_center: config.data_center.clone(), + rack: config.rack.clone(), + master_addresses: config.masters.clone(), + pulse_seconds: 5, + }; + seaweed_volume::server::heartbeat::prime_master_configuration(&hb_config, &state).await; + } + + { + let mut store = state.store.write().unwrap(); + for (i, dir) in config.folders.iter().enumerate() { + let idx_dir = if config.idx_folder.is_empty() { + dir.as_str() + } else { + config.idx_folder.as_str() + }; + let max_volumes = config.folder_max_limits[i]; + let disk_type = DiskType::from_string(&config.disk_types[i]); + let tags = config.folder_tags.get(i).cloned().unwrap_or_default(); + + info!( + "Adding storage location: {} (max_volumes={}, disk_type={:?})", + dir, max_volumes, disk_type + ); + let min_free_space = config.min_free_spaces[i].clone(); + store + .add_location(dir, idx_dir, max_volumes, disk_type, min_free_space, tags) + .map_err(|e| format!("Failed to add storage location {}: {}", dir, e))?; + } + } + // Initialize the batched write queue if enabled if config.enable_write_queue { info!("Batched write queue enabled"); diff --git a/seaweed-volume/src/server/heartbeat.rs b/seaweed-volume/src/server/heartbeat.rs index 2e69b05ab..f243de27c 100644 --- a/seaweed-volume/src/server/heartbeat.rs +++ b/seaweed-volume/src/server/heartbeat.rs @@ -47,9 +47,6 @@ pub async fn run_heartbeat_with_state( config.master_addresses ); - // Call GetMasterConfiguration before starting the heartbeat loop (matches Go behavior). - check_with_master(&config, &state).await; - let pulse = Duration::from_secs(config.pulse_seconds.max(1)); let mut new_leader: Option = None; let mut duplicate_retry_count: u32 = 0; @@ -215,6 +212,10 @@ async fn check_with_master(config: &HeartbeatConfig, state: &Arc) { + check_with_master(config, state).await; +} + async fn try_get_master_configuration( grpc_addr: &str, tls: Option<&super::grpc_client::OutgoingGrpcTlsConfig>,