Browse Source

Match Go ReceiveFile: return protocol errors in response body, not gRPC status

rust-volume-server
Chris Lu 3 days ago
parent
commit
8ed77f83f0
  1. 17
      seaweed-volume/src/server/grpc_server.rs

17
seaweed-volume/src/server/grpc_server.rs

@ -1326,6 +1326,7 @@ impl VolumeServer for VolumeGrpcService {
let mut target_file: Option<std::fs::File> = None;
let mut file_path: Option<String> = None;
let mut bytes_written: u64 = 0;
let mut resp_error: Option<String> = 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();
}

Loading…
Cancel
Save