Skip to content

Commit c562018

Browse files
committed
fix(guard): dont route to installing api nodes
1 parent 36a1286 commit c562018

File tree

5 files changed

+37
-31
lines changed

5 files changed

+37
-31
lines changed

packages/core/services/cluster/src/ops/server/get.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub(crate) struct ServerRow {
2626
vlan_ip: Option<IpAddr>,
2727
public_ip: Option<IpAddr>,
2828
create_ts: i64,
29+
install_complete_ts: Option<i64>,
2930
cloud_destroy_ts: Option<i64>,
3031
state: i64,
3132
}
@@ -42,6 +43,7 @@ impl TryFrom<ServerRow> for Server {
4243
lan_ip: value.vlan_ip,
4344
wan_ip: value.public_ip,
4445
create_ts: value.create_ts,
46+
install_complete_ts: value.install_complete_ts,
4547
cloud_destroy_ts: value.cloud_destroy_ts,
4648
state: unwrap!(ServerState::from_repr(value.state.try_into()?)),
4749
})
@@ -61,6 +63,7 @@ pub async fn cluster_server_get(ctx: &OperationCtx, input: &Input) -> GlobalResu
6163
vlan_ip,
6264
public_ip,
6365
create_ts,
66+
install_complete_ts,
6467
cloud_destroy_ts,
6568
CASE
6669
WHEN cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed

packages/core/services/cluster/src/ops/server/list.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub async fn cluster_server_list(ctx: &OperationCtx, input: &Input) -> GlobalRes
3131
s.vlan_ip,
3232
s.public_ip,
3333
s.create_ts,
34+
s.install_complete_ts,
3435
s.cloud_destroy_ts,
3536
CASE
3637
WHEN s.cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed

packages/core/services/cluster/src/ops/server/lost_list.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ async fn run_for_linode_account(
144144
s.vlan_ip,
145145
s.public_ip,
146146
s.create_ts,
147+
s.install_complete_ts,
147148
s.cloud_destroy_ts,
148149
CASE
149150
WHEN s.cloud_destroy_ts IS NOT NULL THEN 6 -- Destroyed

packages/core/services/cluster/src/types.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ pub struct Server {
153153
pub lan_ip: Option<IpAddr>,
154154
pub wan_ip: Option<IpAddr>,
155155
pub create_ts: i64,
156+
pub install_complete_ts: Option<i64>,
156157
pub cloud_destroy_ts: Option<i64>,
157158
pub state: ServerState,
158159
}

packages/edge/infra/guard/server/src/routing/api.rs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,41 +54,41 @@ pub async fn route_api_request(
5454
.await?;
5555
tracing::info!(?servers_res, "servers");
5656

57-
let targets = if !servers_res.servers.is_empty() {
58-
let port = ctx.config().server()?.rivet.api_public.port();
59-
servers_res
60-
.servers
61-
.iter()
62-
.map(|server| {
63-
// For each server, create a target
64-
// In a real implementation, use the actual server IP
65-
// For demo purposes, use the loopback IP for all servers
66-
Ok(RouteTarget {
67-
actor_id: None,
68-
server_id: Some(server.server_id),
69-
host: unwrap!(server.lan_ip).to_string(),
70-
port,
71-
path: path.to_owned(),
72-
})
57+
let port = ctx.config().server()?.rivet.api_public.port();
58+
let targets = servers_res
59+
.servers
60+
.iter()
61+
// Only include servers that are installed
62+
.filter(|server| server.install_complete_ts.is_some())
63+
.map(|server| {
64+
// For each server, create a target
65+
Ok(RouteTarget {
66+
actor_id: None,
67+
server_id: Some(server.server_id),
68+
host: unwrap!(server.lan_ip).to_string(),
69+
port,
70+
path: path.to_owned(),
7371
})
74-
.collect::<GlobalResult<Vec<_>>>()?
75-
} else if let Some((host, port)) = ctx.config().server()?.rivet.edge_api_fallback_addr_lan() {
76-
vec![RouteTarget {
77-
actor_id: None,
78-
server_id: None,
79-
host,
80-
port,
81-
path: path.to_owned(),
82-
}]
72+
})
73+
.collect::<GlobalResult<Vec<_>>>()?;
74+
75+
let targets = if targets.is_empty() {
76+
if let Some((host, port)) = ctx.config().server()?.rivet.edge_api_fallback_addr_lan() {
77+
vec![RouteTarget {
78+
actor_id: None,
79+
server_id: None,
80+
host,
81+
port,
82+
path: path.to_owned(),
83+
}]
84+
} else {
85+
// No API servers to route to
86+
return Ok(None);
87+
}
8388
} else {
84-
// No API servers to route to
85-
Vec::new()
89+
targets
8690
};
8791

88-
if targets.is_empty() {
89-
return Ok(None);
90-
}
91-
9292
return Ok(Some(RoutingOutput::Route(RouteConfig {
9393
targets,
9494
timeout: RoutingTimeout {

0 commit comments

Comments
 (0)