From 07d6bac16eb744e633876360abbf5fa6a03b2796 Mon Sep 17 00:00:00 2001 From: Younes Khoudli Date: Tue, 18 Feb 2025 12:56:48 +0100 Subject: [PATCH 1/2] editoast: remove useless clone in stdcm_log Signed-off-by: Younes Khoudli --- editoast/src/models/stdcm_log.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editoast/src/models/stdcm_log.rs b/editoast/src/models/stdcm_log.rs index 13d855eae00..a859116dddb 100644 --- a/editoast/src/models/stdcm_log.rs +++ b/editoast/src/models/stdcm_log.rs @@ -42,7 +42,7 @@ impl StdcmLog { let stdcm_log_changeset = StdcmLog::changeset() .trace_id(trace_id) .request(request) - .response(response.clone()) + .response(response) .user_id(user_id); if let Err(e) = stdcm_log_changeset.create(&mut conn).await { tracing::error!("Failed during log operation: {e}"); From 1d6d796547e9845a5db71785fa7f15b40b67c2e3 Mon Sep 17 00:00:00 2001 From: Younes Khoudli Date: Tue, 18 Feb 2025 13:45:24 +0100 Subject: [PATCH 2/2] editoast: stdcm_log: store requests that cause core errors Fixes #10841. Signed-off-by: Younes Khoudli --- .../down.sql | 2 ++ .../up.sql | 1 + editoast/openapi.yaml | 15 ++++++++++++++- editoast/src/models/stdcm_log.rs | 17 ++++++++++++++--- editoast/src/views/timetable/stdcm.rs | 17 +++++++++++++---- front/src/common/api/generatedEditoastApi.ts | 9 ++++++++- 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/down.sql create mode 100644 editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/up.sql diff --git a/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/down.sql b/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/down.sql new file mode 100644 index 00000000000..9adfa23087d --- /dev/null +++ b/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/down.sql @@ -0,0 +1,2 @@ +DELETE FROM stdcm_logs WHERE response ? 'response' = FALSE; +UPDATE stdcm_logs SET response = response->'response'; diff --git a/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/up.sql b/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/up.sql new file mode 100644 index 00000000000..fa8319dd59f --- /dev/null +++ b/editoast/migrations/2025-02-18-122020_stdcm_log_allow_error_response/up.sql @@ -0,0 +1 @@ +UPDATE stdcm_logs SET response = jsonb_build_object('response', response); diff --git a/editoast/openapi.yaml b/editoast/openapi.yaml index fa0f059558e..8644415a0e7 100644 --- a/editoast/openapi.yaml +++ b/editoast/openapi.yaml @@ -11079,7 +11079,7 @@ components: request: $ref: '#/components/schemas/StdcmRequest' response: - $ref: '#/components/schemas/StdcmResponse' + $ref: '#/components/schemas/StdcmResponseOrError' trace_id: type: string nullable: true @@ -11347,6 +11347,19 @@ components: type: string enum: - preprocessing_simulation_error + StdcmResponseOrError: + oneOf: + - type: object + required: + - response + properties: + response: + $ref: '#/components/schemas/StdcmResponse' + - type: object + required: + - request_error + properties: + request_error: {} StdcmSearchEnvironment: type: object required: diff --git a/editoast/src/models/stdcm_log.rs b/editoast/src/models/stdcm_log.rs index a859116dddb..518dd836ebe 100644 --- a/editoast/src/models/stdcm_log.rs +++ b/editoast/src/models/stdcm_log.rs @@ -12,6 +12,18 @@ use crate::models::prelude::*; editoast_common::schemas! { StdcmLog, + StdcmResponseOrError, +} + +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +// We accepted the difference of memory size taken by variants +// Since there is only on success and others are error cases +#[allow(clippy::large_enum_variant)] +pub enum StdcmResponseOrError { + #[schema(value_type = StdcmResponse)] + Response(Response), + RequestError(serde_json::Value), } #[derive(Clone, Debug, Serialize, Deserialize, Model, ToSchema)] @@ -25,8 +37,7 @@ pub struct StdcmLog { #[schema(value_type = StdcmRequest)] pub request: Request, #[model(json)] - #[schema(value_type = StdcmResponse)] - pub response: Response, + pub response: StdcmResponseOrError, pub created: DateTime, pub user_id: Option, } @@ -36,7 +47,7 @@ impl StdcmLog { mut conn: DbConnection, trace_id: Option, request: Request, - response: Response, + response: StdcmResponseOrError, user_id: Option, ) { let stdcm_log_changeset = StdcmLog::changeset() diff --git a/editoast/src/views/timetable/stdcm.rs b/editoast/src/views/timetable/stdcm.rs index 0d73b0c9120..b739b66e764 100644 --- a/editoast/src/views/timetable/stdcm.rs +++ b/editoast/src/views/timetable/stdcm.rs @@ -42,7 +42,7 @@ use crate::core::AsCoreRequest; use crate::core::CoreClient; use crate::error::Result; use crate::models::prelude::*; -use crate::models::stdcm_log::StdcmLog; +use crate::models::stdcm_log::{StdcmLog, StdcmResponseOrError}; use crate::models::timetable::Timetable; use crate::models::train_schedule::TrainSchedule; use crate::models::Infra; @@ -284,7 +284,7 @@ async fn stdcm( .collect(), }; - let stdcm_response = stdcm_request.fetch(core_client.as_ref()).await?; + let stdcm_response = stdcm_request.fetch(core_client.as_ref()).await; // 6. Log STDCM request and response if logging is enabled if config.enable_stdcm_logging { @@ -301,6 +301,15 @@ async fn stdcm( }, ); + let stdcm_response = match stdcm_response.clone() { + Ok(response) => StdcmResponseOrError::Response(response), + Err(error) => { + StdcmResponseOrError::RequestError(serde_json::to_value(error).unwrap_or( + serde_json::Value::String("Failed to serialize the error".into()), + )) + } + }; + tokio::spawn( // We just don't await the creation of the log entry since we want // the endpoint to return as soon as possible, and because failing @@ -309,7 +318,7 @@ async fn stdcm( conn, trace_id.map(|trace_id| trace_id.to_string()), stdcm_request, - stdcm_response.clone(), + stdcm_response, user_id, ) .in_current_span(), @@ -317,7 +326,7 @@ async fn stdcm( } // 7. Handle STDCM Core Response - match stdcm_response { + match stdcm_response? { crate::core::stdcm::Response::Success { simulation, path, diff --git a/front/src/common/api/generatedEditoastApi.ts b/front/src/common/api/generatedEditoastApi.ts index f261bdc66f8..a89b6b0b713 100644 --- a/front/src/common/api/generatedEditoastApi.ts +++ b/front/src/common/api/generatedEditoastApi.ts @@ -3628,11 +3628,18 @@ export type StdcmResponse = error: SimulationResponse; status: 'preprocessing_simulation_error'; }; +export type StdcmResponseOrError = + | { + response: StdcmResponse; + } + | { + request_error: unknown; + }; export type StdcmLog = { created: string; id: number; request: StdcmRequest; - response: StdcmResponse; + response: StdcmResponseOrError; trace_id?: string | null; user_id?: number | null; };