Support benchmark tool for gRPC over UDS 03/308703/5
authorjh9216.park <jh9216.park@samsung.com>
Fri, 29 Mar 2024 05:17:32 +0000 (01:17 -0400)
committerJunghoon Park <jh9216.park@samsung.com>
Tue, 2 Apr 2024 05:31:59 +0000 (05:31 +0000)
Change-Id: Ifd57b6a407e4148c6517788fba6ee719a540dd04
Signed-off-by: jh9216.park <jh9216.park@samsung.com>
14 files changed:
CMakeLists.txt
benchmark/server/CMakeLists.txt
benchmark/server/grpc/CMakeLists.txt [new file with mode: 0644]
benchmark/server/grpc/grpc_bench_server.cc [new file with mode: 0644]
benchmark/server/grpc/grpcbench.proto [new file with mode: 0644]
benchmark/server/tidl/CMakeLists.txt
benchmark/tool/CMakeLists.txt
benchmark/tool/grpc-proxy.cc [new file with mode: 0644]
benchmark/tool/grpc-proxy.hh [new file with mode: 0644]
benchmark/tool/grpcbench.proto [new file with mode: 0644]
benchmark/tool/main.cc
benchmark/tool/options.cc
benchmark/tool/options.hh
packaging/rpc-port.spec

index 6047848..1509ed8 100644 (file)
@@ -28,8 +28,9 @@ SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
 SET(TARGET_RPC_PORT "rpc-port")
 SET(TARGET_RPC_PORT_UNITTESTS "rpc-port_unittests")
 SET(TARGET_RPC_PORT_UTIL "rpc-port-util")
-SET(TARGET_BENCHMARK_SERVER "rpc-port-benchmark-server")
+SET(TARGET_BENCHMARK_SERVER_TIDL "rpc-port-benchmark-server-tidl")
 SET(TARGET_BENCHMARK_SERVER_DBUS "rpc-port-benchmark-server-dbus")
+SET(TARGET_BENCHMARK_SERVER_GRPC "rpc-port-benchmark-server-grpc")
 SET(TARGET_BENCHMARK_TOOL "rpc-port-benchmark-tool")
 
 ENABLE_TESTING()
@@ -55,6 +56,8 @@ PKG_CHECK_MODULES(PARCEL_DEPS REQUIRED parcel)
 PKG_CHECK_MODULES(PKGMGR_INFO_DEPS REQUIRED pkgmgr-info)
 PKG_CHECK_MODULES(TIZEN_SHARED_QUEUE_DEPS REQUIRED tizen-shared-queue)
 PKG_CHECK_MODULES(UUID_DEPS REQUIRED uuid)
+PKG_CHECK_MODULES(GRPC_DEPS REQUIRED grpc)
+PKG_CHECK_MODULES(PROTOBUF_DEPS REQUIRED protobuf)
 
 ADD_SUBDIRECTORY(src)
 ADD_SUBDIRECTORY(benchmark)
index 015cdef..63768df 100644 (file)
@@ -1,2 +1,3 @@
 ADD_SUBDIRECTORY(tidl)
 ADD_SUBDIRECTORY(dbus)
+ADD_SUBDIRECTORY(grpc)
diff --git a/benchmark/server/grpc/CMakeLists.txt b/benchmark/server/grpc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..067c56b
--- /dev/null
@@ -0,0 +1,49 @@
+
+# Proto file
+get_filename_component(hw_proto "./grpcbench.proto" ABSOLUTE)
+get_filename_component(hw_proto_path "${hw_proto}" PATH)
+
+# Generated sources
+SET(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.pb.cc")
+SET(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.pb.h")
+SET(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.grpc.pb.cc")
+SET(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.grpc.pb.h")
+ADD_CUSTOM_COMMAND(
+      OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
+      COMMAND protoc
+      ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
+        --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
+        -I "${hw_proto_path}"
+        --plugin=protoc-gen-grpc=`which grpc_cpp_plugin`
+        "${hw_proto}"
+      DEPENDS "${hw_proto}")
+
+#include_directories("${CMAKE_CURRENT_BINARY_DIR}")
+
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} BENCHMARK_SERVER_GRPC_SRCS)
+ADD_EXECUTABLE(${TARGET_BENCHMARK_SERVER_GRPC}
+  ${hw_proto_srcs}
+  ${hw_grpc_srcs}
+  ${BENCHMARK_SERVER_GRPC_SRCS}
+)
+
+TARGET_INCLUDE_DIRECTORIES(${TARGET_BENCHMARK_SERVER_GRPC} PUBLIC
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../../../include/)
+
+APPLY_PKG_CONFIG(${TARGET_BENCHMARK_SERVER_GRPC} PUBLIC
+  DLOG_DEPS
+  GLIB_DEPS
+  GIO_DEPS
+  GRPC_DEPS
+  PROTOBUF_DEPS
+)
+
+TARGET_LINK_LIBRARIES(${TARGET_BENCHMARK_SERVER_GRPC} PUBLIC
+  ${TARGET_RPC_PORT} "-lpthread" grpc++)
+SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER_GRPC} PROPERTIES
+  COMPILE_FLAGS "-fPIE")
+SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER_GRPC} PROPERTIES
+  LINK_FLAGS "-pie")
+
+INSTALL(TARGETS ${TARGET_BENCHMARK_SERVER_GRPC} DESTINATION bin)
diff --git a/benchmark/server/grpc/grpc_bench_server.cc b/benchmark/server/grpc/grpc_bench_server.cc
new file mode 100644 (file)
index 0000000..ab8edb1
--- /dev/null
@@ -0,0 +1,39 @@
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include <grpcpp/grpcpp.h>
+
+#include "grpcbench.grpc.pb.h"
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::Status;
+using grpcbench::Greeter;
+using grpcbench::HelloReply;
+using grpcbench::HelloRequest;
+
+class GreeterServiceImpl final : public Greeter::Service {
+  Status SayHello(ServerContext* context, const HelloRequest* request,
+                  HelloReply* reply) override {
+    reply->set_message(0);
+    return Status::OK;
+  }
+};
+
+int main(int argc, char** argv) {
+  std::string server_address("unix:///tmp/test.socket");
+
+  GreeterServiceImpl service;
+
+  ServerBuilder builder;
+  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
+  builder.RegisterService(&service);
+  std::unique_ptr<Server> server(builder.BuildAndStart());
+  std::cout << "Server listening on " << server_address << std::endl;
+
+  server->Wait();
+
+  return 0;
+}
\ No newline at end of file
diff --git a/benchmark/server/grpc/grpcbench.proto b/benchmark/server/grpc/grpcbench.proto
new file mode 100644 (file)
index 0000000..797e379
--- /dev/null
@@ -0,0 +1,19 @@
+syntax = "proto3";
+
+package grpcbench;
+
+// The greeting service definition.
+service Greeter {
+  // Sends a greeting
+  rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  int32 message = 1;
+}
index ae94d6e..690d33f 100644 (file)
@@ -1,22 +1,22 @@
-AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} BENCHMARK_SERVER_SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} BENCHMARK_SERVER_TIDL_SRCS)
 
-ADD_EXECUTABLE(${TARGET_BENCHMARK_SERVER} ${BENCHMARK_SERVER_SRCS})
+ADD_EXECUTABLE(${TARGET_BENCHMARK_SERVER_TIDL} ${BENCHMARK_SERVER_TIDL_SRCS})
 
-TARGET_INCLUDE_DIRECTORIES(${TARGET_BENCHMARK_SERVER} PUBLIC
+TARGET_INCLUDE_DIRECTORIES(${TARGET_BENCHMARK_SERVER_TIDL} PUBLIC
   ${CMAKE_CURRENT_SOURCE_DIR}
   ${CMAKE_CURRENT_SOURCE_DIR}/../../../include/)
 
-APPLY_PKG_CONFIG(${TARGET_BENCHMARK_SERVER} PUBLIC
+APPLY_PKG_CONFIG(${TARGET_BENCHMARK_SERVER_TIDL} PUBLIC
   AUL_DEPS
   DLOG_DEPS
   GLIB_DEPS
 )
 
-TARGET_LINK_LIBRARIES(${TARGET_BENCHMARK_SERVER} PUBLIC
+TARGET_LINK_LIBRARIES(${TARGET_BENCHMARK_SERVER_TIDL} PUBLIC
   ${TARGET_RPC_PORT} "-lpthread")
-SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER} PROPERTIES
+SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER_TIDL} PROPERTIES
   COMPILE_FLAGS "-fPIE")
-SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER} PROPERTIES
+SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_SERVER_TIDL} PROPERTIES
   LINK_FLAGS "-pie")
 
-INSTALL(TARGETS ${TARGET_BENCHMARK_SERVER} DESTINATION bin)
+INSTALL(TARGETS ${TARGET_BENCHMARK_SERVER_TIDL} DESTINATION bin)
index b5481d8..25d3009 100644 (file)
@@ -1,6 +1,29 @@
+# Proto file
+get_filename_component(hw_proto "./grpcbench.proto" ABSOLUTE)
+get_filename_component(hw_proto_path "${hw_proto}" PATH)
+
+# Generated sources
+SET(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.pb.cc")
+SET(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.pb.h")
+SET(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.grpc.pb.cc")
+SET(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/grpcbench.grpc.pb.h")
+ADD_CUSTOM_COMMAND(
+      OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
+      COMMAND protoc
+      ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
+        --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
+        -I "${hw_proto_path}"
+        --plugin=protoc-gen-grpc=`which grpc_cpp_plugin`
+        "${hw_proto}"
+      DEPENDS "${hw_proto}")
+
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} BENCHMARK_SRCS)
 
-ADD_EXECUTABLE(${TARGET_BENCHMARK_TOOL} ${BENCHMARK_SRCS})
+ADD_EXECUTABLE(${TARGET_BENCHMARK_TOOL}
+  ${hw_proto_srcs}
+  ${hw_grpc_srcs}
+  ${BENCHMARK_SRCS}
+)
 
 TARGET_INCLUDE_DIRECTORIES(${TARGET_BENCHMARK_TOOL} PUBLIC
   ${CMAKE_CURRENT_SOURCE_DIR}
@@ -11,10 +34,12 @@ APPLY_PKG_CONFIG(${TARGET_BENCHMARK_TOOL} PUBLIC
   BUNDLE_DEPS
   DLOG_DEPS
   GLIB_DEPS
+  GRPC_DEPS
+  PROTOBUF_DEPS
 )
 
 TARGET_LINK_LIBRARIES(${TARGET_BENCHMARK_TOOL} PUBLIC
-  ${TARGET_RPC_PORT} "-lpthread")
+  ${TARGET_RPC_PORT} "-lpthread" grpc++)
 SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_TOOL} PROPERTIES
   COMPILE_FLAGS "-fPIE")
 SET_TARGET_PROPERTIES(${TARGET_BENCHMARK_TOOL} PROPERTIES
diff --git a/benchmark/tool/grpc-proxy.cc b/benchmark/tool/grpc-proxy.cc
new file mode 100644 (file)
index 0000000..de41800
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "grpc-proxy.hh"
+
+namespace rpc_port {
+namespace benchmark {
+
+GrpcProxy::GrpcProxy() {
+}
+
+void GrpcProxy::Connect() {
+  std::string target_str("unix:///tmp/test.socket");
+  channel_ = grpc::CreateChannel(target_str,
+      grpc::InsecureChannelCredentials());
+  stub_ = grpcbench::Greeter::NewStub(channel_);
+}
+
+int GrpcProxy::Test(std::string data) const {
+  grpcbench::HelloRequest request;
+  request.set_name(data);
+
+  grpc::ClientContext context;
+  grpcbench::HelloReply response;
+
+  grpc::Status status = stub_->SayHello(&context, request, &response);
+  if (status.ok()) {
+    int ret = response.message();
+    return ret;
+  }
+
+  return -1;
+}
+
+}  // namespace benchmark
+}  // namespace rpc_port
diff --git a/benchmark/tool/grpc-proxy.hh b/benchmark/tool/grpc-proxy.hh
new file mode 100644 (file)
index 0000000..a9357eb
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef GRPC_PROXY_HH_
+#define GRPC_PROXY_HH_
+
+#include <string>
+#include <memory>
+
+#include <grpcpp/grpcpp.h>
+#include "grpcbench.grpc.pb.h"
+
+namespace rpc_port {
+namespace benchmark {
+
+class GrpcProxy {
+ public:
+  GrpcProxy();
+
+  void Connect();
+  int Test(std::string data) const;
+
+ private:
+  std::unique_ptr<grpcbench::Greeter::Stub> stub_;
+  std::shared_ptr<grpc::Channel> channel_;
+};
+
+}  // namespace benchmark
+}  // namespace rpc_port
+
+#endif  // GRPC_PROXY_HH_
diff --git a/benchmark/tool/grpcbench.proto b/benchmark/tool/grpcbench.proto
new file mode 100644 (file)
index 0000000..797e379
--- /dev/null
@@ -0,0 +1,19 @@
+syntax = "proto3";
+
+package grpcbench;
+
+// The greeting service definition.
+service Greeter {
+  // Sends a greeting
+  rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  int32 message = 1;
+}
index d21d150..cf42bd4 100644 (file)
 #include "options.hh"
 #include "BenchmarkProxy.h"
 #include "dbus-proxy.hh"
+#include "grpc-proxy.hh"
 
 namespace {
 
 #define SERVER_PROC_NAME "org.tizen.appfw.rpc_port.benchmark"
-#define SERVER_BIN "/usr/bin/rpc-port-benchmark-server"
+#define SERVER_BIN_TIDL "/usr/bin/rpc-port-benchmark-server-tidl"
 #define SERVER_BIN_DBUS "/usr/bin/rpc-port-benchmark-server-dbus"
+#define SERVER_BIN_GRPC "/usr/bin/rpc-port-benchmark-server-grpc"
 
 namespace bp = rpc_port::BenchmarkProxy::proxy;
 
@@ -71,9 +73,11 @@ class Tester {
       return;
     }
 
-    ExecuteServer(options_->IsDbus());
+    ExecuteServer();
     if (options_->IsDbus()) {
       dbus_proxy_.Connect();
+    } else if (options_->IsGrpc()) {
+      grpc_proxy_.Connect();
     } else {
       proxy_.reset(new bp::Benchmark(&listener_, SERVER_PROC_NAME));
 
@@ -118,13 +122,14 @@ class Tester {
   void DoTest(int iters, int size) {
     bool is_func = options_->IsFunction();
     bool is_dbus = options_->IsDbus();
+    bool is_grpc = options_->IsGrpc();
 
     StartTime();
     for (int i = 0; i < iters; i++) {
       if (is_func) {
         int ret = FakeFunction(std::string(size, 'a'));
         if (ret != 0) {
-          _E("Invalid return");
+          std::cerr << "Invalid return" << std::endl;
           break;
         }
 
@@ -134,7 +139,17 @@ class Tester {
       if (is_dbus) {
         int ret = dbus_proxy_.Test(std::string(size, 'a'));
         if (ret != 0) {
-          _E("Invalid return");
+          std::cerr << "Invalid return" << std::endl;
+          break;
+        }
+
+        continue;
+      }
+
+      if (is_grpc) {
+        int ret = grpc_proxy_.Test(std::string(size, 'a'));
+        if (ret != 0) {
+          std::cerr << "Invalid return" << std::endl;
           break;
         }
 
@@ -143,7 +158,7 @@ class Tester {
 
       int ret = proxy_->Test(std::string(size, 'a'));
       if (ret != 0) {
-        _E("Invalid return");
+        std::cerr << "Invalid return" << std::endl;
         break;
       }
     }
@@ -168,7 +183,10 @@ class Tester {
         sec.count(), t, l);
   }
 
-  void ExecuteServer(bool is_dbus) {
+  void ExecuteServer() {
+    bool is_dbus = options_->IsDbus();
+    bool is_grpc = options_->IsGrpc();
+
     server_pid_ = fork();
     if (server_pid_ == 0) {
       setsid();
@@ -177,8 +195,12 @@ class Tester {
         char bin[] = { SERVER_BIN_DBUS };
         char* argv[] = { bin, nullptr, nullptr };
         ret = execv(argv[0], argv);
+      } else if (is_grpc) {
+        char bin[] = { SERVER_BIN_GRPC };
+        char* argv[] = { bin, nullptr, nullptr };
+        ret = execv(argv[0], argv);
       } else {
-        char bin[] = { SERVER_BIN };
+        char bin[] = { SERVER_BIN_TIDL };
         char* argv[] = { bin, nullptr, nullptr };
         ret = execv(argv[0], argv);
       }
@@ -202,6 +224,7 @@ class Tester {
   std::chrono::system_clock::time_point start_;
   pid_t server_pid_ = -1;
   rpc_port::benchmark::DbusProxy dbus_proxy_;
+  rpc_port::benchmark::GrpcProxy grpc_proxy_;
 };
 
 }  // namespace
index e4ab4b4..894947a 100644 (file)
@@ -36,6 +36,7 @@ Help Options:
 Additional Options:
   -f, --funcation                     Use function call instead of RPC
   -d, --dbus                          Use Dbus method instead of TIDL RPC
+  -g, --grpc                          Use gRPC over UDS instead of TIDL RPC
   -a, --all                           Test pre-defined test-cases
   -i, --interations=<Iterations>      Iterations
   -s, --size=<Data size>              Data size (byte)
@@ -70,12 +71,13 @@ std::unique_ptr<Options> Options::Parse(int argc, char** argv) {
     {"size", required_argument, nullptr, 's'},
     {"function", no_argument, nullptr, 'f'},
     {"dbus", no_argument, nullptr, 'd'},
+    {"grpc", no_argument, nullptr, 'g'},
     {"all", no_argument, nullptr, 'a'},
     {0, 0, 0, 0}
   };
 
   while (true) {
-    int c = getopt_long(argc, argv, "vhfdai:s:", long_options,
+    int c = getopt_long(argc, argv, "vhfdgai:s:", long_options,
         &option_index);
     if (c == -1)
       break;
@@ -112,6 +114,11 @@ std::unique_ptr<Options> Options::Parse(int argc, char** argv) {
         options->is_dbus_ = true;
         break;
 
+      case 'g':
+        opt[OPT_GRPC] = true;
+        options->is_grpc_ = true;
+        break;
+
       case 'a':
         opt[OPT_ALL] = true;
         options->is_all_ = true;
index 1a560f5..fefef21 100644 (file)
@@ -50,6 +50,10 @@ class Options {
     return is_dbus_;
   }
 
+  bool IsGrpc() const {
+    return is_grpc_;
+  }
+
  private:
   enum Cmd {
     CMD_VERSION,
@@ -63,6 +67,7 @@ class Options {
     OPT_ALL,
     OPT_FUNCTION,
     OPT_DBUS,
+    OPT_GRPC,
     OPT_MAX
   };
 
@@ -77,6 +82,7 @@ class Options {
   bool is_function_ = false;
   bool is_all_ = false;
   bool is_dbus_ = false;
+  bool is_grpc_ = false;
 };
 
 }  // namespace benchmark
index b21ef49..30d4ad4 100644 (file)
@@ -19,6 +19,8 @@ BuildRequires:  pkgconfig(parcel)
 BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(tizen-shared-queue)
 BuildRequires:  pkgconfig(uuid)
+BuildRequires:  pkgconfig(grpc)
+BuildRequires:  pkgconfig(protobuf)
 
 %if 0%{?gcov:1}
 BuildRequires:  lcov
@@ -156,8 +158,9 @@ install -m 0755 run-unittest.sh %{buildroot}%{_bindir}/tizen-unittests/%{name}/
 %attr(0644,root,root) %{_libdir}/lib%{name}.so.*
 %license LICENSE.APLv2
 %{_bindir}/rpc-port-util
-%{_bindir}/rpc-port-benchmark-server
+%{_bindir}/rpc-port-benchmark-server-tidl
 %{_bindir}/rpc-port-benchmark-server-dbus
+%{_bindir}/rpc-port-benchmark-server-grpc
 %{_bindir}/rpc-port-benchmark-tool
 %config %{_sysconfdir}/dbus-1/system.d/rpc-port.conf