diff --git a/crates/client-api/src/routes/database.rs b/crates/client-api/src/routes/database.rs index f170f9b290e..979d2ea5971 100644 --- a/crates/client-api/src/routes/database.rs +++ b/crates/client-api/src/routes/database.rs @@ -139,9 +139,12 @@ fn map_procedure_error(e: ProcedureCallError, procedure: &str) -> (StatusCode, S log::info!("Procedure {procedure} could not run because the module is out of energy"); StatusCode::PAYMENT_REQUIRED } + ProcedureCallError::GuestPanic(_) => { + log::debug!("Guest error while invoking procedure {procedure}: {e:#}"); + StatusCode::INTERNAL_SERVER_ERROR + } ProcedureCallError::InternalError(_) => { - // TODO: May need to split this from module errors vs host errors - log::info!("Internal error while invoking procedure {procedure}: {e:#}"); + log::error!("Internal error while invoking procedure {procedure}: {e:#}"); StatusCode::INTERNAL_SERVER_ERROR } }; @@ -2454,6 +2457,21 @@ mod tests { remove_http_response_size_metric(database_identity); } + #[test] + fn test_map_procedure_error_distinguishes_guest_panic_and_internal_error() { + let (status, msg) = map_procedure_error( + ProcedureCallError::GuestPanic("panic in guest".to_string()), + "my_proc", + ); + assert_eq!(status, StatusCode::INTERNAL_SERVER_ERROR); + assert!(msg.contains("panic in guest")); + + let (status, msg) = map_procedure_error( + ProcedureCallError::InternalError("host failure".to_string()), + "my_proc", + ); + assert_eq!(status, StatusCode::INTERNAL_SERVER_ERROR); + assert!(msg.contains("host failure")); fn root_router(root_routes: RootRoutes) -> axum::Router { let state = DummyState::new(); router_with_root_routes( diff --git a/crates/core/src/host/module_host.rs b/crates/core/src/host/module_host.rs index 25eb09e6382..17155d22c1f 100644 --- a/crates/core/src/host/module_host.rs +++ b/crates/core/src/host/module_host.rs @@ -1662,6 +1662,8 @@ pub enum ProcedureCallError { #[error("Procedure terminated due to insufficient budget")] OutOfEnergy, #[error("The module instance encountered a fatal error: {0}")] + GuestPanic(String), + #[error("The procedure call encountered an internal error: {0}")] InternalError(String), } diff --git a/crates/core/src/host/wasm_common/module_host_actor.rs b/crates/core/src/host/wasm_common/module_host_actor.rs index aee984fe3a5..5098d5acf06 100644 --- a/crates/core/src/host/wasm_common/module_host_actor.rs +++ b/crates/core/src/host/wasm_common/module_host_actor.rs @@ -841,7 +841,7 @@ impl InstanceCommon { // return Err(ProcedureCallError::OutOfEnergy); // } else { - Err(ProcedureCallError::InternalError(format!("{err}"))) + Err(ProcedureCallError::GuestPanic(format!("{err}"))) } } Ok(return_val) => {