From 8ed77f83f08d358d897c01a84c92ccf5325da843 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 17 Mar 2026 01:55:35 -0700 Subject: [PATCH] Match Go ReceiveFile: return protocol errors in response body, not gRPC status --- seaweed-volume/src/server/grpc_server.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/seaweed-volume/src/server/grpc_server.rs b/seaweed-volume/src/server/grpc_server.rs index 9be4665ba..22de8eb0b 100644 --- a/seaweed-volume/src/server/grpc_server.rs +++ b/seaweed-volume/src/server/grpc_server.rs @@ -1326,6 +1326,7 @@ impl VolumeServer for VolumeGrpcService { let mut target_file: Option = None; let mut file_path: Option = None; let mut bytes_written: u64 = 0; + let mut resp_error: Option = None; let result: Result<(), Status> = async { while let Some(req) = stream.message().await? { @@ -1374,13 +1375,14 @@ impl VolumeServer for VolumeGrpcService { })?; bytes_written += n as u64; } else { - return Err(Status::invalid_argument( - "file info must be sent first", - )); + // Go returns protocol violations as response-level errors + resp_error = Some("file info must be sent first".to_string()); + break; } } None => { - return Err(Status::invalid_argument("unknown message type")); + resp_error = Some("unknown message type".to_string()); + break; } } } @@ -1390,6 +1392,13 @@ impl VolumeServer for VolumeGrpcService { match result { Ok(()) => { + // Check for protocol-level errors (returned in response body, not gRPC status) + if let Some(err_msg) = resp_error { + return Ok(Response::new(volume_server_pb::ReceiveFileResponse { + error: err_msg, + bytes_written: 0, + })); + } if let Some(ref f) = target_file { let _ = f.sync_all(); }