Skip to content

Instantly share code, notes, and snippets.

@yang-g
Last active February 2, 2016 19:15
Show Gist options
  • Save yang-g/143c12eca25f8f742134 to your computer and use it in GitHub Desktop.
Save yang-g/143c12eca25f8f742134 to your computer and use it in GitHub Desktop.
example grpc ciena server
// Code sample. May need minor fixes to compile.
// Create a sync service handling class
class OpenConfigImpl : public openconfigs::OpenConfig::Service {
public:
::grpc::Status::Subscribe(::grpc::ServerContext* context, ::grpc::ServerReaderWriter<SubscribeResponse, SubscribeRequest>* stream) override;
::grpc::Status::Set(::grpc::ServerContext* context, ::grpc::ServerReaderWriter<SetResponse, SetRequest>* stream) override;
// Get will be handled async.
};
// wrapper for data related with one async Get rpc
struct GetRpcData {
GetRequest get_request;
GetResponse get_response;
::grpc::ServerContext context;
::grpc::ServerAsyncResponseWriter<GetResponse> response_writer {&context};
};
// Request to handle a new Get rpc from library.
void RequestGet(::grpc::Service* service, ::grpc::ServerCompletionQueue* cq) {
// request a new rpc
auto* data = new GetRpcData;
service->RequestGet(&data->context, &data->get_request, &data->response_writer, cq, cq, new HandleRpcTag(service, cq, data));
}
// Interface for completion queue tag
class TagInterface {
public:
virtual ~TagInterface() {};
virtual void Run() = 0;
};
class HandleRpcTag : public TagInterface {
public:
HandleRpcTag(::grpc::Service* service, ::grpc::ServerCompletionQueue* cq, GetRpcData* data) : service_(service), cq_(cq), data_(data) {}
void Run() override {
// Handle request, set response etc here
RequestGet(service_, cq_);
data_->response_writer->Finish(data->get_response, ::grpc::Status::OK, new DeleteRpcTag(data));
delete this;
}
private:
::grpc::Service* service_;
::grpc::ServerCompletionQueue* cq_;
GetRpcData* data_;
};
class DeleteRpcTag : public TagInterface {
public:
explicit DeleteRpcTag(GetRpcData* data) : data_(data) {}
void Run() override { delete data_; delete this; }
private:
GetRpcData* data_;
};
void HandleGetRpcs(::grpc::CompletionQueue* cq) {
void* tag;
bool ok;
while (cq->Next(&tag, &ok)) {
static_cast<TagInterface *>(tag)->Run();
}
}
int main() {
// Creating a service
openconfigs::OpenConfig::WithAsyncMethod_Get<OpenConfigImpl> service;
::grpc::ServerBuilder builder;
builder.AddListeningPort("0.0.0.0:12345", ::grpc::InsecureServerCredentials());
builder.RegisterService(&service);
auto cq = builder.AddCompletionQueue();
auto server = builder.BuildAndStart();
RequestGet(&service, cq.get();
// This can be run in multiple threads.
HandleGetRpcs(cq.get());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment