Merge github.com:grpc/grpc into always-use-port-server
This commit is contained in:
commit
4d34729a4e
8
BUILD
8
BUILD
|
|
@ -1133,6 +1133,10 @@ grpc_cc_library(
|
|||
"src/cpp/server/async_generic_service.cc",
|
||||
"src/cpp/server/create_default_thread_pool.cc",
|
||||
"src/cpp/server/dynamic_thread_pool.cc",
|
||||
"src/cpp/server/health/default_health_check_service.cc",
|
||||
"src/cpp/server/health/health.pb.c",
|
||||
"src/cpp/server/health/health_check_service.cc",
|
||||
"src/cpp/server/health/health_check_service_server_builder_option.cc",
|
||||
"src/cpp/server/server_builder.cc",
|
||||
"src/cpp/server/server_cc.cc",
|
||||
"src/cpp/server/server_context.cc",
|
||||
|
|
@ -1149,6 +1153,8 @@ grpc_cc_library(
|
|||
"src/cpp/client/create_channel_internal.h",
|
||||
"src/cpp/common/channel_filter.h",
|
||||
"src/cpp/server/dynamic_thread_pool.h",
|
||||
"src/cpp/server/health/default_health_check_service.h",
|
||||
"src/cpp/server/health/health.pb.h",
|
||||
"src/cpp/server/thread_pool_interface.h",
|
||||
"src/cpp/thread_manager/thread_manager.h",
|
||||
],
|
||||
|
|
@ -1160,9 +1166,11 @@ grpc_cc_library(
|
|||
"include/grpc++/completion_queue.h",
|
||||
"include/grpc++/create_channel.h",
|
||||
"include/grpc++/create_channel_posix.h",
|
||||
"include/grpc++/ext/health_check_service_server_builder_option.h",
|
||||
"include/grpc++/generic/async_generic_service.h",
|
||||
"include/grpc++/generic/generic_stub.h",
|
||||
"include/grpc++/grpc++.h",
|
||||
"include/grpc++/health_check_service_interface.h",
|
||||
"include/grpc++/impl/call.h",
|
||||
"include/grpc++/impl/client_unary_call.h",
|
||||
"include/grpc++/impl/codegen/core_codegen.h",
|
||||
|
|
|
|||
227
CMakeLists.txt
227
CMakeLists.txt
|
|
@ -420,9 +420,6 @@ if(_gRPC_PLATFORM_LINUX)
|
|||
add_dependencies(buildtests_c httpscli_test)
|
||||
endif()
|
||||
add_dependencies(buildtests_c init_test)
|
||||
add_dependencies(buildtests_c internal_api_canary_iomgr_test)
|
||||
add_dependencies(buildtests_c internal_api_canary_support_test)
|
||||
add_dependencies(buildtests_c internal_api_canary_transport_test)
|
||||
add_dependencies(buildtests_c invalid_call_argument_test)
|
||||
add_dependencies(buildtests_c json_rewrite)
|
||||
add_dependencies(buildtests_c json_rewrite_test)
|
||||
|
|
@ -570,9 +567,15 @@ add_dependencies(buildtests_cxx alarm_cpp_test)
|
|||
add_dependencies(buildtests_cxx async_end2end_test)
|
||||
add_dependencies(buildtests_cxx auth_property_iterator_test)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx bm_call_create)
|
||||
endif()
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx bm_closure)
|
||||
endif()
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx bm_cq)
|
||||
endif()
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx bm_fullstack)
|
||||
endif()
|
||||
add_dependencies(buildtests_cxx channel_arguments_test)
|
||||
|
|
@ -597,6 +600,7 @@ add_dependencies(buildtests_cxx grpc_cli)
|
|||
add_dependencies(buildtests_cxx grpc_tool_test)
|
||||
add_dependencies(buildtests_cxx grpclb_api_test)
|
||||
add_dependencies(buildtests_cxx grpclb_test)
|
||||
add_dependencies(buildtests_cxx health_service_end2end_test)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx http2_client)
|
||||
endif()
|
||||
|
|
@ -2057,6 +2061,10 @@ add_library(grpc++
|
|||
src/cpp/server/async_generic_service.cc
|
||||
src/cpp/server/create_default_thread_pool.cc
|
||||
src/cpp/server/dynamic_thread_pool.cc
|
||||
src/cpp/server/health/default_health_check_service.cc
|
||||
src/cpp/server/health/health.pb.c
|
||||
src/cpp/server/health/health_check_service.cc
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc
|
||||
src/cpp/server/server_builder.cc
|
||||
src/cpp/server/server_cc.cc
|
||||
src/cpp/server/server_context.cc
|
||||
|
|
@ -2110,9 +2118,11 @@ foreach(_hdr
|
|||
include/grpc++/completion_queue.h
|
||||
include/grpc++/create_channel.h
|
||||
include/grpc++/create_channel_posix.h
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h
|
||||
include/grpc++/generic/async_generic_service.h
|
||||
include/grpc++/generic/generic_stub.h
|
||||
include/grpc++/grpc++.h
|
||||
include/grpc++/health_check_service_interface.h
|
||||
include/grpc++/impl/call.h
|
||||
include/grpc++/impl/client_unary_call.h
|
||||
include/grpc++/impl/codegen/core_codegen.h
|
||||
|
|
@ -2237,6 +2247,10 @@ add_library(grpc++_cronet
|
|||
src/cpp/server/async_generic_service.cc
|
||||
src/cpp/server/create_default_thread_pool.cc
|
||||
src/cpp/server/dynamic_thread_pool.cc
|
||||
src/cpp/server/health/default_health_check_service.cc
|
||||
src/cpp/server/health/health.pb.c
|
||||
src/cpp/server/health/health_check_service.cc
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc
|
||||
src/cpp/server/server_builder.cc
|
||||
src/cpp/server/server_cc.cc
|
||||
src/cpp/server/server_context.cc
|
||||
|
|
@ -2474,9 +2488,11 @@ foreach(_hdr
|
|||
include/grpc++/completion_queue.h
|
||||
include/grpc++/create_channel.h
|
||||
include/grpc++/create_channel_posix.h
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h
|
||||
include/grpc++/generic/async_generic_service.h
|
||||
include/grpc++/generic/generic_stub.h
|
||||
include/grpc++/grpc++.h
|
||||
include/grpc++/health_check_service_interface.h
|
||||
include/grpc++/impl/call.h
|
||||
include/grpc++/impl/client_unary_call.h
|
||||
include/grpc++/impl/codegen/core_codegen.h
|
||||
|
|
@ -2747,6 +2763,10 @@ endif (gRPC_BUILD_TESTS)
|
|||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_library(grpc++_test_util
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.h
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.h
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc
|
||||
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h
|
||||
|
|
@ -2779,6 +2799,9 @@ if(WIN32 AND MSVC)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
protobuf_generate_grpc_cpp(
|
||||
src/proto/grpc/health/v1/health.proto
|
||||
)
|
||||
protobuf_generate_grpc_cpp(
|
||||
src/proto/grpc/testing/echo_messages.proto
|
||||
)
|
||||
|
|
@ -2895,6 +2918,10 @@ add_library(grpc++_unsecure
|
|||
src/cpp/server/async_generic_service.cc
|
||||
src/cpp/server/create_default_thread_pool.cc
|
||||
src/cpp/server/dynamic_thread_pool.cc
|
||||
src/cpp/server/health/default_health_check_service.cc
|
||||
src/cpp/server/health/health.pb.c
|
||||
src/cpp/server/health/health_check_service.cc
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc
|
||||
src/cpp/server/server_builder.cc
|
||||
src/cpp/server/server_cc.cc
|
||||
src/cpp/server/server_context.cc
|
||||
|
|
@ -2948,9 +2975,11 @@ foreach(_hdr
|
|||
include/grpc++/completion_queue.h
|
||||
include/grpc++/create_channel.h
|
||||
include/grpc++/create_channel_posix.h
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h
|
||||
include/grpc++/generic/async_generic_service.h
|
||||
include/grpc++/generic/generic_stub.h
|
||||
include/grpc++/grpc++.h
|
||||
include/grpc++/health_check_service_interface.h
|
||||
include/grpc++/impl/call.h
|
||||
include/grpc++/impl/client_unary_call.h
|
||||
include/grpc++/impl/codegen/core_codegen.h
|
||||
|
|
@ -5911,87 +5940,6 @@ target_link_libraries(init_test
|
|||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(internal_api_canary_iomgr_test
|
||||
test/core/internal_api_canaries/iomgr.c
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(internal_api_canary_iomgr_test
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
)
|
||||
|
||||
target_link_libraries(internal_api_canary_iomgr_test
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc_test_util
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(internal_api_canary_support_test
|
||||
test/core/internal_api_canaries/iomgr.c
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(internal_api_canary_support_test
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
)
|
||||
|
||||
target_link_libraries(internal_api_canary_support_test
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc_test_util
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(internal_api_canary_transport_test
|
||||
test/core/internal_api_canaries/iomgr.c
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(internal_api_canary_transport_test
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
)
|
||||
|
||||
target_link_libraries(internal_api_canary_transport_test
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc_test_util
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(invalid_call_argument_test
|
||||
test/core/end2end/invalid_call_argument_test.c
|
||||
)
|
||||
|
|
@ -7411,6 +7359,44 @@ endif (gRPC_BUILD_TESTS)
|
|||
if (gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(bm_call_create
|
||||
test/cpp/microbenchmarks/bm_call_create.cc
|
||||
third_party/googletest/src/gtest-all.cc
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(bm_call_create
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
PRIVATE third_party/googletest/include
|
||||
PRIVATE third_party/googletest
|
||||
PRIVATE ${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(bm_call_create
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
benchmark
|
||||
grpc++_test_util
|
||||
grpc_test_util
|
||||
grpc++
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
endif()
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(bm_closure
|
||||
test/cpp/microbenchmarks/bm_closure.cc
|
||||
third_party/googletest/src/gtest-all.cc
|
||||
|
|
@ -7447,6 +7433,44 @@ endif (gRPC_BUILD_TESTS)
|
|||
if (gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(bm_cq
|
||||
test/cpp/microbenchmarks/bm_cq.cc
|
||||
third_party/googletest/src/gtest-all.cc
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(bm_cq
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
PRIVATE third_party/googletest/include
|
||||
PRIVATE third_party/googletest
|
||||
PRIVATE ${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(bm_cq
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
benchmark
|
||||
grpc++_test_util
|
||||
grpc_test_util
|
||||
grpc++
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
endif()
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(bm_fullstack
|
||||
test/cpp/microbenchmarks/bm_fullstack.cc
|
||||
third_party/googletest/src/gtest-all.cc
|
||||
|
|
@ -8500,6 +8524,41 @@ target_link_libraries(grpclb_test
|
|||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
|
||||
add_executable(health_service_end2end_test
|
||||
test/cpp/end2end/health_service_end2end_test.cc
|
||||
third_party/googletest/src/gtest-all.cc
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(health_service_end2end_test
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
PRIVATE ${BORINGSSL_ROOT_DIR}/include
|
||||
PRIVATE ${PROTOBUF_ROOT_DIR}/src
|
||||
PRIVATE ${BENCHMARK_ROOT_DIR}/include
|
||||
PRIVATE ${ZLIB_ROOT_DIR}
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
|
||||
PRIVATE third_party/googletest/include
|
||||
PRIVATE third_party/googletest
|
||||
PRIVATE ${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(health_service_end2end_test
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc++_test_util
|
||||
grpc_test_util
|
||||
grpc++
|
||||
grpc
|
||||
gpr_test_util
|
||||
gpr
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
endif (gRPC_BUILD_TESTS)
|
||||
if (gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
|
|
|||
298
Makefile
298
Makefile
|
|
@ -217,7 +217,7 @@ CC_counters = $(DEFAULT_CC)
|
|||
CXX_counters = $(DEFAULT_CXX)
|
||||
LD_counters = $(DEFAULT_CC)
|
||||
LDXX_counters = $(DEFAULT_CXX)
|
||||
CPPFLAGS_counters = -O2 -DGPR_MU_COUNTERS
|
||||
CPPFLAGS_counters = -O2 -DGPR_LOW_LEVEL_COUNTERS
|
||||
DEFINES_counters = NDEBUG
|
||||
|
||||
|
||||
|
|
@ -980,9 +980,6 @@ httpcli_format_request_test: $(BINDIR)/$(CONFIG)/httpcli_format_request_test
|
|||
httpcli_test: $(BINDIR)/$(CONFIG)/httpcli_test
|
||||
httpscli_test: $(BINDIR)/$(CONFIG)/httpscli_test
|
||||
init_test: $(BINDIR)/$(CONFIG)/init_test
|
||||
internal_api_canary_iomgr_test: $(BINDIR)/$(CONFIG)/internal_api_canary_iomgr_test
|
||||
internal_api_canary_support_test: $(BINDIR)/$(CONFIG)/internal_api_canary_support_test
|
||||
internal_api_canary_transport_test: $(BINDIR)/$(CONFIG)/internal_api_canary_transport_test
|
||||
invalid_call_argument_test: $(BINDIR)/$(CONFIG)/invalid_call_argument_test
|
||||
json_fuzzer_test: $(BINDIR)/$(CONFIG)/json_fuzzer_test
|
||||
json_rewrite: $(BINDIR)/$(CONFIG)/json_rewrite
|
||||
|
|
@ -1043,7 +1040,9 @@ wakeup_fd_cv_test: $(BINDIR)/$(CONFIG)/wakeup_fd_cv_test
|
|||
alarm_cpp_test: $(BINDIR)/$(CONFIG)/alarm_cpp_test
|
||||
async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test
|
||||
auth_property_iterator_test: $(BINDIR)/$(CONFIG)/auth_property_iterator_test
|
||||
bm_call_create: $(BINDIR)/$(CONFIG)/bm_call_create
|
||||
bm_closure: $(BINDIR)/$(CONFIG)/bm_closure
|
||||
bm_cq: $(BINDIR)/$(CONFIG)/bm_cq
|
||||
bm_fullstack: $(BINDIR)/$(CONFIG)/bm_fullstack
|
||||
channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test
|
||||
channel_filter_test: $(BINDIR)/$(CONFIG)/channel_filter_test
|
||||
|
|
@ -1072,6 +1071,7 @@ grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
|
|||
grpc_tool_test: $(BINDIR)/$(CONFIG)/grpc_tool_test
|
||||
grpclb_api_test: $(BINDIR)/$(CONFIG)/grpclb_api_test
|
||||
grpclb_test: $(BINDIR)/$(CONFIG)/grpclb_test
|
||||
health_service_end2end_test: $(BINDIR)/$(CONFIG)/health_service_end2end_test
|
||||
http2_client: $(BINDIR)/$(CONFIG)/http2_client
|
||||
hybrid_end2end_test: $(BINDIR)/$(CONFIG)/hybrid_end2end_test
|
||||
interop_client: $(BINDIR)/$(CONFIG)/interop_client
|
||||
|
|
@ -1335,9 +1335,6 @@ buildtests_c: privatelibs_c \
|
|||
$(BINDIR)/$(CONFIG)/httpcli_test \
|
||||
$(BINDIR)/$(CONFIG)/httpscli_test \
|
||||
$(BINDIR)/$(CONFIG)/init_test \
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_iomgr_test \
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_support_test \
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_transport_test \
|
||||
$(BINDIR)/$(CONFIG)/invalid_call_argument_test \
|
||||
$(BINDIR)/$(CONFIG)/json_rewrite \
|
||||
$(BINDIR)/$(CONFIG)/json_rewrite_test \
|
||||
|
|
@ -1450,7 +1447,9 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/alarm_cpp_test \
|
||||
$(BINDIR)/$(CONFIG)/async_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/auth_property_iterator_test \
|
||||
$(BINDIR)/$(CONFIG)/bm_call_create \
|
||||
$(BINDIR)/$(CONFIG)/bm_closure \
|
||||
$(BINDIR)/$(CONFIG)/bm_cq \
|
||||
$(BINDIR)/$(CONFIG)/bm_fullstack \
|
||||
$(BINDIR)/$(CONFIG)/channel_arguments_test \
|
||||
$(BINDIR)/$(CONFIG)/channel_filter_test \
|
||||
|
|
@ -1472,6 +1471,7 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/grpc_tool_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_api_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_test \
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/http2_client \
|
||||
$(BINDIR)/$(CONFIG)/hybrid_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/interop_client \
|
||||
|
|
@ -1555,7 +1555,9 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/alarm_cpp_test \
|
||||
$(BINDIR)/$(CONFIG)/async_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/auth_property_iterator_test \
|
||||
$(BINDIR)/$(CONFIG)/bm_call_create \
|
||||
$(BINDIR)/$(CONFIG)/bm_closure \
|
||||
$(BINDIR)/$(CONFIG)/bm_cq \
|
||||
$(BINDIR)/$(CONFIG)/bm_fullstack \
|
||||
$(BINDIR)/$(CONFIG)/channel_arguments_test \
|
||||
$(BINDIR)/$(CONFIG)/channel_filter_test \
|
||||
|
|
@ -1577,6 +1579,7 @@ buildtests_cxx: privatelibs_cxx \
|
|||
$(BINDIR)/$(CONFIG)/grpc_tool_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_api_test \
|
||||
$(BINDIR)/$(CONFIG)/grpclb_test \
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/http2_client \
|
||||
$(BINDIR)/$(CONFIG)/hybrid_end2end_test \
|
||||
$(BINDIR)/$(CONFIG)/interop_client \
|
||||
|
|
@ -1860,8 +1863,6 @@ test_c: buildtests_c
|
|||
|
||||
|
||||
flaky_test_c: buildtests_c
|
||||
$(E) "[RUN] Testing lb_policies_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/lb_policies_test || ( echo test lb_policies_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing mlog_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/mlog_test || ( echo test mlog_test failed ; exit 1 )
|
||||
|
||||
|
|
@ -1873,8 +1874,12 @@ test_cxx: buildtests_cxx
|
|||
$(Q) $(BINDIR)/$(CONFIG)/async_end2end_test || ( echo test async_end2end_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing auth_property_iterator_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/auth_property_iterator_test || ( echo test auth_property_iterator_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing bm_call_create"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/bm_call_create || ( echo test bm_call_create failed ; exit 1 )
|
||||
$(E) "[RUN] Testing bm_closure"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/bm_closure || ( echo test bm_closure failed ; exit 1 )
|
||||
$(E) "[RUN] Testing bm_cq"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/bm_cq || ( echo test bm_cq failed ; exit 1 )
|
||||
$(E) "[RUN] Testing bm_fullstack"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/bm_fullstack || ( echo test bm_fullstack failed ; exit 1 )
|
||||
$(E) "[RUN] Testing channel_arguments_test"
|
||||
|
|
@ -1913,6 +1918,8 @@ test_cxx: buildtests_cxx
|
|||
$(Q) $(BINDIR)/$(CONFIG)/grpclb_api_test || ( echo test grpclb_api_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing grpclb_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/grpclb_test || ( echo test grpclb_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing health_service_end2end_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/health_service_end2end_test || ( echo test health_service_end2end_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing interop_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/interop_test || ( echo test interop_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing mock_test"
|
||||
|
|
@ -2061,6 +2068,21 @@ $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc:
|
|||
$(Q) mkdir -p $(@D)
|
||||
$(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@
|
||||
|
||||
ifeq ($(NO_PROTOC),true)
|
||||
$(GENDIR)/src/proto/grpc/health/v1/health.pb.cc: protoc_dep_error
|
||||
$(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc: protoc_dep_error
|
||||
else
|
||||
$(GENDIR)/src/proto/grpc/health/v1/health.pb.cc: src/proto/grpc/health/v1/health.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS)
|
||||
$(E) "[PROTOC] Generating protobuf CC file from $<"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
|
||||
|
||||
$(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc: src/proto/grpc/health/v1/health.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS)
|
||||
$(E) "[GRPC] Generating gRPC's protobuf service CC file from $<"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
|
||||
endif
|
||||
|
||||
ifeq ($(NO_PROTOC),true)
|
||||
$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc: protoc_dep_error
|
||||
$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc: protoc_dep_error
|
||||
|
|
@ -3862,6 +3884,10 @@ LIBGRPC++_SRC = \
|
|||
src/cpp/server/async_generic_service.cc \
|
||||
src/cpp/server/create_default_thread_pool.cc \
|
||||
src/cpp/server/dynamic_thread_pool.cc \
|
||||
src/cpp/server/health/default_health_check_service.cc \
|
||||
src/cpp/server/health/health.pb.c \
|
||||
src/cpp/server/health/health_check_service.cc \
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc \
|
||||
src/cpp/server/server_builder.cc \
|
||||
src/cpp/server/server_cc.cc \
|
||||
src/cpp/server/server_context.cc \
|
||||
|
|
@ -3882,9 +3908,11 @@ PUBLIC_HEADERS_CXX += \
|
|||
include/grpc++/completion_queue.h \
|
||||
include/grpc++/create_channel.h \
|
||||
include/grpc++/create_channel_posix.h \
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h \
|
||||
include/grpc++/generic/async_generic_service.h \
|
||||
include/grpc++/generic/generic_stub.h \
|
||||
include/grpc++/grpc++.h \
|
||||
include/grpc++/health_check_service_interface.h \
|
||||
include/grpc++/impl/call.h \
|
||||
include/grpc++/impl/client_unary_call.h \
|
||||
include/grpc++/impl/codegen/core_codegen.h \
|
||||
|
|
@ -4055,6 +4083,10 @@ LIBGRPC++_CRONET_SRC = \
|
|||
src/cpp/server/async_generic_service.cc \
|
||||
src/cpp/server/create_default_thread_pool.cc \
|
||||
src/cpp/server/dynamic_thread_pool.cc \
|
||||
src/cpp/server/health/default_health_check_service.cc \
|
||||
src/cpp/server/health/health.pb.c \
|
||||
src/cpp/server/health/health_check_service.cc \
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc \
|
||||
src/cpp/server/server_builder.cc \
|
||||
src/cpp/server/server_cc.cc \
|
||||
src/cpp/server/server_context.cc \
|
||||
|
|
@ -4258,9 +4290,11 @@ PUBLIC_HEADERS_CXX += \
|
|||
include/grpc++/completion_queue.h \
|
||||
include/grpc++/create_channel.h \
|
||||
include/grpc++/create_channel_posix.h \
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h \
|
||||
include/grpc++/generic/async_generic_service.h \
|
||||
include/grpc++/generic/generic_stub.h \
|
||||
include/grpc++/grpc++.h \
|
||||
include/grpc++/health_check_service_interface.h \
|
||||
include/grpc++/impl/call.h \
|
||||
include/grpc++/impl/client_unary_call.h \
|
||||
include/grpc++/impl/codegen/core_codegen.h \
|
||||
|
|
@ -4593,6 +4627,7 @@ endif
|
|||
|
||||
|
||||
LIBGRPC++_TEST_UTIL_SRC = \
|
||||
$(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc \
|
||||
$(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \
|
||||
$(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \
|
||||
$(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \
|
||||
|
|
@ -4701,13 +4736,13 @@ ifneq ($(NO_DEPS),true)
|
|||
-include $(LIBGRPC++_TEST_UTIL_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_proto_helper.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_helper.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/test_credentials_provider.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/src/cpp/codegen/codegen_init.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_proto_helper.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_helper.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/util/test_credentials_provider.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
$(OBJDIR)/$(CONFIG)/src/cpp/codegen/codegen_init.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
|
||||
|
||||
|
||||
LIBGRPC++_UNSECURE_SRC = \
|
||||
|
|
@ -4731,6 +4766,10 @@ LIBGRPC++_UNSECURE_SRC = \
|
|||
src/cpp/server/async_generic_service.cc \
|
||||
src/cpp/server/create_default_thread_pool.cc \
|
||||
src/cpp/server/dynamic_thread_pool.cc \
|
||||
src/cpp/server/health/default_health_check_service.cc \
|
||||
src/cpp/server/health/health.pb.c \
|
||||
src/cpp/server/health/health_check_service.cc \
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc \
|
||||
src/cpp/server/server_builder.cc \
|
||||
src/cpp/server/server_cc.cc \
|
||||
src/cpp/server/server_context.cc \
|
||||
|
|
@ -4751,9 +4790,11 @@ PUBLIC_HEADERS_CXX += \
|
|||
include/grpc++/completion_queue.h \
|
||||
include/grpc++/create_channel.h \
|
||||
include/grpc++/create_channel_posix.h \
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h \
|
||||
include/grpc++/generic/async_generic_service.h \
|
||||
include/grpc++/generic/generic_stub.h \
|
||||
include/grpc++/grpc++.h \
|
||||
include/grpc++/health_check_service_interface.h \
|
||||
include/grpc++/impl/call.h \
|
||||
include/grpc++/impl/client_unary_call.h \
|
||||
include/grpc++/impl/codegen/core_codegen.h \
|
||||
|
|
@ -10299,102 +10340,6 @@ endif
|
|||
endif
|
||||
|
||||
|
||||
INTERNAL_API_CANARY_IOMGR_TEST_SRC = \
|
||||
test/core/internal_api_canaries/iomgr.c \
|
||||
|
||||
INTERNAL_API_CANARY_IOMGR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTERNAL_API_CANARY_IOMGR_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_iomgr_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_iomgr_test: $(INTERNAL_API_CANARY_IOMGR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LD) $(LDFLAGS) $(INTERNAL_API_CANARY_IOMGR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/internal_api_canary_iomgr_test
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/internal_api_canaries/iomgr.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_internal_api_canary_iomgr_test: $(INTERNAL_API_CANARY_IOMGR_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(INTERNAL_API_CANARY_IOMGR_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
INTERNAL_API_CANARY_SUPPORT_TEST_SRC = \
|
||||
test/core/internal_api_canaries/iomgr.c \
|
||||
|
||||
INTERNAL_API_CANARY_SUPPORT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTERNAL_API_CANARY_SUPPORT_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_support_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_support_test: $(INTERNAL_API_CANARY_SUPPORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LD) $(LDFLAGS) $(INTERNAL_API_CANARY_SUPPORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/internal_api_canary_support_test
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/internal_api_canaries/iomgr.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_internal_api_canary_support_test: $(INTERNAL_API_CANARY_SUPPORT_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(INTERNAL_API_CANARY_SUPPORT_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
INTERNAL_API_CANARY_TRANSPORT_TEST_SRC = \
|
||||
test/core/internal_api_canaries/iomgr.c \
|
||||
|
||||
INTERNAL_API_CANARY_TRANSPORT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTERNAL_API_CANARY_TRANSPORT_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_transport_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/internal_api_canary_transport_test: $(INTERNAL_API_CANARY_TRANSPORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LD) $(LDFLAGS) $(INTERNAL_API_CANARY_TRANSPORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/internal_api_canary_transport_test
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/internal_api_canaries/iomgr.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_internal_api_canary_transport_test: $(INTERNAL_API_CANARY_TRANSPORT_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(INTERNAL_API_CANARY_TRANSPORT_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
INVALID_CALL_ARGUMENT_TEST_SRC = \
|
||||
test/core/end2end/invalid_call_argument_test.c \
|
||||
|
||||
|
|
@ -12348,6 +12293,49 @@ endif
|
|||
endif
|
||||
|
||||
|
||||
BM_CALL_CREATE_SRC = \
|
||||
test/cpp/microbenchmarks/bm_call_create.cc \
|
||||
|
||||
BM_CALL_CREATE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CALL_CREATE_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_call_create: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
|
||||
ifeq ($(NO_PROTOBUF),true)
|
||||
|
||||
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_call_create: protobuf_dep_error
|
||||
|
||||
else
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_call_create: $(PROTOBUF_DEP) $(BM_CALL_CREATE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LDXX) $(LDFLAGS) $(BM_CALL_CREATE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_call_create
|
||||
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_call_create.o: $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_bm_call_create: $(BM_CALL_CREATE_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(BM_CALL_CREATE_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
BM_CLOSURE_SRC = \
|
||||
test/cpp/microbenchmarks/bm_closure.cc \
|
||||
|
||||
|
|
@ -12391,6 +12379,49 @@ endif
|
|||
endif
|
||||
|
||||
|
||||
BM_CQ_SRC = \
|
||||
test/cpp/microbenchmarks/bm_cq.cc \
|
||||
|
||||
BM_CQ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CQ_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_cq: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
|
||||
ifeq ($(NO_PROTOBUF),true)
|
||||
|
||||
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_cq: protobuf_dep_error
|
||||
|
||||
else
|
||||
|
||||
$(BINDIR)/$(CONFIG)/bm_cq: $(PROTOBUF_DEP) $(BM_CQ_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LDXX) $(LDFLAGS) $(BM_CQ_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_cq
|
||||
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_cq.o: $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_bm_cq: $(BM_CQ_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(BM_CQ_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
BM_FULLSTACK_SRC = \
|
||||
test/cpp/microbenchmarks/bm_fullstack.cc \
|
||||
|
||||
|
|
@ -13566,6 +13597,49 @@ endif
|
|||
$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc
|
||||
|
||||
|
||||
HEALTH_SERVICE_END2END_TEST_SRC = \
|
||||
test/cpp/end2end/health_service_end2end_test.cc \
|
||||
|
||||
HEALTH_SERVICE_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HEALTH_SERVICE_END2END_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
|
||||
ifeq ($(NO_PROTOBUF),true)
|
||||
|
||||
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test: protobuf_dep_error
|
||||
|
||||
else
|
||||
|
||||
$(BINDIR)/$(CONFIG)/health_service_end2end_test: $(PROTOBUF_DEP) $(HEALTH_SERVICE_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
$(E) "[LD] Linking $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) $(LDXX) $(LDFLAGS) $(HEALTH_SERVICE_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/health_service_end2end_test
|
||||
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/cpp/end2end/health_service_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_health_service_end2end_test: $(HEALTH_SERVICE_END2END_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(HEALTH_SERVICE_END2END_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
|
|
|||
27
WORKSPACE
27
WORKSPACE
|
|
@ -28,20 +28,41 @@ bind(
|
|||
actual = "@submodule_protobuf//:protoc",
|
||||
)
|
||||
|
||||
bind(
|
||||
name = "gtest",
|
||||
actual = "@submodule_gtest//:gtest",
|
||||
)
|
||||
|
||||
bind(
|
||||
name = "gflags",
|
||||
actual = "@com_github_gflags_gflags//:gflags",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "submodule_boringssl",
|
||||
path = "third_party/boringssl-with-bazel",
|
||||
build_file = "third_party/boringssl-with-bazel/BUILD",
|
||||
path = "third_party/boringssl-with-bazel",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "submodule_zlib",
|
||||
path = "third_party/zlib",
|
||||
build_file = "third_party/zlib.BUILD",
|
||||
path = "third_party/zlib",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "submodule_protobuf",
|
||||
path = "third_party/protobuf",
|
||||
build_file = "third_party/protobuf/BUILD",
|
||||
path = "third_party/protobuf",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "submodule_gtest",
|
||||
build_file = "third_party/gtest.BUILD",
|
||||
path = "third_party/googletest",
|
||||
)
|
||||
|
||||
local_repository(
|
||||
name = "com_github_gflags_gflags",
|
||||
path = "third_party/gflags",
|
||||
)
|
||||
|
|
|
|||
97
build.yaml
97
build.yaml
|
|
@ -767,9 +767,11 @@ filegroups:
|
|||
- include/grpc++/completion_queue.h
|
||||
- include/grpc++/create_channel.h
|
||||
- include/grpc++/create_channel_posix.h
|
||||
- include/grpc++/ext/health_check_service_server_builder_option.h
|
||||
- include/grpc++/generic/async_generic_service.h
|
||||
- include/grpc++/generic/generic_stub.h
|
||||
- include/grpc++/grpc++.h
|
||||
- include/grpc++/health_check_service_interface.h
|
||||
- include/grpc++/impl/call.h
|
||||
- include/grpc++/impl/client_unary_call.h
|
||||
- include/grpc++/impl/codegen/core_codegen.h
|
||||
|
|
@ -807,6 +809,8 @@ filegroups:
|
|||
- src/cpp/client/create_channel_internal.h
|
||||
- src/cpp/common/channel_filter.h
|
||||
- src/cpp/server/dynamic_thread_pool.h
|
||||
- src/cpp/server/health/default_health_check_service.h
|
||||
- src/cpp/server/health/health.pb.h
|
||||
- src/cpp/server/thread_pool_interface.h
|
||||
- src/cpp/thread_manager/thread_manager.h
|
||||
src:
|
||||
|
|
@ -827,6 +831,10 @@ filegroups:
|
|||
- src/cpp/server/async_generic_service.cc
|
||||
- src/cpp/server/create_default_thread_pool.cc
|
||||
- src/cpp/server/dynamic_thread_pool.cc
|
||||
- src/cpp/server/health/default_health_check_service.cc
|
||||
- src/cpp/server/health/health.pb.c
|
||||
- src/cpp/server/health/health_check_service.cc
|
||||
- src/cpp/server/health/health_check_service_server_builder_option.cc
|
||||
- src/cpp/server/server_builder.cc
|
||||
- src/cpp/server/server_cc.cc
|
||||
- src/cpp/server/server_context.cc
|
||||
|
|
@ -1167,6 +1175,7 @@ libs:
|
|||
- test/cpp/util/subprocess.h
|
||||
- test/cpp/util/test_credentials_provider.h
|
||||
src:
|
||||
- src/proto/grpc/health/v1/health.proto
|
||||
- src/proto/grpc/testing/echo_messages.proto
|
||||
- src/proto/grpc/testing/echo.proto
|
||||
- src/proto/grpc/testing/duplicate/echo_duplicate.proto
|
||||
|
|
@ -2238,39 +2247,6 @@ targets:
|
|||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: internal_api_canary_iomgr_test
|
||||
build: test
|
||||
run: false
|
||||
language: c
|
||||
src:
|
||||
- test/core/internal_api_canaries/iomgr.c
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: internal_api_canary_support_test
|
||||
build: test
|
||||
run: false
|
||||
language: c
|
||||
src:
|
||||
- test/core/internal_api_canaries/iomgr.c
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: internal_api_canary_transport_test
|
||||
build: test
|
||||
run: false
|
||||
language: c
|
||||
src:
|
||||
- test/core/internal_api_canaries/iomgr.c
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: invalid_call_argument_test
|
||||
cpu_cost: 0.1
|
||||
build: test
|
||||
|
|
@ -2346,8 +2322,8 @@ targets:
|
|||
- gpr
|
||||
- name: lb_policies_test
|
||||
cpu_cost: 0.1
|
||||
flaky: true
|
||||
build: test
|
||||
run: false
|
||||
language: c
|
||||
src:
|
||||
- test/core/client_channel/lb_policies_test.c
|
||||
|
|
@ -2983,6 +2959,25 @@ targets:
|
|||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: bm_call_create
|
||||
build: test
|
||||
language: c++
|
||||
src:
|
||||
- test/cpp/microbenchmarks/bm_call_create.cc
|
||||
deps:
|
||||
- benchmark
|
||||
- grpc++_test_util
|
||||
- grpc_test_util
|
||||
- grpc++
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
args:
|
||||
- --benchmark_min_time=0
|
||||
platforms:
|
||||
- mac
|
||||
- linux
|
||||
- posix
|
||||
- name: bm_closure
|
||||
build: test
|
||||
language: c++
|
||||
|
|
@ -3000,6 +2995,25 @@ targets:
|
|||
- mac
|
||||
- linux
|
||||
- posix
|
||||
- name: bm_cq
|
||||
build: test
|
||||
language: c++
|
||||
src:
|
||||
- test/cpp/microbenchmarks/bm_cq.cc
|
||||
deps:
|
||||
- benchmark
|
||||
- grpc++_test_util
|
||||
- grpc_test_util
|
||||
- grpc++
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
args:
|
||||
- --benchmark_min_time=0
|
||||
platforms:
|
||||
- mac
|
||||
- linux
|
||||
- posix
|
||||
- name: bm_fullstack
|
||||
build: test
|
||||
language: c++
|
||||
|
|
@ -3347,6 +3361,19 @@ targets:
|
|||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: health_service_end2end_test
|
||||
gtest: true
|
||||
build: test
|
||||
language: c++
|
||||
src:
|
||||
- test/cpp/end2end/health_service_end2end_test.cc
|
||||
deps:
|
||||
- grpc++_test_util
|
||||
- grpc_test_util
|
||||
- grpc++
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
- name: http2_client
|
||||
build: test
|
||||
run: false
|
||||
|
|
@ -3895,7 +3922,7 @@ configs:
|
|||
CPPFLAGS: -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC
|
||||
DEFINES: NDEBUG
|
||||
counters:
|
||||
CPPFLAGS: -O2 -DGPR_MU_COUNTERS
|
||||
CPPFLAGS: -O2 -DGPR_LOW_LEVEL_COUNTERS
|
||||
DEFINES: NDEBUG
|
||||
dbg:
|
||||
CPPFLAGS: -O0
|
||||
|
|
|
|||
|
|
@ -12,105 +12,105 @@ The service config is a JSON string of the following form:
|
|||
|
||||
```
|
||||
{
|
||||
# Load balancing policy name.
|
||||
# Supported values are 'round_robin' and 'grpclb'.
|
||||
# Optional; if unset, the default behavior is pick the first available
|
||||
# backend.
|
||||
# Note that if the resolver returns only balancer addresses and no
|
||||
# backend addresses, gRPC will always use the 'grpclb' policy,
|
||||
# regardless of what this field is set to.
|
||||
// Load balancing policy name.
|
||||
// Supported values are 'round_robin' and 'grpclb'.
|
||||
// Optional; if unset, the default behavior is pick the first available
|
||||
// backend.
|
||||
// Note that if the resolver returns only balancer addresses and no
|
||||
// backend addresses, gRPC will always use the 'grpclb' policy,
|
||||
// regardless of what this field is set to.
|
||||
'loadBalancingPolicy': string,
|
||||
|
||||
# Per-method configuration. Optional.
|
||||
// Per-method configuration. Optional.
|
||||
'methodConfig': [
|
||||
{
|
||||
# The names of the methods to which this method config applies. There
|
||||
# must be at least one name. Each name entry must be unique across the
|
||||
# entire service config. If the 'method' field is empty, then this
|
||||
# method config specifies the defaults for all methods for the specified
|
||||
# service.
|
||||
#
|
||||
# For example, let's say that the service config contains the following
|
||||
# method config entries:
|
||||
#
|
||||
# 'methodConfig': [
|
||||
# { 'name': [ { 'service': 'MyService' } ] ... },
|
||||
# { 'name': [ { 'service': 'MyService', 'method': 'Foo' } ] ... }
|
||||
# ]
|
||||
#
|
||||
# For a request for MyService/Foo, we will use the second entry, because
|
||||
# it exactly matches the service and method name.
|
||||
# For a request for MyService/Bar, we will use the first entry, because
|
||||
# it provides the default for all methods of MyService.
|
||||
// The names of the methods to which this method config applies. There
|
||||
// must be at least one name. Each name entry must be unique across the
|
||||
// entire service config. If the 'method' field is empty, then this
|
||||
// method config specifies the defaults for all methods for the specified
|
||||
// service.
|
||||
//
|
||||
// For example, let's say that the service config contains the following
|
||||
// method config entries:
|
||||
//
|
||||
// 'methodConfig': [
|
||||
// { 'name': [ { 'service': 'MyService' } ] ... },
|
||||
// { 'name': [ { 'service': 'MyService', 'method': 'Foo' } ] ... }
|
||||
// ]
|
||||
//
|
||||
// For a request for MyService/Foo, we will use the second entry, because
|
||||
// it exactly matches the service and method name.
|
||||
// For a request for MyService/Bar, we will use the first entry, because
|
||||
// it provides the default for all methods of MyService.
|
||||
'name': [
|
||||
{
|
||||
# RPC service name. Required.
|
||||
# If using gRPC with protobuf as the IDL, then this will be of
|
||||
# the form "pkg.service_name", where "pkg" is the package name
|
||||
# defined in the proto file.
|
||||
// RPC service name. Required.
|
||||
// If using gRPC with protobuf as the IDL, then this will be of
|
||||
// the form "pkg.service_name", where "pkg" is the package name
|
||||
// defined in the proto file.
|
||||
'service': string,
|
||||
|
||||
# RPC method name. Optional (see above).
|
||||
// RPC method name. Optional (see above).
|
||||
'method': string,
|
||||
}
|
||||
],
|
||||
|
||||
# Whether RPCs sent to this method should wait until the connection is
|
||||
# ready by default. If false, the RPC will abort immediately if there
|
||||
# is a transient failure connecting to the server. Otherwise, gRPC will
|
||||
# attempt to connect until the deadline is exceeded.
|
||||
#
|
||||
# The value specified via the gRPC client API will override the value
|
||||
# set here. However, note that setting the value in the client API will
|
||||
# also affect transient errors encountered during name resolution,
|
||||
# which cannot be caught by the value here, since the service config
|
||||
# is obtained by the gRPC client via name resolution.
|
||||
// Whether RPCs sent to this method should wait until the connection is
|
||||
// ready by default. If false, the RPC will abort immediately if there
|
||||
// is a transient failure connecting to the server. Otherwise, gRPC will
|
||||
// attempt to connect until the deadline is exceeded.
|
||||
//
|
||||
// The value specified via the gRPC client API will override the value
|
||||
// set here. However, note that setting the value in the client API will
|
||||
// also affect transient errors encountered during name resolution,
|
||||
// which cannot be caught by the value here, since the service config
|
||||
// is obtained by the gRPC client via name resolution.
|
||||
'waitForReady': bool,
|
||||
|
||||
# The default timeout in seconds for RPCs sent to this method. This can
|
||||
# be overridden in code. If no reply is received in the specified amount
|
||||
# of time, the request is aborted and a deadline-exceeded error status
|
||||
# is returned to the caller.
|
||||
#
|
||||
# The actual deadline used will be the minimum of the value specified
|
||||
# here and the value set by the application via the gRPC client API.
|
||||
# If either one is not set, then the other will be used.
|
||||
# If neither is set, then the request has no deadline.
|
||||
#
|
||||
# The format of the value is that of the 'Duration' type defined here:
|
||||
# https://developers.google.com/protocol-buffers/docs/proto3#json
|
||||
// The default timeout in seconds for RPCs sent to this method. This can
|
||||
// be overridden in code. If no reply is received in the specified amount
|
||||
// of time, the request is aborted and a deadline-exceeded error status
|
||||
// is returned to the caller.
|
||||
//
|
||||
// The actual deadline used will be the minimum of the value specified
|
||||
// here and the value set by the application via the gRPC client API.
|
||||
// If either one is not set, then the other will be used.
|
||||
// If neither is set, then the request has no deadline.
|
||||
//
|
||||
// The format of the value is that of the 'Duration' type defined here:
|
||||
// https://developers.google.com/protocol-buffers/docs/proto3#json
|
||||
'timeout': string,
|
||||
|
||||
# The maximum allowed payload size for an individual request or object
|
||||
# in a stream (client->server) in bytes. The size which is measured is
|
||||
# the serialized, uncompressed payload in bytes. This applies both
|
||||
# to streaming and non-streaming requests.
|
||||
#
|
||||
# The actual value used is the minimum of the value specified here and
|
||||
# the value set by the application via the gRPC client API.
|
||||
# If either one is not set, then the other will be used.
|
||||
# If neither is set, then the built-in default is used.
|
||||
#
|
||||
# If a client attempts to send an object larger than this value, it
|
||||
# will not be sent and the client will see an error.
|
||||
# Note that 0 is a valid value, meaning that the request message must
|
||||
# be empty.
|
||||
// The maximum allowed payload size for an individual request or object
|
||||
// in a stream (client->server) in bytes. The size which is measured is
|
||||
// the serialized, uncompressed payload in bytes. This applies both
|
||||
// to streaming and non-streaming requests.
|
||||
//
|
||||
// The actual value used is the minimum of the value specified here and
|
||||
// the value set by the application via the gRPC client API.
|
||||
// If either one is not set, then the other will be used.
|
||||
// If neither is set, then the built-in default is used.
|
||||
//
|
||||
// If a client attempts to send an object larger than this value, it
|
||||
// will not be sent and the client will see an error.
|
||||
// Note that 0 is a valid value, meaning that the request message must
|
||||
// be empty.
|
||||
'maxRequestMessageBytes': number,
|
||||
|
||||
# The maximum allowed payload size for an individual response or object
|
||||
# in a stream (server->client) in bytes. The size which is measured is
|
||||
# the serialized, uncompressed payload in bytes. This applies both
|
||||
# to streaming and non-streaming requests.
|
||||
#
|
||||
# The actual value used is the minimum of the value specified here and
|
||||
# the value set by the application via the gRPC client API.
|
||||
# If either one is not set, then the other will be used.
|
||||
# If neither is set, then the built-in default is used.
|
||||
#
|
||||
# If a server attempts to send an object larger than this value, it
|
||||
# will not be sent, and the client will see an error.
|
||||
# Note that 0 is a valid value, meaning that the response message must
|
||||
# be empty.
|
||||
// The maximum allowed payload size for an individual response or object
|
||||
// in a stream (server->client) in bytes. The size which is measured is
|
||||
// the serialized, uncompressed payload in bytes. This applies both
|
||||
// to streaming and non-streaming requests.
|
||||
//
|
||||
// The actual value used is the minimum of the value specified here and
|
||||
// the value set by the application via the gRPC client API.
|
||||
// If either one is not set, then the other will be used.
|
||||
// If neither is set, then the built-in default is used.
|
||||
//
|
||||
// If a server attempts to send an object larger than this value, it
|
||||
// will not be sent, and the client will see an error.
|
||||
// Note that 0 is a valid value, meaning that the response message must
|
||||
// be empty.
|
||||
'maxResponseMessageBytes': number
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
#define GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/health_check_service_interface.h>
|
||||
#include <grpc++/impl/server_builder_option.h>
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class HealthCheckServiceServerBuilderOption : public ServerBuilderOption {
|
||||
public:
|
||||
// The ownership of hc will be taken and transferred to the grpc server.
|
||||
// To explicitly disable default service, pass in a nullptr.
|
||||
explicit HealthCheckServiceServerBuilderOption(
|
||||
std::unique_ptr<HealthCheckServiceInterface> hc);
|
||||
~HealthCheckServiceServerBuilderOption() override {}
|
||||
void UpdateArguments(ChannelArguments* args) override;
|
||||
void UpdatePlugins(
|
||||
std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr<HealthCheckServiceInterface> hc_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2015, Google Inc.
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -31,55 +31,38 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <set>
|
||||
#ifndef GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
#define GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "test/cpp/qps/driver.h"
|
||||
#include "test/cpp/qps/report.h"
|
||||
#include "test/cpp/util/benchmark_config.h"
|
||||
|
||||
extern "C" {
|
||||
#include "src/core/lib/iomgr/pollset_posix.h"
|
||||
}
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
namespace testing {
|
||||
|
||||
static const int WARMUP = 5;
|
||||
static const int BENCHMARK = 5;
|
||||
const char kHealthCheckServiceInterfaceArg[] =
|
||||
"grpc.health_check_service_interface";
|
||||
|
||||
static void RunQPS() {
|
||||
gpr_log(GPR_INFO, "Running QPS test");
|
||||
// The gRPC server uses this interface to expose the health checking service
|
||||
// without depending on protobuf.
|
||||
class HealthCheckServiceInterface {
|
||||
public:
|
||||
virtual ~HealthCheckServiceInterface() {}
|
||||
|
||||
ClientConfig client_config;
|
||||
client_config.set_client_type(ASYNC_CLIENT);
|
||||
client_config.set_outstanding_rpcs_per_channel(1000);
|
||||
client_config.set_client_channels(8);
|
||||
client_config.set_async_client_threads(8);
|
||||
client_config.set_rpc_type(UNARY);
|
||||
client_config.mutable_load_params()->mutable_closed_loop();
|
||||
// Set or change the serving status of the given service_name.
|
||||
virtual void SetServingStatus(const grpc::string& service_name,
|
||||
bool serving) = 0;
|
||||
// Apply to all registered service names.
|
||||
virtual void SetServingStatus(bool serving) = 0;
|
||||
};
|
||||
|
||||
ServerConfig server_config;
|
||||
server_config.set_server_type(ASYNC_SERVER);
|
||||
server_config.set_async_server_threads(4);
|
||||
// Enable/disable the default health checking service. This applies to all C++
|
||||
// servers created afterwards. For each server, user can override the default
|
||||
// with a HealthCheckServiceServerBuilderOption.
|
||||
// NOT thread safe.
|
||||
void EnableDefaultHealthCheckService(bool enable);
|
||||
|
||||
const auto result =
|
||||
RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
|
||||
// NOT thread safe.
|
||||
bool DefaultHealthCheckServiceEnabled();
|
||||
|
||||
GetReporter()->ReportQPSPerCore(*result);
|
||||
GetReporter()->ReportLatency(*result);
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
grpc::testing::InitBenchmark(&argc, &argv, true);
|
||||
|
||||
grpc_platform_become_multipoller = grpc_poll_become_multipoller;
|
||||
|
||||
grpc::testing::RunQPS();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif // GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
|
|
@ -55,12 +55,10 @@ struct grpc_server;
|
|||
|
||||
namespace grpc {
|
||||
|
||||
class GenericServerContext;
|
||||
class AsyncGenericService;
|
||||
class ServerAsyncStreamingInterface;
|
||||
class HealthCheckServiceInterface;
|
||||
class ServerContext;
|
||||
class ServerInitializer;
|
||||
class ThreadPoolInterface;
|
||||
|
||||
/// Models a gRPC server.
|
||||
///
|
||||
|
|
@ -99,6 +97,11 @@ class Server final : public ServerInterface, private GrpcLibraryCodegen {
|
|||
// Returns a \em raw pointer to the underlying grpc_server instance.
|
||||
grpc_server* c_server();
|
||||
|
||||
/// Returns the health check service.
|
||||
HealthCheckServiceInterface* GetHealthCheckService() const {
|
||||
return health_check_service_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class AsyncGenericService;
|
||||
friend class ServerBuilder;
|
||||
|
|
@ -216,6 +219,9 @@ class Server final : public ServerInterface, private GrpcLibraryCodegen {
|
|||
grpc_server* server_;
|
||||
|
||||
std::unique_ptr<ServerInitializer> server_initializer_;
|
||||
|
||||
std::unique_ptr<HealthCheckServiceInterface> health_check_service_;
|
||||
bool health_check_service_disabled_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
|
|
|||
|
|
@ -40,6 +40,20 @@
|
|||
|
||||
typedef intptr_t gpr_atm;
|
||||
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
extern gpr_atm gpr_counter_atm_cas;
|
||||
extern gpr_atm gpr_counter_atm_add;
|
||||
#define GPR_ATM_INC_COUNTER(counter) \
|
||||
__atomic_fetch_add(&counter, 1, __ATOMIC_RELAXED)
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) \
|
||||
(GPR_ATM_INC_COUNTER(gpr_counter_atm_cas), blah)
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) \
|
||||
(GPR_ATM_INC_COUNTER(gpr_counter_atm_add), blah)
|
||||
#else
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) blah
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) blah
|
||||
#endif
|
||||
|
||||
#define gpr_atm_full_barrier() (__atomic_thread_fence(__ATOMIC_SEQ_CST))
|
||||
|
||||
#define gpr_atm_acq_load(p) (__atomic_load_n((p), __ATOMIC_ACQUIRE))
|
||||
|
|
@ -50,25 +64,28 @@ typedef intptr_t gpr_atm;
|
|||
(__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELAXED))
|
||||
|
||||
#define gpr_atm_no_barrier_fetch_add(p, delta) \
|
||||
(__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_RELAXED))
|
||||
GPR_ATM_INC_ADD_THEN( \
|
||||
__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_RELAXED))
|
||||
#define gpr_atm_full_fetch_add(p, delta) \
|
||||
(__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL))
|
||||
GPR_ATM_INC_ADD_THEN( \
|
||||
__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL))
|
||||
|
||||
static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return __atomic_compare_exchange_n(p, &o, n, 0, __ATOMIC_RELAXED,
|
||||
__ATOMIC_RELAXED);
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return __atomic_compare_exchange_n(p, &o, n, 0, __ATOMIC_ACQUIRE,
|
||||
__ATOMIC_RELAXED);
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return __atomic_compare_exchange_n(p, &o, n, 0, __ATOMIC_RELEASE,
|
||||
__ATOMIC_RELAXED);
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
#define gpr_atm_full_xchg(p, n) __atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL)
|
||||
#define gpr_atm_full_xchg(p, n) \
|
||||
GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL))
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ static void server_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static grpc_error *client_init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *d = elem->call_data;
|
||||
GPR_ASSERT(d != NULL);
|
||||
memset(d, 0, sizeof(*d));
|
||||
|
|
@ -146,7 +146,7 @@ static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static grpc_error *server_init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *d = elem->call_data;
|
||||
GPR_ASSERT(d != NULL);
|
||||
memset(d, 0, sizeof(*d));
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ static void on_lb_policy_state_changed_locked(grpc_exec_ctx *exec_ctx,
|
|||
if (w->lb_policy == w->chand->lb_policy) {
|
||||
if (publish_state == GRPC_CHANNEL_SHUTDOWN && w->chand->resolver != NULL) {
|
||||
publish_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
|
||||
grpc_resolver_channel_saw_error(exec_ctx, w->chand->resolver);
|
||||
grpc_resolver_channel_saw_error_locked(exec_ctx, w->chand->resolver);
|
||||
GRPC_LB_POLICY_UNREF(exec_ctx, w->chand->lb_policy, "channel");
|
||||
w->chand->lb_policy = NULL;
|
||||
}
|
||||
|
|
@ -386,11 +386,12 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx,
|
|||
watch_lb_policy(exec_ctx, chand, lb_policy, state);
|
||||
}
|
||||
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
||||
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
grpc_resolver_next_locked(exec_ctx, chand->resolver,
|
||||
&chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
} else {
|
||||
if (chand->resolver != NULL) {
|
||||
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
||||
grpc_resolver_shutdown_locked(exec_ctx, chand->resolver);
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
||||
chand->resolver = NULL;
|
||||
}
|
||||
|
|
@ -451,7 +452,7 @@ static void start_transport_op_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
set_channel_connectivity_state_locked(
|
||||
exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN,
|
||||
GRPC_ERROR_REF(op->disconnect_with_error), "disconnect");
|
||||
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
||||
grpc_resolver_shutdown_locked(exec_ctx, chand->resolver);
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
||||
chand->resolver = NULL;
|
||||
if (!chand->started_resolving) {
|
||||
|
|
@ -550,7 +551,7 @@ static grpc_error *cc_init_channel_elem(grpc_exec_ctx *exec_ctx,
|
|||
chand->resolver = grpc_resolver_create(
|
||||
exec_ctx, proxy_name != NULL ? proxy_name : arg->value.string,
|
||||
new_args != NULL ? new_args : args->channel_args,
|
||||
chand->interested_parties);
|
||||
chand->interested_parties, chand->combiner);
|
||||
if (proxy_name != NULL) gpr_free(proxy_name);
|
||||
if (new_args != NULL) grpc_channel_args_destroy(exec_ctx, new_args);
|
||||
if (chand->resolver == NULL) {
|
||||
|
|
@ -559,13 +560,23 @@ static grpc_error *cc_init_channel_elem(grpc_exec_ctx *exec_ctx,
|
|||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
static void shutdown_resolver_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
grpc_resolver *resolver = arg;
|
||||
grpc_resolver_shutdown_locked(exec_ctx, resolver);
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, resolver, "channel");
|
||||
}
|
||||
|
||||
/* Destructor for channel_data */
|
||||
static void cc_destroy_channel_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_channel_element *elem) {
|
||||
channel_data *chand = elem->channel_data;
|
||||
if (chand->resolver != NULL) {
|
||||
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
||||
grpc_closure_sched(
|
||||
exec_ctx,
|
||||
grpc_closure_create(shutdown_resolver_locked, chand->resolver,
|
||||
grpc_combiner_scheduler(chand->combiner, false)),
|
||||
GRPC_ERROR_NONE);
|
||||
}
|
||||
if (chand->client_channel_factory != NULL) {
|
||||
grpc_client_channel_factory_unref(exec_ctx, chand->client_channel_factory);
|
||||
|
|
@ -846,8 +857,9 @@ static bool pick_subchannel_locked(
|
|||
if (chand->resolver != NULL && !chand->started_resolving) {
|
||||
chand->started_resolving = true;
|
||||
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
||||
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
grpc_resolver_next_locked(exec_ctx, chand->resolver,
|
||||
&chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
}
|
||||
if (chand->resolver != NULL) {
|
||||
cpa = gpr_malloc(sizeof(*cpa));
|
||||
|
|
@ -1123,7 +1135,7 @@ static void initial_read_service_config_locked(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
channel_data *chand = elem->channel_data;
|
||||
call_data *calld = elem->call_data;
|
||||
// Initialize data members.
|
||||
|
|
@ -1210,8 +1222,9 @@ static void try_to_connect_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
if (!chand->started_resolving && chand->resolver != NULL) {
|
||||
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
||||
chand->started_resolving = true;
|
||||
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
grpc_resolver_next_locked(exec_ctx, chand->resolver,
|
||||
&chand->resolver_result,
|
||||
&chand->on_resolver_result_changed);
|
||||
}
|
||||
}
|
||||
GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "try_to_connect");
|
||||
|
|
|
|||
|
|
@ -32,10 +32,13 @@
|
|||
*/
|
||||
|
||||
#include "src/core/ext/client_channel/resolver.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
|
||||
void grpc_resolver_init(grpc_resolver *resolver,
|
||||
const grpc_resolver_vtable *vtable) {
|
||||
const grpc_resolver_vtable *vtable,
|
||||
grpc_combiner *combiner) {
|
||||
resolver->vtable = vtable;
|
||||
resolver->combiner = GRPC_COMBINER_REF(combiner, "resolver");
|
||||
gpr_ref_init(&resolver->refs, 1);
|
||||
}
|
||||
|
||||
|
|
@ -62,20 +65,24 @@ void grpc_resolver_unref(grpc_resolver *resolver,
|
|||
void grpc_resolver_unref(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver) {
|
||||
#endif
|
||||
if (gpr_unref(&resolver->refs)) {
|
||||
grpc_combiner *combiner = resolver->combiner;
|
||||
resolver->vtable->destroy(exec_ctx, resolver);
|
||||
GRPC_COMBINER_UNREF(exec_ctx, combiner, "resolver");
|
||||
}
|
||||
}
|
||||
|
||||
void grpc_resolver_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver) {
|
||||
resolver->vtable->shutdown(exec_ctx, resolver);
|
||||
void grpc_resolver_shutdown_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
resolver->vtable->shutdown_locked(exec_ctx, resolver);
|
||||
}
|
||||
|
||||
void grpc_resolver_channel_saw_error(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
resolver->vtable->channel_saw_error(exec_ctx, resolver);
|
||||
void grpc_resolver_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
resolver->vtable->channel_saw_error_locked(exec_ctx, resolver);
|
||||
}
|
||||
|
||||
void grpc_resolver_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result, grpc_closure *on_complete) {
|
||||
resolver->vtable->next(exec_ctx, resolver, result, on_complete);
|
||||
void grpc_resolver_next_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result,
|
||||
grpc_closure *on_complete) {
|
||||
resolver->vtable->next_locked(exec_ctx, resolver, result, on_complete);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,14 +44,16 @@ typedef struct grpc_resolver_vtable grpc_resolver_vtable;
|
|||
struct grpc_resolver {
|
||||
const grpc_resolver_vtable *vtable;
|
||||
gpr_refcount refs;
|
||||
grpc_combiner *combiner;
|
||||
};
|
||||
|
||||
struct grpc_resolver_vtable {
|
||||
void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver);
|
||||
void (*shutdown)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver);
|
||||
void (*channel_saw_error)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver);
|
||||
void (*next)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result, grpc_closure *on_complete);
|
||||
void (*shutdown_locked)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver);
|
||||
void (*channel_saw_error_locked)(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver);
|
||||
void (*next_locked)(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result, grpc_closure *on_complete);
|
||||
};
|
||||
|
||||
#ifdef GRPC_RESOLVER_REFCOUNT_DEBUG
|
||||
|
|
@ -70,21 +72,30 @@ void grpc_resolver_unref(grpc_exec_ctx *exec_ctx, grpc_resolver *policy);
|
|||
#endif
|
||||
|
||||
void grpc_resolver_init(grpc_resolver *resolver,
|
||||
const grpc_resolver_vtable *vtable);
|
||||
const grpc_resolver_vtable *vtable,
|
||||
grpc_combiner *combiner);
|
||||
|
||||
void grpc_resolver_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver);
|
||||
void grpc_resolver_shutdown_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver);
|
||||
|
||||
/** Notification that the channel has seen an error on some address.
|
||||
Can be used as a hint that re-resolution is desirable soon. */
|
||||
void grpc_resolver_channel_saw_error(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver);
|
||||
Can be used as a hint that re-resolution is desirable soon.
|
||||
|
||||
Must be called from the combiner passed as a resolver_arg at construction
|
||||
time.*/
|
||||
void grpc_resolver_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver);
|
||||
|
||||
/** Get the next result from the resolver. Expected to set \a *result with
|
||||
new channel args and then schedule \a on_complete for execution.
|
||||
|
||||
If resolution is fatally broken, set \a *result to NULL and
|
||||
schedule \a on_complete. */
|
||||
void grpc_resolver_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result, grpc_closure *on_complete);
|
||||
schedule \a on_complete.
|
||||
|
||||
Must be called from the combiner passed as a resolver_arg at construction
|
||||
time.*/
|
||||
void grpc_resolver_next_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **result,
|
||||
grpc_closure *on_complete);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_RESOLVER_H */
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ typedef struct grpc_resolver_args {
|
|||
grpc_uri *uri;
|
||||
const grpc_channel_args *args;
|
||||
grpc_pollset_set *pollset_set;
|
||||
grpc_combiner *combiner;
|
||||
} grpc_resolver_args;
|
||||
|
||||
struct grpc_resolver_factory_vtable {
|
||||
|
|
|
|||
|
|
@ -133,7 +133,8 @@ static grpc_resolver_factory *resolve_factory(const char *target,
|
|||
|
||||
grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
|
||||
const grpc_channel_args *args,
|
||||
grpc_pollset_set *pollset_set) {
|
||||
grpc_pollset_set *pollset_set,
|
||||
grpc_combiner *combiner) {
|
||||
grpc_uri *uri = NULL;
|
||||
char *canonical_target = NULL;
|
||||
grpc_resolver_factory *factory =
|
||||
|
|
@ -144,6 +145,7 @@ grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
|
|||
resolver_args.uri = uri;
|
||||
resolver_args.args = args;
|
||||
resolver_args.pollset_set = pollset_set;
|
||||
resolver_args.combiner = combiner;
|
||||
resolver =
|
||||
grpc_resolver_factory_create_resolver(exec_ctx, factory, &resolver_args);
|
||||
grpc_uri_destroy(uri);
|
||||
|
|
|
|||
|
|
@ -65,7 +65,8 @@ void grpc_register_resolver_type(grpc_resolver_factory *factory);
|
|||
should not be NULL. */
|
||||
grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
|
||||
const grpc_channel_args *args,
|
||||
grpc_pollset_set *pollset_set);
|
||||
grpc_pollset_set *pollset_set,
|
||||
grpc_combiner *combiner);
|
||||
|
||||
/** Find a resolver factory given a name and return an (owned-by-the-caller)
|
||||
* reference to it */
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ static void on_initial_md_ready(grpc_exec_ctx *exec_ctx, void *user_data,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
memset(calld, 0, sizeof(call_data));
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "src/core/ext/client_channel/lb_policy_registry.h"
|
||||
#include "src/core/ext/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
#include "src/core/lib/iomgr/resolve_address.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "src/core/lib/support/backoff.h"
|
||||
|
|
@ -63,8 +64,6 @@ typedef struct {
|
|||
/** pollset_set to drive the name resolution process */
|
||||
grpc_pollset_set *interested_parties;
|
||||
|
||||
/** mutex guarding the rest of the state */
|
||||
gpr_mu mu;
|
||||
/** are we currently resolving? */
|
||||
bool resolving;
|
||||
/** which version of the result have we published? */
|
||||
|
|
@ -95,18 +94,20 @@ static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx,
|
|||
static void dns_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
|
||||
dns_resolver *r);
|
||||
|
||||
static void dns_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
||||
static void dns_channel_saw_error(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
||||
static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *r,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete);
|
||||
static void dns_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
||||
static void dns_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *r);
|
||||
static void dns_next_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *r,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete);
|
||||
|
||||
static const grpc_resolver_vtable dns_resolver_vtable = {
|
||||
dns_destroy, dns_shutdown, dns_channel_saw_error, dns_next};
|
||||
dns_destroy, dns_shutdown_locked, dns_channel_saw_error_locked,
|
||||
dns_next_locked};
|
||||
|
||||
static void dns_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver) {
|
||||
static void dns_shutdown_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
dns_resolver *r = (dns_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
if (r->have_retry_timer) {
|
||||
grpc_timer_cancel(exec_ctx, &r->retry_timer);
|
||||
}
|
||||
|
|
@ -116,25 +117,21 @@ static void dns_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver) {
|
|||
GRPC_ERROR_CREATE("Resolver Shutdown"));
|
||||
r->next_completion = NULL;
|
||||
}
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void dns_channel_saw_error(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
static void dns_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
dns_resolver *r = (dns_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
if (!r->resolving) {
|
||||
gpr_backoff_reset(&r->backoff_state);
|
||||
dns_start_resolving_locked(exec_ctx, r);
|
||||
}
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete) {
|
||||
static void dns_next_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete) {
|
||||
dns_resolver *r = (dns_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
GPR_ASSERT(!r->next_completion);
|
||||
r->next_completion = on_complete;
|
||||
r->target_result = target_result;
|
||||
|
|
@ -144,30 +141,26 @@ static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
|||
} else {
|
||||
dns_maybe_finish_next_locked(exec_ctx, r);
|
||||
}
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void dns_on_retry_timer(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
static void dns_on_retry_timer_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
dns_resolver *r = arg;
|
||||
|
||||
gpr_mu_lock(&r->mu);
|
||||
r->have_retry_timer = false;
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
if (!r->resolving) {
|
||||
dns_start_resolving_locked(exec_ctx, r);
|
||||
}
|
||||
}
|
||||
gpr_mu_unlock(&r->mu);
|
||||
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, &r->base, "retry-timer");
|
||||
}
|
||||
|
||||
static void dns_on_resolved(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
static void dns_on_resolved_locked(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
dns_resolver *r = arg;
|
||||
grpc_channel_args *result = NULL;
|
||||
gpr_mu_lock(&r->mu);
|
||||
GPR_ASSERT(r->resolving);
|
||||
r->resolving = false;
|
||||
if (r->addresses != NULL) {
|
||||
|
|
@ -198,8 +191,8 @@ static void dns_on_resolved(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
} else {
|
||||
gpr_log(GPR_DEBUG, "retrying immediately");
|
||||
}
|
||||
grpc_closure_init(&r->on_retry, dns_on_retry_timer, r,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
grpc_closure_init(&r->on_retry, dns_on_retry_timer_locked, r,
|
||||
grpc_combiner_scheduler(r->base.combiner, false));
|
||||
grpc_timer_init(exec_ctx, &r->retry_timer, next_try, &r->on_retry, now);
|
||||
}
|
||||
if (r->resolved_result != NULL) {
|
||||
|
|
@ -208,7 +201,6 @@ static void dns_on_resolved(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
r->resolved_result = result;
|
||||
r->resolved_version++;
|
||||
dns_maybe_finish_next_locked(exec_ctx, r);
|
||||
gpr_mu_unlock(&r->mu);
|
||||
|
||||
GRPC_RESOLVER_UNREF(exec_ctx, &r->base, "dns-resolving");
|
||||
}
|
||||
|
|
@ -221,7 +213,8 @@ static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx,
|
|||
r->addresses = NULL;
|
||||
grpc_resolve_address(
|
||||
exec_ctx, r->name_to_resolve, r->default_port, r->interested_parties,
|
||||
grpc_closure_create(dns_on_resolved, r, grpc_schedule_on_exec_ctx),
|
||||
grpc_closure_create(dns_on_resolved_locked, r,
|
||||
grpc_combiner_scheduler(r->base.combiner, false)),
|
||||
&r->addresses);
|
||||
}
|
||||
|
||||
|
|
@ -240,7 +233,6 @@ static void dns_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static void dns_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) {
|
||||
dns_resolver *r = (dns_resolver *)gr;
|
||||
gpr_mu_destroy(&r->mu);
|
||||
if (r->resolved_result != NULL) {
|
||||
grpc_channel_args_destroy(exec_ctx, r->resolved_result);
|
||||
}
|
||||
|
|
@ -264,8 +256,7 @@ static grpc_resolver *dns_create(grpc_exec_ctx *exec_ctx,
|
|||
// Create resolver.
|
||||
dns_resolver *r = gpr_malloc(sizeof(dns_resolver));
|
||||
memset(r, 0, sizeof(*r));
|
||||
gpr_mu_init(&r->mu);
|
||||
grpc_resolver_init(&r->base, &dns_resolver_vtable);
|
||||
grpc_resolver_init(&r->base, &dns_resolver_vtable, args->combiner);
|
||||
r->name_to_resolve = gpr_strdup(path);
|
||||
r->default_port = gpr_strdup(default_port);
|
||||
r->channel_args = grpc_channel_args_copy(args->args);
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "src/core/ext/client_channel/parse_address.h"
|
||||
#include "src/core/ext/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
#include "src/core/lib/iomgr/resolve_address.h"
|
||||
#include "src/core/lib/iomgr/unix_sockets_posix.h"
|
||||
#include "src/core/lib/slice/slice_internal.h"
|
||||
|
|
@ -58,8 +59,6 @@ typedef struct {
|
|||
grpc_lb_addresses *addresses;
|
||||
/** channel args */
|
||||
grpc_channel_args *channel_args;
|
||||
/** mutex guarding the rest of the state */
|
||||
gpr_mu mu;
|
||||
/** have we published? */
|
||||
bool published;
|
||||
/** pending next completion, or NULL */
|
||||
|
|
@ -73,48 +72,43 @@ static void sockaddr_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
|||
static void sockaddr_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
|
||||
sockaddr_resolver *r);
|
||||
|
||||
static void sockaddr_shutdown(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
||||
static void sockaddr_channel_saw_error(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *r);
|
||||
static void sockaddr_next(grpc_exec_ctx *exec_ctx, grpc_resolver *r,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete);
|
||||
static void sockaddr_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *r);
|
||||
static void sockaddr_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *r);
|
||||
static void sockaddr_next_locked(grpc_exec_ctx *exec_ctx, grpc_resolver *r,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete);
|
||||
|
||||
static const grpc_resolver_vtable sockaddr_resolver_vtable = {
|
||||
sockaddr_destroy, sockaddr_shutdown, sockaddr_channel_saw_error,
|
||||
sockaddr_next};
|
||||
sockaddr_destroy, sockaddr_shutdown_locked,
|
||||
sockaddr_channel_saw_error_locked, sockaddr_next_locked};
|
||||
|
||||
static void sockaddr_shutdown(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
static void sockaddr_shutdown_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
sockaddr_resolver *r = (sockaddr_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
if (r->next_completion != NULL) {
|
||||
*r->target_result = NULL;
|
||||
grpc_closure_sched(exec_ctx, r->next_completion, GRPC_ERROR_NONE);
|
||||
r->next_completion = NULL;
|
||||
}
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void sockaddr_channel_saw_error(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
static void sockaddr_channel_saw_error_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver) {
|
||||
sockaddr_resolver *r = (sockaddr_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
r->published = false;
|
||||
sockaddr_maybe_finish_next_locked(exec_ctx, r);
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void sockaddr_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete) {
|
||||
static void sockaddr_next_locked(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver,
|
||||
grpc_channel_args **target_result,
|
||||
grpc_closure *on_complete) {
|
||||
sockaddr_resolver *r = (sockaddr_resolver *)resolver;
|
||||
gpr_mu_lock(&r->mu);
|
||||
GPR_ASSERT(!r->next_completion);
|
||||
r->next_completion = on_complete;
|
||||
r->target_result = target_result;
|
||||
sockaddr_maybe_finish_next_locked(exec_ctx, r);
|
||||
gpr_mu_unlock(&r->mu);
|
||||
}
|
||||
|
||||
static void sockaddr_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
|
||||
|
|
@ -131,7 +125,6 @@ static void sockaddr_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static void sockaddr_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) {
|
||||
sockaddr_resolver *r = (sockaddr_resolver *)gr;
|
||||
gpr_mu_destroy(&r->mu);
|
||||
grpc_lb_addresses_destroy(exec_ctx, r->addresses);
|
||||
grpc_channel_args_destroy(exec_ctx, r->channel_args);
|
||||
gpr_free(r);
|
||||
|
|
@ -201,8 +194,7 @@ static grpc_resolver *sockaddr_create(grpc_exec_ctx *exec_ctx,
|
|||
memset(r, 0, sizeof(*r));
|
||||
r->addresses = addresses;
|
||||
r->channel_args = grpc_channel_args_copy(args->args);
|
||||
gpr_mu_init(&r->mu);
|
||||
grpc_resolver_init(&r->base, &sockaddr_resolver_vtable);
|
||||
grpc_resolver_init(&r->base, &sockaddr_resolver_vtable, args->combiner);
|
||||
return &r->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,11 +55,6 @@
|
|||
#include "src/core/lib/surface/api_trace.h"
|
||||
#include "src/core/lib/surface/server.h"
|
||||
|
||||
typedef struct pending_handshake_manager_node {
|
||||
grpc_handshake_manager *handshake_mgr;
|
||||
struct pending_handshake_manager_node *next;
|
||||
} pending_handshake_manager_node;
|
||||
|
||||
typedef struct {
|
||||
grpc_server *server;
|
||||
grpc_tcp_server *tcp_server;
|
||||
|
|
@ -68,7 +63,7 @@ typedef struct {
|
|||
bool shutdown;
|
||||
grpc_closure tcp_server_shutdown_complete;
|
||||
grpc_closure *server_destroy_listener_done;
|
||||
pending_handshake_manager_node *pending_handshake_mgrs;
|
||||
grpc_handshake_manager *pending_handshake_mgrs;
|
||||
} server_state;
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -78,44 +73,6 @@ typedef struct {
|
|||
grpc_handshake_manager *handshake_mgr;
|
||||
} server_connection_state;
|
||||
|
||||
static void pending_handshake_manager_add_locked(
|
||||
server_state *state, grpc_handshake_manager *handshake_mgr) {
|
||||
pending_handshake_manager_node *node = gpr_malloc(sizeof(*node));
|
||||
node->handshake_mgr = handshake_mgr;
|
||||
node->next = state->pending_handshake_mgrs;
|
||||
state->pending_handshake_mgrs = node;
|
||||
}
|
||||
|
||||
static void pending_handshake_manager_remove_locked(
|
||||
server_state *state, grpc_handshake_manager *handshake_mgr) {
|
||||
pending_handshake_manager_node **prev_node = &state->pending_handshake_mgrs;
|
||||
for (pending_handshake_manager_node *node = state->pending_handshake_mgrs;
|
||||
node != NULL; node = node->next) {
|
||||
if (node->handshake_mgr == handshake_mgr) {
|
||||
*prev_node = node->next;
|
||||
gpr_free(node);
|
||||
break;
|
||||
}
|
||||
prev_node = &node->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void pending_handshake_manager_shutdown_locked(grpc_exec_ctx *exec_ctx,
|
||||
server_state *state,
|
||||
grpc_error *why) {
|
||||
pending_handshake_manager_node *prev_node = NULL;
|
||||
for (pending_handshake_manager_node *node = state->pending_handshake_mgrs;
|
||||
node != NULL; node = node->next) {
|
||||
grpc_handshake_manager_shutdown(exec_ctx, node->handshake_mgr,
|
||||
GRPC_ERROR_REF(why));
|
||||
gpr_free(prev_node);
|
||||
prev_node = node;
|
||||
}
|
||||
gpr_free(prev_node);
|
||||
state->pending_handshake_mgrs = NULL;
|
||||
GRPC_ERROR_UNREF(why);
|
||||
}
|
||||
|
||||
static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
grpc_handshaker_args *args = arg;
|
||||
|
|
@ -153,8 +110,9 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
grpc_channel_args_destroy(exec_ctx, args->args);
|
||||
}
|
||||
}
|
||||
pending_handshake_manager_remove_locked(connection_state->server_state,
|
||||
connection_state->handshake_mgr);
|
||||
grpc_handshake_manager_pending_list_remove(
|
||||
&connection_state->server_state->pending_handshake_mgrs,
|
||||
connection_state->handshake_mgr);
|
||||
gpr_mu_unlock(&connection_state->server_state->mu);
|
||||
grpc_handshake_manager_destroy(exec_ctx, connection_state->handshake_mgr);
|
||||
grpc_tcp_server_unref(exec_ctx, connection_state->server_state->tcp_server);
|
||||
|
|
@ -174,7 +132,8 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
|
|||
return;
|
||||
}
|
||||
grpc_handshake_manager *handshake_mgr = grpc_handshake_manager_create();
|
||||
pending_handshake_manager_add_locked(state, handshake_mgr);
|
||||
grpc_handshake_manager_pending_list_add(&state->pending_handshake_mgrs,
|
||||
handshake_mgr);
|
||||
gpr_mu_unlock(&state->mu);
|
||||
grpc_tcp_server_ref(state->tcp_server);
|
||||
server_connection_state *connection_state =
|
||||
|
|
@ -213,8 +172,8 @@ static void tcp_server_shutdown_complete(grpc_exec_ctx *exec_ctx, void *arg,
|
|||
gpr_mu_lock(&state->mu);
|
||||
grpc_closure *destroy_done = state->server_destroy_listener_done;
|
||||
GPR_ASSERT(state->shutdown);
|
||||
pending_handshake_manager_shutdown_locked(exec_ctx, state,
|
||||
GRPC_ERROR_REF(error));
|
||||
grpc_handshake_manager_pending_list_shutdown_all(
|
||||
exec_ctx, state->pending_handshake_mgrs, GRPC_ERROR_REF(error));
|
||||
gpr_mu_unlock(&state->mu);
|
||||
// Flush queued work before destroying handshaker factory, since that
|
||||
// may do a synchronous unref.
|
||||
|
|
|
|||
|
|
@ -1114,8 +1114,11 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
|
|||
grpc_chttp2_list_add_waiting_for_concurrency(t, s);
|
||||
maybe_start_some_streams(exec_ctx, t);
|
||||
} else {
|
||||
grpc_chttp2_cancel_stream(exec_ctx, t, s,
|
||||
GRPC_ERROR_CREATE("Transport closed"));
|
||||
grpc_chttp2_cancel_stream(
|
||||
exec_ctx, t, s,
|
||||
grpc_error_set_int(GRPC_ERROR_CREATE("Transport closed"),
|
||||
GRPC_ERROR_INT_GRPC_STATUS,
|
||||
GRPC_STATUS_UNAVAILABLE));
|
||||
}
|
||||
} else {
|
||||
GPR_ASSERT(s->id != 0);
|
||||
|
|
|
|||
|
|
@ -173,7 +173,6 @@ grpc_error *grpc_call_stack_init(
|
|||
grpc_slice path, gpr_timespec start_time, gpr_timespec deadline,
|
||||
grpc_call_stack *call_stack) {
|
||||
grpc_channel_element *channel_elems = CHANNEL_ELEMS_FROM_STACK(channel_stack);
|
||||
grpc_call_element_args args;
|
||||
size_t count = channel_stack->count;
|
||||
grpc_call_element *call_elems;
|
||||
char *user_data;
|
||||
|
|
@ -188,13 +187,15 @@ grpc_error *grpc_call_stack_init(
|
|||
|
||||
/* init per-filter data */
|
||||
grpc_error *first_error = GRPC_ERROR_NONE;
|
||||
args.start_time = start_time;
|
||||
const grpc_call_element_args args = {
|
||||
.start_time = start_time,
|
||||
.call_stack = call_stack,
|
||||
.server_transport_data = transport_server_data,
|
||||
.context = context,
|
||||
.path = path,
|
||||
.deadline = deadline,
|
||||
};
|
||||
for (i = 0; i < count; i++) {
|
||||
args.call_stack = call_stack;
|
||||
args.server_transport_data = transport_server_data;
|
||||
args.context = context;
|
||||
args.path = path;
|
||||
args.deadline = deadline;
|
||||
call_elems[i].filter = channel_elems[i].filter;
|
||||
call_elems[i].channel_data = channel_elems[i].channel_data;
|
||||
call_elems[i].call_data = user_data;
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ typedef struct {
|
|||
argument. */
|
||||
grpc_error *(*init_call_elem)(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args);
|
||||
const grpc_call_element_args *args);
|
||||
void (*set_pollset_or_pollset_set)(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_polling_entity *pollent);
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ static void compress_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
/* grab pointers to our data from the call element */
|
||||
call_data *calld = elem->call_data;
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ static void con_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
channel_data *chand = elem->channel_data;
|
||||
int r = grpc_transport_init_stream(
|
||||
|
|
|
|||
|
|
@ -52,9 +52,6 @@ static void timer_callback(grpc_exec_ctx* exec_ctx, void* arg,
|
|||
grpc_error* error) {
|
||||
grpc_call_element* elem = arg;
|
||||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
gpr_mu_lock(&deadline_state->timer_mu);
|
||||
deadline_state->timer_pending = false;
|
||||
gpr_mu_unlock(&deadline_state->timer_mu);
|
||||
if (error != GRPC_ERROR_CANCELLED) {
|
||||
grpc_call_element_signal_error(
|
||||
exec_ctx, elem,
|
||||
|
|
@ -66,53 +63,64 @@ static void timer_callback(grpc_exec_ctx* exec_ctx, void* arg,
|
|||
}
|
||||
|
||||
// Starts the deadline timer.
|
||||
static void start_timer_if_needed_locked(grpc_exec_ctx* exec_ctx,
|
||||
grpc_call_element* elem,
|
||||
gpr_timespec deadline) {
|
||||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC);
|
||||
// Note: We do not start the timer if there is already a timer
|
||||
// pending. This should be okay, because this is only called from two
|
||||
// functions exported by this module: grpc_deadline_state_start(), which
|
||||
// starts the initial timer, and grpc_deadline_state_reset(), which
|
||||
// cancels any pre-existing timer before starting a new one. In
|
||||
// particular, we want to ensure that if grpc_deadline_state_start()
|
||||
// winds up trying to start the timer after grpc_deadline_state_reset()
|
||||
// has already done so, we ignore the value from the former.
|
||||
if (!deadline_state->timer_pending &&
|
||||
gpr_time_cmp(deadline, gpr_inf_future(GPR_CLOCK_MONOTONIC)) != 0) {
|
||||
// Take a reference to the call stack, to be owned by the timer.
|
||||
GRPC_CALL_STACK_REF(deadline_state->call_stack, "deadline_timer");
|
||||
deadline_state->timer_pending = true;
|
||||
grpc_closure_init(&deadline_state->timer_callback, timer_callback, elem,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
grpc_timer_init(exec_ctx, &deadline_state->timer, deadline,
|
||||
&deadline_state->timer_callback,
|
||||
gpr_now(GPR_CLOCK_MONOTONIC));
|
||||
}
|
||||
}
|
||||
static void start_timer_if_needed(grpc_exec_ctx* exec_ctx,
|
||||
grpc_call_element* elem,
|
||||
gpr_timespec deadline) {
|
||||
deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC);
|
||||
if (gpr_time_cmp(deadline, gpr_inf_future(GPR_CLOCK_MONOTONIC)) == 0) {
|
||||
return;
|
||||
}
|
||||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
gpr_mu_lock(&deadline_state->timer_mu);
|
||||
start_timer_if_needed_locked(exec_ctx, elem, deadline);
|
||||
gpr_mu_unlock(&deadline_state->timer_mu);
|
||||
grpc_deadline_timer_state cur_state;
|
||||
grpc_closure* closure = NULL;
|
||||
retry:
|
||||
cur_state =
|
||||
(grpc_deadline_timer_state)gpr_atm_acq_load(&deadline_state->timer_state);
|
||||
switch (cur_state) {
|
||||
case GRPC_DEADLINE_STATE_PENDING:
|
||||
// Note: We do not start the timer if there is already a timer
|
||||
return;
|
||||
case GRPC_DEADLINE_STATE_FINISHED:
|
||||
if (gpr_atm_rel_cas(&deadline_state->timer_state,
|
||||
GRPC_DEADLINE_STATE_FINISHED,
|
||||
GRPC_DEADLINE_STATE_PENDING)) {
|
||||
// If we've already created and destroyed a timer, we always create a
|
||||
// new closure: we have no other guarantee that the inlined closure is
|
||||
// not in use (it may hold a pending call to timer_callback)
|
||||
closure = grpc_closure_create(timer_callback, elem,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
} else {
|
||||
goto retry;
|
||||
}
|
||||
break;
|
||||
case GRPC_DEADLINE_STATE_INITIAL:
|
||||
if (gpr_atm_rel_cas(&deadline_state->timer_state,
|
||||
GRPC_DEADLINE_STATE_INITIAL,
|
||||
GRPC_DEADLINE_STATE_PENDING)) {
|
||||
closure =
|
||||
grpc_closure_init(&deadline_state->timer_callback, timer_callback,
|
||||
elem, grpc_schedule_on_exec_ctx);
|
||||
} else {
|
||||
goto retry;
|
||||
}
|
||||
break;
|
||||
}
|
||||
GPR_ASSERT(closure);
|
||||
GRPC_CALL_STACK_REF(deadline_state->call_stack, "deadline_timer");
|
||||
grpc_timer_init(exec_ctx, &deadline_state->timer, deadline, closure,
|
||||
gpr_now(GPR_CLOCK_MONOTONIC));
|
||||
}
|
||||
|
||||
// Cancels the deadline timer.
|
||||
static void cancel_timer_if_needed_locked(grpc_exec_ctx* exec_ctx,
|
||||
grpc_deadline_state* deadline_state) {
|
||||
if (deadline_state->timer_pending) {
|
||||
grpc_timer_cancel(exec_ctx, &deadline_state->timer);
|
||||
deadline_state->timer_pending = false;
|
||||
}
|
||||
}
|
||||
static void cancel_timer_if_needed(grpc_exec_ctx* exec_ctx,
|
||||
grpc_deadline_state* deadline_state) {
|
||||
gpr_mu_lock(&deadline_state->timer_mu);
|
||||
cancel_timer_if_needed_locked(exec_ctx, deadline_state);
|
||||
gpr_mu_unlock(&deadline_state->timer_mu);
|
||||
if (gpr_atm_rel_cas(&deadline_state->timer_state, GRPC_DEADLINE_STATE_PENDING,
|
||||
GRPC_DEADLINE_STATE_FINISHED)) {
|
||||
grpc_timer_cancel(exec_ctx, &deadline_state->timer);
|
||||
} else {
|
||||
// timer was either in STATE_INITAL (nothing to cancel)
|
||||
// OR in STATE_FINISHED (again nothing to cancel)
|
||||
}
|
||||
}
|
||||
|
||||
// Callback run when the call is complete.
|
||||
|
|
@ -120,8 +128,8 @@ static void on_complete(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
|
|||
grpc_deadline_state* deadline_state = arg;
|
||||
cancel_timer_if_needed(exec_ctx, deadline_state);
|
||||
// Invoke the next callback.
|
||||
deadline_state->next_on_complete->cb(
|
||||
exec_ctx, deadline_state->next_on_complete->cb_arg, error);
|
||||
grpc_closure_run(exec_ctx, deadline_state->next_on_complete,
|
||||
GRPC_ERROR_REF(error));
|
||||
}
|
||||
|
||||
// Inject our own on_complete callback into op.
|
||||
|
|
@ -138,14 +146,12 @@ void grpc_deadline_state_init(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
|
|||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
memset(deadline_state, 0, sizeof(*deadline_state));
|
||||
deadline_state->call_stack = call_stack;
|
||||
gpr_mu_init(&deadline_state->timer_mu);
|
||||
}
|
||||
|
||||
void grpc_deadline_state_destroy(grpc_exec_ctx* exec_ctx,
|
||||
grpc_call_element* elem) {
|
||||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
cancel_timer_if_needed(exec_ctx, deadline_state);
|
||||
gpr_mu_destroy(&deadline_state->timer_mu);
|
||||
}
|
||||
|
||||
// Callback and associated state for starting the timer after call stack
|
||||
|
|
@ -187,10 +193,8 @@ void grpc_deadline_state_start(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
|
|||
void grpc_deadline_state_reset(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
|
||||
gpr_timespec new_deadline) {
|
||||
grpc_deadline_state* deadline_state = elem->call_data;
|
||||
gpr_mu_lock(&deadline_state->timer_mu);
|
||||
cancel_timer_if_needed_locked(exec_ctx, deadline_state);
|
||||
start_timer_if_needed_locked(exec_ctx, elem, new_deadline);
|
||||
gpr_mu_unlock(&deadline_state->timer_mu);
|
||||
cancel_timer_if_needed(exec_ctx, deadline_state);
|
||||
start_timer_if_needed(exec_ctx, elem, new_deadline);
|
||||
}
|
||||
|
||||
void grpc_deadline_state_client_start_transport_stream_op(
|
||||
|
|
@ -244,7 +248,7 @@ typedef struct server_call_data {
|
|||
// Constructor for call_data. Used for both client and server filters.
|
||||
static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
|
||||
grpc_call_element* elem,
|
||||
grpc_call_element_args* args) {
|
||||
const grpc_call_element_args* args) {
|
||||
// Note: size of call data is different between client and server.
|
||||
memset(elem->call_data, 0, elem->filter->sizeof_call_data);
|
||||
grpc_deadline_state_init(exec_ctx, elem, args->call_stack);
|
||||
|
|
|
|||
|
|
@ -35,16 +35,18 @@
|
|||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
|
||||
typedef enum grpc_deadline_timer_state {
|
||||
GRPC_DEADLINE_STATE_INITIAL,
|
||||
GRPC_DEADLINE_STATE_PENDING,
|
||||
GRPC_DEADLINE_STATE_FINISHED
|
||||
} grpc_deadline_timer_state;
|
||||
|
||||
// State used for filters that enforce call deadlines.
|
||||
// Must be the first field in the filter's call_data.
|
||||
typedef struct grpc_deadline_state {
|
||||
// We take a reference to the call stack for the timer callback.
|
||||
grpc_call_stack* call_stack;
|
||||
// Guards access to timer_pending and timer.
|
||||
gpr_mu timer_mu;
|
||||
// True if the timer callback is currently pending.
|
||||
bool timer_pending;
|
||||
// The deadline timer.
|
||||
gpr_atm timer_state;
|
||||
grpc_timer timer;
|
||||
grpc_closure timer_callback;
|
||||
// Closure to invoke when the call is complete.
|
||||
|
|
|
|||
|
|
@ -92,6 +92,10 @@ struct grpc_handshake_manager {
|
|||
void* user_data;
|
||||
// Handshaker args.
|
||||
grpc_handshaker_args args;
|
||||
// Links to the previous and next managers in a list of all pending handshakes
|
||||
// Used at server side only.
|
||||
grpc_handshake_manager* prev;
|
||||
grpc_handshake_manager* next;
|
||||
};
|
||||
|
||||
grpc_handshake_manager* grpc_handshake_manager_create() {
|
||||
|
|
@ -102,6 +106,39 @@ grpc_handshake_manager* grpc_handshake_manager_create() {
|
|||
return mgr;
|
||||
}
|
||||
|
||||
void grpc_handshake_manager_pending_list_add(grpc_handshake_manager** head,
|
||||
grpc_handshake_manager* mgr) {
|
||||
GPR_ASSERT(mgr->prev == NULL);
|
||||
GPR_ASSERT(mgr->next == NULL);
|
||||
mgr->next = *head;
|
||||
if (*head) {
|
||||
(*head)->prev = mgr;
|
||||
}
|
||||
*head = mgr;
|
||||
}
|
||||
|
||||
void grpc_handshake_manager_pending_list_remove(grpc_handshake_manager** head,
|
||||
grpc_handshake_manager* mgr) {
|
||||
if (mgr->next != NULL) {
|
||||
mgr->next->prev = mgr->prev;
|
||||
}
|
||||
if (mgr->prev != NULL) {
|
||||
mgr->prev->next = mgr->next;
|
||||
} else {
|
||||
GPR_ASSERT(*head == mgr);
|
||||
*head = mgr->next;
|
||||
}
|
||||
}
|
||||
|
||||
void grpc_handshake_manager_pending_list_shutdown_all(
|
||||
grpc_exec_ctx* exec_ctx, grpc_handshake_manager* head, grpc_error* why) {
|
||||
while (head != NULL) {
|
||||
grpc_handshake_manager_shutdown(exec_ctx, head, GRPC_ERROR_REF(why));
|
||||
head = head->next;
|
||||
}
|
||||
GRPC_ERROR_UNREF(why);
|
||||
}
|
||||
|
||||
static bool is_power_of_2(size_t n) { return (n & (n - 1)) == 0; }
|
||||
|
||||
void grpc_handshake_manager_add(grpc_handshake_manager* mgr,
|
||||
|
|
|
|||
|
|
@ -163,4 +163,20 @@ void grpc_handshake_manager_do_handshake(
|
|||
gpr_timespec deadline, grpc_tcp_server_acceptor* acceptor,
|
||||
grpc_iomgr_cb_func on_handshake_done, void* user_data);
|
||||
|
||||
/// Add \a mgr to the server side list of all pending handshake managers, the
|
||||
/// list starts with \a *head.
|
||||
// Not thread-safe. Caller needs to synchronize.
|
||||
void grpc_handshake_manager_pending_list_add(grpc_handshake_manager** head,
|
||||
grpc_handshake_manager* mgr);
|
||||
|
||||
/// Remove \a mgr from the server side list of all pending handshake managers.
|
||||
// Not thread-safe. Caller needs to synchronize.
|
||||
void grpc_handshake_manager_pending_list_remove(grpc_handshake_manager** head,
|
||||
grpc_handshake_manager* mgr);
|
||||
|
||||
/// Shutdown all pending handshake managers on the server side.
|
||||
// Not thread-safe. Caller needs to synchronize.
|
||||
void grpc_handshake_manager_pending_list_shutdown_all(
|
||||
grpc_exec_ctx* exec_ctx, grpc_handshake_manager* head, grpc_error* why);
|
||||
|
||||
#endif /* GRPC_CORE_LIB_CHANNEL_HANDSHAKER_H */
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ static void hc_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
calld->on_done_recv_initial_metadata = NULL;
|
||||
calld->on_done_recv_trailing_metadata = NULL;
|
||||
|
|
|
|||
|
|
@ -343,7 +343,7 @@ static void hs_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
/* grab pointers to our data from the call element */
|
||||
call_data *calld = elem->call_data;
|
||||
/* initialize members */
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ static void start_transport_stream_op(grpc_exec_ctx* exec_ctx,
|
|||
// Constructor for call_data.
|
||||
static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
|
||||
grpc_call_element* elem,
|
||||
grpc_call_element_args* args) {
|
||||
const grpc_call_element_args* args) {
|
||||
channel_data* chand = elem->channel_data;
|
||||
call_data* calld = elem->call_data;
|
||||
calld->next_recv_message_ready = NULL;
|
||||
|
|
|
|||
|
|
@ -180,25 +180,25 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer,
|
|||
GPR_ASSERT(now.clock_type == g_clock_type);
|
||||
timer->closure = closure;
|
||||
timer->deadline = deadline;
|
||||
timer->triggered = 0;
|
||||
|
||||
if (!g_initialized) {
|
||||
timer->triggered = 1;
|
||||
timer->pending = false;
|
||||
grpc_closure_sched(
|
||||
exec_ctx, timer->closure,
|
||||
GRPC_ERROR_CREATE("Attempt to create timer before initialization"));
|
||||
return;
|
||||
}
|
||||
|
||||
gpr_mu_lock(&shard->mu);
|
||||
timer->pending = true;
|
||||
if (gpr_time_cmp(deadline, now) <= 0) {
|
||||
timer->triggered = 1;
|
||||
timer->pending = false;
|
||||
grpc_closure_sched(exec_ctx, timer->closure, GRPC_ERROR_NONE);
|
||||
gpr_mu_unlock(&shard->mu);
|
||||
/* early out */
|
||||
return;
|
||||
}
|
||||
|
||||
/* TODO(ctiller): check deadline expired */
|
||||
|
||||
gpr_mu_lock(&shard->mu);
|
||||
grpc_time_averaged_stats_add_sample(&shard->stats,
|
||||
ts_to_dbl(gpr_time_sub(deadline, now)));
|
||||
if (gpr_time_cmp(deadline, shard->queue_deadline_cap) < 0) {
|
||||
|
|
@ -243,9 +243,9 @@ void grpc_timer_cancel(grpc_exec_ctx *exec_ctx, grpc_timer *timer) {
|
|||
|
||||
shard_type *shard = &g_shards[GPR_HASH_POINTER(timer, NUM_SHARDS)];
|
||||
gpr_mu_lock(&shard->mu);
|
||||
if (!timer->triggered) {
|
||||
if (timer->pending) {
|
||||
grpc_closure_sched(exec_ctx, timer->closure, GRPC_ERROR_CANCELLED);
|
||||
timer->triggered = 1;
|
||||
timer->pending = false;
|
||||
if (timer->heap_index == INVALID_HEAP_INDEX) {
|
||||
list_remove(timer);
|
||||
} else {
|
||||
|
|
@ -296,7 +296,7 @@ static grpc_timer *pop_one(shard_type *shard, gpr_timespec now) {
|
|||
}
|
||||
timer = grpc_timer_heap_top(&shard->heap);
|
||||
if (gpr_time_cmp(timer->deadline, now) > 0) return NULL;
|
||||
timer->triggered = 1;
|
||||
timer->pending = false;
|
||||
grpc_timer_heap_pop(&shard->heap);
|
||||
return timer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
struct grpc_timer {
|
||||
gpr_timespec deadline;
|
||||
uint32_t heap_index; /* INVALID_HEAP_INDEX if not in heap */
|
||||
int triggered;
|
||||
bool pending;
|
||||
struct grpc_timer *next;
|
||||
struct grpc_timer *prev;
|
||||
grpc_closure *closure;
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ static void stop_uv_timer(uv_timer_t *handle) {
|
|||
void run_expired_timer(uv_timer_t *handle) {
|
||||
grpc_timer *timer = (grpc_timer *)handle->data;
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
GPR_ASSERT(!timer->triggered);
|
||||
timer->triggered = 1;
|
||||
GPR_ASSERT(timer->pending);
|
||||
timer->pending = 0;
|
||||
grpc_closure_sched(&exec_ctx, timer->closure, GRPC_ERROR_NONE);
|
||||
stop_uv_timer(handle);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
|
|
@ -67,11 +67,11 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer,
|
|||
uv_timer_t *uv_timer;
|
||||
timer->closure = closure;
|
||||
if (gpr_time_cmp(deadline, now) <= 0) {
|
||||
timer->triggered = 1;
|
||||
timer->pending = 0;
|
||||
grpc_closure_sched(exec_ctx, timer->closure, GRPC_ERROR_NONE);
|
||||
return;
|
||||
}
|
||||
timer->triggered = 0;
|
||||
timer->pending = 1;
|
||||
timeout = (uint64_t)gpr_time_to_millis(gpr_time_sub(deadline, now));
|
||||
uv_timer = gpr_malloc(sizeof(uv_timer_t));
|
||||
uv_timer_init(uv_default_loop(), uv_timer);
|
||||
|
|
@ -81,8 +81,8 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer,
|
|||
}
|
||||
|
||||
void grpc_timer_cancel(grpc_exec_ctx *exec_ctx, grpc_timer *timer) {
|
||||
if (!timer->triggered) {
|
||||
timer->triggered = 1;
|
||||
if (timer->pending) {
|
||||
timer->pending = 0;
|
||||
grpc_closure_sched(exec_ctx, timer->closure, GRPC_ERROR_CANCELLED);
|
||||
stop_uv_timer((uv_timer_t *)timer->uv_timer);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ struct grpc_timer {
|
|||
/* This is actually a uv_timer_t*, but we want to keep platform-specific
|
||||
types out of headers */
|
||||
void *uv_timer;
|
||||
int triggered;
|
||||
int pending;
|
||||
};
|
||||
|
||||
#endif /* GRPC_CORE_LIB_IOMGR_TIMER_UV_H */
|
||||
|
|
|
|||
|
|
@ -302,7 +302,7 @@ static void auth_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
memset(calld, 0, sizeof(*calld));
|
||||
return GRPC_ERROR_NONE;
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ static void auth_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
/* Constructor for call_data */
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
/* grab pointers to our data from the call element */
|
||||
call_data *calld = elem->call_data;
|
||||
channel_data *chand = elem->channel_data;
|
||||
|
|
|
|||
|
|
@ -42,8 +42,10 @@
|
|||
#include <time.h>
|
||||
#include "src/core/lib/profiling/timers.h"
|
||||
|
||||
#ifdef GPR_MU_COUNTERS
|
||||
gpr_atm grpc_mu_locks = 0;
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
gpr_atm gpr_mu_locks = 0;
|
||||
gpr_atm gpr_counter_atm_cas = 0;
|
||||
gpr_atm gpr_counter_atm_add = 0;
|
||||
#endif
|
||||
|
||||
void gpr_mu_init(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_init(mu, NULL) == 0); }
|
||||
|
|
@ -51,8 +53,8 @@ void gpr_mu_init(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_init(mu, NULL) == 0); }
|
|||
void gpr_mu_destroy(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_destroy(mu) == 0); }
|
||||
|
||||
void gpr_mu_lock(gpr_mu* mu) {
|
||||
#ifdef GPR_MU_COUNTERS
|
||||
gpr_atm_no_barrier_fetch_add(&grpc_mu_locks, 1);
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
GPR_ATM_INC_COUNTER(gpr_mu_locks);
|
||||
#endif
|
||||
GPR_TIMER_BEGIN("gpr_mu_lock", 0);
|
||||
GPR_ASSERT(pthread_mutex_lock(mu) == 0);
|
||||
|
|
|
|||
|
|
@ -101,6 +101,17 @@ typedef struct {
|
|||
grpc_error *error;
|
||||
} received_status;
|
||||
|
||||
static gpr_atm pack_received_status(received_status r) {
|
||||
return r.is_set ? (1 | (gpr_atm)r.error) : 0;
|
||||
}
|
||||
|
||||
static received_status unpack_received_status(gpr_atm atm) {
|
||||
return (atm & 1) == 0
|
||||
? (received_status){.is_set = false, .error = GRPC_ERROR_NONE}
|
||||
: (received_status){.is_set = true,
|
||||
.error = (grpc_error *)(atm & ~(gpr_atm)1)};
|
||||
}
|
||||
|
||||
#define MAX_ERRORS_PER_BATCH 3
|
||||
|
||||
typedef struct batch_control {
|
||||
|
|
@ -165,8 +176,8 @@ struct grpc_call {
|
|||
Element 0 is initial metadata, element 1 is trailing metadata. */
|
||||
grpc_metadata_array *buffered_metadata[2];
|
||||
|
||||
/* Received call statuses from various sources */
|
||||
received_status status[STATUS_SOURCE_COUNT];
|
||||
/* Packed received call statuses from various sources */
|
||||
gpr_atm status[STATUS_SOURCE_COUNT];
|
||||
|
||||
/* Call data useful used for reporting. Only valid after the call has
|
||||
* completed */
|
||||
|
|
@ -446,7 +457,8 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call,
|
|||
gpr_time_sub(gpr_now(GPR_CLOCK_MONOTONIC), c->start_time);
|
||||
|
||||
for (i = 0; i < STATUS_SOURCE_COUNT; i++) {
|
||||
GRPC_ERROR_UNREF(c->status[i].error);
|
||||
GRPC_ERROR_UNREF(
|
||||
unpack_received_status(gpr_atm_no_barrier_load(&c->status[i])).error);
|
||||
}
|
||||
|
||||
grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c), &c->final_info, c);
|
||||
|
|
@ -614,13 +626,12 @@ static void cancel_with_status(grpc_exec_ctx *exec_ctx, grpc_call *c,
|
|||
*/
|
||||
|
||||
static bool get_final_status_from(
|
||||
grpc_call *call, status_source from_source, bool allow_ok_status,
|
||||
grpc_call *call, grpc_error *error, bool allow_ok_status,
|
||||
void (*set_value)(grpc_status_code code, void *user_data),
|
||||
void *set_value_user_data, grpc_slice *details) {
|
||||
grpc_status_code code;
|
||||
const char *msg = NULL;
|
||||
grpc_error_get_status(call->status[from_source].error, call->send_deadline,
|
||||
&code, &msg, NULL);
|
||||
grpc_error_get_status(error, call->send_deadline, &code, &msg, NULL);
|
||||
if (code == GRPC_STATUS_OK && !allow_ok_status) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -638,12 +649,15 @@ static void get_final_status(grpc_call *call,
|
|||
void *user_data),
|
||||
void *set_value_user_data, grpc_slice *details) {
|
||||
int i;
|
||||
received_status status[STATUS_SOURCE_COUNT];
|
||||
for (i = 0; i < STATUS_SOURCE_COUNT; i++) {
|
||||
status[i] = unpack_received_status(gpr_atm_acq_load(&call->status[i]));
|
||||
}
|
||||
if (grpc_call_error_trace) {
|
||||
gpr_log(GPR_DEBUG, "get_final_status %s", call->is_client ? "CLI" : "SVR");
|
||||
for (i = 0; i < STATUS_SOURCE_COUNT; i++) {
|
||||
if (call->status[i].is_set) {
|
||||
gpr_log(GPR_DEBUG, " %d: %s", i,
|
||||
grpc_error_string(call->status[i].error));
|
||||
if (status[i].is_set) {
|
||||
gpr_log(GPR_DEBUG, " %d: %s", i, grpc_error_string(status[i].error));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -653,9 +667,9 @@ static void get_final_status(grpc_call *call,
|
|||
/* search for the best status we can present: ideally the error we use has a
|
||||
clearly defined grpc-status, and we'll prefer that. */
|
||||
for (i = 0; i < STATUS_SOURCE_COUNT; i++) {
|
||||
if (call->status[i].is_set &&
|
||||
grpc_error_has_clear_grpc_status(call->status[i].error)) {
|
||||
if (get_final_status_from(call, (status_source)i, allow_ok_status != 0,
|
||||
if (status[i].is_set &&
|
||||
grpc_error_has_clear_grpc_status(status[i].error)) {
|
||||
if (get_final_status_from(call, status[i].error, allow_ok_status != 0,
|
||||
set_value, set_value_user_data, details)) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -663,8 +677,8 @@ static void get_final_status(grpc_call *call,
|
|||
}
|
||||
/* If no clearly defined status exists, search for 'anything' */
|
||||
for (i = 0; i < STATUS_SOURCE_COUNT; i++) {
|
||||
if (call->status[i].is_set) {
|
||||
if (get_final_status_from(call, (status_source)i, allow_ok_status != 0,
|
||||
if (status[i].is_set) {
|
||||
if (get_final_status_from(call, status[i].error, allow_ok_status != 0,
|
||||
set_value, set_value_user_data, details)) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -681,12 +695,13 @@ static void get_final_status(grpc_call *call,
|
|||
|
||||
static void set_status_from_error(grpc_exec_ctx *exec_ctx, grpc_call *call,
|
||||
status_source source, grpc_error *error) {
|
||||
if (call->status[source].is_set) {
|
||||
if (!gpr_atm_rel_cas(&call->status[source],
|
||||
pack_received_status((received_status){
|
||||
.is_set = false, .error = GRPC_ERROR_NONE}),
|
||||
pack_received_status((received_status){
|
||||
.is_set = true, .error = error}))) {
|
||||
GRPC_ERROR_UNREF(error);
|
||||
return;
|
||||
}
|
||||
call->status[source].is_set = true;
|
||||
call->status[source].error = error;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ static void lame_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
gpr_atm_no_barrier_store(&calld->filled_metadata, 0);
|
||||
return GRPC_ERROR_NONE;
|
||||
|
|
|
|||
|
|
@ -879,7 +879,7 @@ static void channel_connectivity_changed(grpc_exec_ctx *exec_ctx, void *cd,
|
|||
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
call_data *calld = elem->call_data;
|
||||
channel_data *chand = elem->channel_data;
|
||||
memset(calld, 0, sizeof(call_data));
|
||||
|
|
@ -1198,7 +1198,9 @@ void grpc_server_setup_transport(grpc_exec_ctx *exec_ctx, grpc_server *s,
|
|||
crm->server_registered_method = rm;
|
||||
crm->flags = rm->flags;
|
||||
crm->has_host = has_host;
|
||||
crm->host = host;
|
||||
if (has_host) {
|
||||
crm->host = host;
|
||||
}
|
||||
crm->method = method;
|
||||
}
|
||||
GPR_ASSERT(slots <= UINT32_MAX);
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ class CallData {
|
|||
|
||||
/// Initializes the call data.
|
||||
virtual grpc_error *Init(grpc_exec_ctx *exec_ctx, ChannelData *channel_data,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
|
|
@ -308,7 +308,7 @@ class ChannelFilter final {
|
|||
|
||||
static grpc_error *InitCallElement(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
ChannelDataType *channel_data = (ChannelDataType *)elem->channel_data;
|
||||
// Construct the object in the already-allocated memory.
|
||||
CallDataType *call_data = new (elem->call_data) CallDataType();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include <grpc++/impl/codegen/method_handler_impl.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/cpp/server/health/default_health_check_service.h"
|
||||
#include "src/cpp/server/health/health.pb.h"
|
||||
#include "third_party/nanopb/pb_decode.h"
|
||||
#include "third_party/nanopb/pb_encode.h"
|
||||
|
||||
namespace grpc {
|
||||
namespace {
|
||||
const char kHealthCheckMethodName[] = "/grpc.health.v1.Health/Check";
|
||||
} // namespace
|
||||
|
||||
DefaultHealthCheckService::HealthCheckServiceImpl::HealthCheckServiceImpl(
|
||||
DefaultHealthCheckService* service)
|
||||
: service_(service), method_(nullptr) {
|
||||
MethodHandler* handler =
|
||||
new RpcMethodHandler<HealthCheckServiceImpl, ByteBuffer, ByteBuffer>(
|
||||
std::mem_fn(&HealthCheckServiceImpl::Check), this);
|
||||
method_ = new RpcServiceMethod(kHealthCheckMethodName, RpcMethod::NORMAL_RPC,
|
||||
handler);
|
||||
AddMethod(method_);
|
||||
}
|
||||
|
||||
Status DefaultHealthCheckService::HealthCheckServiceImpl::Check(
|
||||
ServerContext* context, const ByteBuffer* request, ByteBuffer* response) {
|
||||
// Decode request.
|
||||
std::vector<Slice> slices;
|
||||
request->Dump(&slices);
|
||||
uint8_t* request_bytes = nullptr;
|
||||
bool request_bytes_owned = false;
|
||||
size_t request_size = 0;
|
||||
grpc_health_v1_HealthCheckRequest request_struct;
|
||||
if (slices.empty()) {
|
||||
request_struct.has_service = false;
|
||||
} else if (slices.size() == 1) {
|
||||
request_bytes = const_cast<uint8_t*>(slices[0].begin());
|
||||
request_size = slices[0].size();
|
||||
} else {
|
||||
request_bytes_owned = true;
|
||||
request_bytes = static_cast<uint8_t*>(gpr_malloc(request->Length()));
|
||||
uint8_t* copy_to = request_bytes;
|
||||
for (size_t i = 0; i < slices.size(); i++) {
|
||||
memcpy(copy_to, slices[i].begin(), slices[i].size());
|
||||
copy_to += slices[i].size();
|
||||
}
|
||||
}
|
||||
|
||||
if (request_bytes != nullptr) {
|
||||
pb_istream_t istream = pb_istream_from_buffer(request_bytes, request_size);
|
||||
bool decode_status = pb_decode(
|
||||
&istream, grpc_health_v1_HealthCheckRequest_fields, &request_struct);
|
||||
if (request_bytes_owned) {
|
||||
gpr_free(request_bytes);
|
||||
}
|
||||
if (!decode_status) {
|
||||
return Status(StatusCode::INVALID_ARGUMENT, "");
|
||||
}
|
||||
}
|
||||
|
||||
// Check status from the associated default health checking service.
|
||||
DefaultHealthCheckService::ServingStatus serving_status =
|
||||
service_->GetServingStatus(
|
||||
request_struct.has_service ? request_struct.service : "");
|
||||
if (serving_status == DefaultHealthCheckService::NOT_FOUND) {
|
||||
return Status(StatusCode::NOT_FOUND, "");
|
||||
}
|
||||
|
||||
// Encode response
|
||||
grpc_health_v1_HealthCheckResponse response_struct;
|
||||
response_struct.has_status = true;
|
||||
response_struct.status =
|
||||
serving_status == DefaultHealthCheckService::SERVING
|
||||
? grpc_health_v1_HealthCheckResponse_ServingStatus_SERVING
|
||||
: grpc_health_v1_HealthCheckResponse_ServingStatus_NOT_SERVING;
|
||||
pb_ostream_t ostream;
|
||||
memset(&ostream, 0, sizeof(ostream));
|
||||
pb_encode(&ostream, grpc_health_v1_HealthCheckResponse_fields,
|
||||
&response_struct);
|
||||
grpc_slice response_slice = grpc_slice_malloc(ostream.bytes_written);
|
||||
ostream = pb_ostream_from_buffer(GRPC_SLICE_START_PTR(response_slice),
|
||||
GRPC_SLICE_LENGTH(response_slice));
|
||||
bool encode_status = pb_encode(
|
||||
&ostream, grpc_health_v1_HealthCheckResponse_fields, &response_struct);
|
||||
if (!encode_status) {
|
||||
return Status(StatusCode::INTERNAL, "Failed to encode response.");
|
||||
}
|
||||
Slice encoded_response(response_slice, Slice::STEAL_REF);
|
||||
ByteBuffer response_buffer(&encoded_response, 1);
|
||||
response->Swap(&response_buffer);
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
DefaultHealthCheckService::DefaultHealthCheckService() {
|
||||
services_map_.emplace("", true);
|
||||
}
|
||||
|
||||
void DefaultHealthCheckService::SetServingStatus(
|
||||
const grpc::string& service_name, bool serving) {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
services_map_[service_name] = serving;
|
||||
}
|
||||
|
||||
void DefaultHealthCheckService::SetServingStatus(bool serving) {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
for (auto iter = services_map_.begin(); iter != services_map_.end(); ++iter) {
|
||||
iter->second = serving;
|
||||
}
|
||||
}
|
||||
|
||||
DefaultHealthCheckService::ServingStatus
|
||||
DefaultHealthCheckService::GetServingStatus(
|
||||
const grpc::string& service_name) const {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
const auto& iter = services_map_.find(service_name);
|
||||
if (iter == services_map_.end()) {
|
||||
return NOT_FOUND;
|
||||
}
|
||||
return iter->second ? SERVING : NOT_SERVING;
|
||||
}
|
||||
|
||||
DefaultHealthCheckService::HealthCheckServiceImpl*
|
||||
DefaultHealthCheckService::GetHealthCheckService() {
|
||||
GPR_ASSERT(impl_ == nullptr);
|
||||
impl_.reset(new HealthCheckServiceImpl(this));
|
||||
return impl_.get();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_INTERNAL_CPP_SERVER_DEFAULT_HEALTH_CHECK_SERVICE_H
|
||||
#define GRPC_INTERNAL_CPP_SERVER_DEFAULT_HEALTH_CHECK_SERVICE_H
|
||||
|
||||
#include <mutex>
|
||||
|
||||
#include <grpc++/health_check_service_interface.h>
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
#include <grpc++/support/byte_buffer.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
// Default implementation of HealthCheckServiceInterface. Server will create and
|
||||
// own it.
|
||||
class DefaultHealthCheckService final : public HealthCheckServiceInterface {
|
||||
public:
|
||||
// The service impl to register with the server.
|
||||
class HealthCheckServiceImpl : public Service {
|
||||
public:
|
||||
explicit HealthCheckServiceImpl(DefaultHealthCheckService* service);
|
||||
|
||||
Status Check(ServerContext* context, const ByteBuffer* request,
|
||||
ByteBuffer* response);
|
||||
|
||||
private:
|
||||
const DefaultHealthCheckService* const service_;
|
||||
RpcServiceMethod* method_;
|
||||
};
|
||||
|
||||
DefaultHealthCheckService();
|
||||
void SetServingStatus(const grpc::string& service_name,
|
||||
bool serving) override;
|
||||
void SetServingStatus(bool serving) override;
|
||||
enum ServingStatus { NOT_FOUND, SERVING, NOT_SERVING };
|
||||
ServingStatus GetServingStatus(const grpc::string& service_name) const;
|
||||
HealthCheckServiceImpl* GetHealthCheckService();
|
||||
|
||||
private:
|
||||
mutable std::mutex mu_;
|
||||
std::map<grpc::string, bool> services_map_;
|
||||
std::unique_ptr<HealthCheckServiceImpl> impl_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPC_INTERNAL_CPP_SERVER_DEFAULT_HEALTH_CHECK_SERVICE_H
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/* Automatically generated nanopb constant definitions */
|
||||
/* Generated by nanopb-0.3.7-dev */
|
||||
|
||||
#include "src/cpp/server/health/health.pb.h"
|
||||
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
const pb_field_t grpc_health_v1_HealthCheckRequest_fields[2] = {
|
||||
PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, grpc_health_v1_HealthCheckRequest, service, service, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t grpc_health_v1_HealthCheckResponse_fields[2] = {
|
||||
PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, grpc_health_v1_HealthCheckResponse, status, status, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
|
||||
/* @@protoc_insertion_point(eof) */
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/* Automatically generated nanopb header */
|
||||
/* Generated by nanopb-0.3.7-dev */
|
||||
|
||||
#ifndef PB_GRPC_HEALTH_V1_HEALTH_PB_H_INCLUDED
|
||||
#define PB_GRPC_HEALTH_V1_HEALTH_PB_H_INCLUDED
|
||||
#include "third_party/nanopb/pb.h"
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Enum definitions */
|
||||
typedef enum _grpc_health_v1_HealthCheckResponse_ServingStatus {
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_UNKNOWN = 0,
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_SERVING = 1,
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_NOT_SERVING = 2
|
||||
} grpc_health_v1_HealthCheckResponse_ServingStatus;
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_MIN grpc_health_v1_HealthCheckResponse_ServingStatus_UNKNOWN
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_MAX grpc_health_v1_HealthCheckResponse_ServingStatus_NOT_SERVING
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_ARRAYSIZE ((grpc_health_v1_HealthCheckResponse_ServingStatus)(grpc_health_v1_HealthCheckResponse_ServingStatus_NOT_SERVING+1))
|
||||
|
||||
/* Struct definitions */
|
||||
typedef struct _grpc_health_v1_HealthCheckRequest {
|
||||
bool has_service;
|
||||
char service[200];
|
||||
/* @@protoc_insertion_point(struct:grpc_health_v1_HealthCheckRequest) */
|
||||
} grpc_health_v1_HealthCheckRequest;
|
||||
|
||||
typedef struct _grpc_health_v1_HealthCheckResponse {
|
||||
bool has_status;
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus status;
|
||||
/* @@protoc_insertion_point(struct:grpc_health_v1_HealthCheckResponse) */
|
||||
} grpc_health_v1_HealthCheckResponse;
|
||||
|
||||
/* Default values for struct fields */
|
||||
|
||||
/* Initializer values for message structs */
|
||||
#define grpc_health_v1_HealthCheckRequest_init_default {false, ""}
|
||||
#define grpc_health_v1_HealthCheckResponse_init_default {false, (grpc_health_v1_HealthCheckResponse_ServingStatus)0}
|
||||
#define grpc_health_v1_HealthCheckRequest_init_zero {false, ""}
|
||||
#define grpc_health_v1_HealthCheckResponse_init_zero {false, (grpc_health_v1_HealthCheckResponse_ServingStatus)0}
|
||||
|
||||
/* Field tags (for use in manual encoding/decoding) */
|
||||
#define grpc_health_v1_HealthCheckRequest_service_tag 1
|
||||
#define grpc_health_v1_HealthCheckResponse_status_tag 1
|
||||
|
||||
/* Struct field encoding specification for nanopb */
|
||||
extern const pb_field_t grpc_health_v1_HealthCheckRequest_fields[2];
|
||||
extern const pb_field_t grpc_health_v1_HealthCheckResponse_fields[2];
|
||||
|
||||
/* Maximum encoded size of messages (where known) */
|
||||
#define grpc_health_v1_HealthCheckRequest_size 203
|
||||
#define grpc_health_v1_HealthCheckResponse_size 2
|
||||
|
||||
/* Message IDs (where set with "msgid" option) */
|
||||
#ifdef PB_MSGID
|
||||
|
||||
#define HEALTH_MESSAGES \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
/* @@protoc_insertion_point(eof) */
|
||||
|
||||
#endif
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2015, Google Inc.
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -31,28 +31,19 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* NOTE: If this test fails to compile, then the api changes are likely to cause
|
||||
* merge failures downstream. Please pay special attention to reviewing
|
||||
* these changes, and solicit help as appropriate when merging downstream.
|
||||
*
|
||||
* This test is NOT expected to be run directly.
|
||||
******************************************************************************/
|
||||
#include <grpc++/health_check_service_interface.h>
|
||||
|
||||
#include "src/core/lib/iomgr/load_file.h"
|
||||
#include "src/core/lib/support/env.h"
|
||||
#include "src/core/lib/support/tmpfile.h"
|
||||
namespace grpc {
|
||||
namespace {
|
||||
bool g_grpc_default_health_check_service_enabled = false;
|
||||
} // namesapce
|
||||
|
||||
static void test_code(void) {
|
||||
/* env.h */
|
||||
gpr_set_env("abc", gpr_getenv("xyz"));
|
||||
/* load_file.h */
|
||||
grpc_load_file("abc", 1, NULL);
|
||||
/* tmpfile.h */
|
||||
fclose(gpr_tmpfile("foo", NULL));
|
||||
bool DefaultHealthCheckServiceEnabled() {
|
||||
return g_grpc_default_health_check_service_enabled;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
if (false) test_code();
|
||||
return 0;
|
||||
void EnableDefaultHealthCheckService(bool enable) {
|
||||
g_grpc_default_health_check_service_enabled = enable;
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc++/ext/health_check_service_server_builder_option.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
HealthCheckServiceServerBuilderOption::HealthCheckServiceServerBuilderOption(
|
||||
std::unique_ptr<HealthCheckServiceInterface> hc)
|
||||
: hc_(std::move(hc)) {}
|
||||
// Hand over hc_ to the server.
|
||||
void HealthCheckServiceServerBuilderOption::UpdateArguments(
|
||||
ChannelArguments* args) {
|
||||
args->SetPointer(kHealthCheckServiceInterfaceArg, hc_.release());
|
||||
}
|
||||
|
||||
void HealthCheckServiceServerBuilderOption::UpdatePlugins(
|
||||
std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) {}
|
||||
|
||||
} // namespace grpc
|
||||
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include <grpc++/completion_queue.h>
|
||||
#include <grpc++/generic/async_generic_service.h>
|
||||
#include <grpc++/impl/codegen/async_unary_call.h>
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/grpc_library.h>
|
||||
#include <grpc++/impl/method_handler_impl.h>
|
||||
|
|
@ -51,6 +52,7 @@
|
|||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/lib/profiling/timers.h"
|
||||
#include "src/cpp/server/health/default_health_check_service.h"
|
||||
#include "src/cpp/thread_manager/thread_manager.h"
|
||||
|
||||
namespace grpc {
|
||||
|
|
@ -342,6 +344,7 @@ class Server::SyncRequestThreadManager : public ThreadManager {
|
|||
int cq_timeout_msec_;
|
||||
std::vector<std::unique_ptr<SyncRequest>> sync_requests_;
|
||||
std::unique_ptr<RpcServiceMethod> unknown_method_;
|
||||
std::unique_ptr<RpcServiceMethod> health_check_;
|
||||
std::shared_ptr<Server::GlobalCallbacks> global_callbacks_;
|
||||
};
|
||||
|
||||
|
|
@ -358,7 +361,8 @@ Server::Server(
|
|||
shutdown_notified_(false),
|
||||
has_generic_service_(false),
|
||||
server_(nullptr),
|
||||
server_initializer_(new ServerInitializer(this)) {
|
||||
server_initializer_(new ServerInitializer(this)),
|
||||
health_check_service_disabled_(false) {
|
||||
g_gli_initializer.summon();
|
||||
gpr_once_init(&g_once_init_callbacks, InitGlobalCallbacks);
|
||||
global_callbacks_ = g_callbacks;
|
||||
|
|
@ -374,6 +378,19 @@ Server::Server(
|
|||
grpc_channel_args channel_args;
|
||||
args->SetChannelArgs(&channel_args);
|
||||
|
||||
for (size_t i = 0; i < channel_args.num_args; i++) {
|
||||
if (0 ==
|
||||
strcmp(channel_args.args[i].key, kHealthCheckServiceInterfaceArg)) {
|
||||
if (channel_args.args[i].value.pointer.p == nullptr) {
|
||||
health_check_service_disabled_ = true;
|
||||
} else {
|
||||
health_check_service_.reset(static_cast<HealthCheckServiceInterface*>(
|
||||
channel_args.args[i].value.pointer.p));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
server_ = grpc_server_create(&channel_args, nullptr);
|
||||
}
|
||||
|
||||
|
|
@ -480,6 +497,21 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) {
|
|||
GPR_ASSERT(!started_);
|
||||
global_callbacks_->PreServerStart(this);
|
||||
started_ = true;
|
||||
|
||||
// Only create default health check service when user did not provide an
|
||||
// explicit one.
|
||||
if (health_check_service_ == nullptr && !health_check_service_disabled_ &&
|
||||
DefaultHealthCheckServiceEnabled()) {
|
||||
if (sync_server_cqs_->empty()) {
|
||||
gpr_log(GPR_ERROR,
|
||||
"Default health check service disabled at async-only server.");
|
||||
} else {
|
||||
auto* default_hc_service = new DefaultHealthCheckService;
|
||||
health_check_service_.reset(default_hc_service);
|
||||
RegisterService(nullptr, default_hc_service->GetHealthCheckService());
|
||||
}
|
||||
}
|
||||
|
||||
grpc_server_start(server_);
|
||||
|
||||
if (!has_generic_service_) {
|
||||
|
|
|
|||
|
|
@ -321,44 +321,8 @@ unsigned int parse_h2_length(const char *field) {
|
|||
grpc_metadata_array_init(&request_metadata_recv);
|
||||
grpc_call_details_init(&call_details);
|
||||
|
||||
memset(ops, 0, sizeof(ops));
|
||||
op = ops;
|
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
||||
op->data.send_initial_metadata.count = 2;
|
||||
op->data.send_initial_metadata.metadata = meta_c;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_SEND_MESSAGE;
|
||||
op->data.send_message.send_message = request_payload;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
||||
op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_MESSAGE;
|
||||
op->data.recv_message.recv_message = &response_payload_recv;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
||||
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
|
||||
op->data.recv_status_on_client.status = &status;
|
||||
op->data.recv_status_on_client.status_details = &details;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
error = grpc_call_start_batch(c, ops, (size_t)(op - ops), (void *)1, NULL);
|
||||
GPR_ASSERT(GRPC_CALL_OK == error);
|
||||
|
||||
__weak XCTestExpectation *expectation = [self expectationWithDescription:@"Coalescing"];
|
||||
__weak XCTestExpectation *expectation =
|
||||
[self expectationWithDescription:@"Coalescing"];
|
||||
|
||||
dispatch_async(
|
||||
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
|
|
@ -425,6 +389,46 @@ unsigned int parse_h2_length(const char *field) {
|
|||
[expectation fulfill];
|
||||
});
|
||||
|
||||
// Guarantees that server is listening to the port before client connects.
|
||||
sleep(1);
|
||||
|
||||
memset(ops, 0, sizeof(ops));
|
||||
op = ops;
|
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
||||
op->data.send_initial_metadata.count = 2;
|
||||
op->data.send_initial_metadata.metadata = meta_c;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_SEND_MESSAGE;
|
||||
op->data.send_message.send_message = request_payload;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
||||
op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_MESSAGE;
|
||||
op->data.recv_message.recv_message = &response_payload_recv;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
||||
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
|
||||
op->data.recv_status_on_client.status = &status;
|
||||
op->data.recv_status_on_client.status_details = &details;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
error = grpc_call_start_batch(c, ops, (size_t)(op - ops), (void *)1, NULL);
|
||||
GPR_ASSERT(GRPC_CALL_OK == error);
|
||||
|
||||
CQ_EXPECT_COMPLETION(cqv, (void *)1, 1);
|
||||
cq_verify(cqv);
|
||||
|
||||
|
|
@ -445,7 +449,7 @@ unsigned int parse_h2_length(const char *field) {
|
|||
grpc_completion_queue_shutdown(cq);
|
||||
drain_cq(cq);
|
||||
grpc_completion_queue_destroy(cq);
|
||||
|
||||
|
||||
[self waitForExpectationsWithTimeout:4 handler:nil];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@ zval *grpc_parse_metadata_array(grpc_metadata_array
|
|||
str_key = ecalloc(key_len + 1, sizeof(char));
|
||||
memcpy(str_key, GRPC_SLICE_START_PTR(elem->key), key_len);
|
||||
str_val = ecalloc(GRPC_SLICE_LENGTH(elem->value) + 1, sizeof(char));
|
||||
memcpy(str_val, GRPC_SLICE_START_PTR(elem->value), GRPC_SLICE_LENGTH(elem->value));
|
||||
memcpy(str_val, GRPC_SLICE_START_PTR(elem->value),
|
||||
GRPC_SLICE_LENGTH(elem->value));
|
||||
if (php_grpc_zend_hash_find(array_hash, str_key, key_len, (void **)&data)
|
||||
== SUCCESS) {
|
||||
if (Z_TYPE_P(data) != IS_ARRAY) {
|
||||
|
|
@ -115,7 +116,8 @@ zval *grpc_parse_metadata_array(grpc_metadata_array
|
|||
efree(str_val);
|
||||
return NULL;
|
||||
}
|
||||
php_grpc_add_next_index_stringl(data, str_val, GRPC_SLICE_LENGTH(elem->value),
|
||||
php_grpc_add_next_index_stringl(data, str_val,
|
||||
GRPC_SLICE_LENGTH(elem->value),
|
||||
false);
|
||||
} else {
|
||||
PHP_GRPC_MAKE_STD_ZVAL(inner_array);
|
||||
|
|
@ -172,8 +174,10 @@ bool create_metadata_array(zval *array, grpc_metadata_array *metadata) {
|
|||
if (Z_TYPE_P(value) != IS_STRING) {
|
||||
return false;
|
||||
}
|
||||
metadata->metadata[metadata->count].key = grpc_slice_from_copied_string(key1);
|
||||
metadata->metadata[metadata->count].value = grpc_slice_from_copied_buffer(Z_STRVAL_P(value), Z_STRLEN_P(value));
|
||||
metadata->metadata[metadata->count].key =
|
||||
grpc_slice_from_copied_string(key1);
|
||||
metadata->metadata[metadata->count].value =
|
||||
grpc_slice_from_copied_buffer(Z_STRVAL_P(value), Z_STRLEN_P(value));
|
||||
metadata->count += 1;
|
||||
PHP_GRPC_HASH_FOREACH_END()
|
||||
PHP_GRPC_HASH_FOREACH_END()
|
||||
|
|
@ -233,7 +237,8 @@ PHP_METHOD(Call, __construct) {
|
|||
grpc_slice_from_copied_string(host_override) : grpc_empty_slice();
|
||||
call->wrapped =
|
||||
grpc_channel_create_call(channel->wrapped, NULL, GRPC_PROPAGATE_DEFAULTS,
|
||||
completion_queue, method_slice, host_override != NULL ? &host_slice : NULL,
|
||||
completion_queue, method_slice,
|
||||
host_override != NULL ? &host_slice : NULL,
|
||||
deadline->wrapped, NULL);
|
||||
grpc_slice_unref(method_slice);
|
||||
grpc_slice_unref(host_slice);
|
||||
|
|
@ -384,8 +389,10 @@ PHP_METHOD(Call, startBatch) {
|
|||
1 TSRMLS_CC);
|
||||
goto cleanup;
|
||||
}
|
||||
send_status_details = grpc_slice_from_copied_string(Z_STRVAL_P(inner_value));
|
||||
ops[op_num].data.send_status_from_server.status_details = &send_status_details;
|
||||
send_status_details = grpc_slice_from_copied_string(
|
||||
Z_STRVAL_P(inner_value));
|
||||
ops[op_num].data.send_status_from_server.status_details =
|
||||
&send_status_details;
|
||||
} else {
|
||||
zend_throw_exception(spl_ce_InvalidArgumentException,
|
||||
"String status details is required",
|
||||
|
|
@ -557,12 +564,33 @@ PHP_METHOD(Call, setCredentials) {
|
|||
RETURN_LONG(error);
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 3)
|
||||
ZEND_ARG_INFO(0, channel)
|
||||
ZEND_ARG_INFO(0, method)
|
||||
ZEND_ARG_INFO(0, deadline)
|
||||
ZEND_ARG_INFO(0, host_override)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_startBatch, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, ops)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_getPeer, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_cancel, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_setCredentials, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, credentials)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry call_methods[] = {
|
||||
PHP_ME(Call, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Call, startBatch, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, getPeer, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, cancel, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, setCredentials, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, __construct, arginfo_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Call, startBatch, arginfo_startBatch, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, getPeer, arginfo_getPeer, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, cancel, arginfo_cancel, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Call, setCredentials, arginfo_setCredentials, ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -212,10 +212,19 @@ void plugin_destroy_state(void *ptr) {
|
|||
efree(state);
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createComposite, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, creds1)
|
||||
ZEND_ARG_INFO(0, creds2)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createFromPlugin, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, callback)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry call_credentials_methods[] = {
|
||||
PHP_ME(CallCredentials, createComposite, NULL,
|
||||
PHP_ME(CallCredentials, createComposite, arginfo_createComposite,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(CallCredentials, createFromPlugin, NULL,
|
||||
PHP_ME(CallCredentials, createFromPlugin, arginfo_createFromPlugin,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
|
|
|||
|
|
@ -243,12 +243,37 @@ PHP_METHOD(Channel, close) {
|
|||
}
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, target)
|
||||
ZEND_ARG_INFO(0, args)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_getTarget, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_getConnectivityState, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, try_to_connect)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_watchConnectivityState, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, last_state)
|
||||
ZEND_ARG_INFO(0, deadline)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_close, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry channel_methods[] = {
|
||||
PHP_ME(Channel, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Channel, getTarget, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, getConnectivityState, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, watchConnectivityState, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, close, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, __construct, arginfo_construct,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Channel, getTarget, arginfo_getTarget,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, getConnectivityState, arginfo_getConnectivityState,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, watchConnectivityState, arginfo_watchConnectivityState,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Channel, close, arginfo_close,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -199,16 +199,37 @@ PHP_METHOD(ChannelCredentials, createInsecure) {
|
|||
RETURN_NULL();
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_setDefaultRootsPem, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, pem_roots)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createDefault, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createSsl, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, pem_root_certs)
|
||||
ZEND_ARG_INFO(0, pem_private_key)
|
||||
ZEND_ARG_INFO(0, pem_cert_chain)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createComposite, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, channel_creds)
|
||||
ZEND_ARG_INFO(0, call_creds)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createInsecure, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry channel_credentials_methods[] = {
|
||||
PHP_ME(ChannelCredentials, setDefaultRootsPem, NULL,
|
||||
PHP_ME(ChannelCredentials, setDefaultRootsPem, arginfo_setDefaultRootsPem,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(ChannelCredentials, createDefault, NULL,
|
||||
PHP_ME(ChannelCredentials, createDefault, arginfo_createDefault,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(ChannelCredentials, createSsl, NULL,
|
||||
PHP_ME(ChannelCredentials, createSsl, arginfo_createSsl,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(ChannelCredentials, createComposite, NULL,
|
||||
PHP_ME(ChannelCredentials, createComposite, arginfo_createComposite,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(ChannelCredentials, createInsecure, NULL,
|
||||
PHP_ME(ChannelCredentials, createInsecure, arginfo_createInsecure,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
|
|
|||
|
|
@ -116,8 +116,6 @@ PHP_METHOD(Server, __construct) {
|
|||
|
||||
/**
|
||||
* Request a call on a server. Creates a single GRPC_SERVER_RPC_NEW event.
|
||||
* @param long $tag_new The tag to associate with the new request
|
||||
* @param long $tag_cancel The tag to use if the call is cancelled
|
||||
* @return void
|
||||
*/
|
||||
PHP_METHOD(Server, requestCall) {
|
||||
|
|
@ -239,12 +237,36 @@ PHP_METHOD(Server, start) {
|
|||
grpc_server_start(server->wrapped);
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, args)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_requestCall, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_addHttp2Port, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, addr)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_addSecureHttp2Port, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, addr)
|
||||
ZEND_ARG_INFO(0, server_creds)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_start, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry server_methods[] = {
|
||||
PHP_ME(Server, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Server, requestCall, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, addHttp2Port, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, addSecureHttp2Port, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, start, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, __construct, arginfo_construct,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Server, requestCall, arginfo_requestCall,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, addHttp2Port, arginfo_addHttp2Port,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, addSecureHttp2Port, arginfo_addSecureHttp2Port,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Server, start, arginfo_start,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -117,8 +117,14 @@ PHP_METHOD(ServerCredentials, createSsl) {
|
|||
RETURN_DESTROY_ZVAL(creds_object);
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_createSsl, 0, 0, 3)
|
||||
ZEND_ARG_INFO(0, pem_root_certs)
|
||||
ZEND_ARG_INFO(0, pem_private_key)
|
||||
ZEND_ARG_INFO(0, pem_cert_chain)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry server_credentials_methods[] = {
|
||||
PHP_ME(ServerCredentials, createSsl, NULL,
|
||||
PHP_ME(ServerCredentials, createSsl, arginfo_createSsl,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
|
|
|||
|
|
@ -245,17 +245,65 @@ PHP_METHOD(Timeval, sleepUntil) {
|
|||
gpr_sleep_until(this->wrapped);
|
||||
}
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, microseconds)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_add, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, timeval)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_compare, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, a_timeval)
|
||||
ZEND_ARG_INFO(0, b_timeval)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_infFuture, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_infPast, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_now, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_similar, 0, 0, 3)
|
||||
ZEND_ARG_INFO(0, a_timeval)
|
||||
ZEND_ARG_INFO(0, b_timeval)
|
||||
ZEND_ARG_INFO(0, threshold_timeval)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_sleepUntil, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_subtract, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, timeval)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_zero, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
static zend_function_entry timeval_methods[] = {
|
||||
PHP_ME(Timeval, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Timeval, add, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, compare, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, infFuture, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, infPast, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, now, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, similar, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, sleepUntil, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, subtract, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, zero, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, __construct, arginfo_construct,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
||||
PHP_ME(Timeval, add, arginfo_add,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, compare, arginfo_compare,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, infFuture, arginfo_infFuture,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, infPast, arginfo_infPast,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, now, arginfo_now,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, similar, arginfo_similar,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_ME(Timeval, sleepUntil, arginfo_sleepUntil,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, subtract, arginfo_subtract,
|
||||
ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Timeval, zero, arginfo_zero,
|
||||
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
grpc.health.v1.HealthCheckRequest.service max_size:200
|
||||
|
|
@ -84,7 +84,7 @@ module GRPC
|
|||
# channel:
|
||||
#
|
||||
# - :channel_override
|
||||
# when present, this must be a pre-created GRPC::Channel. If it's
|
||||
# when present, this must be a pre-created GRPC::Core::Channel. If it's
|
||||
# present the host and arbitrary keyword arg areignored, and the RPC
|
||||
# connection uses this channel.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ static grpc_error *channel_init_func(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static grpc_error *call_init_func(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
++*(int *)(elem->channel_data);
|
||||
*(int *)(elem->call_data) = 0;
|
||||
return GRPC_ERROR_NONE;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
grpc_fuzzer(
|
||||
name = "uri_fuzzer_test",
|
||||
srcs = ["uri_fuzzer_test.c"],
|
||||
deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util"],
|
||||
corpus = "uri_corpus",
|
||||
copts = ["-std=c99"],
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "lb_policies_test",
|
||||
srcs = ["lb_policies_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:cq_verifier"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "set_initial_connect_string_test",
|
||||
srcs = ["set_initial_connect_string_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_test(
|
||||
name = "dns_resolver_connectivity_test",
|
||||
srcs = ["dns_resolver_connectivity_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "dns_resolver_test",
|
||||
srcs = ["dns_resolver_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "sockaddr_resolver_test",
|
||||
srcs = ["sockaddr_resolver_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -36,14 +36,17 @@
|
|||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
|
||||
#include "src/core/ext/client_channel/resolver.h"
|
||||
#include "src/core/ext/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
#include "src/core/lib/iomgr/resolve_address.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
static gpr_mu g_mu;
|
||||
static bool g_fail_resolution = true;
|
||||
static grpc_combiner *g_combiner;
|
||||
|
||||
static grpc_error *my_resolve_address(const char *name, const char *addr,
|
||||
grpc_resolved_addresses **addrs) {
|
||||
|
|
@ -71,6 +74,7 @@ static grpc_resolver *create_resolver(grpc_exec_ctx *exec_ctx,
|
|||
grpc_resolver_args args;
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.uri = uri;
|
||||
args.combiner = g_combiner;
|
||||
grpc_resolver *resolver =
|
||||
grpc_resolver_factory_create_resolver(exec_ctx, factory, &args);
|
||||
grpc_resolver_factory_unref(factory);
|
||||
|
|
@ -96,11 +100,41 @@ static bool wait_loop(int deadline_seconds, gpr_event *ev) {
|
|||
return false;
|
||||
}
|
||||
|
||||
typedef struct next_args {
|
||||
grpc_resolver *resolver;
|
||||
grpc_channel_args **result;
|
||||
grpc_closure *on_complete;
|
||||
} next_args;
|
||||
|
||||
static void call_resolver_next_now_lock_taken(grpc_exec_ctx *exec_ctx,
|
||||
void *arg,
|
||||
grpc_error *error_unused) {
|
||||
next_args *a = arg;
|
||||
grpc_resolver_next_locked(exec_ctx, a->resolver, a->result, a->on_complete);
|
||||
gpr_free(a);
|
||||
}
|
||||
|
||||
static void call_resolver_next_after_locking(grpc_exec_ctx *exec_ctx,
|
||||
grpc_resolver *resolver,
|
||||
grpc_channel_args **result,
|
||||
grpc_closure *on_complete) {
|
||||
next_args *a = gpr_malloc(sizeof(*a));
|
||||
a->resolver = resolver;
|
||||
a->result = result;
|
||||
a->on_complete = on_complete;
|
||||
grpc_closure_sched(
|
||||
exec_ctx,
|
||||
grpc_closure_create(call_resolver_next_now_lock_taken, a,
|
||||
grpc_combiner_scheduler(resolver->combiner, false)),
|
||||
GRPC_ERROR_NONE);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
grpc_test_init(argc, argv);
|
||||
|
||||
grpc_init();
|
||||
gpr_mu_init(&g_mu);
|
||||
g_combiner = grpc_combiner_create(NULL);
|
||||
grpc_blocking_resolve_address = my_resolve_address;
|
||||
grpc_channel_args *result = (grpc_channel_args *)1;
|
||||
|
||||
|
|
@ -108,7 +142,7 @@ int main(int argc, char **argv) {
|
|||
grpc_resolver *resolver = create_resolver(&exec_ctx, "dns:test");
|
||||
gpr_event ev1;
|
||||
gpr_event_init(&ev1);
|
||||
grpc_resolver_next(
|
||||
call_resolver_next_after_locking(
|
||||
&exec_ctx, resolver, &result,
|
||||
grpc_closure_create(on_done, &ev1, grpc_schedule_on_exec_ctx));
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
|
|
@ -117,7 +151,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
gpr_event ev2;
|
||||
gpr_event_init(&ev2);
|
||||
grpc_resolver_next(
|
||||
call_resolver_next_after_locking(
|
||||
&exec_ctx, resolver, &result,
|
||||
grpc_closure_create(on_done, &ev2, grpc_schedule_on_exec_ctx));
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
|
|
@ -126,6 +160,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
grpc_channel_args_destroy(&exec_ctx, result);
|
||||
GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test");
|
||||
GRPC_COMBINER_UNREF(&exec_ctx, g_combiner, "test");
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
|
||||
grpc_shutdown();
|
||||
|
|
|
|||
|
|
@ -36,8 +36,11 @@
|
|||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/ext/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
static grpc_combiner *g_combiner;
|
||||
|
||||
static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_uri *uri = grpc_uri_parse(string, 0);
|
||||
|
|
@ -48,6 +51,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
|
|||
GPR_ASSERT(uri);
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.uri = uri;
|
||||
args.combiner = g_combiner;
|
||||
resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
|
||||
GPR_ASSERT(resolver != NULL);
|
||||
GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds");
|
||||
|
|
@ -65,6 +69,7 @@ static void test_fails(grpc_resolver_factory *factory, const char *string) {
|
|||
GPR_ASSERT(uri);
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.uri = uri;
|
||||
args.combiner = g_combiner;
|
||||
resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
|
||||
GPR_ASSERT(resolver == NULL);
|
||||
grpc_uri_destroy(uri);
|
||||
|
|
@ -76,6 +81,8 @@ int main(int argc, char **argv) {
|
|||
grpc_test_init(argc, argv);
|
||||
grpc_init();
|
||||
|
||||
g_combiner = grpc_combiner_create(NULL);
|
||||
|
||||
dns = grpc_resolver_factory_lookup("dns");
|
||||
|
||||
test_succeeds(dns, "dns:10.2.1.1");
|
||||
|
|
@ -84,6 +91,11 @@ int main(int argc, char **argv) {
|
|||
test_fails(dns, "ipv4://8.8.8.8/8.8.8.8:8888");
|
||||
|
||||
grpc_resolver_factory_unref(dns);
|
||||
{
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
GRPC_COMBINER_UNREF(&exec_ctx, g_combiner, "test");
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
}
|
||||
grpc_shutdown();
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -39,9 +39,12 @@
|
|||
|
||||
#include "src/core/ext/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
static grpc_combiner *g_combiner;
|
||||
|
||||
typedef struct on_resolution_arg {
|
||||
char *expected_server_name;
|
||||
grpc_channel_args *resolver_result;
|
||||
|
|
@ -62,6 +65,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
|
|||
GPR_ASSERT(uri);
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.uri = uri;
|
||||
args.combiner = g_combiner;
|
||||
resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
|
||||
GPR_ASSERT(resolver != NULL);
|
||||
|
||||
|
|
@ -71,8 +75,8 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
|
|||
grpc_closure *on_resolution = grpc_closure_create(
|
||||
on_resolution_cb, &on_res_arg, grpc_schedule_on_exec_ctx);
|
||||
|
||||
grpc_resolver_next(&exec_ctx, resolver, &on_res_arg.resolver_result,
|
||||
on_resolution);
|
||||
grpc_resolver_next_locked(&exec_ctx, resolver, &on_res_arg.resolver_result,
|
||||
on_resolution);
|
||||
GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds");
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
grpc_uri_destroy(uri);
|
||||
|
|
@ -88,6 +92,7 @@ static void test_fails(grpc_resolver_factory *factory, const char *string) {
|
|||
GPR_ASSERT(uri);
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.uri = uri;
|
||||
args.combiner = g_combiner;
|
||||
resolver = grpc_resolver_factory_create_resolver(&exec_ctx, factory, &args);
|
||||
GPR_ASSERT(resolver == NULL);
|
||||
grpc_uri_destroy(uri);
|
||||
|
|
@ -99,6 +104,8 @@ int main(int argc, char **argv) {
|
|||
grpc_test_init(argc, argv);
|
||||
grpc_init();
|
||||
|
||||
g_combiner = grpc_combiner_create(NULL);
|
||||
|
||||
ipv4 = grpc_resolver_factory_lookup("ipv4");
|
||||
ipv6 = grpc_resolver_factory_lookup("ipv6");
|
||||
|
||||
|
|
@ -118,6 +125,12 @@ int main(int argc, char **argv) {
|
|||
|
||||
grpc_resolver_factory_unref(ipv4);
|
||||
grpc_resolver_factory_unref(ipv6);
|
||||
|
||||
{
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
GRPC_COMBINER_UNREF(&exec_ctx, g_combiner, "test");
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
}
|
||||
grpc_shutdown();
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ static grpc_resolver* fake_resolver_create(grpc_exec_ctx* exec_ctx,
|
|||
r->channel_args = grpc_channel_args_copy(args->args);
|
||||
r->addresses = addresses;
|
||||
gpr_mu_init(&r->mu);
|
||||
grpc_resolver_init(&r->base, &fake_resolver_vtable);
|
||||
grpc_resolver_init(&r->base, &fake_resolver_vtable, args->combiner);
|
||||
return &r->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ static void test_request(grpc_end2end_test_config config) {
|
|||
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
return grpc_error_set_int(GRPC_ERROR_CREATE("access denied"),
|
||||
GRPC_ERROR_INT_GRPC_STATUS,
|
||||
GRPC_STATUS_PERMISSION_DENIED);
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ static void start_transport_stream_op(grpc_exec_ctx *exec_ctx,
|
|||
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ static void test_request(grpc_end2end_test_config config) {
|
|||
|
||||
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_call_element_args *args) {
|
||||
const grpc_call_element_args *args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
cc_binary(
|
||||
name = "client",
|
||||
srcs = ["client.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
testonly = 1,
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "server",
|
||||
srcs = ["server.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
testonly = 1,
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "fling",
|
||||
srcs = ["fling_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
data = [":client", ":server"]
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "fling_stream",
|
||||
srcs = ["fling_stream_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
data = [":client", ":server"]
|
||||
)
|
||||
|
|
@ -47,3 +47,58 @@ grpc_fuzzer(
|
|||
copts = ["-std=c99"],
|
||||
)
|
||||
|
||||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
cc_test(
|
||||
name = "httpcli_test",
|
||||
srcs = ["httpcli_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
copts = ['-std=c99'],
|
||||
data = ['test_server.py']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "httpscli_test",
|
||||
srcs = ["httpscli_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
copts = ['-std=c99'],
|
||||
data = ['test_server.py']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "parser_test",
|
||||
srcs = ["parser_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:ssl_test_data"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,118 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2015, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "src/core/lib/iomgr/iomgr.h"
|
||||
#include "src/core/lib/iomgr/closure.h"
|
||||
#include "src/core/lib/iomgr/endpoint.h"
|
||||
#include "src/core/lib/iomgr/exec_ctx.h"
|
||||
#include "src/core/lib/iomgr/executor.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* NOTE: If this test fails to compile, then the api changes are likely to cause
|
||||
* merge failures downstream. Please pay special attention to reviewing
|
||||
* these changes, and solicit help as appropriate when merging downstream.
|
||||
*
|
||||
* This test is NOT expected to be run directly.
|
||||
******************************************************************************/
|
||||
|
||||
static void test_code(void) {
|
||||
/* iomgr.h */
|
||||
grpc_iomgr_init();
|
||||
grpc_iomgr_shutdown(NULL);
|
||||
|
||||
/* closure.h */
|
||||
grpc_closure closure;
|
||||
closure.cb = NULL;
|
||||
closure.cb_arg = NULL;
|
||||
closure.next_data.scratch = 0;
|
||||
|
||||
grpc_closure_list closure_list = GRPC_CLOSURE_LIST_INIT;
|
||||
closure_list.head = NULL;
|
||||
closure_list.tail = NULL;
|
||||
|
||||
grpc_closure_init(&closure, NULL, NULL, grpc_schedule_on_exec_ctx);
|
||||
|
||||
grpc_closure_create(NULL, NULL, grpc_schedule_on_exec_ctx);
|
||||
|
||||
grpc_closure_list_move(NULL, NULL);
|
||||
grpc_closure_list_append(NULL, NULL, GRPC_ERROR_CREATE("Foo"));
|
||||
grpc_closure_list_empty(closure_list);
|
||||
|
||||
/* exec_ctx.h */
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
grpc_closure_sched(&exec_ctx, &closure, GRPC_ERROR_CREATE("Foo"));
|
||||
grpc_closure_list_sched(&exec_ctx, &closure_list);
|
||||
|
||||
/* endpoint.h */
|
||||
grpc_endpoint endpoint;
|
||||
grpc_endpoint_vtable vtable = {grpc_endpoint_read,
|
||||
grpc_endpoint_write,
|
||||
grpc_endpoint_get_workqueue,
|
||||
grpc_endpoint_add_to_pollset,
|
||||
grpc_endpoint_add_to_pollset_set,
|
||||
grpc_endpoint_shutdown,
|
||||
grpc_endpoint_destroy,
|
||||
grpc_endpoint_get_resource_user,
|
||||
grpc_endpoint_get_peer,
|
||||
grpc_endpoint_get_fd};
|
||||
endpoint.vtable = &vtable;
|
||||
|
||||
grpc_endpoint_read(&exec_ctx, &endpoint, NULL, NULL);
|
||||
grpc_endpoint_get_peer(&endpoint);
|
||||
grpc_endpoint_write(&exec_ctx, &endpoint, NULL, NULL);
|
||||
grpc_endpoint_shutdown(&exec_ctx, &endpoint, GRPC_ERROR_CANCELLED);
|
||||
grpc_endpoint_destroy(&exec_ctx, &endpoint);
|
||||
grpc_endpoint_add_to_pollset(&exec_ctx, &endpoint, NULL);
|
||||
grpc_endpoint_add_to_pollset_set(&exec_ctx, &endpoint, NULL);
|
||||
|
||||
/* executor.h */
|
||||
grpc_executor_init();
|
||||
grpc_executor_shutdown(NULL);
|
||||
|
||||
/* pollset.h */
|
||||
grpc_pollset_size();
|
||||
grpc_pollset_init(NULL, NULL);
|
||||
grpc_pollset_shutdown(NULL, NULL, NULL);
|
||||
grpc_pollset_destroy(NULL);
|
||||
GRPC_ERROR_UNREF(grpc_pollset_work(NULL, NULL, NULL,
|
||||
gpr_now(GPR_CLOCK_REALTIME),
|
||||
gpr_now(GPR_CLOCK_MONOTONIC)));
|
||||
GRPC_ERROR_UNREF(grpc_pollset_kick(NULL, NULL));
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
if (false) test_code();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2015, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* NOTE: If this test fails to compile, then the api changes are likely to cause
|
||||
* merge failures downstream. Please pay special attention to reviewing
|
||||
* these changes, and solicit help as appropriate when merging downstream.
|
||||
*
|
||||
* This test is NOT expected to be run directly.
|
||||
******************************************************************************/
|
||||
|
||||
#include "src/core/lib/transport/transport.h"
|
||||
#include "src/core/lib/transport/transport_impl.h"
|
||||
|
||||
static void test_code(void) {
|
||||
/* transport_impl.h */
|
||||
grpc_transport transport;
|
||||
grpc_transport_vtable vtable = {12345,
|
||||
grpc_transport_init_stream,
|
||||
grpc_transport_set_pollset,
|
||||
grpc_transport_perform_stream_op,
|
||||
grpc_transport_perform_op,
|
||||
grpc_transport_destroy_stream,
|
||||
grpc_transport_destroy,
|
||||
grpc_transport_get_peer};
|
||||
transport.vtable = &vtable;
|
||||
|
||||
/* transport.h */
|
||||
GRPC_STREAM_REF_INIT(NULL, 0, NULL, NULL, "xyz");
|
||||
GPR_ASSERT(0 == grpc_transport_stream_size(NULL));
|
||||
GPR_ASSERT(grpc_transport_init_stream(&transport, NULL, NULL, NULL, NULL));
|
||||
grpc_transport_set_pollset(&transport, NULL, NULL, NULL);
|
||||
grpc_transport_destroy_stream(&transport, NULL, NULL);
|
||||
grpc_transport_stream_op_finish_with_failure(NULL, NULL);
|
||||
grpc_transport_stream_op_add_cancellation(NULL, GRPC_STATUS_UNAVAILABLE);
|
||||
grpc_transport_stream_op_add_close(NULL, GRPC_STATUS_UNAVAILABLE,
|
||||
grpc_transport_op_string(NULL));
|
||||
grpc_transport_perform_stream_op(&transport, NULL, NULL, NULL);
|
||||
grpc_transport_perform_op(&transport, NULL, NULL);
|
||||
grpc_transport_ping(&transport, NULL);
|
||||
grpc_transport_goaway(&transport, GRPC_STATUS_UNAVAILABLE,
|
||||
grpc_slice_malloc(0));
|
||||
grpc_transport_close(&transport);
|
||||
grpc_transport_destroy(&transport, NULL);
|
||||
GPR_ASSERT("xyz" == grpc_transport_get_peer(&transport, NULL));
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
if (false) test_code();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
cc_library(
|
||||
name = "endpoint_tests",
|
||||
srcs = ["endpoint_tests.c"],
|
||||
hdrs = ["endpoint_tests.h"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
visibility = ["//test:__subpackages__"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "combiner_test",
|
||||
srcs = ["combiner_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "endpoint_pair_test",
|
||||
srcs = ["endpoint_pair_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", ":endpoint_tests"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "ev_epoll_linux_test",
|
||||
srcs = ["ev_epoll_linux_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "fd_conservation_posix_test",
|
||||
srcs = ["fd_conservation_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "fd_posix_test",
|
||||
srcs = ["fd_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "load_file_test",
|
||||
srcs = ["load_file_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "pollset_set_test",
|
||||
srcs = ["pollset_set_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "resolve_address_posix_test",
|
||||
srcs = ["resolve_address_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "resolve_address_test",
|
||||
srcs = ["resolve_address_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "resource_quota_test",
|
||||
srcs = ["resource_quota_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "sockaddr_utils_test",
|
||||
srcs = ["sockaddr_utils_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "socket_utils_test",
|
||||
srcs = ["socket_utils_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "tcp_client_posix_test",
|
||||
srcs = ["tcp_client_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "tcp_posix_test",
|
||||
srcs = ["tcp_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", ":endpoint_tests"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "tcp_server_posix_test",
|
||||
srcs = ["tcp_server_posix_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "time_averaged_stats_test",
|
||||
srcs = ["time_averaged_stats_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "timer_heap_test",
|
||||
srcs = ["timer_heap_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "timer_list_test",
|
||||
srcs = ["timer_list_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "udp_server_test",
|
||||
srcs = ["udp_server_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "wakeup_fd_cv_test",
|
||||
srcs = ["wakeup_fd_cv_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright 2016, Google Inc.
|
||||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -39,3 +39,32 @@ grpc_fuzzer(
|
|||
copts = ["-std=c99"],
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "json_rewrite",
|
||||
srcs = ["json_rewrite.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
testonly = 1,
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "json_rewrite_test",
|
||||
srcs = ["json_rewrite_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99'],
|
||||
data = ["rewrite_test_input.json", "rewrite_test_output_condensed.json", "rewrite_test_output_indented.json", ":json_stream_error_test"]
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "json_stream_error_test",
|
||||
srcs = ["json_stream_error_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "json_test",
|
||||
srcs = ["json_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
# Copyright 2016, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_binary(
|
||||
name = "low_level_ping_pong",
|
||||
srcs = ["low_level_ping_pong.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
grpc_fuzzer(
|
||||
name = "ssl_server_fuzzer",
|
||||
srcs = ["ssl_server_fuzzer.c"],
|
||||
deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util"],
|
||||
corpus = "corpus",
|
||||
copts = ["-std=c99"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "oauth2_utils",
|
||||
srcs = ["oauth2_utils.c"],
|
||||
hdrs = ["oauth2_utils.h"],
|
||||
deps = ["//:grpc"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "auth_context_test",
|
||||
srcs = ["auth_context_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "b64_test",
|
||||
srcs = ["b64_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "credentials_test",
|
||||
srcs = ["credentials_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "secure_endpoint_test",
|
||||
srcs = ["secure_endpoint_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/iomgr:endpoint_tests"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "security_connector_test",
|
||||
srcs = ["security_connector_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "create_jwt",
|
||||
srcs = ["create_jwt.c"],
|
||||
deps = ["//:grpc", "//:gpr"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "fetch_oauth2",
|
||||
srcs = ["fetch_oauth2.c"],
|
||||
deps = ["//:grpc", "//:gpr", ":oauth2_utils"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "verify_jwt",
|
||||
srcs = ["verify_jwt.c"],
|
||||
deps = ["//:grpc", "//:gpr"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer")
|
||||
|
||||
grpc_fuzzer(
|
||||
name = "percent_decode_fuzzer",
|
||||
srcs = ["percent_decode_fuzzer.c"],
|
||||
deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util"],
|
||||
corpus = "response_corpus",
|
||||
copts = ["-std=c99"],
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "percent_encoding_test",
|
||||
srcs = ["percent_encoding_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "slice_buffer_test",
|
||||
srcs = ["slice_string_helpers_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_test(
|
||||
name = "bdp_estimator_test",
|
||||
srcs = ["bdp_estimator_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "connectivity_state_test",
|
||||
srcs = ["connectivity_state_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "metadata_test",
|
||||
srcs = ["metadata_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "pid_controller_test",
|
||||
srcs = ["pid_controller_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "status_conversion_test",
|
||||
srcs = ["status_conversion_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "timeout_encoding_test",
|
||||
srcs = ["timeout_encoding_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -38,3 +38,58 @@ grpc_fuzzer(
|
|||
corpus = "hpack_parser_corpus"
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "alpn_test",
|
||||
srcs = ["alpn_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "bin_decoder_test",
|
||||
srcs = ["bin_decoder_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "bin_encoder_test",
|
||||
srcs = ["bin_encoder_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "hpack_encoder_test",
|
||||
srcs = ["hpack_encoder_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "hpack_parser_test",
|
||||
srcs = ["hpack_parser_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "hpack_table_test",
|
||||
srcs = ["hpack_table_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "stream_map_test",
|
||||
srcs = ["stream_map_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "varint_test",
|
||||
srcs = ["varint_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_test(
|
||||
name = "transport_security_test",
|
||||
srcs = ["transport_security_test.c"],
|
||||
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
|
||||
copts = ['-std=c99']
|
||||
)
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_test(
|
||||
name = "alarm_cpp_test",
|
||||
srcs = ["alarm_cpp_test.cc"],
|
||||
deps = ["//:grpc++", "//external:gtest", "//test/core/util:gpr_test_util"],
|
||||
)
|
||||
|
|
@ -55,7 +55,7 @@ class MyCallData : public CallData {
|
|||
MyCallData() {}
|
||||
|
||||
grpc_error* Init(grpc_exec_ctx* exec_ctx, ChannelData* channel_data,
|
||||
grpc_call_element_args* args) override {
|
||||
const grpc_call_element_args* args) override {
|
||||
(void)args->path; // Make sure field is available.
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,323 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2016, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/channel.h>
|
||||
#include <grpc++/client_context.h>
|
||||
#include <grpc++/create_channel.h>
|
||||
#include <grpc++/ext/health_check_service_server_builder_option.h>
|
||||
#include <grpc++/health_check_service_interface.h>
|
||||
#include <grpc++/server.h>
|
||||
#include <grpc++/server_builder.h>
|
||||
#include <grpc++/server_context.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "src/proto/grpc/health/v1/health.grpc.pb.h"
|
||||
#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
|
||||
#include "src/proto/grpc/testing/echo.grpc.pb.h"
|
||||
#include "test/core/util/port.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
#include "test/cpp/end2end/test_service_impl.h"
|
||||
|
||||
using grpc::health::v1::Health;
|
||||
using grpc::health::v1::HealthCheckRequest;
|
||||
using grpc::health::v1::HealthCheckResponse;
|
||||
|
||||
namespace grpc {
|
||||
namespace testing {
|
||||
namespace {
|
||||
|
||||
// A sample sync implementation of the health checking service. This does the
|
||||
// same thing as the default one.
|
||||
class HealthCheckServiceImpl : public ::grpc::health::v1::Health::Service {
|
||||
public:
|
||||
Status Check(ServerContext* context, const HealthCheckRequest* request,
|
||||
HealthCheckResponse* response) override {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
auto iter = status_map_.find(request->service());
|
||||
if (iter == status_map_.end()) {
|
||||
return Status(StatusCode::NOT_FOUND, "");
|
||||
}
|
||||
response->set_status(iter->second);
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
void SetStatus(const grpc::string& service_name,
|
||||
HealthCheckResponse::ServingStatus status) {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
status_map_[service_name] = status;
|
||||
}
|
||||
|
||||
void SetAll(HealthCheckResponse::ServingStatus status) {
|
||||
std::lock_guard<std::mutex> lock(mu_);
|
||||
for (auto iter = status_map_.begin(); iter != status_map_.end(); ++iter) {
|
||||
iter->second = status;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::mutex mu_;
|
||||
std::map<const grpc::string, HealthCheckResponse::ServingStatus> status_map_;
|
||||
};
|
||||
|
||||
// A custom implementation of the health checking service interface. This is
|
||||
// used to test that it prevents the server from creating a default service and
|
||||
// also serves as an example of how to override the default service.
|
||||
class CustomHealthCheckService : public HealthCheckServiceInterface {
|
||||
public:
|
||||
explicit CustomHealthCheckService(HealthCheckServiceImpl* impl)
|
||||
: impl_(impl) {
|
||||
impl_->SetStatus("", HealthCheckResponse::SERVING);
|
||||
}
|
||||
void SetServingStatus(const grpc::string& service_name,
|
||||
bool serving) override {
|
||||
impl_->SetStatus(service_name, serving ? HealthCheckResponse::SERVING
|
||||
: HealthCheckResponse::NOT_SERVING);
|
||||
}
|
||||
|
||||
void SetServingStatus(bool serving) override {
|
||||
impl_->SetAll(serving ? HealthCheckResponse::SERVING
|
||||
: HealthCheckResponse::NOT_SERVING);
|
||||
}
|
||||
|
||||
private:
|
||||
HealthCheckServiceImpl* impl_; // not owned
|
||||
};
|
||||
|
||||
void LoopCompletionQueue(ServerCompletionQueue* cq) {
|
||||
void* tag;
|
||||
bool ok;
|
||||
while (cq->Next(&tag, &ok)) {
|
||||
abort(); // Nothing should come out of the cq.
|
||||
}
|
||||
}
|
||||
|
||||
class HealthServiceEnd2endTest : public ::testing::Test {
|
||||
protected:
|
||||
HealthServiceEnd2endTest() {}
|
||||
|
||||
void SetUpServer(bool register_sync_test_service, bool add_async_cq,
|
||||
bool explicit_health_service,
|
||||
std::unique_ptr<HealthCheckServiceInterface> service) {
|
||||
int port = grpc_pick_unused_port_or_die();
|
||||
server_address_ << "localhost:" << port;
|
||||
|
||||
bool register_sync_health_service_impl =
|
||||
explicit_health_service && service != nullptr;
|
||||
|
||||
// Setup server
|
||||
ServerBuilder builder;
|
||||
if (explicit_health_service) {
|
||||
std::unique_ptr<ServerBuilderOption> option(
|
||||
new HealthCheckServiceServerBuilderOption(std::move(service)));
|
||||
builder.SetOption(std::move(option));
|
||||
}
|
||||
builder.AddListeningPort(server_address_.str(),
|
||||
grpc::InsecureServerCredentials());
|
||||
if (register_sync_test_service) {
|
||||
// Register a sync service.
|
||||
builder.RegisterService(&echo_test_service_);
|
||||
}
|
||||
if (register_sync_health_service_impl) {
|
||||
builder.RegisterService(&health_check_service_impl_);
|
||||
}
|
||||
if (add_async_cq) {
|
||||
cq_ = builder.AddCompletionQueue();
|
||||
}
|
||||
server_ = builder.BuildAndStart();
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
if (server_) {
|
||||
server_->Shutdown();
|
||||
if (cq_ != nullptr) {
|
||||
cq_->Shutdown();
|
||||
}
|
||||
if (cq_thread_.joinable()) {
|
||||
cq_thread_.join();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ResetStubs() {
|
||||
std::shared_ptr<Channel> channel =
|
||||
CreateChannel(server_address_.str(), InsecureChannelCredentials());
|
||||
hc_stub_ = grpc::health::v1::Health::NewStub(channel);
|
||||
}
|
||||
|
||||
// When the expected_status is NOT OK, we do not care about the response.
|
||||
void SendHealthCheckRpc(const grpc::string& service_name,
|
||||
const Status& expected_status) {
|
||||
EXPECT_FALSE(expected_status.ok());
|
||||
SendHealthCheckRpc(service_name, expected_status,
|
||||
HealthCheckResponse::UNKNOWN);
|
||||
}
|
||||
|
||||
void SendHealthCheckRpc(
|
||||
const grpc::string& service_name, const Status& expected_status,
|
||||
HealthCheckResponse::ServingStatus expected_serving_status) {
|
||||
HealthCheckRequest request;
|
||||
request.set_service(service_name);
|
||||
HealthCheckResponse response;
|
||||
ClientContext context;
|
||||
Status s = hc_stub_->Check(&context, request, &response);
|
||||
EXPECT_EQ(expected_status.error_code(), s.error_code());
|
||||
if (s.ok()) {
|
||||
EXPECT_EQ(expected_serving_status, response.status());
|
||||
}
|
||||
}
|
||||
|
||||
void VerifyHealthCheckService() {
|
||||
HealthCheckServiceInterface* service = server_->GetHealthCheckService();
|
||||
EXPECT_TRUE(service != nullptr);
|
||||
const grpc::string kHealthyService("healthy_service");
|
||||
const grpc::string kUnhealthyService("unhealthy_service");
|
||||
const grpc::string kNotRegisteredService("not_registered");
|
||||
service->SetServingStatus(kHealthyService, true);
|
||||
service->SetServingStatus(kUnhealthyService, false);
|
||||
|
||||
ResetStubs();
|
||||
|
||||
SendHealthCheckRpc("", Status::OK, HealthCheckResponse::SERVING);
|
||||
SendHealthCheckRpc(kHealthyService, Status::OK,
|
||||
HealthCheckResponse::SERVING);
|
||||
SendHealthCheckRpc(kUnhealthyService, Status::OK,
|
||||
HealthCheckResponse::NOT_SERVING);
|
||||
SendHealthCheckRpc(kNotRegisteredService,
|
||||
Status(StatusCode::NOT_FOUND, ""));
|
||||
|
||||
service->SetServingStatus(false);
|
||||
SendHealthCheckRpc("", Status::OK, HealthCheckResponse::NOT_SERVING);
|
||||
SendHealthCheckRpc(kHealthyService, Status::OK,
|
||||
HealthCheckResponse::NOT_SERVING);
|
||||
SendHealthCheckRpc(kUnhealthyService, Status::OK,
|
||||
HealthCheckResponse::NOT_SERVING);
|
||||
SendHealthCheckRpc(kNotRegisteredService,
|
||||
Status(StatusCode::NOT_FOUND, ""));
|
||||
}
|
||||
|
||||
TestServiceImpl echo_test_service_;
|
||||
HealthCheckServiceImpl health_check_service_impl_;
|
||||
std::unique_ptr<Health::Stub> hc_stub_;
|
||||
std::unique_ptr<ServerCompletionQueue> cq_;
|
||||
std::unique_ptr<Server> server_;
|
||||
std::ostringstream server_address_;
|
||||
std::thread cq_thread_;
|
||||
};
|
||||
|
||||
TEST_F(HealthServiceEnd2endTest, DefaultHealthServiceDisabled) {
|
||||
EnableDefaultHealthCheckService(false);
|
||||
EXPECT_FALSE(DefaultHealthCheckServiceEnabled());
|
||||
SetUpServer(true, false, false, nullptr);
|
||||
HealthCheckServiceInterface* default_service =
|
||||
server_->GetHealthCheckService();
|
||||
EXPECT_TRUE(default_service == nullptr);
|
||||
|
||||
ResetStubs();
|
||||
|
||||
SendHealthCheckRpc("", Status(StatusCode::UNIMPLEMENTED, ""));
|
||||
}
|
||||
|
||||
TEST_F(HealthServiceEnd2endTest, DefaultHealthService) {
|
||||
EnableDefaultHealthCheckService(true);
|
||||
EXPECT_TRUE(DefaultHealthCheckServiceEnabled());
|
||||
SetUpServer(true, false, false, nullptr);
|
||||
VerifyHealthCheckService();
|
||||
|
||||
// The default service has a size limit of the service name.
|
||||
const grpc::string kTooLongServiceName(201, 'x');
|
||||
SendHealthCheckRpc(kTooLongServiceName,
|
||||
Status(StatusCode::INVALID_ARGUMENT, ""));
|
||||
}
|
||||
|
||||
// The server has no sync service.
|
||||
TEST_F(HealthServiceEnd2endTest, DefaultHealthServiceAsyncOnly) {
|
||||
EnableDefaultHealthCheckService(true);
|
||||
EXPECT_TRUE(DefaultHealthCheckServiceEnabled());
|
||||
SetUpServer(false, true, false, nullptr);
|
||||
cq_thread_ = std::thread(LoopCompletionQueue, cq_.get());
|
||||
|
||||
HealthCheckServiceInterface* default_service =
|
||||
server_->GetHealthCheckService();
|
||||
EXPECT_TRUE(default_service == nullptr);
|
||||
|
||||
ResetStubs();
|
||||
|
||||
SendHealthCheckRpc("", Status(StatusCode::UNIMPLEMENTED, ""));
|
||||
}
|
||||
|
||||
// Provide an empty service to disable the default service.
|
||||
TEST_F(HealthServiceEnd2endTest, ExplicitlyDisableViaOverride) {
|
||||
EnableDefaultHealthCheckService(true);
|
||||
EXPECT_TRUE(DefaultHealthCheckServiceEnabled());
|
||||
std::unique_ptr<HealthCheckServiceInterface> empty_service;
|
||||
SetUpServer(true, false, true, std::move(empty_service));
|
||||
HealthCheckServiceInterface* service = server_->GetHealthCheckService();
|
||||
EXPECT_TRUE(service == nullptr);
|
||||
|
||||
ResetStubs();
|
||||
|
||||
SendHealthCheckRpc("", Status(StatusCode::UNIMPLEMENTED, ""));
|
||||
}
|
||||
|
||||
// Provide an explicit override of health checking service interface.
|
||||
TEST_F(HealthServiceEnd2endTest, ExplicitlyOverride) {
|
||||
EnableDefaultHealthCheckService(true);
|
||||
EXPECT_TRUE(DefaultHealthCheckServiceEnabled());
|
||||
std::unique_ptr<HealthCheckServiceInterface> override_service(
|
||||
new CustomHealthCheckService(&health_check_service_impl_));
|
||||
HealthCheckServiceInterface* underlying_service = override_service.get();
|
||||
SetUpServer(false, false, true, std::move(override_service));
|
||||
HealthCheckServiceInterface* service = server_->GetHealthCheckService();
|
||||
EXPECT_TRUE(service == underlying_service);
|
||||
|
||||
ResetStubs();
|
||||
|
||||
VerifyHealthCheckService();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
grpc_test_init(argc, argv);
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
|
@ -0,0 +1,382 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2017, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* This benchmark exists to ensure that the benchmark integration is
|
||||
* working */
|
||||
|
||||
#include <string.h>
|
||||
#include <sstream>
|
||||
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
extern "C" {
|
||||
#include "src/core/ext/client_channel/client_channel.h"
|
||||
#include "src/core/ext/load_reporting/load_reporting_filter.h"
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/channel/compress_filter.h"
|
||||
#include "src/core/lib/channel/connected_channel.h"
|
||||
#include "src/core/lib/channel/deadline_filter.h"
|
||||
#include "src/core/lib/channel/http_client_filter.h"
|
||||
#include "src/core/lib/channel/http_server_filter.h"
|
||||
#include "src/core/lib/channel/message_size_filter.h"
|
||||
#include "src/core/lib/transport/transport_impl.h"
|
||||
}
|
||||
|
||||
#include "third_party/benchmark/include/benchmark/benchmark.h"
|
||||
|
||||
static struct Init {
|
||||
Init() { grpc_init(); }
|
||||
~Init() { grpc_shutdown(); }
|
||||
} g_init;
|
||||
|
||||
static void BM_InsecureChannelWithDefaults(benchmark::State &state) {
|
||||
grpc_channel *channel =
|
||||
grpc_insecure_channel_create("localhost:12345", NULL, NULL);
|
||||
grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
|
||||
grpc_slice method = grpc_slice_from_static_string("/foo/bar");
|
||||
gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
|
||||
while (state.KeepRunning()) {
|
||||
grpc_call_destroy(grpc_channel_create_call(channel, NULL,
|
||||
GRPC_PROPAGATE_DEFAULTS, cq,
|
||||
method, NULL, deadline, NULL));
|
||||
}
|
||||
grpc_channel_destroy(channel);
|
||||
grpc_completion_queue_destroy(cq);
|
||||
}
|
||||
BENCHMARK(BM_InsecureChannelWithDefaults);
|
||||
|
||||
static void FilterDestroy(grpc_exec_ctx *exec_ctx, void *arg,
|
||||
grpc_error *error) {
|
||||
gpr_free(arg);
|
||||
}
|
||||
|
||||
static void DoNothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
|
||||
|
||||
class FakeClientChannelFactory : public grpc_client_channel_factory {
|
||||
public:
|
||||
FakeClientChannelFactory() { vtable = &vtable_; }
|
||||
|
||||
private:
|
||||
static void NoRef(grpc_client_channel_factory *factory) {}
|
||||
static void NoUnref(grpc_exec_ctx *exec_ctx,
|
||||
grpc_client_channel_factory *factory) {}
|
||||
static grpc_subchannel *CreateSubchannel(grpc_exec_ctx *exec_ctx,
|
||||
grpc_client_channel_factory *factory,
|
||||
const grpc_subchannel_args *args) {
|
||||
return nullptr;
|
||||
}
|
||||
static grpc_channel *CreateClientChannel(grpc_exec_ctx *exec_ctx,
|
||||
grpc_client_channel_factory *factory,
|
||||
const char *target,
|
||||
grpc_client_channel_type type,
|
||||
const grpc_channel_args *args) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static const grpc_client_channel_factory_vtable vtable_;
|
||||
};
|
||||
|
||||
const grpc_client_channel_factory_vtable FakeClientChannelFactory::vtable_ = {
|
||||
NoRef, NoUnref, CreateSubchannel, CreateClientChannel};
|
||||
|
||||
static grpc_arg StringArg(const char *key, const char *value) {
|
||||
grpc_arg a;
|
||||
a.type = GRPC_ARG_STRING;
|
||||
a.key = const_cast<char *>(key);
|
||||
a.value.string = const_cast<char *>(value);
|
||||
return a;
|
||||
}
|
||||
|
||||
enum FixtureFlags : uint32_t {
|
||||
CHECKS_NOT_LAST = 1,
|
||||
REQUIRES_TRANSPORT = 2,
|
||||
};
|
||||
|
||||
template <const grpc_channel_filter *kFilter, uint32_t kFlags>
|
||||
struct Fixture {
|
||||
const grpc_channel_filter *filter = kFilter;
|
||||
const uint32_t flags = kFlags;
|
||||
};
|
||||
|
||||
namespace dummy_filter {
|
||||
|
||||
static void StartTransportStreamOp(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_transport_stream_op *op) {}
|
||||
|
||||
static void StartTransportOp(grpc_exec_ctx *exec_ctx,
|
||||
grpc_channel_element *elem,
|
||||
grpc_transport_op *op) {}
|
||||
|
||||
static grpc_error *InitCallElem(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
const grpc_call_element_args *args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
static void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx,
|
||||
grpc_call_element *elem,
|
||||
grpc_polling_entity *pollent) {}
|
||||
|
||||
static void DestroyCallElem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
||||
const grpc_call_final_info *final_info,
|
||||
void *and_free_memory) {}
|
||||
|
||||
grpc_error *InitChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
|
||||
grpc_channel_element_args *args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
void DestroyChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem) {}
|
||||
|
||||
char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
|
||||
return gpr_strdup("peer");
|
||||
}
|
||||
|
||||
void GetChannelInfo(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
|
||||
const grpc_channel_info *channel_info) {}
|
||||
|
||||
static const grpc_channel_filter dummy_filter = {StartTransportStreamOp,
|
||||
StartTransportOp,
|
||||
0,
|
||||
InitCallElem,
|
||||
SetPollsetOrPollsetSet,
|
||||
DestroyCallElem,
|
||||
0,
|
||||
InitChannelElem,
|
||||
DestroyChannelElem,
|
||||
GetPeer,
|
||||
GetChannelInfo,
|
||||
"dummy_filter"};
|
||||
|
||||
} // namespace dummy_filter
|
||||
|
||||
namespace dummy_transport {
|
||||
|
||||
/* Memory required for a single stream element - this is allocated by upper
|
||||
layers and initialized by the transport */
|
||||
size_t sizeof_stream; /* = sizeof(transport stream) */
|
||||
|
||||
/* name of this transport implementation */
|
||||
const char *name;
|
||||
|
||||
/* implementation of grpc_transport_init_stream */
|
||||
int InitStream(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_stream *stream, grpc_stream_refcount *refcount,
|
||||
const void *server_data) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* implementation of grpc_transport_set_pollset */
|
||||
void SetPollset(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_stream *stream, grpc_pollset *pollset) {}
|
||||
|
||||
/* implementation of grpc_transport_set_pollset */
|
||||
void SetPollsetSet(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_stream *stream, grpc_pollset_set *pollset_set) {}
|
||||
|
||||
/* implementation of grpc_transport_perform_stream_op */
|
||||
void PerformStreamOp(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_stream *stream, grpc_transport_stream_op *op) {
|
||||
grpc_closure_sched(exec_ctx, op->on_complete, GRPC_ERROR_NONE);
|
||||
}
|
||||
|
||||
/* implementation of grpc_transport_perform_op */
|
||||
void PerformOp(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_transport_op *op) {}
|
||||
|
||||
/* implementation of grpc_transport_destroy_stream */
|
||||
void DestroyStream(grpc_exec_ctx *exec_ctx, grpc_transport *self,
|
||||
grpc_stream *stream, void *and_free_memory) {}
|
||||
|
||||
/* implementation of grpc_transport_destroy */
|
||||
void Destroy(grpc_exec_ctx *exec_ctx, grpc_transport *self) {}
|
||||
|
||||
/* implementation of grpc_transport_get_peer */
|
||||
char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_transport *self) {
|
||||
return gpr_strdup("transport_peer");
|
||||
}
|
||||
|
||||
/* implementation of grpc_transport_get_endpoint */
|
||||
grpc_endpoint *GetEndpoint(grpc_exec_ctx *exec_ctx, grpc_transport *self) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static const grpc_transport_vtable dummy_transport_vtable = {
|
||||
0, "dummy_http2", InitStream,
|
||||
SetPollset, SetPollsetSet, PerformStreamOp,
|
||||
PerformOp, DestroyStream, Destroy,
|
||||
GetPeer, GetEndpoint};
|
||||
|
||||
static grpc_transport dummy_transport = {&dummy_transport_vtable};
|
||||
|
||||
} // namespace dummy_transport
|
||||
|
||||
class NoOp {
|
||||
public:
|
||||
class Op {
|
||||
public:
|
||||
Op(grpc_exec_ctx *exec_ctx, NoOp *p, grpc_call_stack *s) {}
|
||||
void Finish(grpc_exec_ctx *exec_ctx) {}
|
||||
};
|
||||
};
|
||||
|
||||
class SendEmptyMetadata {
|
||||
public:
|
||||
SendEmptyMetadata() {
|
||||
memset(&op_, 0, sizeof(op_));
|
||||
op_.on_complete = grpc_closure_init(&closure_, DoNothing, nullptr,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
}
|
||||
|
||||
class Op {
|
||||
public:
|
||||
Op(grpc_exec_ctx *exec_ctx, SendEmptyMetadata *p, grpc_call_stack *s) {
|
||||
grpc_metadata_batch_init(&batch_);
|
||||
p->op_.send_initial_metadata = &batch_;
|
||||
}
|
||||
void Finish(grpc_exec_ctx *exec_ctx) {
|
||||
grpc_metadata_batch_destroy(exec_ctx, &batch_);
|
||||
}
|
||||
|
||||
private:
|
||||
grpc_metadata_batch batch_;
|
||||
};
|
||||
|
||||
private:
|
||||
const gpr_timespec deadline_ = gpr_inf_future(GPR_CLOCK_MONOTONIC);
|
||||
const gpr_timespec start_time_ = gpr_now(GPR_CLOCK_MONOTONIC);
|
||||
const grpc_slice method_ = grpc_slice_from_static_string("/foo/bar");
|
||||
grpc_transport_stream_op op_;
|
||||
grpc_closure closure_;
|
||||
};
|
||||
|
||||
// Test a filter in isolation. Fixture specifies the filter under test (use the
|
||||
// Fixture<> template to specify this), and TestOp defines some unit of work to
|
||||
// perform on said filter.
|
||||
template <class Fixture, class TestOp>
|
||||
static void BM_IsolatedFilter(benchmark::State &state) {
|
||||
Fixture fixture;
|
||||
std::ostringstream label;
|
||||
|
||||
std::vector<grpc_arg> args;
|
||||
FakeClientChannelFactory fake_client_channel_factory;
|
||||
args.push_back(grpc_client_channel_factory_create_channel_arg(
|
||||
&fake_client_channel_factory));
|
||||
args.push_back(StringArg(GRPC_ARG_SERVER_URI, "localhost"));
|
||||
|
||||
grpc_channel_args channel_args = {args.size(), &args[0]};
|
||||
|
||||
std::vector<const grpc_channel_filter *> filters;
|
||||
if (fixture.filter != nullptr) {
|
||||
filters.push_back(fixture.filter);
|
||||
}
|
||||
if (fixture.flags & CHECKS_NOT_LAST) {
|
||||
filters.push_back(&dummy_filter::dummy_filter);
|
||||
label << " #has_dummy_filter";
|
||||
}
|
||||
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
size_t channel_size = grpc_channel_stack_size(&filters[0], filters.size());
|
||||
grpc_channel_stack *channel_stack =
|
||||
static_cast<grpc_channel_stack *>(gpr_malloc(channel_size));
|
||||
GPR_ASSERT(GRPC_LOG_IF_ERROR(
|
||||
"call_stack_init",
|
||||
grpc_channel_stack_init(&exec_ctx, 1, FilterDestroy, channel_stack,
|
||||
&filters[0], filters.size(), &channel_args,
|
||||
fixture.flags & REQUIRES_TRANSPORT
|
||||
? &dummy_transport::dummy_transport
|
||||
: nullptr,
|
||||
"CHANNEL", channel_stack)));
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
grpc_call_stack *call_stack = static_cast<grpc_call_stack *>(
|
||||
gpr_malloc(channel_stack->call_stack_size));
|
||||
gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
|
||||
gpr_timespec start_time = gpr_now(GPR_CLOCK_MONOTONIC);
|
||||
grpc_slice method = grpc_slice_from_static_string("/foo/bar");
|
||||
grpc_call_final_info final_info;
|
||||
TestOp test_op_data;
|
||||
while (state.KeepRunning()) {
|
||||
GRPC_ERROR_UNREF(grpc_call_stack_init(&exec_ctx, channel_stack, 1,
|
||||
DoNothing, NULL, NULL, NULL, method,
|
||||
start_time, deadline, call_stack));
|
||||
typename TestOp::Op op(&exec_ctx, &test_op_data, call_stack);
|
||||
grpc_call_stack_destroy(&exec_ctx, call_stack, &final_info, NULL);
|
||||
op.Finish(&exec_ctx);
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
}
|
||||
grpc_channel_stack_destroy(&exec_ctx, channel_stack);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
gpr_free(channel_stack);
|
||||
gpr_free(call_stack);
|
||||
|
||||
state.SetLabel(label.str());
|
||||
}
|
||||
|
||||
typedef Fixture<nullptr, 0> NoFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, NoFilter, NoOp);
|
||||
typedef Fixture<&dummy_filter::dummy_filter, 0> DummyFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, DummyFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, DummyFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_client_channel_filter, 0> ClientChannelFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, ClientChannelFilter, NoOp);
|
||||
typedef Fixture<&grpc_compress_filter, CHECKS_NOT_LAST> CompressFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, CompressFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, CompressFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_client_deadline_filter, CHECKS_NOT_LAST>
|
||||
ClientDeadlineFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, ClientDeadlineFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, ClientDeadlineFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_server_deadline_filter, CHECKS_NOT_LAST>
|
||||
ServerDeadlineFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, ServerDeadlineFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, ServerDeadlineFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_http_client_filter, CHECKS_NOT_LAST | REQUIRES_TRANSPORT>
|
||||
HttpClientFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, HttpClientFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, HttpClientFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_http_server_filter, CHECKS_NOT_LAST> HttpServerFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, HttpServerFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, HttpServerFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_message_size_filter, CHECKS_NOT_LAST> MessageSizeFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, MessageSizeFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, MessageSizeFilter, SendEmptyMetadata);
|
||||
typedef Fixture<&grpc_load_reporting_filter, CHECKS_NOT_LAST>
|
||||
LoadReportingFilter;
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, LoadReportingFilter, NoOp);
|
||||
BENCHMARK_TEMPLATE(BM_IsolatedFilter, LoadReportingFilter, SendEmptyMetadata);
|
||||
|
||||
BENCHMARK_MAIN();
|
||||
|
|
@ -43,13 +43,53 @@ extern "C" {
|
|||
|
||||
#include "third_party/benchmark/include/benchmark/benchmark.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
extern "C" gpr_atm gpr_mu_locks;
|
||||
#endif
|
||||
|
||||
static class InitializeStuff {
|
||||
public:
|
||||
InitializeStuff() { grpc_init(); }
|
||||
~InitializeStuff() { grpc_shutdown(); }
|
||||
} initialize_stuff;
|
||||
|
||||
class TrackCounters {
|
||||
public:
|
||||
TrackCounters(benchmark::State& state) : state_(state) {}
|
||||
|
||||
~TrackCounters() {
|
||||
std::ostringstream out;
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
out << " locks/iter:" << ((double)(gpr_atm_no_barrier_load(&gpr_mu_locks) -
|
||||
mu_locks_at_start_) /
|
||||
(double)state_.iterations())
|
||||
<< " atm_cas/iter:"
|
||||
<< ((double)(gpr_atm_no_barrier_load(&gpr_counter_atm_cas) -
|
||||
atm_cas_at_start_) /
|
||||
(double)state_.iterations())
|
||||
<< " atm_add/iter:"
|
||||
<< ((double)(gpr_atm_no_barrier_load(&gpr_counter_atm_add) -
|
||||
atm_add_at_start_) /
|
||||
(double)state_.iterations());
|
||||
#endif
|
||||
state_.SetLabel(out.str());
|
||||
}
|
||||
|
||||
private:
|
||||
benchmark::State& state_;
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
const size_t mu_locks_at_start_ = gpr_atm_no_barrier_load(&gpr_mu_locks);
|
||||
const size_t atm_cas_at_start_ =
|
||||
gpr_atm_no_barrier_load(&gpr_counter_atm_cas);
|
||||
const size_t atm_add_at_start_ =
|
||||
gpr_atm_no_barrier_load(&gpr_counter_atm_add);
|
||||
#endif
|
||||
};
|
||||
|
||||
static void BM_NoOpExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
while (state.KeepRunning()) {
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
|
|
@ -58,6 +98,7 @@ static void BM_NoOpExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_NoOpExecCtx);
|
||||
|
||||
static void BM_WellFlushed(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
while (state.KeepRunning()) {
|
||||
grpc_exec_ctx_flush(&exec_ctx);
|
||||
|
|
@ -69,6 +110,7 @@ BENCHMARK(BM_WellFlushed);
|
|||
static void DoNothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
|
||||
|
||||
static void BM_ClosureInitAgainstExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_closure c;
|
||||
while (state.KeepRunning()) {
|
||||
benchmark::DoNotOptimize(
|
||||
|
|
@ -78,6 +120,7 @@ static void BM_ClosureInitAgainstExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureInitAgainstExecCtx);
|
||||
|
||||
static void BM_ClosureInitAgainstCombiner(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
grpc_closure c;
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
|
|
@ -91,6 +134,7 @@ static void BM_ClosureInitAgainstCombiner(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureInitAgainstCombiner);
|
||||
|
||||
static void BM_ClosureRunOnExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_closure c;
|
||||
grpc_closure_init(&c, DoNothing, NULL, grpc_schedule_on_exec_ctx);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
|
|
@ -103,6 +147,7 @@ static void BM_ClosureRunOnExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureRunOnExecCtx);
|
||||
|
||||
static void BM_ClosureCreateAndRun(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
while (state.KeepRunning()) {
|
||||
grpc_closure_run(&exec_ctx, grpc_closure_create(DoNothing, NULL,
|
||||
|
|
@ -114,6 +159,7 @@ static void BM_ClosureCreateAndRun(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureCreateAndRun);
|
||||
|
||||
static void BM_ClosureInitAndRun(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_closure c;
|
||||
while (state.KeepRunning()) {
|
||||
|
|
@ -126,6 +172,7 @@ static void BM_ClosureInitAndRun(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureInitAndRun);
|
||||
|
||||
static void BM_ClosureSchedOnExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_closure c;
|
||||
grpc_closure_init(&c, DoNothing, NULL, grpc_schedule_on_exec_ctx);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
|
|
@ -138,6 +185,7 @@ static void BM_ClosureSchedOnExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSchedOnExecCtx);
|
||||
|
||||
static void BM_ClosureSched2OnExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_closure c1;
|
||||
grpc_closure c2;
|
||||
grpc_closure_init(&c1, DoNothing, NULL, grpc_schedule_on_exec_ctx);
|
||||
|
|
@ -153,6 +201,7 @@ static void BM_ClosureSched2OnExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSched2OnExecCtx);
|
||||
|
||||
static void BM_ClosureSched3OnExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_closure c1;
|
||||
grpc_closure c2;
|
||||
grpc_closure c3;
|
||||
|
|
@ -171,6 +220,7 @@ static void BM_ClosureSched3OnExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSched3OnExecCtx);
|
||||
|
||||
static void BM_AcquireMutex(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
// for comparison with the combiner stuff below
|
||||
gpr_mu mu;
|
||||
gpr_mu_init(&mu);
|
||||
|
|
@ -185,6 +235,7 @@ static void BM_AcquireMutex(benchmark::State& state) {
|
|||
BENCHMARK(BM_AcquireMutex);
|
||||
|
||||
static void BM_ClosureSchedOnCombiner(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
grpc_closure c;
|
||||
grpc_closure_init(&c, DoNothing, NULL,
|
||||
|
|
@ -200,6 +251,7 @@ static void BM_ClosureSchedOnCombiner(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSchedOnCombiner);
|
||||
|
||||
static void BM_ClosureSched2OnCombiner(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
grpc_closure c1;
|
||||
grpc_closure c2;
|
||||
|
|
@ -219,6 +271,7 @@ static void BM_ClosureSched2OnCombiner(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSched2OnCombiner);
|
||||
|
||||
static void BM_ClosureSched3OnCombiner(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
grpc_closure c1;
|
||||
grpc_closure c2;
|
||||
|
|
@ -242,6 +295,7 @@ static void BM_ClosureSched3OnCombiner(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSched3OnCombiner);
|
||||
|
||||
static void BM_ClosureSched2OnTwoCombiners(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner1 = grpc_combiner_create(NULL);
|
||||
grpc_combiner* combiner2 = grpc_combiner_create(NULL);
|
||||
grpc_closure c1;
|
||||
|
|
@ -263,6 +317,7 @@ static void BM_ClosureSched2OnTwoCombiners(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureSched2OnTwoCombiners);
|
||||
|
||||
static void BM_ClosureSched4OnTwoCombiners(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_combiner* combiner1 = grpc_combiner_create(NULL);
|
||||
grpc_combiner* combiner2 = grpc_combiner_create(NULL);
|
||||
grpc_closure c1;
|
||||
|
|
@ -323,6 +378,7 @@ class Rescheduler {
|
|||
};
|
||||
|
||||
static void BM_ClosureReschedOnExecCtx(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
Rescheduler r(state, grpc_schedule_on_exec_ctx);
|
||||
r.ScheduleFirst(&exec_ctx);
|
||||
|
|
@ -331,6 +387,7 @@ static void BM_ClosureReschedOnExecCtx(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureReschedOnExecCtx);
|
||||
|
||||
static void BM_ClosureReschedOnCombiner(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
Rescheduler r(state, grpc_combiner_scheduler(combiner, false));
|
||||
|
|
@ -342,6 +399,7 @@ static void BM_ClosureReschedOnCombiner(benchmark::State& state) {
|
|||
BENCHMARK(BM_ClosureReschedOnCombiner);
|
||||
|
||||
static void BM_ClosureReschedOnCombinerFinally(benchmark::State& state) {
|
||||
TrackCounters track_counters(state);
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_combiner* combiner = grpc_combiner_create(NULL);
|
||||
Rescheduler r(state, grpc_combiner_finally_scheduler(combiner, false));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2015, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* This benchmark exists to ensure that the benchmark integration is
|
||||
* working */
|
||||
|
||||
#include <grpc++/completion_queue.h>
|
||||
#include <grpc++/impl/grpc_library.h>
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
#include "third_party/benchmark/include/benchmark/benchmark.h"
|
||||
|
||||
extern "C" {
|
||||
#include "src/core/lib/surface/completion_queue.h"
|
||||
}
|
||||
|
||||
namespace grpc {
|
||||
namespace testing {
|
||||
|
||||
static class InitializeStuff {
|
||||
public:
|
||||
InitializeStuff() { init_lib_.init(); }
|
||||
~InitializeStuff() { init_lib_.shutdown(); }
|
||||
|
||||
private:
|
||||
internal::GrpcLibrary init_lib_;
|
||||
internal::GrpcLibraryInitializer init_;
|
||||
} initialize_stuff;
|
||||
|
||||
static void BM_CreateDestroyCpp(benchmark::State& state) {
|
||||
while (state.KeepRunning()) {
|
||||
CompletionQueue cq;
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_CreateDestroyCpp);
|
||||
|
||||
static void BM_CreateDestroyCore(benchmark::State& state) {
|
||||
while (state.KeepRunning()) {
|
||||
grpc_completion_queue_destroy(grpc_completion_queue_create(NULL));
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_CreateDestroyCore);
|
||||
|
||||
static void DoneWithCompletionOnStack(grpc_exec_ctx* exec_ctx, void* arg,
|
||||
grpc_cq_completion* completion) {}
|
||||
|
||||
class DummyTag final : public CompletionQueueTag {
|
||||
public:
|
||||
bool FinalizeResult(void** tag, bool* status) override { return true; }
|
||||
};
|
||||
|
||||
static void BM_Pass1Cpp(benchmark::State& state) {
|
||||
CompletionQueue cq;
|
||||
grpc_completion_queue* c_cq = cq.cq();
|
||||
while (state.KeepRunning()) {
|
||||
grpc_cq_completion completion;
|
||||
DummyTag dummy_tag;
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_cq_begin_op(c_cq, &dummy_tag);
|
||||
grpc_cq_end_op(&exec_ctx, c_cq, &dummy_tag, GRPC_ERROR_NONE,
|
||||
DoneWithCompletionOnStack, NULL, &completion);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
void* tag;
|
||||
bool ok;
|
||||
cq.Next(&tag, &ok);
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_Pass1Cpp);
|
||||
|
||||
static void BM_Pass1Core(benchmark::State& state) {
|
||||
grpc_completion_queue* cq = grpc_completion_queue_create(NULL);
|
||||
gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
|
||||
while (state.KeepRunning()) {
|
||||
grpc_cq_completion completion;
|
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
||||
grpc_cq_begin_op(cq, NULL);
|
||||
grpc_cq_end_op(&exec_ctx, cq, NULL, GRPC_ERROR_NONE,
|
||||
DoneWithCompletionOnStack, NULL, &completion);
|
||||
grpc_exec_ctx_finish(&exec_ctx);
|
||||
grpc_completion_queue_next(cq, deadline, NULL);
|
||||
}
|
||||
grpc_completion_queue_destroy(cq);
|
||||
}
|
||||
BENCHMARK(BM_Pass1Core);
|
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
||||
|
||||
BENCHMARK_MAIN();
|
||||
|
|
@ -99,8 +99,10 @@ static void ApplyCommonChannelArguments(ChannelArguments* c) {
|
|||
c->SetInt(GRPC_ARG_MAX_SEND_MESSAGE_LENGTH, INT_MAX);
|
||||
}
|
||||
|
||||
#ifdef GPR_MU_COUNTERS
|
||||
extern "C" gpr_atm grpc_mu_locks;
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
extern "C" gpr_atm gpr_mu_locks;
|
||||
extern "C" gpr_atm gpr_counter_atm_cas;
|
||||
extern "C" gpr_atm gpr_counter_atm_add;
|
||||
#endif
|
||||
|
||||
class BaseFixture {
|
||||
|
|
@ -108,10 +110,18 @@ class BaseFixture {
|
|||
void Finish(benchmark::State& s) {
|
||||
std::ostringstream out;
|
||||
this->AddToLabel(out, s);
|
||||
#ifdef GPR_MU_COUNTERS
|
||||
out << " locks/iter:" << ((double)(gpr_atm_no_barrier_load(&grpc_mu_locks) -
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
out << " locks/iter:" << ((double)(gpr_atm_no_barrier_load(&gpr_mu_locks) -
|
||||
mu_locks_at_start_) /
|
||||
(double)s.iterations());
|
||||
(double)s.iterations())
|
||||
<< " atm_cas/iter:"
|
||||
<< ((double)(gpr_atm_no_barrier_load(&gpr_counter_atm_cas) -
|
||||
atm_cas_at_start_) /
|
||||
(double)s.iterations())
|
||||
<< " atm_add/iter:"
|
||||
<< ((double)(gpr_atm_no_barrier_load(&gpr_counter_atm_add) -
|
||||
atm_add_at_start_) /
|
||||
(double)s.iterations());
|
||||
#endif
|
||||
grpc_memory_counters counters_at_end = grpc_memory_counters_snapshot();
|
||||
out << " allocs/iter:"
|
||||
|
|
@ -128,8 +138,12 @@ class BaseFixture {
|
|||
virtual void AddToLabel(std::ostream& out, benchmark::State& s) = 0;
|
||||
|
||||
private:
|
||||
#ifdef GPR_MU_COUNTERS
|
||||
const size_t mu_locks_at_start_ = gpr_atm_no_barrier_load(&grpc_mu_locks);
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
const size_t mu_locks_at_start_ = gpr_atm_no_barrier_load(&gpr_mu_locks);
|
||||
const size_t atm_cas_at_start_ =
|
||||
gpr_atm_no_barrier_load(&gpr_counter_atm_cas);
|
||||
const size_t atm_add_at_start_ =
|
||||
gpr_atm_no_barrier_load(&gpr_counter_atm_add);
|
||||
#endif
|
||||
grpc_memory_counters counters_at_start_ = grpc_memory_counters_snapshot();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
licenses(["notice"]) # 3-clause BSD
|
||||
|
||||
cc_library(
|
||||
name = "test_config",
|
||||
srcs = [
|
||||
"test_config_cc.cc",
|
||||
],
|
||||
hdrs = [
|
||||
"test_config.h",
|
||||
],
|
||||
visibility = ["//test:__subpackages__"],
|
||||
deps = [
|
||||
"//:gpr",
|
||||
"//external:gflags",
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "test_util",
|
||||
srcs = [
|
||||
# "test/cpp/end2end/test_service_impl.cc",
|
||||
"byte_buffer_proto_helper.cc",
|
||||
"create_test_channel.cc",
|
||||
"string_ref_helper.cc",
|
||||
"subprocess.cc",
|
||||
"test_credentials_provider.cc",
|
||||
],
|
||||
hdrs = [
|
||||
"byte_buffer_proto_helper.h",
|
||||
"create_test_channel.h",
|
||||
"string_ref_helper.h",
|
||||
"subprocess.h",
|
||||
"test_credentials_provider.h",
|
||||
],
|
||||
visibility = ["//test:__subpackages__"],
|
||||
deps = [
|
||||
"//:grpc++",
|
||||
"//test/core/end2end:ssl_test_data",
|
||||
"//test/core/util:gpr_test_util",
|
||||
],
|
||||
)
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit f8a0efe03aa69b3336d8e228b37d4ccb17324b88
|
||||
Subproject commit 30dbc81fb5ffdc98ea9b14b1918bfe4e8779b26e
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
cc_library(
|
||||
name = "gtest",
|
||||
srcs = [
|
||||
"src/gtest-all.cc",
|
||||
],
|
||||
hdrs = glob(["include/**/*.h", "src/*.cc", "src/*.h"]),
|
||||
includes = [
|
||||
"include", "."
|
||||
],
|
||||
linkstatic = 1,
|
||||
visibility = [
|
||||
"//visibility:public",
|
||||
],
|
||||
)
|
||||
|
|
@ -106,6 +106,8 @@ _EXEMPT = frozenset((
|
|||
|
||||
'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
|
||||
'src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
|
||||
'src/cpp/server/health/health.pb.h',
|
||||
'src/cpp/server/health/health.pb.c',
|
||||
|
||||
# An older file originally from outside gRPC.
|
||||
'src/php/tests/bootstrap.php',
|
||||
|
|
|
|||
|
|
@ -795,9 +795,11 @@ include/grpc++/client_context.h \
|
|||
include/grpc++/completion_queue.h \
|
||||
include/grpc++/create_channel.h \
|
||||
include/grpc++/create_channel_posix.h \
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h \
|
||||
include/grpc++/generic/async_generic_service.h \
|
||||
include/grpc++/generic/generic_stub.h \
|
||||
include/grpc++/grpc++.h \
|
||||
include/grpc++/health_check_service_interface.h \
|
||||
include/grpc++/impl/call.h \
|
||||
include/grpc++/impl/client_unary_call.h \
|
||||
include/grpc++/impl/codegen/async_stream.h \
|
||||
|
|
|
|||
|
|
@ -795,9 +795,11 @@ include/grpc++/client_context.h \
|
|||
include/grpc++/completion_queue.h \
|
||||
include/grpc++/create_channel.h \
|
||||
include/grpc++/create_channel_posix.h \
|
||||
include/grpc++/ext/health_check_service_server_builder_option.h \
|
||||
include/grpc++/generic/async_generic_service.h \
|
||||
include/grpc++/generic/generic_stub.h \
|
||||
include/grpc++/grpc++.h \
|
||||
include/grpc++/health_check_service_interface.h \
|
||||
include/grpc++/impl/call.h \
|
||||
include/grpc++/impl/client_unary_call.h \
|
||||
include/grpc++/impl/codegen/async_stream.h \
|
||||
|
|
@ -913,6 +915,12 @@ src/cpp/server/async_generic_service.cc \
|
|||
src/cpp/server/create_default_thread_pool.cc \
|
||||
src/cpp/server/dynamic_thread_pool.cc \
|
||||
src/cpp/server/dynamic_thread_pool.h \
|
||||
src/cpp/server/health/default_health_check_service.cc \
|
||||
src/cpp/server/health/default_health_check_service.h \
|
||||
src/cpp/server/health/health.pb.c \
|
||||
src/cpp/server/health/health.pb.h \
|
||||
src/cpp/server/health/health_check_service.cc \
|
||||
src/cpp/server/health/health_check_service_server_builder_option.cc \
|
||||
src/cpp/server/insecure_server_credentials.cc \
|
||||
src/cpp/server/secure_server_credentials.cc \
|
||||
src/cpp/server/secure_server_credentials.h \
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
#!/bin/bash
|
||||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
|
|
@ -31,11 +30,11 @@
|
|||
# Config file for the internal CI (in protobuf text format)
|
||||
|
||||
# Location of the continuous shell script in repository.
|
||||
build_file: "grpc/tools/internal_ci/linux/grpc_interop.sh"
|
||||
build_file: "grpc/tools/internal_ci/linux/grpc_interop_badserver_java.sh"
|
||||
# grpc_interop tests can take 6+ hours to complete.
|
||||
timeout_mins: 480
|
||||
action {
|
||||
define_artifacts {
|
||||
regex: "**/sponge_log.xml"
|
||||
regex: "**/report.xml"
|
||||
}
|
||||
}
|
||||
|
|
@ -37,6 +37,5 @@ cd $(dirname $0)/../../..
|
|||
|
||||
git submodule update --init
|
||||
|
||||
tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --cloud_to_prod_auth --use_docker --http2_interop -t -j 12 $@ || FAILED="true"
|
||||
tools/run_tests/run_interop_tests.py -l java --use_docker --http2_badserver_interop $@ || FAILED="true"
|
||||
tools/run_tests/run_interop_tests.py -l python --use_docker --http2_badserver_interop $@ || FAILED="true"
|
||||
tools/run_tests/run_interop_tests.py -l java --use_docker --http2_badserver_interop $@
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Config file for the internal CI (in protobuf text format)
|
||||
|
||||
# Location of the continuous shell script in repository.
|
||||
build_file: "grpc/tools/internal_ci/linux/grpc_interop_badserver_python.sh"
|
||||
# grpc_interop tests can take 6+ hours to complete.
|
||||
timeout_mins: 480
|
||||
action {
|
||||
define_artifacts {
|
||||
regex: "**/report.xml"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2017, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
set -ex
|
||||
|
||||
export LANG=en_US.UTF-8
|
||||
|
||||
# Enter the gRPC repo root
|
||||
cd $(dirname $0)/../../..
|
||||
|
||||
git submodule update --init
|
||||
|
||||
tools/run_tests/run_interop_tests.py -l python --use_docker --http2_badserver_interop $@
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue