From 682d66d13e3680ed852fee38d3f216d79eb6f320 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 18 Mar 2026 11:08:42 -0700 Subject: [PATCH] fix write replication to survive client disconnects --- seaweed-volume/src/server/handlers.rs | 33 ++++++++++++++++++--------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/seaweed-volume/src/server/handlers.rs b/seaweed-volume/src/server/handlers.rs index 4a10f9fa7..6658d2336 100644 --- a/seaweed-volume/src/server/handlers.rs +++ b/seaweed-volume/src/server/handlers.rs @@ -2471,17 +2471,28 @@ pub async fn post_handler( }) }; if needs_replication { - if let Err(e) = do_replicated_request( - &state, - vid.0, - Method::POST, - &path, - &query, - &headers, - Some(body.clone()), - ) - .await - { + let state_clone = state.clone(); + let path_clone = path.clone(); + let query_clone = query.clone(); + let headers_clone = headers.clone(); + let body_clone = body.clone(); + let replication = tokio::spawn(async move { + do_replicated_request( + &state_clone, + vid.0, + Method::POST, + &path_clone, + &query_clone, + &headers_clone, + Some(body_clone), + ) + .await + }); + let replication_result = replication + .await + .map_err(|e| format!("replication task failed: {}", e)) + .and_then(|result| result); + if let Err(e) = replication_result { tracing::error!("replicated write failed: {}", e); return json_error_with_query( StatusCode::INTERNAL_SERVER_ERROR,