mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-02 17:38:19 +00:00
[C++] Add grpc/streaming test and fix Deserialize (#4296)
* [C++] Add delete msg->buf * [C++] Add grpc streaming test * Use free instead of delete * Refactoring grpctest
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
bbb72f0b73
commit
0920d663d5
@@ -43,11 +43,25 @@ class ServiceImpl final : public MyGame::Example::MonsterStorage::Service {
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
virtual ::grpc::Status Retrieve(::grpc::ServerContext *context,
|
virtual ::grpc::Status Retrieve(::grpc::ServerContext *context,
|
||||||
const flatbuffers::BufferRef<Stat> *request,
|
const flatbuffers::BufferRef<Stat> *request,
|
||||||
::grpc::ServerWriter< flatbuffers::BufferRef<Monster>>* writer)
|
::grpc::ServerWriter< flatbuffers::BufferRef<Monster>>* writer)
|
||||||
override {
|
override {
|
||||||
assert(false); // We're not actually using this RPC.
|
|
||||||
return grpc::Status::CANCELLED;
|
for (int i=0; i<10; i++) {
|
||||||
|
fbb_.Clear();
|
||||||
|
// Create 10 monsters for resposne.
|
||||||
|
auto monster_offset =
|
||||||
|
CreateMonster(fbb_, 0, 0, 0, fbb_.CreateString(
|
||||||
|
request->GetRoot()->id()->str() + " No." + std::to_string(i)));
|
||||||
|
fbb_.Finish(monster_offset);
|
||||||
|
|
||||||
|
flatbuffers::BufferRef<Monster> monsterRef(
|
||||||
|
fbb_.GetBufferPointer(), fbb_.GetSize()
|
||||||
|
);
|
||||||
|
// Send monster to client using streaming.
|
||||||
|
writer->Write(monsterRef);
|
||||||
|
}
|
||||||
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -93,24 +107,42 @@ int main(int /*argc*/, const char * /*argv*/[]) {
|
|||||||
grpc::InsecureChannelCredentials());
|
grpc::InsecureChannelCredentials());
|
||||||
auto stub = MyGame::Example::MonsterStorage::NewStub(channel);
|
auto stub = MyGame::Example::MonsterStorage::NewStub(channel);
|
||||||
|
|
||||||
grpc::ClientContext context;
|
|
||||||
|
|
||||||
// Build a request with the name set.
|
|
||||||
flatbuffers::FlatBufferBuilder fbb;
|
flatbuffers::FlatBufferBuilder fbb;
|
||||||
auto monster_offset = CreateMonster(fbb, 0, 0, 0, fbb.CreateString("Fred"));
|
{
|
||||||
fbb.Finish(monster_offset);
|
grpc::ClientContext context;
|
||||||
auto request = flatbuffers::BufferRef<Monster>(fbb.GetBufferPointer(),
|
// Build a request with the name set.
|
||||||
fbb.GetSize());
|
auto monster_offset = CreateMonster(fbb, 0, 0, 0, fbb.CreateString("Fred"));
|
||||||
flatbuffers::BufferRef<Stat> response;
|
fbb.Finish(monster_offset);
|
||||||
|
auto request = flatbuffers::BufferRef<Monster>(fbb.GetBufferPointer(),
|
||||||
|
fbb.GetSize());
|
||||||
|
flatbuffers::BufferRef<Stat> response;
|
||||||
|
|
||||||
// The actual RPC.
|
// The actual RPC.
|
||||||
auto status = stub->Store(&context, request, &response);
|
auto status = stub->Store(&context, request, &response);
|
||||||
|
|
||||||
if (status.ok()) {
|
if (status.ok()) {
|
||||||
auto resp = response.GetRoot()->id();
|
auto resp = response.GetRoot()->id();
|
||||||
std::cout << "RPC response: " << resp->str() << std::endl;
|
std::cout << "RPC response: " << resp->str() << std::endl;
|
||||||
} else {
|
} else {
|
||||||
std::cout << "RPC failed" << std::endl;
|
std::cout << "RPC failed" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
grpc::ClientContext context;
|
||||||
|
fbb.Clear();
|
||||||
|
auto stat_offset = CreateStat(fbb, fbb.CreateString("Fred"));
|
||||||
|
fbb.Finish(stat_offset);
|
||||||
|
auto request = flatbuffers::BufferRef<Stat>(
|
||||||
|
fbb.GetBufferPointer(),fbb.GetSize()
|
||||||
|
);
|
||||||
|
|
||||||
|
flatbuffers::BufferRef<Monster> response;
|
||||||
|
auto stream = stub->Retrieve(&context, request);
|
||||||
|
while (stream->Read(&response)) {
|
||||||
|
auto resp = response.GetRoot()->name();
|
||||||
|
std::cout << "RPC Streaming response: " << resp->str() << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
server_instance->Shutdown();
|
server_instance->Shutdown();
|
||||||
@@ -121,4 +153,3 @@ int main(int /*argc*/, const char * /*argv*/[]) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ class SerializationTraits<T, typename std::enable_if<std::is_base_of<
|
|||||||
static grpc::Status Deserialize(grpc_byte_buffer *buffer, T *msg) {
|
static grpc::Status Deserialize(grpc_byte_buffer *buffer, T *msg) {
|
||||||
// TODO(wvo): make this more efficient / zero copy when possible.
|
// TODO(wvo): make this more efficient / zero copy when possible.
|
||||||
auto len = grpc_byte_buffer_length(buffer);
|
auto len = grpc_byte_buffer_length(buffer);
|
||||||
|
if(msg->buf != nullptr){
|
||||||
|
free(msg->buf);
|
||||||
|
}
|
||||||
msg->buf = reinterpret_cast<uint8_t *>(malloc(len));
|
msg->buf = reinterpret_cast<uint8_t *>(malloc(len));
|
||||||
msg->len = static_cast<flatbuffers::uoffset_t>(len);
|
msg->len = static_cast<flatbuffers::uoffset_t>(len);
|
||||||
msg->must_free = true;
|
msg->must_free = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user