X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgrpc.cc;h=abdd6b02e3b710423e92fac9a9924048ae46c36b;hb=1bdd4bf92c0e54efe40b372cf738527d04f90152;hp=9523fc2513dd2cf6804a2fdec8ab2029bbeb04c8;hpb=c6ff2298206ce78a6f2c7772f3bf413af8d44311;p=collectd.git diff --git a/src/grpc.cc b/src/grpc.cc index 9523fc25..abdd6b02 100644 --- a/src/grpc.cc +++ b/src/grpc.cc @@ -38,6 +38,8 @@ extern "C" { #include "configfile.h" #include "plugin.h" +#include "daemon/utils_cache.h" + typedef struct { char *addr; char *port; @@ -225,7 +227,63 @@ private: collectd::DispatchValuesReply reply_; grpc::ServerAsyncResponseWriter responder_; -}; +}; /* class DispatchValuesCall */ + +class ListValuesCall : public Call +{ +public: + ListValuesCall(collectd::Collectd::AsyncService *service, grpc::ServerCompletionQueue *cq) + : Call(service, cq), responder_(&ctx_) + { + Handle(); + } /* ListValuesCall() */ + + virtual ~ListValuesCall() + { } + +private: + void Create() + { + service_->RequestListValues(&ctx_, &request_, &responder_, cq_, cq_, this); + } /* Create() */ + + void Process() + { + new ListValuesCall(service_, cq_); + + char **names = NULL; + cdtime_t *times = NULL; + size_t i, n = 0; + + auto status = grpc::Status::OK; + if (uc_get_names(&names, ×, &n)) { + status = grpc::Status(grpc::StatusCode::INTERNAL, + grpc::string("failed to retrieve values")); + } + + for (i = 0; i < n; i++) { + auto v = reply_.add_value(); + auto t = TimeUtil::NanosecondsToTimestamp(CDTIME_T_TO_NS(times[i])); + v->set_name(names[i]); + v->set_allocated_time(new google::protobuf::Timestamp(t)); + sfree(names[i]); + } + sfree(names); + sfree(times); + + responder_.Finish(reply_, status, this); + } /* Process() */ + + void Finish() + { + delete this; + } /* Finish() */ + + collectd::ListValuesRequest request_; + collectd::ListValuesReply reply_; + + grpc::ServerAsyncResponseWriter responder_; +}; /* class ListValuesCall */ /* * gRPC server implementation @@ -272,6 +330,7 @@ public: { // Register request types. new DispatchValuesCall(&service_, cq_.get()); + new ListValuesCall(&service_, cq_.get()); while (true) { void *req = NULL;