From 071c89f58c603763bf9cd508f87b4831b28d0325 Mon Sep 17 00:00:00 2001 From: Mahmudsudo Date: Wed, 2 Sep 2026 01:22:16 +0100 Subject: [PATCH] ProcedureCallError: preserve distinction between guest and host errors --- crates/client-api/src/routes/database.rs | 24 +++++++++++++++++-- crates/core/src/host/module_host.rs | 2 ++ .../src/host/wasm_common/module_host_actor.rs | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/crates/client-api/src/routes/database.rs b/crates/client-api/src/routes/database.rs index ba7ebcd8008..85bbc693d89 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 } }; @@ -2452,4 +2455,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")); + } } 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) => {