From 5409a33893b8745d0c0e9d22c902585204174f5d Mon Sep 17 00:00:00 2001 From: MasterPtato Date: Fri, 6 Jun 2025 00:35:30 +0000 Subject: [PATCH] fix(guard): dont route to installing api nodes --- .../services/cluster/src/ops/server/get.rs | 3 + .../services/cluster/src/ops/server/list.rs | 1 + .../cluster/src/ops/server/lost_list.rs | 1 + packages/core/services/cluster/src/types.rs | 1 + .../infra/guard/server/src/routing/api.rs | 62 +++++++++---------- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/core/services/cluster/src/ops/server/get.rs b/packages/core/services/cluster/src/ops/server/get.rs index 8152f28a1a..ccf2fa4d87 100644 --- a/packages/core/services/cluster/src/ops/server/get.rs +++ b/packages/core/services/cluster/src/ops/server/get.rs @@ -26,6 +26,7 @@ pub(crate) struct ServerRow { vlan_ip: Option, public_ip: Option, create_ts: i64, + install_complete_ts: Option, cloud_destroy_ts: Option, state: i64, } @@ -42,6 +43,7 @@ impl TryFrom for Server { lan_ip: value.vlan_ip, wan_ip: value.public_ip, create_ts: value.create_ts, + install_complete_ts: value.install_complete_ts, cloud_destroy_ts: value.cloud_destroy_ts, state: unwrap!(ServerState::from_repr(value.state.try_into()?)), }) @@ -61,6 +63,7 @@ pub async fn cluster_server_get(ctx: &OperationCtx, input: &Input) -> GlobalResu vlan_ip, public_ip, create_ts, + install_complete_ts, cloud_destroy_ts, CASE WHEN cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed diff --git a/packages/core/services/cluster/src/ops/server/list.rs b/packages/core/services/cluster/src/ops/server/list.rs index a3f99e6cc2..b1103177f7 100644 --- a/packages/core/services/cluster/src/ops/server/list.rs +++ b/packages/core/services/cluster/src/ops/server/list.rs @@ -31,6 +31,7 @@ pub async fn cluster_server_list(ctx: &OperationCtx, input: &Input) -> GlobalRes s.vlan_ip, s.public_ip, s.create_ts, + s.install_complete_ts, s.cloud_destroy_ts, CASE WHEN s.cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed diff --git a/packages/core/services/cluster/src/ops/server/lost_list.rs b/packages/core/services/cluster/src/ops/server/lost_list.rs index 6051698ba9..89aa253342 100644 --- a/packages/core/services/cluster/src/ops/server/lost_list.rs +++ b/packages/core/services/cluster/src/ops/server/lost_list.rs @@ -144,6 +144,7 @@ async fn run_for_linode_account( s.vlan_ip, s.public_ip, s.create_ts, + s.install_complete_ts, s.cloud_destroy_ts, CASE WHEN s.cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed diff --git a/packages/core/services/cluster/src/types.rs b/packages/core/services/cluster/src/types.rs index d58dba79b8..457fc53543 100644 --- a/packages/core/services/cluster/src/types.rs +++ b/packages/core/services/cluster/src/types.rs @@ -153,6 +153,7 @@ pub struct Server { pub lan_ip: Option, pub wan_ip: Option, pub create_ts: i64, + pub install_complete_ts: Option, pub cloud_destroy_ts: Option, pub state: ServerState, } diff --git a/packages/edge/infra/guard/server/src/routing/api.rs b/packages/edge/infra/guard/server/src/routing/api.rs index cf8e8160d0..e7a69ccebd 100644 --- a/packages/edge/infra/guard/server/src/routing/api.rs +++ b/packages/edge/infra/guard/server/src/routing/api.rs @@ -54,41 +54,41 @@ pub async fn route_api_request( .await?; tracing::info!(?servers_res, "servers"); - let targets = if !servers_res.servers.is_empty() { - let port = ctx.config().server()?.rivet.api_public.port(); - servers_res - .servers - .iter() - .map(|server| { - // For each server, create a target - // In a real implementation, use the actual server IP - // For demo purposes, use the loopback IP for all servers - Ok(RouteTarget { - actor_id: None, - server_id: Some(server.server_id), - host: unwrap!(server.lan_ip).to_string(), - port, - path: path.to_owned(), - }) + let port = ctx.config().server()?.rivet.api_public.port(); + let targets = servers_res + .servers + .iter() + // Only include servers that are installed + .filter(|server| server.install_complete_ts.is_some()) + .map(|server| { + // For each server, create a target + Ok(RouteTarget { + actor_id: None, + server_id: Some(server.server_id), + host: unwrap!(server.lan_ip).to_string(), + port, + path: path.to_owned(), }) - .collect::>>()? - } else if let Some((host, port)) = ctx.config().server()?.rivet.edge_api_fallback_addr_lan() { - vec![RouteTarget { - actor_id: None, - server_id: None, - host, - port, - path: path.to_owned(), - }] + }) + .collect::>>()?; + + let targets = if targets.is_empty() { + if let Some((host, port)) = ctx.config().server()?.rivet.edge_api_fallback_addr_lan() { + vec![RouteTarget { + actor_id: None, + server_id: None, + host, + port, + path: path.to_owned(), + }] + } else { + // No API servers to route to + return Ok(None); + } } else { - // No API servers to route to - Vec::new() + targets }; - if targets.is_empty() { - return Ok(None); - } - return Ok(Some(RoutingOutput::Route(RouteConfig { targets, timeout: RoutingTimeout {