Skip to content

Commit 2dd73e4

Browse files
committed
fix: misc bug fixes (#3019)
1 parent 4ad1e71 commit 2dd73e4

File tree

10 files changed

+94
-93
lines changed

10 files changed

+94
-93
lines changed

Cargo.lock

Lines changed: 46 additions & 46 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

out/openapi.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/common/api-builder/src/error_response.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl IntoResponse for ApiError {
2323
if let Some(rivet_err) = self.0.chain().find_map(|x| x.downcast_ref::<RivetError>()) {
2424
let status = match (rivet_err.group(), rivet_err.code()) {
2525
("api", "not_found") => StatusCode::NOT_FOUND,
26-
("api", "invalid_token") | ("api", "unauthorized") => StatusCode::UNAUTHORIZED,
26+
("api", "unauthorized") => StatusCode::UNAUTHORIZED,
2727
("api", "forbidden") => StatusCode::FORBIDDEN,
2828
_ => StatusCode::BAD_REQUEST,
2929
};

packages/common/api-builder/src/errors.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ use serde::Serialize;
55
#[error("api", "not_found", "The requested resource was not found")]
66
pub struct ApiNotFound;
77

8-
#[derive(RivetError)]
9-
#[error("api", "invalid_token", "The provided authentication token is invalid")]
10-
pub struct ApiInvalidToken;
11-
128
#[derive(RivetError)]
139
#[error("api", "unauthorized", "Authentication required")]
1410
pub struct ApiUnauthorized;

packages/common/api-builder/src/prelude.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
pub use crate::{ApiCtx, ApiError, GlobalApiCtx};
33

44
// Error types
5-
pub use crate::errors::{
6-
ApiForbidden, ApiInternalError, ApiInvalidToken, ApiNotFound, ApiUnauthorized,
7-
};
5+
pub use crate::errors::{ApiForbidden, ApiInternalError, ApiNotFound, ApiUnauthorized};
86

97
// HTTP method handlers
108
pub use crate::router::ApiRouter;

packages/common/api-builder/tests/errors.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ enum TestErrorWrapper {
1616
WrapError(#[source] anyhow::Error),
1717
}
1818

19-
// Handler that returns invalid token error
20-
async fn handle_invalid_token(_ctx: ApiCtx, _path: (), _query: ()) -> Result<()> {
21-
Err(rivet_api_builder::errors::ApiInvalidToken.build())
22-
}
23-
2419
// Handler that returns unauthorized error
2520
async fn handle_unauthorized(_ctx: ApiCtx, _path: (), _query: ()) -> Result<()> {
2621
Err(rivet_api_builder::errors::ApiUnauthorized.build())
@@ -56,7 +51,6 @@ async fn test_error_responses() {
5651
// Create router with error routes
5752
let app = create_router("test", config, pools, |router| {
5853
router
59-
.route("/invalid-token", get(handle_invalid_token))
6054
.route("/unauthorized", get(handle_unauthorized))
6155
.route("/forbidden", get(handle_forbidden))
6256
.route("/internal-error", get(handle_internal_error))
@@ -68,16 +62,6 @@ async fn test_error_responses() {
6862

6963
let server = TestServer::new(app).unwrap();
7064

71-
// Test invalid token error
72-
let res = server.get("/invalid-token").await;
73-
res.assert_status(axum::http::StatusCode::UNAUTHORIZED);
74-
let error_response: ErrorResponse = res.json();
75-
assert_eq!(error_response.group, "api");
76-
assert_eq!(
77-
error_response.message,
78-
"The provided authentication token is invalid"
79-
);
80-
8165
// Test unauthorized error
8266
let res = server.get("/unauthorized").await;
8367
res.assert_status(axum::http::StatusCode::UNAUTHORIZED);

packages/core/api-peer/src/actors/delete.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::Result;
2+
use gas::prelude::*;
23
use rivet_api_builder::ApiCtx;
34
use rivet_util::Id;
45
use serde::{Deserialize, Serialize};
@@ -61,11 +62,25 @@ pub async fn delete(ctx: ApiCtx, path: DeletePath, query: DeleteQuery) -> Result
6162
}
6263
}
6364

64-
ctx.signal(pegboard::workflows::actor::Destroy {})
65+
let res = ctx
66+
.signal(pegboard::workflows::actor::Destroy {})
6567
.to_workflow::<pegboard::workflows::actor::Workflow>()
6668
.tag("actor_id", path.actor_id)
6769
.send()
68-
.await?;
70+
.await;
71+
72+
if let Some(WorkflowError::WorkflowNotFound) = res
73+
.as_ref()
74+
.err()
75+
.and_then(|x| x.chain().find_map(|x| x.downcast_ref::<WorkflowError>()))
76+
{
77+
tracing::warn!(
78+
actor_id=?path.actor_id,
79+
"actor workflow not found, likely already stopped"
80+
);
81+
} else {
82+
res?;
83+
}
6984

7085
Ok(DeleteResponse {})
7186
}

packages/core/guard/server/src/routing/pegboard_gateway.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ async fn find_actor(
180180
let runner_id = if let Some(actor) = actor {
181181
actor.runner_id
182182
} else {
183-
tracing::info!(?actor_id, "waiting for actor to become ready");
183+
tracing::debug!(?actor_id, "waiting for actor to become ready");
184184

185185
// Wait for ready, fail, or destroy
186186
tokio::select! {

packages/core/pegboard-serverless/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ async fn outbound_handler(
236236
req = req.header(X_RIVET_TOKEN, auth.admin_token.read());
237237
}
238238

239-
let mut source = sse::EventSource::new(req)?;
239+
let mut source = sse::EventSource::new(req).context("failed creating event source")?;
240240
let mut runner_id = None;
241241

242242
let stream_handler = async {

packages/services/pegboard/src/workflows/runner.rs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,15 @@ pub async fn pegboard_runner(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
159159
}
160160
}
161161
protocol::ToServer::ToServerEvents(events) => {
162-
let last_event_idx = events.last().map(|event| event.index);
163-
164162
// NOTE: This should not be parallelized because signals should be sent in order
165163
// Forward to actor workflows
166-
for event in events {
164+
for event in &events {
167165
let actor_id =
168166
crate::utils::event_actor_id(&event.inner).to_string();
169167
let res = ctx
170-
.signal(crate::workflows::actor::Event { inner: event.inner })
168+
.signal(crate::workflows::actor::Event {
169+
inner: event.inner.clone(),
170+
})
171171
.to_workflow::<crate::workflows::actor::Workflow>()
172172
.tag("actor_id", &actor_id)
173173
.send()
@@ -186,20 +186,29 @@ pub async fn pegboard_runner(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
186186
}
187187
}
188188

189-
// Ack every 500 events
190-
if let Some(last_event_idx) = last_event_idx {
191-
if last_event_idx > state.last_event_ack_idx.saturating_add(500) {
192-
state.last_event_ack_idx = last_event_idx;
189+
if !events.is_empty() {
190+
ctx.activity(InsertEventsInput {
191+
events: events.clone(),
192+
})
193+
.await?;
193194

194-
ctx.activity(SendMessageToRunnerInput {
195-
runner_id: input.runner_id,
196-
message: protocol::ToClient::ToClientAckEvents(
197-
protocol::ToClientAckEvents {
198-
last_event_idx: state.last_event_ack_idx,
199-
},
200-
),
201-
})
202-
.await?;
195+
// Ack every 500 events
196+
let last_event_idx = events.last().map(|event| event.index);
197+
if let Some(last_event_idx) = last_event_idx {
198+
if last_event_idx > state.last_event_ack_idx.saturating_add(500)
199+
{
200+
state.last_event_ack_idx = last_event_idx;
201+
202+
ctx.activity(SendMessageToRunnerInput {
203+
runner_id: input.runner_id,
204+
message: protocol::ToClient::ToClientAckEvents(
205+
protocol::ToClientAckEvents {
206+
last_event_idx: state.last_event_ack_idx,
207+
},
208+
),
209+
})
210+
.await?;
211+
}
203212
}
204213
}
205214
}
@@ -822,7 +831,6 @@ async fn ack_commands(ctx: &ActivityCtx, input: &AckCommandsInput) -> Result<()>
822831

823832
#[derive(Debug, Serialize, Deserialize, Hash)]
824833
struct InsertEventsInput {
825-
runner_id: Id,
826834
events: Vec<protocol::EventWrapper>,
827835
}
828836

0 commit comments

Comments
 (0)