use goosefs_sdk::client::MasterClient;
use goosefs_sdk::config::GoosefsConfig;
use std::time::Duration;
#[tokio::main]
async fn main() -> goosefs_sdk::error::Result<()> {
let args: Vec<String> = std::env::args().skip(1).collect();
if args.is_empty() {
eprintln!("Usage: ha_multi_master <master1:port> [master2:port] [master3:port ...]");
eprintln!();
eprintln!("Example:");
eprintln!(" Single master: ha_multi_master 10.0.0.1:9200");
eprintln!(" HA (3 masters): ha_multi_master 10.0.0.1:9200 10.0.0.2:9200 10.0.0.3:9200");
std::process::exit(1);
}
let mut config = GoosefsConfig::from_addresses(args.clone());
if config.is_multi_master() {
config.master_polling_timeout = Duration::from_secs(3);
config.master_inquire_retry_max_duration = Duration::from_secs(15);
config.master_inquire_initial_sleep = Duration::from_millis(100);
config.master_inquire_max_sleep = Duration::from_secs(2);
}
let mode = if config.is_multi_master() {
format!("Multi-master ({} masters)", args.len())
} else {
format!("Single-master: {}", args[0])
};
println!("▸ {}", mode);
println!(" is_multi_master = {}", config.is_multi_master());
println!(" master_addresses = {:?}", config.master_addresses());
println!(
" master_polling_timeout = {:?}",
config.master_polling_timeout
);
println!("\n▸ Connecting to Goosefs Master...");
let master = MasterClient::connect(&config).await?;
println!(" ✓ Connected successfully!");
println!("\n▸ Listing root directory /...");
match master.list_status("/", false).await {
Ok(entries) => {
println!(" ✓ Found {} entries:", entries.len());
for entry in entries.iter().take(10) {
let name = entry.path.as_deref().unwrap_or("<unknown>");
let is_dir = entry.folder.unwrap_or(false);
let size = entry.length.unwrap_or(0);
let kind = if is_dir { "DIR " } else { "FILE" };
println!(" {} {} ({} bytes)", kind, name, size);
}
if entries.len() > 10 {
println!(" ... and {} more", entries.len() - 10);
}
}
Err(e) => {
println!(" ✗ Error: {}", e);
}
}
println!("\n▸ Done!");
Ok(())
}