in src/kudu/rpc/protoc-gen-krpc.cc [405:549]
static void GenerateServiceIf(Printer* printer,
SubstitutionContext* subs,
const FileDescriptor* file) {
Print(printer, *subs,
"// THIS FILE IS AUTOGENERATED FROM $path$\n"
"\n"
"#include <functional>\n"
"#include <memory>\n"
"#include <unordered_map>\n"
"#include <utility>\n"
"\n"
"#include <google/protobuf/message.h>\n"
"\n"
"#include \"$path_no_extension$.pb.h\"\n"
"#include \"$path_no_extension$.service.h\"\n"
"\n"
"#include \"kudu/rpc/result_tracker.h\"\n"
"#include \"kudu/rpc/service_if.h\"\n"
"#include \"kudu/util/metrics.h\"\n"
"#include \"kudu/util/net/dns_resolver.h\"\n"
"\n");
// Define metric prototypes for each method in the service.
for (int service_idx = 0; service_idx < file->service_count();
++service_idx) {
const ServiceDescriptor* service = file->service(service_idx);
subs->PushService(service);
for (int method_idx = 0; method_idx < service->method_count();
++method_idx) {
const MethodDescriptor* method = service->method(method_idx);
subs->PushMethod(method);
Print(printer, *subs,
"METRIC_DEFINE_histogram(server,\n"
" handler_latency_$rpc_full_name_plainchars$,\n"
" \"$rpc_full_name$ RPC Time\",\n"
" kudu::MetricUnit::kMicroseconds,\n"
" \"Microseconds spent handling $rpc_full_name$ RPC requests\",\n"
" kudu::MetricLevel::kInfo,\n"
" 60000000LU, 2);\n"
"\n");
Print(printer, *subs,
"METRIC_DEFINE_counter(server,\n"
" queue_overflow_rejections_$rpc_full_name_plainchars$,\n"
" \"$rpc_full_name$ RPC Rejections\",\n"
" kudu::MetricUnit::kRequests,\n"
" \"Number of rejected $rpc_full_name$ requests due to RPC queue overflow\",\n"
" kudu::MetricLevel::kInfo);\n"
"\n");
Print(printer, *subs,
"METRIC_DEFINE_counter(server,\n"
" timed_out_on_response_$rpc_full_name_plainchars$,\n"
" \"Late $rpc_full_name$ RPC Responses\",\n"
" kudu::MetricUnit::kRequests,\n"
" \"Number of times $rpc_full_name$ responses were sent past the RPC's deadline\",\n"
" kudu::MetricLevel::kInfo);\n"
"\n");
subs->Pop(); // method
}
subs->Pop(); // service
}
Print(printer, *subs,
"using google::protobuf::Message;\n"
"using kudu::MetricEntity;\n"
"using kudu::rpc::ResultTracker;\n"
"using kudu::rpc::RpcContext;\n"
"using kudu::rpc::RpcMethodInfo;\n"
"using std::string;\n"
"\n"
"$open_namespace$");
for (int service_idx = 0; service_idx < file->service_count();
++service_idx) {
const ServiceDescriptor* service = file->service(service_idx);
subs->PushService(service);
Print(printer, *subs,
"\n"
"const string $service_name$If::kServiceName_ = \"$full_service_name$\";\n"
"\n"
"const string& $service_name$If::static_service_name() {\n"
" return kServiceName_;\n"
"}\n"
"\n"
"$service_name$If::$service_name$If(\n"
" const scoped_refptr<MetricEntity>& entity,\n"
" const scoped_refptr<ResultTracker>& result_tracker)\n"
" : GeneratedServiceIf(result_tracker) {\n"
);
for (int method_idx = 0; method_idx < service->method_count();
++method_idx) {
const MethodDescriptor* method = service->method(method_idx);
subs->PushMethod(method);
Print(printer, *subs,
" {\n"
" scoped_refptr<RpcMethodInfo> mi(new RpcMethodInfo);\n"
" mi->req_prototype.reset(new $request$);\n"
" mi->resp_prototype.reset(new $response$);\n"
" mi->authz_method = [this](const Message* req, Message* resp,\n"
" RpcContext* ctx) {\n"
" return this->$authz_method$(\n"
" static_cast<const $request$*>(req),\n"
" static_cast<$response$*>(resp),\n"
" ctx);\n"
" };\n"
" mi->track_result = $track_result$;\n"
" mi->handler_latency_histogram =\n"
" METRIC_handler_latency_$rpc_full_name_plainchars$.Instantiate(entity);\n"
" mi->queue_overflow_rejections =\n"
" METRIC_queue_overflow_rejections_$rpc_full_name_plainchars$.Instantiate("
"entity);\n"
" mi->timed_out_on_response =\n"
" METRIC_timed_out_on_response_$rpc_full_name_plainchars$.Instantiate("
"entity);\n"
" mi->func = [this](const Message* req, Message* resp, RpcContext* ctx) {\n"
" this->$rpc_name$(\n"
" static_cast<const $request$*>(req),\n"
" static_cast<$response$*>(resp),\n"
" ctx);\n"
" };\n"
" methods_by_name_[\"$rpc_name$\"] = std::move(mi);\n"
" }\n");
subs->Pop(); // method
}
Print(printer, *subs,
"}\n"
"\n"
"$service_name$If::~$service_name$If() {\n"
"}\n"
"\n"
"const string& $service_name$If::service_name() const {\n"
" return kServiceName_;\n"
"}\n");
subs->Pop(); // service
}
Print(printer, *subs,
"\n"
"$close_namespace$");
}