mirror of
https://github.com/apache/impala.git
synced 2025-12-21 19:08:12 -05:00
This patch introduces a new class, RpcMgr which is the abstraction layer around KRPC core mechanics. It provides an interface RegisterService() for various services to register themselves. Kudu RPC is invoked via an auto-generated interface called proxy. This change implements an inline wrapper for KRPC client to obtain a proxy for a particular service exported by remote server. Last but not least, the RpcMgr will start all registered services if FLAGS_use_krpc is true. This patch hasn't yet added any service except for some test services in rpc-mgr-test. This patch is based on an abandoned patch by Henry Robinson. Testing done: a new backend test is added to exercise the code and demonstrate the way to interact with KRPC framework. Change-Id: I8adb10ae375d7bf945394c38a520f12d29cf7b46 Reviewed-on: http://gerrit.cloudera.org:8080/7901 Reviewed-by: Michael Ho <kwho@cloudera.com> Tested-by: Impala Public Jenkins
120 lines
4.7 KiB
CMake
120 lines
4.7 KiB
CMake
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you 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.
|
|
#
|
|
# Kudu RPC generator support
|
|
#########
|
|
find_package(Protobuf REQUIRED)
|
|
|
|
#
|
|
# Generate the KRPC files for a given .proto file.
|
|
#
|
|
function(KRPC_GENERATE SRCS HDRS TGTS)
|
|
if(NOT ARGN)
|
|
message(SEND_ERROR "Error: KRPC_GENERATE() called without protobuf files")
|
|
return()
|
|
endif(NOT ARGN)
|
|
|
|
set(options)
|
|
set(one_value_args SOURCE_ROOT BINARY_ROOT)
|
|
set(multi_value_args EXTRA_PROTO_PATHS PROTO_FILES)
|
|
cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})
|
|
if(ARG_UNPARSED_ARGUMENTS)
|
|
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
|
|
endif()
|
|
set(${SRCS})
|
|
set(${HDRS})
|
|
set(${TGTS})
|
|
|
|
set(EXTRA_PROTO_PATH_ARGS)
|
|
foreach(PP ${ARG_EXTRA_PROTO_PATHS})
|
|
set(EXTRA_PROTO_PATH_ARGS ${EXTRA_PROTO_PATH_ARGS} --proto_path ${PP})
|
|
endforeach()
|
|
|
|
if("${ARG_SOURCE_ROOT}" STREQUAL "")
|
|
SET(ARG_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
endif()
|
|
GET_FILENAME_COMPONENT(ARG_SOURCE_ROOT ${ARG_SOURCE_ROOT} ABSOLUTE)
|
|
|
|
if("${ARG_BINARY_ROOT}" STREQUAL "")
|
|
SET(ARG_BINARY_ROOT "${CMAKE_CURRENT_BINARY_DIR}")
|
|
endif()
|
|
GET_FILENAME_COMPONENT(ARG_BINARY_ROOT ${ARG_BINARY_ROOT} ABSOLUTE)
|
|
|
|
foreach(FIL ${ARG_PROTO_FILES})
|
|
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
|
|
get_filename_component(FIL_WE ${FIL} NAME_WE)
|
|
|
|
# Ensure that the protobuf file is within the source root.
|
|
# This is a requirement of protoc.
|
|
FILE(RELATIVE_PATH PROTO_REL_TO_ROOT "${ARG_SOURCE_ROOT}" "${ABS_FIL}")
|
|
|
|
GET_FILENAME_COMPONENT(REL_DIR "${PROTO_REL_TO_ROOT}" PATH)
|
|
|
|
if(NOT REL_DIR STREQUAL "")
|
|
SET(REL_DIR "${REL_DIR}/")
|
|
endif()
|
|
|
|
set(PROTO_CC_OUT "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.pb.cc")
|
|
set(PROTO_H_OUT "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.pb.h")
|
|
set(SERVICE_CC "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.service.cc")
|
|
set(SERVICE_H "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.service.h")
|
|
set(PROXY_CC "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.proxy.cc")
|
|
set(PROXY_H "${ARG_BINARY_ROOT}/${REL_DIR}${FIL_WE}.proxy.h")
|
|
list(APPEND ${SRCS} "${PROTO_CC_OUT}" "${SERVICE_CC}" "${PROXY_CC}")
|
|
list(APPEND ${HDRS} "${PROTO_H_OUT}" "${SERVICE_H}" "${PROXY_H}")
|
|
|
|
get_filename_component(PROTO_LIB_DIR ${PROTOBUF_SHARED_LIBRARY} DIRECTORY)
|
|
|
|
add_custom_command(
|
|
OUTPUT "${SERVICE_CC}" "${SERVICE_H}" "${PROXY_CC}" "${PROXY_H}"
|
|
"${PROTO_CC_OUT}" "${PROTO_H_OUT}"
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-E env "LD_LIBRARY_PATH=${PROTO_LIB_DIR}:$ENV{LD_LIBRARY_PATH}"
|
|
${PROTOBUF_PROTOC_EXECUTABLE}
|
|
ARGS --plugin $<TARGET_FILE:protoc-gen-krpc>
|
|
--plugin $<TARGET_FILE:protoc-gen-insertions>
|
|
--cpp_out ${ARG_BINARY_ROOT}
|
|
--krpc_out ${ARG_BINARY_ROOT}
|
|
--insertions_out ${ARG_BINARY_ROOT}
|
|
--proto_path ${ARG_SOURCE_ROOT}
|
|
# Used to find built-in .proto files (e.g. FileDescriptorProto)
|
|
--proto_path ${PROTOBUF_INCLUDE_DIR}
|
|
${EXTRA_PROTO_PATH_ARGS} ${ABS_FIL}
|
|
DEPENDS ${ABS_FIL} protoc-gen-krpc protoc-gen-insertions
|
|
COMMENT "Running C++ protocol buffer compiler with KRPC plugin on ${FIL}"
|
|
VERBATIM)
|
|
|
|
# This custom target enforces that there's just one invocation of protoc
|
|
# when there are multiple consumers of the generated files. The target name
|
|
# must be unique; adding parts of the filename helps ensure this.
|
|
# Adding the prefix "KRPC_" to avoid conflation with the input proto file
|
|
# when ninja is used. Otherwise, ninja will flag a false circular dependency.
|
|
set(TGT_NAME KRPC_${REL_DIR}${FIL})
|
|
string(REPLACE "/" "-" TGT_NAME ${TGT_NAME})
|
|
add_custom_target(${TGT_NAME}
|
|
DEPENDS "${SERVICE_CC}" "${SERVICE_H}"
|
|
"${PROXY_CC}" "${PROXY_H}"
|
|
"${PROTO_CC_OUT}" "${PROTO_H_OUT}")
|
|
list(APPEND ${TGTS} "${TGT_NAME}")
|
|
endforeach()
|
|
|
|
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
|
|
set(${SRCS} ${${SRCS}} PARENT_SCOPE)
|
|
set(${HDRS} ${${HDRS}} PARENT_SCOPE)
|
|
set(${TGTS} ${${TGTS}} PARENT_SCOPE)
|
|
endfunction()
|