我正在编写分布式集合实现。
请求者 - 请求张量。
响应者 - 查看张量并将其发送给请求者。
如果响应方发生错误,我想将错误代码发送给请求者,请求者将其传播到更高级别。
我在GRPC上看到状态转换为::grpc::status
。这对于状态序列化是否足够(即我可以简单地将::grpc::status
字节存储在我的邮件正文中并发送它,还是需要另一个调用来压缩数据?感谢。
答案 0 :(得分:0)
所以,很明显我无法直接复制::grpc::status
,因为它有error_message
和error_details
类型的字段::grpc::string
基本上是std::string
的typedef。因此,据我所知,数据并不平坦,我也无法指望它。
我找不到序列化如何完成的代码示例,所以我做了以下事情:
error_code
,error_message
,error_details
。::grpc::status
手动设置这些字段,然后拨打proto.SerializeToArray()
。ParseProtoUnlimited(&proto)
然后从原型字段创建::grpc::status
。看起来足够干净。也许只是一点代码重复。
<强>原强>
message ErrorStatusProto {
int32 error_code = 1;
string error_message = 2;
string error_details = 3;
}
<强>序列化强>
::grpc::Status gs = ToGrpcStatus(rm.status_);
ErrorStatusProto gsProto;
gsProto.set_error_code(gs.error_code());
gsProto.set_error_message(gs.error_message());
gsProto.set_error_details(gs.error_details());
gsProto.SerializeToArray(&message[kErrorStatusStartIndex],
gsProto.ByteSize());
if (gsProto.ByteSize() > kErrorStatusMaxSize) {
LOG(ERROR) << "Error status (" << gsProto.ByteSize() << " bytes) "
<< "is too big to fit in RDMA message ("
<< kErrorStatusMaxSize << " bytes). Truncated.";
}
<强>反序列化强>
ErrorStatusProto gsProto;
CHECK(ParseProtoUnlimited(
&gsProto, &message[kErrorStatusStartIndex], kErrorStatusMaxSize))
<< "Failed to parse error status proto from message. Aborting.";
::grpc::Status gs((::grpc::StatusCode)gsProto.error_code(),
gsProto.error_message(), gsProto.error_details());
rm.status_ = FromGrpcStatus(gs);