in src/kudu/rpc/protoc-gen-krpc.cc [435:550]
void GenerateServiceIf(Printer *printer,
SubstitutionContext *subs,
const FileDescriptor *file) const {
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"
"\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, 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"
" 60000000LU, 2);\n"
"\n");
subs->Pop();
}
subs->Pop();
}
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::unique_ptr;\n"
"\n"
"$open_namespace$"
"\n");
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,
"$service_name$If::$service_name$If(const scoped_refptr<MetricEntity>& entity,"
" const scoped_refptr<ResultTracker>& result_tracker) {\n"
"result_tracker_ = 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$(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->func = [this](const Message* req, Message* resp, RpcContext* ctx) {\n"
" this->$rpc_name$(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();
}
Print(printer, *subs,
"}\n"
"\n"
"$service_name$If::~$service_name$If() {\n"
"}\n"
"\n"
"std::string $service_name$If::service_name() const {\n"
" return \"$full_service_name$\";\n"
"}\n"
"std::string $service_name$If::static_service_name() {\n"
" return \"$full_service_name$\";\n"
"}\n"
"\n"
);
subs->Pop();
}
Print(printer, *subs,
"$close_namespace$"
);
}