static void GenerateServiceIf()

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$");
  }