diff --git a/crates/corro-agent/src/agent/run_root.rs b/crates/corro-agent/src/agent/run_root.rs index 1f73bf66..1e1adb3d 100644 --- a/crates/corro-agent/src/agent/run_root.rs +++ b/crates/corro-agent/src/agent/run_root.rs @@ -38,7 +38,7 @@ async fn run(agent: Agent, opts: AgentOptions, pconf: PerfConfig) -> eyre::Resul let AgentOptions { gossip_server_endpoint, transport, - api_listener, + api_listeners, tripwire, lock_registry, rx_bcast, @@ -96,7 +96,7 @@ async fn run(agent: Agent, opts: AgentOptions, pconf: PerfConfig) -> eyre::Resul &tripwire, subs_bcast_cache, &subs_manager, - api_listener, + api_listeners, ) .await?; diff --git a/crates/corro-agent/src/agent/setup.rs b/crates/corro-agent/src/agent/setup.rs index 331c081f..ddac02ed 100644 --- a/crates/corro-agent/src/agent/setup.rs +++ b/crates/corro-agent/src/agent/setup.rs @@ -47,7 +47,7 @@ pub struct AgentOptions { pub lock_registry: LockRegistry, pub gossip_server_endpoint: quinn::Endpoint, pub transport: Transport, - pub api_listener: TcpListener, + pub api_listeners: Vec, pub rx_bcast: CorroReceiver, pub rx_apply: CorroReceiver<(ActorId, Version)>, pub rx_clear_buf: CorroReceiver<(ActorId, RangeInclusive)>, @@ -132,8 +132,11 @@ pub async fn setup(conf: Config, tripwire: Tripwire) -> eyre::Result<(Agent, Age let transport = Transport::new(&conf.gossip, rtt_tx).await?; - let api_listener = TcpListener::bind(conf.api.bind_addr.as_slice()).await?; - let api_addr = api_listener.local_addr()?; + let mut api_listeners = Vec::with_capacity(conf.api.bind_addr.len()); + for addr in conf.api.bind_addr.iter() { + api_listeners.push(TcpListener::bind(addr).await?); + } + let api_addr = api_listeners.first().unwrap().local_addr()?; let clock = Arc::new( uhlc::HLCBuilder::default() @@ -166,7 +169,7 @@ pub async fn setup(conf: Config, tripwire: Tripwire) -> eyre::Result<(Agent, Age let opts = AgentOptions { gossip_server_endpoint, transport, - api_listener, + api_listeners, lock_registry, rx_bcast, rx_apply, diff --git a/crates/corro-agent/src/agent/util.rs b/crates/corro-agent/src/agent/util.rs index cd0bd7dd..3e7e3e74 100644 --- a/crates/corro-agent/src/agent/util.rs +++ b/crates/corro-agent/src/agent/util.rs @@ -383,7 +383,7 @@ pub async fn setup_http_api_handler( tripwire: &Tripwire, subs_bcast_cache: BcastCache, subs_manager: &SubsManager, - api_listener: TcpListener, + api_listeners: Vec, ) -> eyre::Result<()> { let api = Router::new() // transactions @@ -484,25 +484,27 @@ pub async fn setup_http_api_handler( .layer(DefaultBodyLimit::disable()) .layer(TraceLayer::new_for_http()); - let api_addr = api_listener.local_addr()?; - info!("Starting API listener on tcp/{api_addr}"); - let mut incoming = AddrIncoming::from_listener(api_listener)?; - - incoming.set_nodelay(true); - spawn_counted( - axum::Server::builder(incoming) - .executor(CountedExecutor) - .serve( - api.clone() - .into_make_service_with_connect_info::(), - ) - .with_graceful_shutdown( - tripwire - .clone() - .inspect(move |_| info!("corrosion api http tripped {api_addr}")), - ) - .inspect(|_| info!("corrosion api is done")), - ); + for api_listener in api_listeners { + let api_addr = api_listener.local_addr()?; + info!("Starting API listener on tcp/{api_addr}"); + let mut incoming = AddrIncoming::from_listener(api_listener)?; + + incoming.set_nodelay(true); + spawn_counted( + axum::Server::builder(incoming) + .executor(CountedExecutor) + .serve( + api.clone() + .into_make_service_with_connect_info::(), + ) + .with_graceful_shutdown( + tripwire + .clone() + .inspect(move |_| info!("corrosion api http tripped {api_addr}")), + ) + .inspect(|_| info!("corrosion api is done")), + ); + } Ok(()) } diff --git a/crates/corrosion/src/command/agent.rs b/crates/corrosion/src/command/agent.rs index 78878283..264e7e70 100644 --- a/crates/corrosion/src/command/agent.rs +++ b/crates/corrosion/src/command/agent.rs @@ -59,8 +59,7 @@ pub async fn run(config: Config, config_path: &Utf8PathBuf) -> eyre::Result<()> )?; if !config.db.schema_paths.is_empty() { - let client = - corro_client::CorrosionApiClient::new(config.api.bind_addr.first().unwrap().clone()); + let client = corro_client::CorrosionApiClient::new(*config.api.bind_addr.first().unwrap()); match client .schema_from_paths(config.db.schema_paths.as_slice()) .await diff --git a/crates/corrosion/src/main.rs b/crates/corrosion/src/main.rs index 5d84e1b1..318b165f 100644 --- a/crates/corrosion/src/main.rs +++ b/crates/corrosion/src/main.rs @@ -577,7 +577,7 @@ impl Cli { Ok(if let Some(api_addr) = self.api_addr { api_addr } else { - self.config()?.api.bind_addr.first().unwrap().clone() + *self.config()?.api.bind_addr.first().unwrap() }) }