From 27a4f3f3200f12960224506411b8288e2b8e8b41 Mon Sep 17 00:00:00 2001 From: Riz Ashraf Date: Mon, 21 Sep 2026 19:32:11 +0100 Subject: [PATCH] perf(api): eliminate expensive heap allocations and memory clones by serializing axum response payloads directly from store read locks --- server/Cargo.toml | 5 +++++ server/src/bin_test_axum.rs | 11 +++++++++++ server/src/bin_test_serialize.rs | 12 ++++++++++++ server/src/main.rs | 18 ++++++++---------- 4 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 server/src/bin_test_axum.rs create mode 100644 server/src/bin_test_serialize.rs diff --git a/server/Cargo.toml b/server/Cargo.toml index 7181ba3..01fc0da 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -39,3 +39,8 @@ tempfile = "3.27.0" [[bin]] name = "test_rmcp" path = "src/bin_test.rs" + +[[bin]] +name = "bin_test_axum" +path = "src/bin_test_axum.rs" + diff --git a/server/src/bin_test_axum.rs b/server/src/bin_test_axum.rs new file mode 100644 index 0000000..d6491d4 --- /dev/null +++ b/server/src/bin_test_axum.rs @@ -0,0 +1,11 @@ +use axum::response::IntoResponse; + +fn test_response() -> impl IntoResponse { + let tasks_json = "[]".to_string(); + ( + [(axum::http::header::CONTENT_TYPE, "application/json")], + tasks_json, + ).into_response() +} + +fn main() {} diff --git a/server/src/bin_test_serialize.rs b/server/src/bin_test_serialize.rs new file mode 100644 index 0000000..36d4c47 --- /dev/null +++ b/server/src/bin_test_serialize.rs @@ -0,0 +1,12 @@ +fn main() { + let init = rmcp::model::InitializeResult::new( + rmcp::model::ServerCapabilities::builder() + .enable_tools() + .build(), + ) + .with_server_info(rmcp::model::Implementation::new( + "gemini-mcp-memory", + "3.0.0", + )); + println!("{:?}", serde_json::to_string(&init)); +} diff --git a/server/src/main.rs b/server/src/main.rs index 98a20e0..44cea5b 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -297,8 +297,8 @@ async fn run_server(state: Arc) -> Result<(), Box) -> Result<(), Box) -> Result<(), Box) -> Result<(), Box>() - }); - axum::Json(serde_json::json!(activities)) + let activities_json = state_clone.recent_activities.read_with(|a| serde_json::to_string(a).unwrap_or_else(|_| "[]".to_string())); + ([(axum::http::header::CONTENT_TYPE, "application/json")], activities_json) } }), )