From 703abdbbb4e23a6b3054d504635c415191e7f543 Mon Sep 17 00:00:00 2001 From: erm-g <110920239+erm-g@users.noreply.github.com> Date: Wed, 7 Aug 2024 00:26:54 +0000 Subject: [PATCH 1/7] Automated change: Fix sanity tests --- CMakeLists.txt | 52 ++++++++++++++ build_autogenerated.yaml | 29 ++++++++ src/core/BUILD | 2 +- src/core/lib/experiments/experiments.cc | 2 +- src/core/lib/experiments/experiments.h | 3 - .../local/local_security_connector.cc | 3 +- .../unit/_contextvars_propagation_test.py | 4 +- test/core/end2end/end2end_tests.h | 4 +- test/core/end2end/tests/call_creds.cc | 4 +- .../security/local_security_connector_test.cc | 69 ++++++++----------- tools/run_tests/generated/tests.json | 24 +++++++ 11 files changed, 146 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fcae603d42e7..00f7233800b1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1242,6 +1242,7 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx load_config_test) add_dependencies(buildtests_cxx load_file_test) + add_dependencies(buildtests_cxx local_security_connector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx lock_free_event_test) endif() @@ -19926,6 +19927,57 @@ target_link_libraries(load_file_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(local_security_connector_test + test/core/security/local_security_connector_test.cc + test/core/test_util/cmdline.cc + test/core/test_util/fuzzer_util.cc + test/core/test_util/grpc_profiler.cc + test/core/test_util/histogram.cc + test/core/test_util/mock_endpoint.cc + test/core/test_util/parse_hexstring.cc + test/core/test_util/resolve_localhost_ip46.cc + test/core/test_util/slice_splitter.cc + test/core/test_util/tracer_util.cc +) +if(WIN32 AND MSVC) + if(BUILD_SHARED_LIBS) + target_compile_definitions(local_security_connector_test + PRIVATE + "GPR_DLL_IMPORTS" + "GRPC_DLL_IMPORTS" + ) + endif() +endif() +target_compile_features(local_security_connector_test PUBLIC cxx_std_14) +target_include_directories(local_security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(local_security_connector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest + grpc_test_util +) + + endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index b68115b43c2b0..483e38026841e 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -13306,6 +13306,35 @@ targets: - gtest - grpc_test_util uses_polling: false +- name: local_security_connector_test + gtest: true + build: test + language: c++ + headers: + - test/core/test_util/cmdline.h + - test/core/test_util/evaluate_args_test_util.h + - test/core/test_util/fuzzer_util.h + - test/core/test_util/grpc_profiler.h + - test/core/test_util/histogram.h + - test/core/test_util/mock_endpoint.h + - test/core/test_util/parse_hexstring.h + - test/core/test_util/resolve_localhost_ip46.h + - test/core/test_util/slice_splitter.h + - test/core/test_util/tracer_util.h + src: + - test/core/security/local_security_connector_test.cc + - test/core/test_util/cmdline.cc + - test/core/test_util/fuzzer_util.cc + - test/core/test_util/grpc_profiler.cc + - test/core/test_util/histogram.cc + - test/core/test_util/mock_endpoint.cc + - test/core/test_util/parse_hexstring.cc + - test/core/test_util/resolve_localhost_ip46.cc + - test/core/test_util/slice_splitter.cc + - test/core/test_util/tracer_util.cc + deps: + - gtest + - grpc_test_util - name: lock_free_event_test gtest: true build: test diff --git a/src/core/BUILD b/src/core/BUILD index 2ffc92a5aeace..4af318d88ece0 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -4069,9 +4069,9 @@ grpc_cc_library( "//:promise", "//:ref_counted_ptr", "//:sockaddr_utils", - "//src/core:experiments", "//:tsi_base", "//:uri_parser", + "//src/core:experiments", ], ) diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index 309169a4d49d7..7413beb4c31d0 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -442,7 +442,7 @@ const ExperimentMetadata g_experiment_metadata[] = { additional_constraints_free_large_allocator, nullptr, 0, false, true}, {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"max_pings_wo_data_throttle", description_max_pings_wo_data_throttle, + {"max_pings_wo_data_throttle", description_max_pings_wo_data_throttle, additional_constraints_max_pings_wo_data_throttle, nullptr, 0, false, true}, {"monitoring_experiment", description_monitoring_experiment, diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 0e4d8f0d95049..fac6b6395b310 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -67,7 +67,6 @@ inline bool IsEventEngineClientEnabled() { return false; } inline bool IsEventEngineDnsEnabled() { return false; } inline bool IsEventEngineListenerEnabled() { return false; } inline bool IsFreeLargeAllocatorEnabled() { return false; } -#define GRPC_EXPERIMENT_IS_INCLUDED_LOCAL_CONNECTOR_SECURE inline bool IsLocalConnectorSecureEnabled() { return false; } inline bool IsMaxPingsWoDataThrottleEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT @@ -103,7 +102,6 @@ inline bool IsEventEngineDnsEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_LISTENER inline bool IsEventEngineListenerEnabled() { return true; } inline bool IsFreeLargeAllocatorEnabled() { return false; } -#define GRPC_EXPERIMENT_IS_INCLUDED_LOCAL_CONNECTOR_SECURE inline bool IsLocalConnectorSecureEnabled() { return false; } inline bool IsMaxPingsWoDataThrottleEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT @@ -138,7 +136,6 @@ inline bool IsEventEngineDnsEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_LISTENER inline bool IsEventEngineListenerEnabled() { return true; } inline bool IsFreeLargeAllocatorEnabled() { return false; } -#define GRPC_EXPERIMENT_IS_INCLUDED_LOCAL_CONNECTOR_SECURE inline bool IsLocalConnectorSecureEnabled() { return false; } inline bool IsMaxPingsWoDataThrottleEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT diff --git a/src/core/lib/security/security_connector/local/local_security_connector.cc b/src/core/lib/security/security_connector/local/local_security_connector.cc index 9b5f52a70ddae..70f502399c3ac 100644 --- a/src/core/lib/security/security_connector/local/local_security_connector.cc +++ b/src/core/lib/security/security_connector/local/local_security_connector.cc @@ -149,7 +149,8 @@ void local_check_peer(tsi_peer peer, grpc_endpoint* ep, if (grpc_core::IsLocalConnectorSecureEnabled()) { switch (type) { case UDS: - security_level = tsi_security_level_to_string(TSI_PRIVACY_AND_INTEGRITY); + security_level = + tsi_security_level_to_string(TSI_PRIVACY_AND_INTEGRITY); break; default: security_level = tsi_security_level_to_string(TSI_SECURITY_NONE); diff --git a/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py b/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py index 1d2cb79db7716..36a971be68417 100644 --- a/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py +++ b/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py @@ -119,7 +119,9 @@ def test_propagation_to_auth_plugin(self): composite_credentials = grpc.composite_channel_credentials( local_credentials, call_credentials ) - with grpc.secure_channel(f"unix:{uds_path}", composite_credentials) as channel: + with grpc.secure_channel( + f"unix:{uds_path}", composite_credentials + ) as channel: stub = channel.unary_unary( grpc._common.fully_qualified_method( _SERVICE_NAME, _UNARY_UNARY diff --git a/test/core/end2end/end2end_tests.h b/test/core/end2end/end2end_tests.h index 8472b61e696eb..e664062a17ab2 100644 --- a/test/core/end2end/end2end_tests.h +++ b/test/core/end2end/end2end_tests.h @@ -684,9 +684,9 @@ class CoreEnd2endTestRegistry { GTEST_SKIP() << "Disabled for initial v3 testing"; \ } -#define SKIP_IF_LOCAL_CREDS() \ +#define SKIP_IF_LOCAL_CREDS() \ if (GetParam()->feature_mask & FEATURE_MASK_IS_LOCAL_CREDS) { \ - GTEST_SKIP() << "Disabled for Local TCP Connection"; \ + GTEST_SKIP() << "Disabled for Local TCP Connection"; \ } #define CORE_END2END_TEST(suite, name) \ diff --git a/test/core/end2end/tests/call_creds.cc b/test/core/end2end/tests/call_creds.cc index f07268f0f6c60..2fb1e8eb067f7 100644 --- a/test/core/end2end/tests/call_creds.cc +++ b/test/core/end2end/tests/call_creds.cc @@ -264,7 +264,7 @@ CORE_END2END_TEST(PerCallCredsOnInsecureTest, } CORE_END2END_TEST(PerCallCredsTest, RequestResponseWithPayloadAndCallCreds) { - if (grpc_core::IsLocalConnectorSecureEnabled()) { + if (IsLocalConnectorSecureEnabled()) { SKIP_IF_LOCAL_CREDS(); } TestRequestResponseWithPayloadAndCallCreds(*this, true); @@ -272,7 +272,7 @@ CORE_END2END_TEST(PerCallCredsTest, RequestResponseWithPayloadAndCallCreds) { CORE_END2END_TEST(PerCallCredsTest, RequestResponseWithPayloadAndOverriddenCallCreds) { - if (grpc_core::IsLocalConnectorSecureEnabled()) { + if (IsLocalConnectorSecureEnabled()) { SKIP_IF_LOCAL_CREDS(); } TestRequestResponseWithPayloadAndOverriddenCallCreds(*this, true); diff --git a/test/core/security/local_security_connector_test.cc b/test/core/security/local_security_connector_test.cc index c3a0b2a8c4090..a6c14c7871ab8 100644 --- a/test/core/security/local_security_connector_test.cc +++ b/test/core/security/local_security_connector_test.cc @@ -18,53 +18,40 @@ #include +#include + +#include "src/core/client_channel/client_channel_filter.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/tsi/transport_security.h" #include "test/core/test_util/test_config.h" -#include "src/core/client_channel/client_channel_filter.h" -#include "include/grpc/impl/grpc_types.h" namespace grpc_core { namespace testing { namespace { -absl::string_view GetLocalUnixAddress(grpc_endpoint* /*ep*/) { - return "unix:"; -} +absl::string_view GetLocalUnixAddress(grpc_endpoint* /*ep*/) { return "unix:"; } -const grpc_endpoint_vtable kUnixEndpointVtable = {nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - GetLocalUnixAddress, - nullptr, - nullptr}; +const grpc_endpoint_vtable kUnixEndpointVtable = { + nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, GetLocalUnixAddress, + nullptr, nullptr}; absl::string_view GetLocalTcpAddress(grpc_endpoint* /*ep*/) { return "ipv4:127.0.0.1:12667"; } -const grpc_endpoint_vtable kTcpEndpointVtable = {nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - GetLocalTcpAddress, - nullptr, - nullptr}; +const grpc_endpoint_vtable kTcpEndpointVtable = { + nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, GetLocalTcpAddress, + nullptr, nullptr}; void CheckSecurityLevelForServer(grpc_local_connect_type connect_type, - tsi_security_level level, - grpc_endpoint ep) { - grpc_server_credentials* server_creds = grpc_local_server_credentials_create(connect_type); + tsi_security_level level, grpc_endpoint ep) { + grpc_server_credentials* server_creds = + grpc_local_server_credentials_create(connect_type); ChannelArgs args; - RefCountedPtr connector = server_creds-> - create_security_connector(args); + RefCountedPtr connector = + server_creds->create_security_connector(args); ASSERT_NE(connector, nullptr); tsi_peer peer; CHECK(tsi_construct_peer(0, &peer) == TSI_OK); @@ -82,14 +69,14 @@ void CheckSecurityLevelForServer(grpc_local_connect_type connect_type, grpc_server_credentials_release(server_creds); } -static void CheckSecurityLevelForChannel(grpc_local_connect_type connect_type, - tsi_security_level level, - grpc_endpoint ep) { - grpc_channel_credentials* channel_creds = grpc_local_credentials_create(connect_type); +void CheckSecurityLevelForChannel(grpc_local_connect_type connect_type, + tsi_security_level level, grpc_endpoint ep) { + grpc_channel_credentials* channel_creds = + grpc_local_credentials_create(connect_type); ChannelArgs args; - args = args.Set((char*) GRPC_ARG_SERVER_URI, (char*) "unix:"); - RefCountedPtr connector = channel_creds-> - create_security_connector(nullptr, "unix:", &args); + args = args.Set((char*)GRPC_ARG_SERVER_URI, (char*)"unix:"); + RefCountedPtr connector = + channel_creds->create_security_connector(nullptr, "unix:", &args); ASSERT_NE(connector, nullptr); tsi_peer peer; CHECK(tsi_construct_peer(0, &peer) == TSI_OK); @@ -115,7 +102,9 @@ TEST(LocalSecurityConnectorTest, CheckSecurityLevelOfUdsConnectionServer) { } TEST(LocalSecurityConnectorTest, SecurityLevelOfTcpConnectionServer) { - if (!grpc_core::IsLocalConnectorSecureEnabled()) {return;} + if (!IsLocalConnectorSecureEnabled()) { + return; + } grpc_endpoint ep; ep.vtable = &kTcpEndpointVtable; CheckSecurityLevelForServer(LOCAL_TCP, TSI_SECURITY_NONE, ep); @@ -128,7 +117,9 @@ TEST(LocalSecurityConnectorTest, CheckSecurityLevelOfUdsConnectionChannel) { } TEST(LocalSecurityConnectorTest, SecurityLevelOfTcpConnectionChannel) { - if (!grpc_core::IsLocalConnectorSecureEnabled()) {return;} + if (!IsLocalConnectorSecureEnabled()) { + return; + } grpc_endpoint ep; ep.vtable = &kTcpEndpointVtable; CheckSecurityLevelForChannel(LOCAL_TCP, TSI_SECURITY_NONE, ep); diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index b1539ab9fff52..4f914307028b9 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5929,6 +5929,30 @@ ], "uses_polling": false }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "local_security_connector_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [ "--benchmark_min_time=0.001s" From 8990bebd1476edcc4a790411be8f1d551c2f700a Mon Sep 17 00:00:00 2001 From: Andrey Ermolov Date: Thu, 8 Aug 2024 21:45:23 +0000 Subject: [PATCH 2/7] Rolling back conflicts --- CMakeLists.txt | 52 ---------------------------- build_autogenerated.yaml | 29 ---------------- tools/run_tests/generated/tests.json | 24 ------------- 3 files changed, 105 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00f7233800b1e..3fcae603d42e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1242,7 +1242,6 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx load_config_test) add_dependencies(buildtests_cxx load_file_test) - add_dependencies(buildtests_cxx local_security_connector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx lock_free_event_test) endif() @@ -19927,57 +19926,6 @@ target_link_libraries(load_file_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(local_security_connector_test - test/core/security/local_security_connector_test.cc - test/core/test_util/cmdline.cc - test/core/test_util/fuzzer_util.cc - test/core/test_util/grpc_profiler.cc - test/core/test_util/histogram.cc - test/core/test_util/mock_endpoint.cc - test/core/test_util/parse_hexstring.cc - test/core/test_util/resolve_localhost_ip46.cc - test/core/test_util/slice_splitter.cc - test/core/test_util/tracer_util.cc -) -if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(local_security_connector_test - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() -endif() -target_compile_features(local_security_connector_test PUBLIC cxx_std_14) -target_include_directories(local_security_connector_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(local_security_connector_test - ${_gRPC_ALLTARGETS_LIBRARIES} - gtest - grpc_test_util -) - - endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 483e38026841e..b68115b43c2b0 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -13306,35 +13306,6 @@ targets: - gtest - grpc_test_util uses_polling: false -- name: local_security_connector_test - gtest: true - build: test - language: c++ - headers: - - test/core/test_util/cmdline.h - - test/core/test_util/evaluate_args_test_util.h - - test/core/test_util/fuzzer_util.h - - test/core/test_util/grpc_profiler.h - - test/core/test_util/histogram.h - - test/core/test_util/mock_endpoint.h - - test/core/test_util/parse_hexstring.h - - test/core/test_util/resolve_localhost_ip46.h - - test/core/test_util/slice_splitter.h - - test/core/test_util/tracer_util.h - src: - - test/core/security/local_security_connector_test.cc - - test/core/test_util/cmdline.cc - - test/core/test_util/fuzzer_util.cc - - test/core/test_util/grpc_profiler.cc - - test/core/test_util/histogram.cc - - test/core/test_util/mock_endpoint.cc - - test/core/test_util/parse_hexstring.cc - - test/core/test_util/resolve_localhost_ip46.cc - - test/core/test_util/slice_splitter.cc - - test/core/test_util/tracer_util.cc - deps: - - gtest - - grpc_test_util - name: lock_free_event_test gtest: true build: test diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 4f914307028b9..b1539ab9fff52 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5929,30 +5929,6 @@ ], "uses_polling": false }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "local_security_connector_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [ "--benchmark_min_time=0.001s" From 06154629e2e15309f93d35953149dfb4618af87c Mon Sep 17 00:00:00 2001 From: erm-g <110920239+erm-g@users.noreply.github.com> Date: Thu, 8 Aug 2024 22:07:09 +0000 Subject: [PATCH 3/7] Automated change: Fix sanity tests --- CMakeLists.txt | 52 ++++++++++++++++++++++++++++ build_autogenerated.yaml | 29 ++++++++++++++++ tools/run_tests/generated/tests.json | 24 +++++++++++++ 3 files changed, 105 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fcae603d42e7..00f7233800b1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1242,6 +1242,7 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx load_config_test) add_dependencies(buildtests_cxx load_file_test) + add_dependencies(buildtests_cxx local_security_connector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx lock_free_event_test) endif() @@ -19926,6 +19927,57 @@ target_link_libraries(load_file_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(local_security_connector_test + test/core/security/local_security_connector_test.cc + test/core/test_util/cmdline.cc + test/core/test_util/fuzzer_util.cc + test/core/test_util/grpc_profiler.cc + test/core/test_util/histogram.cc + test/core/test_util/mock_endpoint.cc + test/core/test_util/parse_hexstring.cc + test/core/test_util/resolve_localhost_ip46.cc + test/core/test_util/slice_splitter.cc + test/core/test_util/tracer_util.cc +) +if(WIN32 AND MSVC) + if(BUILD_SHARED_LIBS) + target_compile_definitions(local_security_connector_test + PRIVATE + "GPR_DLL_IMPORTS" + "GRPC_DLL_IMPORTS" + ) + endif() +endif() +target_compile_features(local_security_connector_test PUBLIC cxx_std_14) +target_include_directories(local_security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(local_security_connector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest + grpc_test_util +) + + endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index b68115b43c2b0..483e38026841e 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -13306,6 +13306,35 @@ targets: - gtest - grpc_test_util uses_polling: false +- name: local_security_connector_test + gtest: true + build: test + language: c++ + headers: + - test/core/test_util/cmdline.h + - test/core/test_util/evaluate_args_test_util.h + - test/core/test_util/fuzzer_util.h + - test/core/test_util/grpc_profiler.h + - test/core/test_util/histogram.h + - test/core/test_util/mock_endpoint.h + - test/core/test_util/parse_hexstring.h + - test/core/test_util/resolve_localhost_ip46.h + - test/core/test_util/slice_splitter.h + - test/core/test_util/tracer_util.h + src: + - test/core/security/local_security_connector_test.cc + - test/core/test_util/cmdline.cc + - test/core/test_util/fuzzer_util.cc + - test/core/test_util/grpc_profiler.cc + - test/core/test_util/histogram.cc + - test/core/test_util/mock_endpoint.cc + - test/core/test_util/parse_hexstring.cc + - test/core/test_util/resolve_localhost_ip46.cc + - test/core/test_util/slice_splitter.cc + - test/core/test_util/tracer_util.cc + deps: + - gtest + - grpc_test_util - name: lock_free_event_test gtest: true build: test diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index b1539ab9fff52..4f914307028b9 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5929,6 +5929,30 @@ ], "uses_polling": false }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "local_security_connector_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [ "--benchmark_min_time=0.001s" From b4a0a00c9024f23eb02254c12c925bd15496fb5f Mon Sep 17 00:00:00 2001 From: Andrey Ermolov Date: Thu, 8 Aug 2024 22:19:36 +0000 Subject: [PATCH 4/7] Rollback style PR --- CMakeLists.txt | 921 +++++++-------------------- build_autogenerated.yaml | 748 +++++----------------- tools/run_tests/generated/tests.json | 316 ++------- 3 files changed, 422 insertions(+), 1563 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00f7233800b1e..da48ca9f836af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,11 +25,11 @@ cmake_minimum_required(VERSION 3.13) set(PACKAGE_NAME "grpc") -set(PACKAGE_VERSION "1.66.0-dev") -set(gRPC_CORE_VERSION "42.0.0") -set(gRPC_CORE_SOVERSION "42") -set(gRPC_CPP_VERSION "1.66.0-dev") -set(gRPC_CPP_SOVERSION "1.66") +set(PACKAGE_VERSION "1.67.0-dev") +set(gRPC_CORE_VERSION "43.0.0") +set(gRPC_CORE_SOVERSION "43") +set(gRPC_CPP_VERSION "1.67.0-dev") +set(gRPC_CPP_SOVERSION "1.67") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") @@ -397,18 +397,18 @@ if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/envoy-api AND gRPC_DOWNLO # Download the archive via HTTP, validate the checksum, and extract to third_party/envoy-api. download_archive( ${CMAKE_CURRENT_SOURCE_DIR}/third_party/envoy-api - https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz - 1ee20b3041a4f093cc393448ab022f770e70b509c8fe8399d6e83017067b2fc3 - data-plane-api-091cfd044258312a56c632ae1860813b1c0c58bc + https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz + e525a6fb6e6ed3eef1eec6bef3da9b5708e471f0f9335a7604df14a4b386231e + data-plane-api-f8b75d1efa92bbf534596a013d9ca5873f79dd30 ) endif() if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/envoy-api AND gRPC_DOWNLOAD_ARCHIVES) # Download the archive via HTTP, validate the checksum, and extract to third_party/envoy-api. download_archive( ${CMAKE_CURRENT_SOURCE_DIR}/third_party/envoy-api - https://github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz - 1ee20b3041a4f093cc393448ab022f770e70b509c8fe8399d6e83017067b2fc3 - data-plane-api-091cfd044258312a56c632ae1860813b1c0c58bc + https://github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz + e525a6fb6e6ed3eef1eec6bef3da9b5708e471f0f9335a7604df14a4b386231e + data-plane-api-f8b75d1efa92bbf534596a013d9ca5873f79dd30 ) endif() # Setup external proto library at third_party/googleapis with 2 download URLs @@ -886,30 +886,6 @@ protobuf_generate_grpc_cpp_with_import_path_correction( if(gRPC_BUILD_TESTS) add_custom_target(buildtests_c) - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_call_spine) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_chaotic_good) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_client_call) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_client_channel) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_experiments) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_http_client_filter) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_inproc) - endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c bm_party) - endif() if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_c fd_conservation_posix_test) endif() @@ -917,9 +893,6 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX OR _gRPC_PLATFORM_WINDOWS) add_dependencies(buildtests_c pollset_windows_starvation_test) endif() - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_c static_stride_scheduler_benchmark) - endif() add_dependencies(buildtests_c test_core_iomgr_timer_list_test) add_custom_target(buildtests_cxx) @@ -1242,10 +1215,6 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx load_config_test) add_dependencies(buildtests_cxx load_file_test) - add_dependencies(buildtests_cxx local_security_connector_test) - if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - add_dependencies(buildtests_cxx lock_free_event_test) - endif() if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx log_too_many_open_files_test) endif() @@ -1253,7 +1222,6 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx map_pipe_test) add_dependencies(buildtests_cxx match_test) add_dependencies(buildtests_cxx matchers_test) - add_dependencies(buildtests_cxx max_concurrent_streams_policy_test) add_dependencies(buildtests_cxx max_concurrent_streams_test) add_dependencies(buildtests_cxx max_connection_age_test) add_dependencies(buildtests_cxx max_connection_idle_test) @@ -1404,6 +1372,7 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx retry_transparent_not_sent_on_wire_test) add_dependencies(buildtests_cxx retry_unref_before_finish_test) add_dependencies(buildtests_cxx retry_unref_before_recv_test) + add_dependencies(buildtests_cxx ring_buffer_test) add_dependencies(buildtests_cxx ring_hash_test) add_dependencies(buildtests_cxx rls_end2end_test) add_dependencies(buildtests_cxx rls_lb_config_parser_test) @@ -1558,6 +1527,7 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx try_join_test) add_dependencies(buildtests_cxx try_seq_metadata_test) add_dependencies(buildtests_cxx try_seq_test) + add_dependencies(buildtests_cxx unique_ptr_with_bitset_test) add_dependencies(buildtests_cxx unique_type_name_test) add_dependencies(buildtests_cxx unknown_frame_bad_client_test) add_dependencies(buildtests_cxx uri_parser_test) @@ -1938,7 +1908,6 @@ add_library(grpc src/core/ext/transport/chttp2/transport/hpack_parser_table.cc src/core/ext/transport/chttp2/transport/http2_settings.cc src/core/ext/transport/chttp2/transport/huffsyms.cc - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc src/core/ext/transport/chttp2/transport/parsing.cc src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc src/core/ext/transport/chttp2/transport/ping_callbacks.cc @@ -3035,7 +3004,6 @@ add_library(grpc_unsecure src/core/ext/transport/chttp2/transport/hpack_parser_table.cc src/core/ext/transport/chttp2/transport/http2_settings.cc src/core/ext/transport/chttp2/transport/huffsyms.cc - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc src/core/ext/transport/chttp2/transport/parsing.cc src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc src/core/ext/transport/chttp2/transport/ping_callbacks.cc @@ -3374,14 +3342,6 @@ add_library(grpc_unsecure src/core/util/json/json_reader.cc src/core/util/json/json_writer.cc src/core/util/latent_see.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ${gRPC_ADDITIONAL_DLL_SRC} ) @@ -3425,8 +3385,8 @@ target_include_directories(grpc_unsecure ) target_link_libraries(grpc_unsecure ${_gRPC_ALLTARGETS_LIBRARIES} - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib ${_gRPC_ZLIB_LIBRARIES} absl::algorithm_container absl::config @@ -3680,11 +3640,6 @@ add_library(upb_json_lib ${_gRPC_STATIC_WIN32} third_party/upb/upb/lex/strtod.c third_party/upb/upb/lex/unicode.c third_party/upb/upb/message/copy.c - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c third_party/upb/upb/reflection/def_pool.c third_party/upb/upb/reflection/def_type.c third_party/upb/upb/reflection/desc_state.c @@ -3702,9 +3657,6 @@ add_library(upb_json_lib ${_gRPC_STATIC_WIN32} third_party/upb/upb/reflection/method_def.c third_party/upb/upb/reflection/oneof_def.c third_party/upb/upb/reflection/service_def.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) target_compile_features(upb_json_lib PUBLIC cxx_std_14) @@ -3740,8 +3692,8 @@ target_include_directories(upb_json_lib ) target_link_libraries(upb_json_lib ${_gRPC_ALLTARGETS_LIBRARIES} - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib ) @@ -3875,17 +3827,73 @@ if(gRPC_INSTALL) endif() +add_library(upb_mini_descriptor_lib + third_party/upb/upb/hash/common.c + third_party/upb/upb/mini_descriptor/build_enum.c + third_party/upb/upb/mini_descriptor/decode.c + third_party/upb/upb/mini_descriptor/internal/base92.c + third_party/upb/upb/mini_descriptor/internal/encode.c + third_party/upb/upb/mini_descriptor/link.c + third_party/upb/upb/mini_table/extension_registry.c + third_party/upb/upb/mini_table/internal/message.c + third_party/upb/upb/mini_table/message.c +) + +target_compile_features(upb_mini_descriptor_lib PUBLIC cxx_std_14) + +set_target_properties(upb_mini_descriptor_lib PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(upb_mini_descriptor_lib PROPERTIES COMPILE_PDB_NAME "upb_mini_descriptor_lib" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/upb_mini_descriptor_lib.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(upb_mini_descriptor_lib + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(upb_mini_descriptor_lib + ${_gRPC_ALLTARGETS_LIBRARIES} + upb_base_lib + upb_mem_lib +) + + + +if(gRPC_INSTALL) + install(TARGETS upb_mini_descriptor_lib EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + add_library(upb_textformat_lib ${_gRPC_STATIC_WIN32} third_party/upb/upb/lex/atoi.c third_party/upb/upb/lex/round_trip.c third_party/upb/upb/lex/strtod.c third_party/upb/upb/lex/unicode.c third_party/upb/upb/message/copy.c - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c third_party/upb/upb/reflection/def_pool.c third_party/upb/upb/reflection/def_type.c third_party/upb/upb/reflection/desc_state.c @@ -3904,9 +3912,6 @@ add_library(upb_textformat_lib ${_gRPC_STATIC_WIN32} third_party/upb/upb/reflection/oneof_def.c third_party/upb/upb/reflection/service_def.c third_party/upb/upb/text/encode.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) target_compile_features(upb_textformat_lib PUBLIC cxx_std_14) @@ -3941,6 +3946,61 @@ target_include_directories(upb_textformat_lib ${_gRPC_ZLIB_INCLUDE_DIR} ) target_link_libraries(upb_textformat_lib + ${_gRPC_ALLTARGETS_LIBRARIES} + upb_mini_descriptor_lib + upb_wire_lib +) + + + +if(gRPC_INSTALL) + install(TARGETS upb_textformat_lib EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +add_library(upb_wire_lib + third_party/upb/upb/wire/decode.c + third_party/upb/upb/wire/encode.c + third_party/upb/upb/wire/internal/decode_fast.c +) + +target_compile_features(upb_wire_lib PUBLIC cxx_std_14) + +set_target_properties(upb_wire_lib PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(upb_wire_lib PROPERTIES COMPILE_PDB_NAME "upb_wire_lib" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/upb_wire_lib.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(upb_wire_lib + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(upb_wire_lib ${_gRPC_ALLTARGETS_LIBRARIES} utf8_range_lib upb_message_lib @@ -3949,7 +4009,7 @@ target_link_libraries(upb_textformat_lib if(gRPC_INSTALL) - install(TARGETS upb_textformat_lib EXPORT gRPCTargets + install(TARGETS upb_wire_lib EXPORT gRPCTargets RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} @@ -5450,14 +5510,6 @@ add_library(grpc_authorization_provider src/core/util/json/json_reader.cc src/core/util/json/json_writer.cc src/core/util/latent_see.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) target_compile_features(grpc_authorization_provider PUBLIC cxx_std_14) @@ -5500,8 +5552,8 @@ target_include_directories(grpc_authorization_provider ) target_link_libraries(grpc_authorization_provider ${_gRPC_ALLTARGETS_LIBRARIES} - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib ${_gRPC_RE2_LIBRARIES} ${_gRPC_ZLIB_LIBRARIES} absl::config @@ -5845,330 +5897,6 @@ endif() endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_call_spine - test/core/transport/bm_call_spine.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_call_spine - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_call_spine PUBLIC cxx_std_14) - target_include_directories(bm_call_spine - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_call_spine - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_chaotic_good - src/core/ext/transport/chaotic_good/client_transport.cc - src/core/ext/transport/chaotic_good/frame.cc - src/core/ext/transport/chaotic_good/frame_header.cc - src/core/ext/transport/chaotic_good/server_transport.cc - src/core/lib/transport/promise_endpoint.cc - test/core/test_util/passthrough_endpoint.cc - test/core/transport/benchmarks/bm_chaotic_good.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_chaotic_good - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_chaotic_good PUBLIC cxx_std_14) - target_include_directories(bm_chaotic_good - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_chaotic_good - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_client_call - test/core/call/bm_client_call.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_client_call - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_client_call PUBLIC cxx_std_14) - target_include_directories(bm_client_call - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_client_call - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_client_channel - test/core/client_channel/bm_client_channel.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_client_channel - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_client_channel PUBLIC cxx_std_14) - target_include_directories(bm_client_channel - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_client_channel - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_experiments - test/core/experiments/bm_experiments.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_experiments - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_experiments PUBLIC cxx_std_14) - target_include_directories(bm_experiments - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_experiments - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc_test_util - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_http_client_filter - test/core/filters/bm_http_client_filter.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_http_client_filter - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_http_client_filter PUBLIC cxx_std_14) - target_include_directories(bm_http_client_filter - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_http_client_filter - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_inproc - src/core/ext/transport/chaotic_good/client_transport.cc - src/core/ext/transport/chaotic_good/frame.cc - src/core/ext/transport/chaotic_good/frame_header.cc - src/core/ext/transport/chaotic_good/server_transport.cc - src/core/lib/transport/promise_endpoint.cc - test/core/test_util/passthrough_endpoint.cc - test/core/transport/benchmarks/bm_inproc.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_inproc - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_inproc PUBLIC cxx_std_14) - target_include_directories(bm_inproc - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_inproc - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(bm_party - test/core/promise/bm_party.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(bm_party - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(bm_party PUBLIC cxx_std_14) - target_include_directories(bm_party - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(bm_party - ${_gRPC_ALLTARGETS_LIBRARIES} - ${_gRPC_BENCHMARK_LIBRARIES} - grpc - ) - - -endif() -endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -6288,47 +6016,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX OR _gRPC_PLATFORM_WINDOWS) ) -endif() -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(static_stride_scheduler_benchmark - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc - test/core/load_balancing/static_stride_scheduler_benchmark.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(static_stride_scheduler_benchmark - PRIVATE - "GPR_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(static_stride_scheduler_benchmark PUBLIC cxx_std_14) - target_include_directories(static_stride_scheduler_benchmark - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - ) - - target_link_libraries(static_stride_scheduler_benchmark - ${_gRPC_ALLTARGETS_LIBRARIES} - absl::algorithm_container - absl::span - ${_gRPC_BENCHMARK_LIBRARIES} - gpr - ) - - endif() endif() if(gRPC_BUILD_TESTS) @@ -8983,14 +8670,6 @@ add_executable(call_filters_test src/core/lib/transport/timeout_encoding.cc src/core/util/latent_see.cc test/core/transport/call_filters_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -9023,8 +8702,8 @@ target_include_directories(call_filters_test target_link_libraries(call_filters_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::no_destructor absl::flat_hash_map @@ -9532,14 +9211,6 @@ add_executable(call_utils_test src/core/util/json/json_writer.cc src/core/util/latent_see.cc test/core/call/call_utils_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -9572,8 +9243,8 @@ target_include_directories(call_utils_test target_link_libraries(call_utils_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib ${_gRPC_ZLIB_LIBRARIES} absl::config absl::no_destructor @@ -9987,14 +9658,6 @@ add_executable(cancel_callback_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/promise/cancel_callback_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -10027,8 +9690,8 @@ target_include_directories(cancel_callback_test target_link_libraries(cancel_callback_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -11095,14 +10758,6 @@ add_executable(chunked_vector_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/gprpp/chunked_vector_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -11135,8 +10790,8 @@ target_include_directories(chunked_vector_test target_link_libraries(chunked_vector_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -14399,14 +14054,6 @@ add_executable(exec_ctx_wakeup_scheduler_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/promise/exec_ctx_wakeup_scheduler_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -14439,8 +14086,8 @@ target_include_directories(exec_ctx_wakeup_scheduler_test target_link_libraries(exec_ctx_wakeup_scheduler_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::hash @@ -15207,14 +14854,6 @@ add_executable(flow_control_test src/core/lib/transport/bdp_estimator.cc src/core/util/latent_see.cc test/core/transport/chttp2/flow_control_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -15247,8 +14886,8 @@ target_include_directories(flow_control_test target_link_libraries(flow_control_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -15293,14 +14932,6 @@ add_executable(for_each_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/promise/for_each_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -15333,8 +14964,8 @@ target_include_directories(for_each_test target_link_libraries(for_each_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -18840,14 +18471,6 @@ add_executable(interceptor_list_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/promise/interceptor_list_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -18880,8 +18503,8 @@ target_include_directories(interceptor_list_test target_link_libraries(interceptor_list_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -19927,102 +19550,6 @@ target_link_libraries(load_file_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(local_security_connector_test - test/core/security/local_security_connector_test.cc - test/core/test_util/cmdline.cc - test/core/test_util/fuzzer_util.cc - test/core/test_util/grpc_profiler.cc - test/core/test_util/histogram.cc - test/core/test_util/mock_endpoint.cc - test/core/test_util/parse_hexstring.cc - test/core/test_util/resolve_localhost_ip46.cc - test/core/test_util/slice_splitter.cc - test/core/test_util/tracer_util.cc -) -if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(local_security_connector_test - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() -endif() -target_compile_features(local_security_connector_test PUBLIC cxx_std_14) -target_include_directories(local_security_connector_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(local_security_connector_test - ${_gRPC_ALLTARGETS_LIBRARIES} - gtest - grpc_test_util -) - - -endif() -if(gRPC_BUILD_TESTS) -if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) - - add_executable(lock_free_event_test - test/core/event_engine/posix/lock_free_event_test.cc - ) - if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(lock_free_event_test - PRIVATE - "GPR_DLL_IMPORTS" - "GRPC_DLL_IMPORTS" - ) - endif() - endif() - target_compile_features(lock_free_event_test PUBLIC cxx_std_14) - target_include_directories(lock_free_event_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} - ) - - target_link_libraries(lock_free_event_test - ${_gRPC_ALLTARGETS_LIBRARIES} - gtest - ${_gRPC_BENCHMARK_LIBRARIES} - grpc_test_util - ) - - -endif() endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -20147,14 +19674,6 @@ add_executable(map_pipe_test src/core/lib/slice/slice_string_helpers.cc src/core/util/latent_see.cc test/core/promise/map_pipe_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -20187,8 +19706,8 @@ target_include_directories(map_pipe_test target_link_libraries(map_pipe_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::config absl::flat_hash_map absl::function_ref @@ -20282,48 +19801,6 @@ target_link_libraries(matchers_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(max_concurrent_streams_policy_test - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc - test/core/transport/chttp2/max_concurrent_streams_policy_test.cc -) -if(WIN32 AND MSVC) - if(BUILD_SHARED_LIBS) - target_compile_definitions(max_concurrent_streams_policy_test - PRIVATE - "GPR_DLL_IMPORTS" - ) - endif() -endif() -target_compile_features(max_concurrent_streams_policy_test PUBLIC cxx_std_14) -target_include_directories(max_concurrent_streams_policy_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(max_concurrent_streams_policy_test - ${_gRPC_ALLTARGETS_LIBRARIES} - gtest - gpr -) - - endif() if(gRPC_BUILD_TESTS) @@ -22412,6 +21889,7 @@ add_executable(periodic_update_test src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/glob.cc + src/core/lib/gprpp/per_cpu.cc src/core/lib/gprpp/status_helper.cc src/core/lib/gprpp/time.cc src/core/lib/iomgr/closure.cc @@ -22424,15 +21902,8 @@ add_executable(periodic_update_test src/core/lib/slice/percent_encoding.cc src/core/lib/slice/slice.cc src/core/lib/slice/slice_string_helpers.cc + src/core/util/latent_see.cc test/core/resource_quota/periodic_update_test.cc - third_party/upb/upb/mini_descriptor/build_enum.c - third_party/upb/upb/mini_descriptor/decode.c - third_party/upb/upb/mini_descriptor/internal/base92.c - third_party/upb/upb/mini_descriptor/internal/encode.c - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -22465,8 +21936,8 @@ target_include_directories(periodic_update_test target_link_libraries(periodic_update_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - utf8_range_lib - upb_message_lib + upb_mini_descriptor_lib + upb_wire_lib absl::flat_hash_map absl::function_ref absl::hash @@ -27193,6 +26664,38 @@ target_link_libraries(retry_unref_before_recv_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(ring_buffer_test + test/core/util/ring_buffer_test.cc +) +target_compile_features(ring_buffer_test PUBLIC cxx_std_14) +target_include_directories(ring_buffer_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(ring_buffer_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest +) + + endif() if(gRPC_BUILD_TESTS) @@ -32982,6 +32485,40 @@ target_link_libraries(try_seq_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(unique_ptr_with_bitset_test + test/core/util/unique_ptr_with_bitset_test.cc +) +target_compile_features(unique_ptr_with_bitset_test PUBLIC cxx_std_14) +target_include_directories(unique_ptr_with_bitset_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(unique_ptr_with_bitset_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest + absl::check + absl::bits +) + + endif() if(gRPC_BUILD_TESTS) @@ -38043,7 +37580,7 @@ generate_pkgconfig( "absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_optional absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant gpr" "libcares openssl re2 zlib" "-lgrpc" - "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_message_lib -lupb_mem_lib -lupb_base_lib -lutf8_range_lib" + "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_mini_descriptor_lib -lupb_mem_lib -lupb_base_lib" "grpc.pc") # grpc_unsecure .pc file @@ -38054,7 +37591,7 @@ generate_pkgconfig( "absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_optional absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant gpr" "libcares zlib" "-lgrpc_unsecure" - "-laddress_sorting -lupb_message_lib -lupb_mem_lib -lupb_base_lib -lutf8_range_lib" + "-laddress_sorting -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_mini_descriptor_lib -lupb_mem_lib -lupb_base_lib" "grpc_unsecure.pc") # grpc++ .pc file @@ -38065,7 +37602,7 @@ generate_pkgconfig( "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_optional absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant gpr grpc" "libcares openssl re2 zlib" "-lgrpc++" - "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_message_lib -lupb_mem_lib -lupb_base_lib -lutf8_range_lib" + "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_mini_descriptor_lib -lupb_mem_lib -lupb_base_lib" "grpc++.pc") # grpc++_unsecure .pc file @@ -38076,7 +37613,7 @@ generate_pkgconfig( "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_optional absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant gpr grpc_unsecure" "libcares zlib" "-lgrpc++_unsecure" - "-laddress_sorting -lupb_message_lib -lupb_mem_lib -lupb_base_lib -lutf8_range_lib" + "-laddress_sorting -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_mini_descriptor_lib -lupb_mem_lib -lupb_base_lib" "grpc++_unsecure.pc") # grpcpp_otel_plugin .pc file @@ -38087,5 +37624,5 @@ generate_pkgconfig( "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_optional absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant gpr grpc grpc++ opentelemetry_api" "libcares openssl re2 zlib" "-lgrpcpp_otel_plugin" - "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_message_lib -lupb_mem_lib -lupb_base_lib -lutf8_range_lib" + "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_mini_descriptor_lib -lupb_mem_lib -lupb_base_lib" "grpcpp_otel_plugin.pc") diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 483e38026841e..b95f89cafd6db 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -290,7 +290,6 @@ libs: - src/core/ext/transport/chttp2/transport/huffsyms.h - src/core/ext/transport/chttp2/transport/internal.h - src/core/ext/transport/chttp2/transport/legacy_frame.h - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h - src/core/ext/transport/chttp2/transport/ping_abuse_policy.h - src/core/ext/transport/chttp2/transport/ping_callbacks.h - src/core/ext/transport/chttp2/transport/ping_rate_policy.h @@ -1075,7 +1074,6 @@ libs: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/surface/api_trace.h - src/core/lib/surface/call.h - src/core/lib/surface/call_test_only.h - src/core/lib/surface/call_utils.h @@ -1219,7 +1217,9 @@ libs: - src/core/util/json/json_util.h - src/core/util/json/json_writer.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h + - src/core/util/unique_ptr_with_bitset.h - src/core/util/upb_utils.h - src/core/xds/grpc/certificate_provider_store.h - src/core/xds/grpc/file_watcher_certificate_provider_factory.h @@ -1320,7 +1320,6 @@ libs: - src/core/ext/transport/chttp2/transport/hpack_parser_table.cc - src/core/ext/transport/chttp2/transport/http2_settings.cc - src/core/ext/transport/chttp2/transport/huffsyms.cc - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc - src/core/ext/transport/chttp2/transport/parsing.cc - src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc - src/core/ext/transport/chttp2/transport/ping_callbacks.cc @@ -2290,7 +2289,6 @@ libs: - src/core/ext/transport/chttp2/transport/huffsyms.h - src/core/ext/transport/chttp2/transport/internal.h - src/core/ext/transport/chttp2/transport/legacy_frame.h - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h - src/core/ext/transport/chttp2/transport/ping_abuse_policy.h - src/core/ext/transport/chttp2/transport/ping_callbacks.h - src/core/ext/transport/chttp2/transport/ping_rate_policy.h @@ -2597,7 +2595,6 @@ libs: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/surface/api_trace.h - src/core/lib/surface/call.h - src/core/lib/surface/call_test_only.h - src/core/lib/surface/call_utils.h @@ -2707,23 +2704,11 @@ libs: - src/core/util/json/json_reader.h - src/core/util/json/json_writer.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h + - src/core/util/unique_ptr_with_bitset.h - src/core/util/upb_utils.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/channelz/channel_trace.cc - src/core/channelz/channelz.cc @@ -2780,7 +2765,6 @@ libs: - src/core/ext/transport/chttp2/transport/hpack_parser_table.cc - src/core/ext/transport/chttp2/transport/http2_settings.cc - src/core/ext/transport/chttp2/transport/huffsyms.cc - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc - src/core/ext/transport/chttp2/transport/parsing.cc - src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc - src/core/ext/transport/chttp2/transport/ping_callbacks.cc @@ -3119,17 +3103,9 @@ libs: - src/core/util/json/json_reader.cc - src/core/util/json/json_writer.cc - src/core/util/latent_see.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - z - absl/algorithm:container - absl/base:config @@ -3304,15 +3280,6 @@ libs: - third_party/upb/upb/lex/strtod.h - third_party/upb/upb/lex/unicode.h - third_party/upb/upb/message/copy.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - third_party/upb/upb/reflection/common.h - third_party/upb/upb/reflection/def.h - third_party/upb/upb/reflection/def.hpp @@ -3347,11 +3314,6 @@ libs: - third_party/upb/upb/reflection/method_def.h - third_party/upb/upb/reflection/oneof_def.h - third_party/upb/upb/reflection/service_def.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - third_party/upb/upb/json/decode.c - third_party/upb/upb/json/encode.c @@ -3360,11 +3322,6 @@ libs: - third_party/upb/upb/lex/strtod.c - third_party/upb/upb/lex/unicode.c - third_party/upb/upb/message/copy.c - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/reflection/def_pool.c - third_party/upb/upb/reflection/def_type.c - third_party/upb/upb/reflection/desc_state.c @@ -3382,12 +3339,9 @@ libs: - third_party/upb/upb/reflection/method_def.c - third_party/upb/upb/reflection/oneof_def.c - third_party/upb/upb/reflection/service_def.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - name: upb_mem_lib build: all language: c @@ -3470,16 +3424,18 @@ libs: deps: - upb_base_lib - upb_mem_lib -- name: upb_textformat_lib +- name: upb_mini_descriptor_lib build: all language: c public_headers: [] headers: - - third_party/upb/upb/lex/atoi.h - - third_party/upb/upb/lex/round_trip.h - - third_party/upb/upb/lex/strtod.h - - third_party/upb/upb/lex/unicode.h - - third_party/upb/upb/message/copy.h + - third_party/upb/upb/base/internal/endian.h + - third_party/upb/upb/base/internal/log2.h + - third_party/upb/upb/hash/common.h + - third_party/upb/upb/hash/int_table.h + - third_party/upb/upb/hash/str_table.h + - third_party/upb/upb/message/internal/map_entry.h + - third_party/upb/upb/message/internal/types.h - third_party/upb/upb/mini_descriptor/build_enum.h - third_party/upb/upb/mini_descriptor/decode.h - third_party/upb/upb/mini_descriptor/internal/base92.h @@ -3489,6 +3445,43 @@ libs: - third_party/upb/upb/mini_descriptor/internal/modifiers.h - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - third_party/upb/upb/mini_descriptor/link.h + - third_party/upb/upb/mini_table/enum.h + - third_party/upb/upb/mini_table/extension.h + - third_party/upb/upb/mini_table/extension_registry.h + - third_party/upb/upb/mini_table/field.h + - third_party/upb/upb/mini_table/file.h + - third_party/upb/upb/mini_table/internal/enum.h + - third_party/upb/upb/mini_table/internal/extension.h + - third_party/upb/upb/mini_table/internal/field.h + - third_party/upb/upb/mini_table/internal/file.h + - third_party/upb/upb/mini_table/internal/message.h + - third_party/upb/upb/mini_table/internal/size_log2.h + - third_party/upb/upb/mini_table/internal/sub.h + - third_party/upb/upb/mini_table/message.h + - third_party/upb/upb/mini_table/sub.h + src: + - third_party/upb/upb/hash/common.c + - third_party/upb/upb/mini_descriptor/build_enum.c + - third_party/upb/upb/mini_descriptor/decode.c + - third_party/upb/upb/mini_descriptor/internal/base92.c + - third_party/upb/upb/mini_descriptor/internal/encode.c + - third_party/upb/upb/mini_descriptor/link.c + - third_party/upb/upb/mini_table/extension_registry.c + - third_party/upb/upb/mini_table/internal/message.c + - third_party/upb/upb/mini_table/message.c + deps: + - upb_base_lib + - upb_mem_lib +- name: upb_textformat_lib + build: all + language: c + public_headers: [] + headers: + - third_party/upb/upb/lex/atoi.h + - third_party/upb/upb/lex/round_trip.h + - third_party/upb/upb/lex/strtod.h + - third_party/upb/upb/lex/unicode.h + - third_party/upb/upb/message/copy.h - third_party/upb/upb/reflection/common.h - third_party/upb/upb/reflection/def.h - third_party/upb/upb/reflection/def.hpp @@ -3524,22 +3517,12 @@ libs: - third_party/upb/upb/reflection/oneof_def.h - third_party/upb/upb/reflection/service_def.h - third_party/upb/upb/text/encode.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - third_party/upb/upb/lex/atoi.c - third_party/upb/upb/lex/round_trip.c - third_party/upb/upb/lex/strtod.c - third_party/upb/upb/lex/unicode.c - third_party/upb/upb/message/copy.c - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - third_party/upb/upb/reflection/def_pool.c - third_party/upb/upb/reflection/def_type.c - third_party/upb/upb/reflection/desc_state.c @@ -3558,6 +3541,20 @@ libs: - third_party/upb/upb/reflection/oneof_def.c - third_party/upb/upb/reflection/service_def.c - third_party/upb/upb/text/encode.c + deps: + - upb_mini_descriptor_lib + - upb_wire_lib +- name: upb_wire_lib + build: all + language: c + public_headers: [] + headers: + - third_party/upb/upb/wire/decode.h + - third_party/upb/upb/wire/encode.h + - third_party/upb/upb/wire/internal/constants.h + - third_party/upb/upb/wire/internal/decode_fast.h + - third_party/upb/upb/wire/internal/decoder.h + src: - third_party/upb/upb/wire/decode.c - third_party/upb/upb/wire/encode.c - third_party/upb/upb/wire/internal/decode_fast.c @@ -4691,7 +4688,6 @@ libs: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/surface/api_trace.h - src/core/lib/surface/call.h - src/core/lib/surface/call_test_only.h - src/core/lib/surface/call_utils.h @@ -4759,22 +4755,9 @@ libs: - src/core/util/json/json_reader.h - src/core/util/json/json_writer.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/channelz/channel_trace.cc - src/core/channelz/channelz.cc @@ -5041,17 +5024,9 @@ libs: - src/core/util/json/json_reader.cc - src/core/util/json/json_writer.cc - src/core/util/latent_see.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - re2 - z - absl/base:config @@ -5143,185 +5118,6 @@ libs: - grpc++ - opentelemetry-cpp::api targets: -- name: bm_call_spine - build: test - language: c - headers: - - test/core/transport/call_spine_benchmarks.h - src: - - test/core/transport/bm_call_spine.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_chaotic_good - build: test - language: c - headers: - - src/core/ext/transport/chaotic_good/chaotic_good_transport.h - - src/core/ext/transport/chaotic_good/client_transport.h - - src/core/ext/transport/chaotic_good/frame.h - - src/core/ext/transport/chaotic_good/frame_header.h - - src/core/ext/transport/chaotic_good/server_transport.h - - src/core/lib/promise/event_engine_wakeup_scheduler.h - - src/core/lib/promise/inter_activity_latch.h - - src/core/lib/promise/inter_activity_pipe.h - - src/core/lib/promise/mpsc.h - - src/core/lib/promise/switch.h - - src/core/lib/promise/wait_set.h - - src/core/lib/transport/promise_endpoint.h - - test/core/test_util/passthrough_endpoint.h - - test/core/transport/call_spine_benchmarks.h - src: - - src/core/ext/transport/chaotic_good/client_transport.cc - - src/core/ext/transport/chaotic_good/frame.cc - - src/core/ext/transport/chaotic_good/frame_header.cc - - src/core/ext/transport/chaotic_good/server_transport.cc - - src/core/lib/transport/promise_endpoint.cc - - test/core/test_util/passthrough_endpoint.cc - - test/core/transport/benchmarks/bm_chaotic_good.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_client_call - build: test - language: c - headers: [] - src: - - test/core/call/bm_client_call.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_client_channel - build: test - language: c - headers: - - test/core/transport/call_spine_benchmarks.h - src: - - test/core/client_channel/bm_client_channel.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_experiments - build: test - language: c - headers: [] - src: - - test/core/experiments/bm_experiments.cc - deps: - - benchmark - - grpc_test_util - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_http_client_filter - build: test - language: c - headers: - - test/core/transport/call_spine_benchmarks.h - src: - - test/core/filters/bm_http_client_filter.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_inproc - build: test - language: c - headers: - - src/core/ext/transport/chaotic_good/chaotic_good_transport.h - - src/core/ext/transport/chaotic_good/client_transport.h - - src/core/ext/transport/chaotic_good/frame.h - - src/core/ext/transport/chaotic_good/frame_header.h - - src/core/ext/transport/chaotic_good/server_transport.h - - src/core/lib/promise/event_engine_wakeup_scheduler.h - - src/core/lib/promise/inter_activity_latch.h - - src/core/lib/promise/inter_activity_pipe.h - - src/core/lib/promise/mpsc.h - - src/core/lib/promise/switch.h - - src/core/lib/promise/wait_set.h - - src/core/lib/transport/promise_endpoint.h - - test/core/test_util/passthrough_endpoint.h - - test/core/transport/call_spine_benchmarks.h - src: - - src/core/ext/transport/chaotic_good/client_transport.cc - - src/core/ext/transport/chaotic_good/frame.cc - - src/core/ext/transport/chaotic_good/frame_header.cc - - src/core/ext/transport/chaotic_good/server_transport.cc - - src/core/lib/transport/promise_endpoint.cc - - test/core/test_util/passthrough_endpoint.cc - - test/core/transport/benchmarks/bm_inproc.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false -- name: bm_party - build: test - language: c - headers: [] - src: - - test/core/promise/bm_party.cc - deps: - - benchmark - - grpc - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false - name: fd_conservation_posix_test build: test language: c @@ -5373,27 +5169,6 @@ targets: - linux - posix - windows -- name: static_stride_scheduler_benchmark - build: test - language: c - headers: - - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.h - src: - - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc - - test/core/load_balancing/static_stride_scheduler_benchmark.cc - deps: - - absl/algorithm:container - - absl/types:span - - benchmark - - gpr - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false - name: test_core_iomgr_timer_list_test build: test language: c @@ -5455,6 +5230,7 @@ targets: - src/core/lib/promise/seq.h - src/core/lib/promise/wait_set.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/test_wakeup_schedulers.h src: - src/core/lib/debug/trace.cc @@ -6669,7 +6445,6 @@ targets: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/surface/api_trace.h - src/core/lib/surface/channel_stack_type.h - src/core/lib/transport/call_filters.h - src/core/lib/transport/call_final_info.h @@ -6686,23 +6461,10 @@ targets: - src/core/lib/transport/status_conversion.h - src/core/lib/transport/timeout_encoding.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - test/core/promise/poll_matcher.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -6749,18 +6511,10 @@ targets: - src/core/lib/transport/timeout_encoding.cc - src/core/util/latent_see.cc - test/core/transport/call_filters_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/base:no_destructor - absl/container:flat_hash_map @@ -6895,6 +6649,7 @@ targets: - src/core/lib/promise/status_flag.h - src/core/lib/transport/call_state.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/poll_matcher.h src: - src/core/lib/debug/trace.cc @@ -7176,7 +6931,6 @@ targets: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/surface/api_trace.h - src/core/lib/surface/call.h - src/core/lib/surface/call_test_only.h - src/core/lib/surface/call_utils.h @@ -7240,22 +6994,9 @@ targets: - src/core/util/json/json_args.h - src/core/util/json/json_writer.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/channelz/channel_trace.cc - src/core/channelz/channelz.cc @@ -7492,18 +7233,10 @@ targets: - src/core/util/json/json_writer.cc - src/core/util/latent_see.cc - test/core/call/call_utils_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - z - absl/base:config - absl/base:no_destructor @@ -7915,22 +7648,9 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h + - third_party/upb/upb/generated_code_support.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -7961,18 +7681,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/promise/cancel_callback_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -8732,22 +8444,9 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -8778,18 +8477,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/gprpp/chunked_vector_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -10302,22 +9993,9 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -10342,18 +10020,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/promise/exec_ctx_wakeup_scheduler_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/hash:hash @@ -10874,22 +10544,9 @@ targets: - src/core/lib/transport/bdp_estimator.h - src/core/lib/transport/http2_errors.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/transport/chttp2/transport/flow_control.cc - src/core/ext/transport/chttp2/transport/frame.cc @@ -10924,18 +10581,10 @@ targets: - src/core/lib/transport/bdp_estimator.cc - src/core/util/latent_see.cc - test/core/transport/chttp2/flow_control_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -11012,23 +10661,10 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - test/core/promise/test_wakeup_schedulers.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -11059,18 +10695,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/promise/for_each_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -12618,6 +12246,7 @@ targets: - src/core/lib/promise/poll.h - src/core/lib/promise/seq.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/test_wakeup_schedulers.h src: - src/core/lib/debug/trace.cc @@ -12708,23 +12337,10 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - test/core/promise/test_context.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -12755,18 +12371,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/promise/interceptor_list_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -13202,6 +12810,7 @@ targets: - src/core/lib/promise/poll.h - src/core/lib/promise/seq.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/test_wakeup_schedulers.h src: - src/core/lib/debug/trace.cc @@ -13306,54 +12915,6 @@ targets: - gtest - grpc_test_util uses_polling: false -- name: local_security_connector_test - gtest: true - build: test - language: c++ - headers: - - test/core/test_util/cmdline.h - - test/core/test_util/evaluate_args_test_util.h - - test/core/test_util/fuzzer_util.h - - test/core/test_util/grpc_profiler.h - - test/core/test_util/histogram.h - - test/core/test_util/mock_endpoint.h - - test/core/test_util/parse_hexstring.h - - test/core/test_util/resolve_localhost_ip46.h - - test/core/test_util/slice_splitter.h - - test/core/test_util/tracer_util.h - src: - - test/core/security/local_security_connector_test.cc - - test/core/test_util/cmdline.cc - - test/core/test_util/fuzzer_util.cc - - test/core/test_util/grpc_profiler.cc - - test/core/test_util/histogram.cc - - test/core/test_util/mock_endpoint.cc - - test/core/test_util/parse_hexstring.cc - - test/core/test_util/resolve_localhost_ip46.cc - - test/core/test_util/slice_splitter.cc - - test/core/test_util/tracer_util.cc - deps: - - gtest - - grpc_test_util -- name: lock_free_event_test - gtest: true - build: test - language: c++ - headers: [] - src: - - test/core/event_engine/posix/lock_free_event_test.cc - deps: - - gtest - - benchmark - - grpc_test_util - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false - name: log_too_many_open_files_test gtest: true build: test @@ -13464,23 +13025,10 @@ targets: - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - test/core/promise/test_wakeup_schedulers.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -13511,18 +13059,10 @@ targets: - src/core/lib/slice/slice_string_helpers.cc - src/core/util/latent_see.cc - test/core/promise/map_pipe_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/base:config - absl/container:flat_hash_map - absl/functional:function_ref @@ -13572,18 +13112,6 @@ targets: deps: - gtest - grpc_test_util -- name: max_concurrent_streams_policy_test - gtest: true - build: test - language: c++ - headers: - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h - src: - - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc - - test/core/transport/chttp2/max_concurrent_streams_policy_test.cc - deps: - - gtest - - gpr - name: max_concurrent_streams_test gtest: true build: test @@ -14040,6 +13568,7 @@ targets: - src/core/lib/promise/promise.h - src/core/lib/promise/wait_set.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/poll_matcher.h src: - src/core/lib/debug/trace.cc @@ -14353,6 +13882,7 @@ targets: - src/core/lib/promise/observable.h - src/core/lib/promise/poll.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/poll_matcher.h src: - src/core/lib/debug/trace.cc @@ -14691,6 +14221,7 @@ targets: - src/core/lib/gprpp/bitset.h - src/core/lib/gprpp/glob.h - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/per_cpu.h - src/core/lib/gprpp/status_helper.h - src/core/lib/gprpp/time.h - src/core/lib/iomgr/closure.h @@ -14705,22 +14236,10 @@ targets: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_refcount.h - src/core/lib/slice/slice_string_helpers.h + - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - src/core/util/spinlock.h - third_party/upb/upb/generated_code_support.h - - third_party/upb/upb/mini_descriptor/build_enum.h - - third_party/upb/upb/mini_descriptor/decode.h - - third_party/upb/upb/mini_descriptor/internal/base92.h - - third_party/upb/upb/mini_descriptor/internal/decoder.h - - third_party/upb/upb/mini_descriptor/internal/encode.h - - third_party/upb/upb/mini_descriptor/internal/encode.hpp - - third_party/upb/upb/mini_descriptor/internal/modifiers.h - - third_party/upb/upb/mini_descriptor/internal/wire_constants.h - - third_party/upb/upb/mini_descriptor/link.h - - third_party/upb/upb/wire/decode.h - - third_party/upb/upb/wire/encode.h - - third_party/upb/upb/wire/internal/constants.h - - third_party/upb/upb/wire/internal/decode_fast.h - - third_party/upb/upb/wire/internal/decoder.h src: - src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c - src/core/ext/upb-gen/google/rpc/status.upb_minitable.c @@ -14729,6 +14248,7 @@ targets: - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/glob.cc + - src/core/lib/gprpp/per_cpu.cc - src/core/lib/gprpp/status_helper.cc - src/core/lib/gprpp/time.cc - src/core/lib/iomgr/closure.cc @@ -14741,19 +14261,12 @@ targets: - src/core/lib/slice/percent_encoding.cc - src/core/lib/slice/slice.cc - src/core/lib/slice/slice_string_helpers.cc + - src/core/util/latent_see.cc - test/core/resource_quota/periodic_update_test.cc - - third_party/upb/upb/mini_descriptor/build_enum.c - - third_party/upb/upb/mini_descriptor/decode.c - - third_party/upb/upb/mini_descriptor/internal/base92.c - - third_party/upb/upb/mini_descriptor/internal/encode.c - - third_party/upb/upb/mini_descriptor/link.c - - third_party/upb/upb/wire/decode.c - - third_party/upb/upb/wire/encode.c - - third_party/upb/upb/wire/internal/decode_fast.c deps: - gtest - - utf8_range_lib - - upb_message_lib + - upb_mini_descriptor_lib + - upb_wire_lib - absl/container:flat_hash_map - absl/functional:function_ref - absl/hash:hash @@ -15290,6 +14803,7 @@ targets: - src/core/lib/promise/promise_mutex.h - src/core/lib/promise/seq.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/test_wakeup_schedulers.h src: - src/core/lib/debug/trace.cc @@ -18262,6 +17776,17 @@ targets: - grpc_authorization_provider - grpc_unsecure - grpc_test_util +- name: ring_buffer_test + gtest: true + build: test + language: c++ + headers: + - src/core/util/ring_buffer.h + src: + - test/core/util/ring_buffer_test.cc + deps: + - gtest + uses_polling: false - name: ring_hash_test gtest: true build: test @@ -20968,6 +20493,19 @@ targets: - absl/status:statusor - gpr uses_polling: false +- name: unique_ptr_with_bitset_test + gtest: true + build: test + language: c++ + headers: + - src/core/util/unique_ptr_with_bitset.h + src: + - test/core/util/unique_ptr_with_bitset_test.cc + deps: + - gtest + - absl/log:check + - absl/numeric:bits + uses_polling: false - name: unique_type_name_test gtest: true build: test @@ -21079,6 +20617,7 @@ targets: - src/core/lib/promise/poll.h - src/core/lib/promise/wait_for_callback.h - src/core/util/latent_see.h + - src/core/util/ring_buffer.h - test/core/promise/test_wakeup_schedulers.h src: - src/core/lib/debug/trace.cc @@ -21769,7 +21308,8 @@ targets: gtest: true build: test language: c++ - headers: [] + headers: + - test/core/test_util/scoped_env_var.h src: - src/proto/grpc/testing/xds/v3/address.proto - src/proto/grpc/testing/xds/v3/aggregate_cluster.proto @@ -21864,6 +21404,7 @@ targets: build: test language: c++ headers: + - test/core/test_util/scoped_env_var.h - test/cpp/util/cli_call.h - test/cpp/util/cli_credentials.h - test/cpp/util/config_grpc_cli.h @@ -22353,6 +21894,7 @@ targets: build: test language: c++ headers: + - test/core/test_util/scoped_env_var.h - test/cpp/util/cli_call.h - test/cpp/util/cli_credentials.h - test/cpp/util/config_grpc_cli.h @@ -22917,12 +22459,12 @@ targets: - mac external_proto_libraries: - destination: third_party/envoy-api - hash: 1ee20b3041a4f093cc393448ab022f770e70b509c8fe8399d6e83017067b2fc3 + hash: e525a6fb6e6ed3eef1eec6bef3da9b5708e471f0f9335a7604df14a4b386231e proto_prefix: third_party/envoy-api/ - strip_prefix: data-plane-api-091cfd044258312a56c632ae1860813b1c0c58bc + strip_prefix: data-plane-api-f8b75d1efa92bbf534596a013d9ca5873f79dd30 urls: - - https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz - - https://github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz + - https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz + - https://github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz - destination: third_party/googleapis hash: 5bb6b0253ccf64b53d6c7249625a7e3f6c3bc6402abd52d3778bfa48258703a0 proto_prefix: third_party/googleapis/ diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 4f914307028b9..d4d8594268463 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -1,182 +1,6 @@ [ - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_call_spine", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_chaotic_good", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_client_call", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_client_channel", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_experiments", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_http_client_filter", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_inproc", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "bm_party", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, { "args": [], "benchmark": false, @@ -245,28 +69,6 @@ ], "uses_polling": true }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "static_stride_scheduler_benchmark", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, { "args": [], "benchmark": false, @@ -5929,52 +5731,6 @@ ], "uses_polling": false }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "local_security_connector_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "lock_free_event_test", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, { "args": [], "benchmark": false, @@ -6093,30 +5849,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "max_concurrent_streams_policy_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, @@ -9041,6 +8773,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "ring_buffer_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, { "args": [], "benchmark": false, @@ -11663,6 +11419,30 @@ ], "uses_polling": false }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "unique_ptr_with_bitset_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, { "args": [], "benchmark": false, From 2ffe8f2f7dcdaa25544a97f61f9221f804717c05 Mon Sep 17 00:00:00 2001 From: Andrey Ermolov Date: Thu, 8 Aug 2024 23:05:55 +0000 Subject: [PATCH 5/7] Style fix --- CMakeLists.txt | 52 ++++++++++++++++++++++++++++ build_autogenerated.yaml | 48 +++++++++++++++++++++++++ tools/run_tests/generated/tests.json | 46 ++++++++++++++++++++++++ 3 files changed, 146 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index da48ca9f836af..1e37f381e2087 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1215,6 +1215,7 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx load_config_test) add_dependencies(buildtests_cxx load_file_test) + add_dependencies(buildtests_cxx local_security_connector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx log_too_many_open_files_test) endif() @@ -19550,6 +19551,57 @@ target_link_libraries(load_file_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(local_security_connector_test + test/core/security/local_security_connector_test.cc + test/core/test_util/cmdline.cc + test/core/test_util/fuzzer_util.cc + test/core/test_util/grpc_profiler.cc + test/core/test_util/histogram.cc + test/core/test_util/mock_endpoint.cc + test/core/test_util/parse_hexstring.cc + test/core/test_util/resolve_localhost_ip46.cc + test/core/test_util/slice_splitter.cc + test/core/test_util/tracer_util.cc +) +if(WIN32 AND MSVC) + if(BUILD_SHARED_LIBS) + target_compile_definitions(local_security_connector_test + PRIVATE + "GPR_DLL_IMPORTS" + "GRPC_DLL_IMPORTS" + ) + endif() +endif() +target_compile_features(local_security_connector_test PUBLIC cxx_std_14) +target_include_directories(local_security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(local_security_connector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest + grpc_test_util +) + + endif() if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index b95f89cafd6db..dd56cb0f9d76b 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -12915,6 +12915,54 @@ targets: - gtest - grpc_test_util uses_polling: false +- name: local_security_connector_test + gtest: true + build: test + language: c++ + headers: + - test/core/test_util/cmdline.h + - test/core/test_util/evaluate_args_test_util.h + - test/core/test_util/fuzzer_util.h + - test/core/test_util/grpc_profiler.h + - test/core/test_util/histogram.h + - test/core/test_util/mock_endpoint.h + - test/core/test_util/parse_hexstring.h + - test/core/test_util/resolve_localhost_ip46.h + - test/core/test_util/slice_splitter.h + - test/core/test_util/tracer_util.h + src: + - test/core/security/local_security_connector_test.cc + - test/core/test_util/cmdline.cc + - test/core/test_util/fuzzer_util.cc + - test/core/test_util/grpc_profiler.cc + - test/core/test_util/histogram.cc + - test/core/test_util/mock_endpoint.cc + - test/core/test_util/parse_hexstring.cc + - test/core/test_util/resolve_localhost_ip46.cc + - test/core/test_util/slice_splitter.cc + - test/core/test_util/tracer_util.cc + deps: + - gtest + - grpc_test_util +- name: lock_free_event_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/event_engine/posix/lock_free_event_test.cc + deps: + - gtest + - benchmark + - grpc_test_util + args: + - --benchmark_min_time=0.001s + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false - name: log_too_many_open_files_test gtest: true build: test diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index d4d8594268463..be0c6d819aed5 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5731,6 +5731,52 @@ ], "uses_polling": false }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "local_security_connector_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, + { + "args": [ + "--benchmark_min_time=0.001s" + ], + "benchmark": true, + "ci_platforms": [ + "linux", + "posix" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "lock_free_event_test", + "platforms": [ + "linux", + "posix" + ], + "uses_polling": false + }, { "args": [], "benchmark": false, From a69f4b4ab9af023de334de22c57e222dc9e510fb Mon Sep 17 00:00:00 2001 From: Andrey Ermolov Date: Fri, 9 Aug 2024 15:18:33 +0000 Subject: [PATCH 6/7] add stuff --- .github/ISSUE_TEMPLATE/bug_report_python.md | 2 + .../ISSUE_TEMPLATE/feature_request_python.md | 2 + BUILD | 36 +- Makefile | 11 +- Package.swift | 27 +- TROUBLESHOOTING.md | 6 +- _metadata.py | 2 +- bazel/experiments.bzl | 4 - bazel/grpc_deps.bzl | 28 +- build_config.rb | 2 +- build_handwritten.yaml | 6 +- config.m4 | 3 +- config.w32 | 1 - doc/g_stands_for.md | 3 +- doc/grpc_xds_features.md | 2 +- examples/cpp/route_guide/CMakeLists.txt | 3 +- examples/python/helloworld/helloworld_pb2.py | 12 +- .../python/helloworld/helloworld_pb2_grpc.py | 6 +- gRPC-C++.podspec | 10 +- gRPC-Core.podspec | 13 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- grpc.def | 3 - grpc.gemspec | 5 +- include/grpc/event_engine/extensible.h | 3 + include/grpc/support/log.h | 22 - include/grpcpp/impl/codegen/config_protobuf.h | 2 + include/grpcpp/impl/proto_utils.h | 4 +- include/grpcpp/version_info.h | 4 +- package.xml | 11 +- src/boringssl/boringssl_prefix_symbols.h | 7 +- src/compiler/python_generator.cc | 4 +- src/core/BUILD | 55 +- .../retry_filter_legacy_call_data.cc | 122 +- src/core/client_channel/subchannel.cc | 14 +- .../backend_metrics/backend_metric_filter.cc | 7 +- src/core/ext/filters/census/grpc_context.cc | 8 +- .../fault_injection/fault_injection_filter.cc | 7 +- .../message_compress/compression_filter.cc | 7 +- .../filters/http/server/http_server_filter.cc | 6 +- .../message_size/message_size_filter.cc | 14 +- .../binder/client/channel_create_impl.cc | 1 - .../chaotic_good/chaotic_good_transport.h | 7 +- .../client/chaotic_good_connector.cc | 6 +- .../chaotic_good/client_transport.cc | 47 +- src/core/ext/transport/chaotic_good/frame.cc | 2 +- src/core/ext/transport/chaotic_good/frame.h | 3 + .../server/chaotic_good_server.cc | 5 +- .../chaotic_good/server_transport.cc | 78 +- .../transport/chaotic_good/server_transport.h | 5 +- .../chaotic_good/settings_metadata.cc | 2 +- .../chttp2/client/chttp2_connector.cc | 12 +- .../transport/chttp2/server/chttp2_server.cc | 29 +- .../chttp2/transport/chttp2_transport.cc | 144 ++- .../chttp2/transport/flow_control.cc | 7 +- .../transport/chttp2/transport/frame_ping.cc | 7 +- .../chttp2/transport/frame_rst_stream.cc | 7 +- .../chttp2/transport/hpack_parser.cc | 80 +- .../transport/chttp2/transport/hpack_parser.h | 2 + .../chttp2/transport/hpack_parser_table.cc | 42 +- .../chttp2/transport/hpack_parser_table.h | 33 +- .../ext/transport/chttp2/transport/internal.h | 5 +- .../max_concurrent_streams_policy.cc | 45 - .../transport/max_concurrent_streams_policy.h | 67 -- .../ext/transport/chttp2/transport/parsing.cc | 22 +- .../chttp2/transport/stream_lists.cc | 14 +- .../ext/transport/chttp2/transport/writing.cc | 11 +- .../cronet/transport/cronet_transport.cc | 834 +++++++------ .../ext/transport/inproc/inproc_transport.cc | 3 +- .../inproc/legacy_inproc_transport.cc | 199 ++-- .../envoy/config/cluster/v3/cluster.upb.h | 132 ++- .../config/cluster/v3/cluster.upb_minitable.c | 35 +- .../config/endpoint/v3/load_report.upb.h | 197 +++- .../endpoint/v3/load_report.upb_minitable.c | 51 +- .../endpoint/v3/load_report.upb_minitable.h | 1 + .../envoy/config/trace/v3/datadog.upb.h | 115 +- .../config/trace/v3/datadog.upb_minitable.c | 46 +- .../config/trace/v3/datadog.upb_minitable.h | 1 + .../envoy/config/cluster/v3/cluster.upbdefs.c | 632 +++++----- .../config/endpoint/v3/load_report.upbdefs.c | 172 +-- .../config/endpoint/v3/load_report.upbdefs.h | 5 + .../envoy/config/trace/v3/datadog.upbdefs.c | 50 +- .../envoy/config/trace/v3/datadog.upbdefs.h | 5 + src/core/handshaker/handshaker.cc | 13 +- .../http_connect/http_connect_handshaker.cc | 4 +- .../http_connect/http_proxy_mapper.cc | 15 +- .../handshaker/security/secure_endpoint.cc | 10 +- .../security/security_handshaker.cc | 131 +-- src/core/lib/channel/promise_based_filter.cc | 187 ++- src/core/lib/channel/promise_based_filter.h | 2 +- src/core/lib/compression/compression.cc | 6 +- src/core/lib/compression/message_compress.cc | 6 +- src/core/lib/event_engine/ares_resolver.cc | 15 + .../cf_engine/cfstream_endpoint.cc | 4 + .../posix_engine/ev_epoll1_linux.cc | 2 +- .../posix_engine/ev_epoll1_linux.h | 8 +- .../posix_engine/posix_endpoint.cc | 9 +- .../posix_engine/posix_endpoint.h | 2 +- .../posix_engine_listener_utils.cc | 12 +- .../posix_engine/tcp_socket_utils.cc | 11 +- .../thread_pool/work_stealing_thread_pool.cc | 3 +- .../lib/event_engine/windows/win_socket.cc | 6 +- .../event_engine/windows/windows_endpoint.cc | 8 +- src/core/lib/experiments/config.cc | 25 +- src/core/lib/experiments/experiments.cc | 18 - src/core/lib/experiments/experiments.h | 8 - src/core/lib/experiments/experiments.yaml | 14 +- src/core/lib/gprpp/bitset.h | 2 +- src/core/lib/gprpp/dual_ref_counted.h | 60 +- src/core/lib/gprpp/table.h | 66 +- src/core/lib/gprpp/work_serializer.cc | 57 +- src/core/lib/iomgr/endpoint_cfstream.cc | 8 +- src/core/lib/iomgr/endpoint_pair_windows.cc | 8 +- src/core/lib/iomgr/ev_apple.cc | 31 +- src/core/lib/iomgr/ev_epoll1_linux.cc | 116 +- src/core/lib/iomgr/ev_poll_posix.cc | 8 +- src/core/lib/iomgr/ev_posix.cc | 16 +- src/core/lib/iomgr/ev_posix.h | 5 - .../lib/iomgr/event_engine_shims/endpoint.cc | 7 +- src/core/lib/iomgr/exec_ctx.h | 13 +- src/core/lib/iomgr/polling_entity.cc | 12 +- .../lib/iomgr/socket_utils_common_posix.cc | 29 +- src/core/lib/iomgr/socket_windows.cc | 6 +- src/core/lib/iomgr/tcp_client_posix.cc | 20 +- src/core/lib/iomgr/tcp_posix.cc | 86 +- src/core/lib/iomgr/tcp_server_posix.cc | 35 +- src/core/lib/iomgr/tcp_server_windows.cc | 4 +- src/core/lib/iomgr/tcp_windows.cc | 16 +- src/core/lib/iomgr/timer_manager.cc | 9 +- src/core/lib/promise/detail/join_state.h | 296 +---- src/core/lib/promise/detail/seq_state.h | 621 ++-------- src/core/lib/promise/for_each.h | 23 +- src/core/lib/promise/inter_activity_latch.h | 20 +- src/core/lib/promise/latch.h | 40 +- src/core/lib/promise/party.cc | 345 ++++-- src/core/lib/promise/party.h | 413 ++----- src/core/lib/resource_quota/arena.h | 5 + src/core/lib/resource_quota/memory_quota.cc | 30 +- src/core/lib/resource_quota/memory_quota.h | 6 +- .../lib/resource_quota/periodic_update.cc | 5 +- .../grpc_authorization_policy_provider.cc | 9 +- .../authorization/grpc_server_authz_filter.cc | 13 +- .../lib/security/context/security_context.cc | 50 +- .../credentials/alts/check_gcp_environment.cc | 2 +- .../alts/check_gcp_environment_no_op.cc | 2 +- .../composite/composite_credentials.cc | 16 +- .../lib/security/credentials/credentials.cc | 20 +- .../google_default_credentials.cc | 5 +- .../credentials/iam/iam_credentials.cc | 8 +- .../security/credentials/jwt/json_token.cc | 2 +- .../credentials/jwt/jwt_credentials.cc | 18 +- .../credentials/oauth2/oauth2_credentials.cc | 21 +- .../credentials/plugin/plugin_credentials.cc | 34 +- .../credentials/ssl/ssl_credentials.cc | 36 +- .../tls/grpc_tls_certificate_provider.cc | 11 +- .../tls/grpc_tls_certificate_verifier.cc | 5 +- .../tls/grpc_tls_credentials_options.cc | 12 +- .../credentials/tls/tls_credentials.cc | 4 +- .../credentials/xds/xds_credentials.cc | 20 +- .../security/security_connector/ssl_utils.cc | 15 +- .../tls/tls_security_connector.cc | 4 +- src/core/lib/slice/slice_refcount.h | 14 +- src/core/lib/surface/api_trace.h | 50 - src/core/lib/surface/call.cc | 25 +- src/core/lib/surface/call.h | 1 - src/core/lib/surface/call_details.cc | 7 +- src/core/lib/surface/channel.cc | 66 +- src/core/lib/surface/channel_create.cc | 8 +- src/core/lib/surface/client_call.cc | 2 +- src/core/lib/surface/client_call.h | 2 +- src/core/lib/surface/completion_queue.cc | 73 +- src/core/lib/surface/filter_stack_call.cc | 5 +- src/core/lib/surface/init.cc | 9 +- src/core/lib/surface/lame_client.cc | 1 - src/core/lib/surface/metadata_array.cc | 7 +- src/core/lib/surface/version.cc | 4 +- src/core/lib/transport/bdp_estimator.cc | 21 +- src/core/lib/transport/bdp_estimator.h | 14 +- .../lib/transport/call_arena_allocator.cc | 18 +- src/core/lib/transport/call_arena_allocator.h | 25 +- src/core/lib/transport/call_filters.cc | 10 +- src/core/lib/transport/call_spine.h | 36 +- src/core/lib/transport/connectivity_state.cc | 21 +- src/core/lib/transport/interception_chain.cc | 2 +- src/core/lib/transport/metadata.cc | 19 +- src/core/lib/transport/metadata.h | 21 + src/core/lib/transport/metadata_batch.h | 41 + src/core/load_balancing/grpclb/grpclb.cc | 60 +- .../load_balancing/health_check_client.cc | 38 +- src/core/load_balancing/oob_backend_metric.cc | 6 +- .../outlier_detection/outlier_detection.cc | 77 +- .../load_balancing/pick_first/pick_first.cc | 88 +- src/core/load_balancing/priority/priority.cc | 35 +- .../load_balancing/ring_hash/ring_hash.cc | 7 +- src/core/load_balancing/rls/rls.cc | 121 +- .../load_balancing/round_robin/round_robin.cc | 28 +- .../weighted_round_robin.cc | 81 +- .../weighted_target/weighted_target.cc | 35 +- src/core/load_balancing/xds/cds.cc | 20 +- .../load_balancing/xds/xds_cluster_impl.cc | 90 +- .../load_balancing/xds/xds_cluster_manager.cc | 21 +- .../load_balancing/xds/xds_override_host.cc | 120 +- .../load_balancing/xds/xds_wrr_locality.cc | 14 +- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 29 +- .../resolver/xds/xds_dependency_manager.cc | 125 +- .../resolver/xds/xds_dependency_manager.h | 4 + src/core/resolver/xds/xds_resolver.cc | 32 +- src/core/server/server.cc | 120 +- src/core/server/xds_server_config_fetcher.cc | 30 +- src/core/telemetry/metrics.h | 21 +- src/core/telemetry/stats_data.cc | 67 ++ src/core/telemetry/stats_data.h | 48 + src/core/telemetry/stats_data.yaml | 8 + .../alts/handshaker/alts_handshaker_client.cc | 12 +- .../alts/handshaker/alts_tsi_handshaker.cc | 6 +- src/core/tsi/fake_transport_security.cc | 3 + src/core/tsi/ssl_transport_security.cc | 43 +- src/core/util/android/log.cc | 3 + src/core/util/latent_see.cc | 27 +- src/core/util/latent_see.h | 104 +- src/core/util/linux/log.cc | 3 + src/core/util/log.cc | 65 +- src/core/util/posix/log.cc | 3 + src/core/util/subprocess_windows.cc | 2 +- src/core/util/useful.h | 71 -- src/core/util/windows/log.cc | 3 + src/core/xds/grpc/xds_certificate_provider.cc | 3 +- src/core/xds/grpc/xds_certificate_provider.h | 4 +- src/core/xds/grpc/xds_client_grpc.cc | 13 +- src/core/xds/grpc/xds_cluster_parser.cc | 6 +- src/core/xds/grpc/xds_common_types.cc | 52 +- src/core/xds/grpc/xds_common_types.h | 10 +- src/core/xds/grpc/xds_common_types_parser.cc | 48 +- src/core/xds/grpc/xds_listener_parser.cc | 31 +- src/core/xds/xds_client/xds_client.cc | 47 +- src/cpp/ext/gcp/environment_autodetect.cc | 7 +- src/cpp/ext/otel/otel_plugin.cc | 115 +- src/cpp/server/backend_metric_recorder.cc | 65 +- src/cpp/server/server_builder.cc | 12 +- src/csharp/build/dependencies.props | 2 +- .../!ProtoCompiler-gRPCCppPlugin.podspec | 2 +- .../!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/BoringSSL-GRPC.podspec | 1031 +++++++++-------- src/objective-c/GRPCClient/version.h | 2 +- src/objective-c/tests/version.h | 4 +- src/php/composer.json | 2 +- src/php/ext/grpc/version.h | 2 +- src/proto/grpc/testing/xds/v3/tls.proto | 9 + .../grpc/_cython/_cygrpc/channel.pxd.pxi | 1 + .../grpc/_cython/_cygrpc/channel.pyx.pxi | 28 +- src/python/grpcio/grpc/_grpcio_metadata.py | 2 +- src/python/grpcio/grpc_core_dependencies.py | 1 - src/python/grpcio/grpc_version.py | 2 +- src/python/grpcio_admin/grpc_version.py | 2 +- src/python/grpcio_channelz/grpc_version.py | 2 +- src/python/grpcio_csds/grpc_version.py | 2 +- .../grpcio_csm_observability/grpc_version.py | 2 +- .../grpcio_health_checking/grpc_version.py | 2 +- .../grpc_observability/client_call_tracer.cc | 13 +- .../grpc_observability/client_call_tracer.h | 4 +- .../python_observability_context.h | 8 +- .../grpcio_observability/grpc_version.py | 2 +- .../grpc_reflection/v1alpha/_async.py | 12 +- .../grpc_reflection/v1alpha/_base.py | 40 +- .../grpc_reflection/v1alpha/reflection.py | 12 +- src/python/grpcio_reflection/grpc_version.py | 2 +- src/python/grpcio_status/grpc_version.py | 2 +- src/python/grpcio_testing/grpc_version.py | 2 +- src/python/grpcio_tests/grpc_version.py | 2 +- .../grpcio_tests/tests/fork/BUILD.bazel | 4 + .../reflection/_reflection_servicer_test.py | 9 + .../reflection/reflection_servicer_test.py | 9 + .../tests_py3_only/interop/BUILD.bazel | 2 + .../interop/xds_interop_client.py | 3 + .../interop/xds_interop_server.py | 3 + src/ruby/ext/grpc/rb_grpc_imports.generated.c | 6 - src/ruby/ext/grpc/rb_grpc_imports.generated.h | 9 - src/ruby/lib/grpc/generic/active_call.rb | 13 +- src/ruby/lib/grpc/version.rb | 2 +- src/ruby/nativedebug/version.rb | 2 +- src/ruby/spec/call_spec.rb | 93 +- src/ruby/spec/channel_spec.rb | 6 +- src/ruby/spec/client_server_spec.rb | 655 +++-------- src/ruby/spec/generic/active_call_spec.rb | 150 +-- src/ruby/spec/support/services.rb | 3 + src/ruby/tools/version.rb | 2 +- templates/gRPC-Core.podspec.template | 2 +- .../BoringSSL-GRPC.podspec.template | 2 +- test/core/call/bm_client_call.cc | 6 +- test/core/call/client_call_test.cc | 2 +- test/core/call/server_call_test.cc | 3 +- test/core/client_channel/BUILD | 10 + test/core/client_channel/bm_client_channel.cc | 6 +- .../client_channel/client_channel_test.cc | 3 +- .../connected_subchannel_test.cc | 3 +- .../load_balanced_call_destination_test.cc | 3 +- .../end2end/fixtures/http_proxy_fixture.cc | 2 +- test/core/end2end/fuzzers/BUILD | 76 ++ test/core/end2end/fuzzers/fuzzer_input.proto | 23 + test/core/end2end/fuzzers/network_input.cc | 50 + test/core/end2end/fuzzers/network_input.h | 6 + .../end2end/tests/cancel_after_client_done.cc | 2 - test/core/end2end/tests/no_logging.cc | 124 +- .../fuzzing_event_engine.cc | 75 +- .../fuzzing_event_engine.h | 39 +- test/core/filters/bm_http_client_filter.cc | 6 +- test/core/load_balancing/BUILD | 14 + test/core/promise/party_test.cc | 184 +-- .../resource_quota/periodic_update_test.cc | 30 +- test/core/surface/channel_init_test.cc | 4 +- test/core/test_util/fake_stats_plugin.h | 84 +- test/core/transport/BUILD | 10 + .../transport/benchmarks/bm_chaotic_good.cc | 6 +- test/core/transport/benchmarks/bm_inproc.cc | 6 +- test/core/transport/bm_call_spine.cc | 20 +- test/core/transport/call_filters_test.cc | 66 +- test/core/transport/call_spine_benchmarks.h | 7 +- test/core/transport/call_spine_test.cc | 7 +- .../client_transport_error_test.cc | 2 +- .../chaotic_good/client_transport_test.cc | 2 +- .../chaotic_good/server_transport_test.cc | 4 +- test/core/transport/chttp2/BUILD | 10 - .../chttp2/hpack_parser_table_test.cc | 55 +- .../transport/chttp2/hpack_parser_test.cc | 89 +- .../transport/chttp2/hpack_sync_fuzzer.cc | 62 + .../transport/chttp2/hpack_sync_fuzzer.proto | 3 + .../max_concurrent_streams_policy_test.cc | 48 - .../core/transport/interception_chain_test.cc | 10 +- test/core/transport/metadata_map_test.cc | 77 ++ .../core/transport/test_suite/call_content.cc | 6 +- test/core/transport/test_suite/call_shapes.cc | 48 +- test/core/transport/test_suite/stress.cc | 6 +- test/core/util/BUILD | 26 + test/core/util/useful_test.cc | 56 - test/core/xds/BUILD | 3 + .../xds/xds_cluster_resource_type_test.cc | 43 +- test/core/xds/xds_common_types_test.cc | 126 +- .../xds/xds_listener_resource_type_test.cc | 68 +- test/cpp/end2end/thread_stress_test.cc | 1 - .../xds/xds_cluster_type_end2end_test.cc | 51 + test/cpp/end2end/xds/xds_end2end_test.cc | 18 + test/cpp/ext/otel/otel_plugin_test.cc | 6 +- test/cpp/microbenchmarks/BUILD | 16 + .../microbenchmarks/grpc_benchmark_config.bzl | 2 +- test/distrib/ruby/run_distrib_test.sh | 6 + .../dockerimage_current_versions.bzl | 1 - .../bazelify_tests/test/portability_tests.bzl | 4 +- .../extract_metadata_from_bazel_xml.py | 10 + tools/codegen/core/experiments_compiler.py | 26 +- tools/codegen/core/gen_experiments.py | 10 + tools/codegen/core/gen_join.py | 9 +- tools/codegen/core/gen_seq.py | 21 +- tools/codegen/core/gen_stats_data.py | 4 + tools/distrib/fix_build_deps.py | 2 + tools/distrib/gen_experiments_and_format.sh | 2 +- tools/distrib/python/grpc_version.py | 2 +- .../grpcio_tools/grpc_tools/grpc_version.py | 2 +- .../python/grpcio_tools/grpc_version.py | 2 +- .../envoy/config/cluster/v3/cluster_pb2.py | 132 +-- .../config/endpoint/v3/load_report_pb2.py | 22 +- .../envoy/config/trace/v3/datadog_pb2.py | 9 +- .../http/gcp_authn/v3/gcp_authn_pb2.py | 24 +- .../grpc_json_transcoder/v3/transcoder_pb2.py | 24 +- .../redirect_policy/v3/redirect_policy_pb2.py | 6 +- .../xds_protos/generated_file_import_test.py | 1 + .../distrib/python/xds_protos/grpc_version.py | 2 +- .../ruby_centos7_x64.current_version | 1 - .../distribtest/ruby_centos7_x64/Dockerfile | 33 - tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 7 +- tools/doxygen/Doxyfile.core | 2 +- tools/doxygen/Doxyfile.core.internal | 7 +- tools/doxygen/Doxyfile.objc | 2 +- tools/doxygen/Doxyfile.objc.internal | 2 +- tools/doxygen/Doxyfile.php | 2 +- .../linux/arm64/grpc_basictests_csharp.cfg | 2 +- .../linux/arm64/grpc_basictests_php.cfg | 2 +- .../linux/arm64/grpc_basictests_python.cfg | 2 +- .../linux/arm64/grpc_basictests_ruby.cfg | 2 +- .../linux/grpc_basictests_c_cpp_dbg.cfg | 2 +- .../linux/grpc_basictests_c_cpp_opt.cfg | 2 +- .../linux/grpc_basictests_csharp.cfg | 2 +- .../internal_ci/linux/grpc_basictests_php.cfg | 2 +- .../linux/grpc_basictests_python.cfg | 2 +- .../linux/grpc_basictests_ruby.cfg | 2 +- .../linux/grpc_build_submodule_at_head.sh | 4 +- tools/internal_ci/linux/grpc_clang_tidy.cfg | 2 +- tools/internal_ci/linux/grpc_interop_alts.cfg | 2 +- .../linux/grpc_interop_tocloud.cfg | 2 +- .../internal_ci/linux/grpc_interop_toprod.cfg | 2 +- tools/internal_ci/linux/grpc_portability.cfg | 2 +- .../linux/grpc_pull_request_sanity.cfg | 2 +- tools/internal_ci/linux/grpc_sanity.cfg | 2 +- .../pull_request/grpc_basictests_csharp.cfg | 2 +- .../pull_request/grpc_basictests_php.cfg | 2 +- .../pull_request/grpc_basictests_python.cfg | 2 +- .../pull_request/grpc_basictests_ruby.cfg | 2 +- .../linux/pull_request/grpc_clang_tidy.cfg | 2 +- .../linux/pull_request/grpc_sanity.cfg | 2 +- .../linux/sanitizer/grpc_c_asan.cfg | 2 +- .../linux/sanitizer/grpc_c_msan.cfg | 2 +- .../linux/sanitizer/grpc_c_tsan.cfg | 2 +- .../linux/sanitizer/grpc_c_ubsan.cfg | 2 +- .../linux/sanitizer/grpc_cpp_asan.cfg | 2 +- .../linux/sanitizer/grpc_cpp_tsan.cfg | 2 +- .../sanitizer/pull_request/grpc_c_asan.cfg | 2 +- .../sanitizer/pull_request/grpc_c_msan.cfg | 2 +- .../sanitizer/pull_request/grpc_c_tsan.cfg | 2 +- .../sanitizer/pull_request/grpc_c_ubsan.cfg | 2 +- .../sanitizer/pull_request/grpc_cpp_asan.cfg | 2 +- .../sanitizer/pull_request/grpc_cpp_tsan.cfg | 2 +- .../macos/grpc_basictests_c_cpp_dbg.cfg | 4 +- .../macos/grpc_basictests_c_cpp_opt.cfg | 4 +- .../macos/grpc_basictests_cpp_ios.cfg | 2 +- .../macos/grpc_basictests_csharp.cfg | 2 +- .../macos/grpc_basictests_objc_examples.cfg | 2 +- .../macos/grpc_basictests_objc_ios.cfg | 2 +- .../macos/grpc_basictests_objc_mac.cfg | 2 +- .../macos/grpc_basictests_objc_tvos.cfg | 2 +- .../internal_ci/macos/grpc_basictests_php.cfg | 2 +- .../macos/grpc_basictests_python.cfg | 2 +- .../macos/grpc_basictests_ruby.cfg | 2 +- .../internal_ci/macos/grpc_interop_toprod.sh | 2 +- .../grpc_basictests_c_cpp_dbg.cfg | 4 +- .../pull_request/grpc_basictests_cpp_ios.cfg | 2 +- .../pull_request/grpc_basictests_csharp.cfg | 2 +- .../grpc_basictests_objc_examples.cfg | 2 +- .../pull_request/grpc_basictests_objc_ios.cfg | 2 +- .../pull_request/grpc_basictests_objc_mac.cfg | 2 +- .../grpc_basictests_objc_tvos.cfg | 2 +- .../pull_request/grpc_basictests_php.cfg | 2 +- .../pull_request/grpc_basictests_python.cfg | 2 +- .../pull_request/grpc_basictests_ruby.cfg | 2 +- .../internal_ci/windows/grpc_basictests_c.cfg | 2 +- .../windows/grpc_basictests_csharp.cfg | 2 +- .../windows/grpc_basictests_python.cfg | 2 +- .../internal_ci/windows/grpc_portability.cfg | 2 +- .../windows/grpc_portability_build_only.cfg | 2 +- .../pull_request/grpc_basictests_c.cfg | 2 +- .../pull_request/grpc_basictests_csharp.cfg | 2 +- .../pull_request/grpc_basictests_python.cfg | 2 +- tools/interop_matrix/README.md | 39 +- tools/interop_matrix/client_matrix.py | 11 +- tools/interop_matrix/create_matrix_images.py | 12 +- .../run_interop_matrix_tests.py | 10 +- .../include/rbe_remote_execution.bazelrc | 7 +- tools/run_tests/artifacts/artifact_targets.py | 2 +- .../artifacts/distribtest_targets.py | 22 +- tools/run_tests/helper_scripts/build_cxx.sh | 13 +- tools/run_tests/run_interop_tests.py | 10 - tools/run_tests/run_tests.py | 10 +- tools/run_tests/run_tests_matrix.py | 10 - tools/run_tests/sanity/banned_functions.py | 19 +- tools/run_tests/sanity/check_submodules.sh | 4 +- 455 files changed, 6954 insertions(+), 7103 deletions(-) delete mode 100644 src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc delete mode 100644 src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h delete mode 100644 src/core/lib/surface/api_trace.h delete mode 100644 test/core/transport/chttp2/max_concurrent_streams_policy_test.cc delete mode 100644 tools/dockerfile/distribtest/ruby_centos7_x64.current_version delete mode 100644 tools/dockerfile/distribtest/ruby_centos7_x64/Dockerfile diff --git a/.github/ISSUE_TEMPLATE/bug_report_python.md b/.github/ISSUE_TEMPLATE/bug_report_python.md index 038188da28ce9..de3ba93076d92 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_python.md +++ b/.github/ISSUE_TEMPLATE/bug_report_python.md @@ -5,6 +5,8 @@ labels: kind/bug, priority/P2, lang/Python assignees: - gnossen - XuanWang-Amos + - sreenithi + - sourabhsinghs --- diff --git a/.github/ISSUE_TEMPLATE/feature_request_python.md b/.github/ISSUE_TEMPLATE/feature_request_python.md index 8387f345ac4e7..b5571d0936264 100644 --- a/.github/ISSUE_TEMPLATE/feature_request_python.md +++ b/.github/ISSUE_TEMPLATE/feature_request_python.md @@ -5,6 +5,8 @@ labels: kind/enhancement, priority/P2, lang/Python assignees: - gnossen - XuanWang-Amos + - sreenithi + - sourabhsinghs --- diff --git a/BUILD b/BUILD index 69fc678baf33d..a7517c25e2337 100644 --- a/BUILD +++ b/BUILD @@ -227,11 +227,11 @@ config_setting( python_config_settings() # This should be updated along with build_handwritten.yaml -g_stands_for = "gladiator" # @unused +g_stands_for = "gesundheit" # @unused -core_version = "42.0.0" # @unused +core_version = "43.0.0" # @unused -version = "1.66.0-dev" # @unused +version = "1.67.0-dev" # @unused GPR_PUBLIC_HDRS = [ "include/grpc/support/alloc.h", @@ -579,7 +579,6 @@ grpc_cc_library( ], visibility = ["@grpc:public"], deps = [ - "api_trace", "channel_arg_names", "channel_stack_builder", "config", @@ -659,7 +658,6 @@ grpc_cc_library( "@grpc:public", ], deps = [ - "api_trace", "channel_arg_names", "channel_stack_builder", "config", @@ -1151,7 +1149,6 @@ grpc_cc_library( ], tags = ["nofixdeps"], deps = [ - "api_trace", "channel", "channel_create", "config", @@ -1329,7 +1326,6 @@ grpc_cc_library( ], visibility = ["@grpc:public"], deps = [ - "api_trace", "gpr", "grpc_base", "grpc_public_hdrs", @@ -1477,21 +1473,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "api_trace", - hdrs = [ - "//src/core:lib/surface/api_trace.h", - ], - external_deps = [ - "absl/log:log", - ], - language = "c++", - deps = [ - "gpr", - "grpc_trace", - ], -) - grpc_cc_library( name = "byte_buffer", srcs = [ @@ -1763,7 +1744,6 @@ grpc_cc_library( language = "c++", visibility = ["@grpc:alt_grpc_base_legacy"], deps = [ - "api_trace", "channel_arg_names", "channelz", "cpp_impl_of", @@ -1809,7 +1789,6 @@ grpc_cc_library( language = "c++", visibility = ["@grpc:alt_grpc_base_legacy"], deps = [ - "api_trace", "channel", "channelz", "config", @@ -1905,7 +1884,6 @@ grpc_cc_library( language = "c++", visibility = ["@grpc:alt_grpc_base_legacy"], deps = [ - "api_trace", "call_combiner", "call_tracer", "channel", @@ -2035,7 +2013,6 @@ grpc_cc_library( public_hdrs = GRPC_PUBLIC_HDRS + GRPC_PUBLIC_EVENT_ENGINE_HDRS, visibility = ["@grpc:alt_grpc_base_legacy"], deps = [ - "api_trace", "call_combiner", "call_tracer", "channel", @@ -2299,7 +2276,6 @@ grpc_cc_library( public_hdrs = GRPC_PUBLIC_HDRS, visibility = ["@grpc:public"], deps = [ - "api_trace", "channel_arg_names", "channelz", "config", @@ -3303,6 +3279,7 @@ grpc_cc_library( "//src/core:experiments", "//src/core:gpr_atm", "//src/core:gpr_spinlock", + "//src/core:latent_see", "//src/core:time", "//src/core:useful", ], @@ -4058,6 +4035,7 @@ grpc_cc_library( deps = [ "gpr", "tsi_base", + "//src/core:dump_args", "//src/core:slice", "//src/core:useful", ], @@ -4090,7 +4068,6 @@ grpc_cc_library( language = "c++", visibility = ["@grpc:public"], deps = [ - "api_trace", "exec_ctx", "gpr", "grpc_base", @@ -4593,11 +4570,13 @@ grpc_cc_library( "gpr_platform", "grpc_trace", "hpack_parse_result", + "stats", "//src/core:hpack_constants", "//src/core:metadata_batch", "//src/core:no_destruct", "//src/core:parsed_metadata", "//src/core:slice", + "//src/core:unique_ptr_with_bitset", ], ) @@ -4853,7 +4832,6 @@ grpc_cc_library( "//src/core:iomgr_fwd", "//src/core:iomgr_port", "//src/core:match", - "//src/core:max_concurrent_streams_policy", "//src/core:memory_quota", "//src/core:metadata_batch", "//src/core:metadata_info", diff --git a/Makefile b/Makefile index 8db5503b5585a..5d194c1d104cf 100644 --- a/Makefile +++ b/Makefile @@ -367,8 +367,8 @@ E = @echo Q = @ endif -CORE_VERSION = 42.0.0 -CPP_VERSION = 1.66.0-dev +CORE_VERSION = 43.0.0 +CPP_VERSION = 1.67.0-dev CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) @@ -404,7 +404,7 @@ SHARED_EXT_CORE = dll SHARED_EXT_CPP = dll SHARED_PREFIX = -SHARED_VERSION_CORE = -42 +SHARED_VERSION_CORE = -43 SHARED_VERSION_CPP = -1 else ifeq ($(SYSTEM),Darwin) EXECUTABLE_SUFFIX = @@ -726,7 +726,6 @@ LIBGRPC_SRC = \ src/core/ext/transport/chttp2/transport/hpack_parser_table.cc \ src/core/ext/transport/chttp2/transport/http2_settings.cc \ src/core/ext/transport/chttp2/transport/huffsyms.cc \ - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc \ src/core/ext/transport/chttp2/transport/parsing.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc \ src/core/ext/transport/chttp2/transport/ping_callbacks.cc \ @@ -1843,8 +1842,8 @@ $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_ ifeq ($(SYSTEM),Darwin) $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libcares.a $(OPENSSL_MERGE_LIBS) $(ZLIB_MERGE_LIBS) $(LDLIBS_SECURE) $(LDLIBS) else - $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.42 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libcares.a $(OPENSSL_MERGE_LIBS) $(ZLIB_MERGE_LIBS) $(LDLIBS_SECURE) $(LDLIBS) - $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.42 + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.43 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libcares.a $(OPENSSL_MERGE_LIBS) $(ZLIB_MERGE_LIBS) $(LDLIBS_SECURE) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.43 $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so endif endif diff --git a/Package.swift b/Package.swift index ddceef95c22f5..1e3548bc56723 100644 --- a/Package.swift +++ b/Package.swift @@ -244,8 +244,6 @@ let package = Package( "src/core/ext/transport/chttp2/transport/huffsyms.h", "src/core/ext/transport/chttp2/transport/internal.h", "src/core/ext/transport/chttp2/transport/legacy_frame.h", - "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc", - "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h", "src/core/ext/transport/chttp2/transport/parsing.cc", "src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc", "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h", @@ -1641,7 +1639,6 @@ let package = Package( "src/core/lib/slice/slice_refcount.h", "src/core/lib/slice/slice_string_helpers.cc", "src/core/lib/slice/slice_string_helpers.h", - "src/core/lib/surface/api_trace.h", "src/core/lib/surface/byte_buffer.cc", "src/core/lib/surface/byte_buffer_reader.cc", "src/core/lib/surface/call.cc", @@ -1943,6 +1940,7 @@ let package = Package( "src/core/util/posix/sync.cc", "src/core/util/posix/time.cc", "src/core/util/posix/tmpfile.cc", + "src/core/util/ring_buffer.h", "src/core/util/spinlock.h", "src/core/util/string.cc", "src/core/util/string.h", @@ -1952,6 +1950,7 @@ let package = Package( "src/core/util/time_precise.cc", "src/core/util/time_precise.h", "src/core/util/tmpfile.h", + "src/core/util/unique_ptr_with_bitset.h", "src/core/util/upb_utils.h", "src/core/util/useful.h", "src/core/util/windows/cpu.cc", @@ -2130,20 +2129,6 @@ let package = Package( "third_party/upb/upb/message/message.h", "third_party/upb/upb/message/tagged_ptr.h", "third_party/upb/upb/message/value.h", - "third_party/upb/upb/mini_descriptor/build_enum.c", - "third_party/upb/upb/mini_descriptor/build_enum.h", - "third_party/upb/upb/mini_descriptor/decode.c", - "third_party/upb/upb/mini_descriptor/decode.h", - "third_party/upb/upb/mini_descriptor/internal/base92.c", - "third_party/upb/upb/mini_descriptor/internal/base92.h", - "third_party/upb/upb/mini_descriptor/internal/decoder.h", - "third_party/upb/upb/mini_descriptor/internal/encode.c", - "third_party/upb/upb/mini_descriptor/internal/encode.h", - "third_party/upb/upb/mini_descriptor/internal/encode.hpp", - "third_party/upb/upb/mini_descriptor/internal/modifiers.h", - "third_party/upb/upb/mini_descriptor/internal/wire_constants.h", - "third_party/upb/upb/mini_descriptor/link.c", - "third_party/upb/upb/mini_descriptor/link.h", "third_party/upb/upb/mini_table/enum.h", "third_party/upb/upb/mini_table/extension.h", "third_party/upb/upb/mini_table/extension_registry.c", @@ -2218,16 +2203,8 @@ let package = Package( "third_party/upb/upb/reflection/service_def.h", "third_party/upb/upb/text/encode.c", "third_party/upb/upb/text/encode.h", - "third_party/upb/upb/wire/decode.c", - "third_party/upb/upb/wire/decode.h", - "third_party/upb/upb/wire/encode.c", - "third_party/upb/upb/wire/encode.h", "third_party/upb/upb/wire/eps_copy_input_stream.c", "third_party/upb/upb/wire/eps_copy_input_stream.h", - "third_party/upb/upb/wire/internal/constants.h", - "third_party/upb/upb/wire/internal/decode_fast.c", - "third_party/upb/upb/wire/internal/decode_fast.h", - "third_party/upb/upb/wire/internal/decoder.h", "third_party/upb/upb/wire/internal/reader.h", "third_party/upb/upb/wire/reader.c", "third_party/upb/upb/wire/reader.h", diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md index d71fd6dca2d8c..a49d8fa75518a 100644 --- a/TROUBLESHOOTING.md +++ b/TROUBLESHOOTING.md @@ -22,9 +22,11 @@ Example ./helloworld_application_using_grpc --v=-1 --minloglevel=3 ``` -## GRPC_VERBOSITY (DEPRECATED) +## GRPC_VERBOSITY -[Environment Variables Overview](doc/environment_variables.md) +This is not recommended for gRPC C++. For gRPC C++ it is strongly recommended that you use absl to control gRPC verbosity. For Python, ObjC, PHP, and Ruby, GRPC_VERBOSITY will be supported. Users need to note that this will change settings for all libraries/binaries that use absl in the application. GRPC_VERBOSITY will alter the global absl settings, not just settings for gRPC. + +To learn how to set GRPC_VERBOSITY refer [Environment Variables Overview](doc/environment_variables.md) ## GRPC_TRACE diff --git a/_metadata.py b/_metadata.py index f7fa656248dff..4e8ea32870817 100644 --- a/_metadata.py +++ b/_metadata.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/_metadata.py.template`!!! -__version__ = """1.66.0.dev0""" +__version__ = """1.67.0.dev0""" diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index 7db70b1ce09a6..32f229fde9a60 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -32,7 +32,6 @@ EXPERIMENT_ENABLES = { "peer_state_based_framing": "peer_state_based_framing", "pick_first_new": "pick_first_new", "promise_based_inproc_transport": "promise_based_inproc_transport", - "rstpit": "rstpit", "schedule_cancellation_over_write": "schedule_cancellation_over_write", "server_privacy": "server_privacy", "tcp_frame_size_tuning": "tcp_frame_size_tuning", @@ -64,7 +63,6 @@ EXPERIMENTS = { "flow_control_test": [ "multiping", "peer_state_based_framing", - "rstpit", "tcp_frame_size_tuning", "tcp_rcv_lowat", ], @@ -115,7 +113,6 @@ EXPERIMENTS = { "flow_control_test": [ "multiping", "peer_state_based_framing", - "rstpit", "tcp_frame_size_tuning", "tcp_rcv_lowat", ], @@ -158,7 +155,6 @@ EXPERIMENTS = { "flow_control_test": [ "multiping", "peer_state_based_framing", - "rstpit", "tcp_frame_size_tuning", "tcp_rcv_lowat", ], diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 8e496b9d42b9e..0521b0a4e9346 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -23,10 +23,10 @@ def grpc_deps(): if "platforms" not in native.existing_rules(): http_archive( name = "platforms", - sha256 = "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74", + sha256 = "218efe8ee736d26a3572663b374a253c012b716d8af0c07e842e82f238a0a7ee", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", ], ) @@ -35,11 +35,11 @@ def grpc_deps(): name = "boringssl", # Use github mirror instead of https://boringssl.googlesource.com/boringssl # to obtain a boringssl archive with consistent sha256 - sha256 = "9f441d72fccb9a3faf96470478c8ccfaaeb8db1cffd4d78b698f782124dad1b0", - strip_prefix = "boringssl-b8a2bffc598f230484ff48a247526a9820facfc2", + sha256 = "7a35bebd0e1eecbc5bf5bbf5eec03e86686c356802b5540872119bd26f84ecc7", + strip_prefix = "boringssl-16c8d3db1af20fcc04b5190b25242aadcb1fbb30", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/b8a2bffc598f230484ff48a247526a9820facfc2.tar.gz", - "https://github.com/google/boringssl/archive/b8a2bffc598f230484ff48a247526a9820facfc2.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/16c8d3db1af20fcc04b5190b25242aadcb1fbb30.tar.gz", + "https://github.com/google/boringssl/archive/16c8d3db1af20fcc04b5190b25242aadcb1fbb30.tar.gz", ], ) @@ -168,10 +168,10 @@ def grpc_deps(): http_archive( name = "bazel_skylib", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz", ], - sha256 = "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c", + sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f", ) if "bazel_compdb" not in native.existing_rules(): @@ -199,11 +199,11 @@ def grpc_deps(): if "envoy_api" not in native.existing_rules(): http_archive( name = "envoy_api", - sha256 = "1ee20b3041a4f093cc393448ab022f770e70b509c8fe8399d6e83017067b2fc3", - strip_prefix = "data-plane-api-091cfd044258312a56c632ae1860813b1c0c58bc", + sha256 = "e525a6fb6e6ed3eef1eec6bef3da9b5708e471f0f9335a7604df14a4b386231e", + strip_prefix = "data-plane-api-f8b75d1efa92bbf534596a013d9ca5873f79dd30", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz", - "https://github.com/envoyproxy/data-plane-api/archive/091cfd044258312a56c632ae1860813b1c0c58bc.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz", + "https://github.com/envoyproxy/data-plane-api/archive/f8b75d1efa92bbf534596a013d9ca5873f79dd30.tar.gz", ], ) diff --git a/build_config.rb b/build_config.rb index 549196641f9a1..2524b03b7659f 100644 --- a/build_config.rb +++ b/build_config.rb @@ -13,5 +13,5 @@ # limitations under the License. module GrpcBuildConfig - CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-42.dll' + CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-43.dll' end diff --git a/build_handwritten.yaml b/build_handwritten.yaml index 5ea09b7529088..67062727e9409 100644 --- a/build_handwritten.yaml +++ b/build_handwritten.yaml @@ -12,11 +12,11 @@ settings: '#08': Use "-preN" suffixes to identify pre-release versions '#09': Per-language overrides are possible with (eg) ruby_version tag here '#10': See the expand_version.py for all the quirks here - core_version: 42.0.0 + core_version: 43.0.0 csharp_major_version: 2 - g_stands_for: gladiator + g_stands_for: gesundheit protobuf_version: 3.27.2 - version: 1.66.0-dev + version: 1.67.0-dev configs: asan: CC: clang diff --git a/config.m4 b/config.m4 index 619d9761de443..00594e8878fb1 100644 --- a/config.m4 +++ b/config.m4 @@ -101,7 +101,6 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/transport/chttp2/transport/hpack_parser_table.cc \ src/core/ext/transport/chttp2/transport/http2_settings.cc \ src/core/ext/transport/chttp2/transport/huffsyms.cc \ - src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc \ src/core/ext/transport/chttp2/transport/parsing.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc \ src/core/ext/transport/chttp2/transport/ping_callbacks.cc \ @@ -1391,7 +1390,7 @@ if test "$PHP_GRPC" != "no"; then -D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \ -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1 \ -DGRPC_XDS_USER_AGENT_NAME_SUFFIX='"\"PHP\""' \ - -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.66.0dev\""') + -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.67.0dev\""') PHP_ADD_BUILD_DIR($ext_builddir/src/core/channelz) PHP_ADD_BUILD_DIR($ext_builddir/src/core/client_channel) diff --git a/config.w32 b/config.w32 index 0384064082d2d..d443a78a90e20 100644 --- a/config.w32 +++ b/config.w32 @@ -66,7 +66,6 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser_table.cc " + "src\\core\\ext\\transport\\chttp2\\transport\\http2_settings.cc " + "src\\core\\ext\\transport\\chttp2\\transport\\huffsyms.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\max_concurrent_streams_policy.cc " + "src\\core\\ext\\transport\\chttp2\\transport\\parsing.cc " + "src\\core\\ext\\transport\\chttp2\\transport\\ping_abuse_policy.cc " + "src\\core\\ext\\transport\\chttp2\\transport\\ping_callbacks.cc " + diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md index 035601582a7bc..b11b6438d9b67 100644 --- a/doc/g_stands_for.md +++ b/doc/g_stands_for.md @@ -65,4 +65,5 @@ - 1.63 'g' stands for ['giggle'](https://github.com/grpc/grpc/tree/v1.63.x) - 1.64 'g' stands for ['grateful'](https://github.com/grpc/grpc/tree/v1.64.x) - 1.65 'g' stands for ['gnarly'](https://github.com/grpc/grpc/tree/v1.65.x) -- 1.66 'g' stands for ['gladiator'](https://github.com/grpc/grpc/tree/master) +- 1.66 'g' stands for ['gladiator'](https://github.com/grpc/grpc/tree/v1.66.x) +- 1.67 'g' stands for ['gesundheit'](https://github.com/grpc/grpc/tree/master) diff --git a/doc/grpc_xds_features.md b/doc/grpc_xds_features.md index 91be914ef81ba..3d673302e9b49 100644 --- a/doc/grpc_xds_features.md +++ b/doc/grpc_xds_features.md @@ -77,7 +77,7 @@ Ignore Resource Deletion | [A53](https://github.com/grpc/proposal/blob/master/A5 [Client-Side Weighted Round Robin LB Policy](https://github.com/envoyproxy/envoy/blob/a6d46b6ac4750720eec9a49abe701f0df9bf8e0a/api/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.proto#L36) | [A58](https://github.com/grpc/proposal/blob/master/A58-client-side-weighted-round-robin-lb-policy.md) | v1.55.0 | v1.54.0 | v1.56.0 | | Pick First | [A62](https://github.com/grpc/proposal/blob/master/A62-pick-first.md) | v1.58.0 | v1.58.1 | v1.56.0 | | [StringMatcher for Header Matching](https://github.com/envoyproxy/envoy/blob/3fe4b8d335fa339ef6f17325c8d31f87ade7bb1a/api/envoy/config/route/v3/route_components.proto#L2280) | [A63](https://github.com/grpc/proposal/blob/master/A63-xds-string-matcher-in-header-matching.md) | v1.56.0 | v1.53.0 | v1.56.0 | v1.9.0 | -LRS Custom Metrics Support | [A64](https://github.com/grpc/proposal/blob/master/A64-lrs-custom-metrics.md) | v1.54.0 | | | | +LRS Custom Metrics Support | [A64](https://github.com/grpc/proposal/blob/master/A64-lrs-custom-metrics.md) | v1.54.0 | v1.57.0 | v1.63.0 | | mTLS Credentials in xDS Bootstrap File | [A65](https://github.com/grpc/proposal/blob/master/A65-xds-mtls-creds-in-bootstrap.md) | v1.65.0 | | v1.61.0 | | Stateful Session Affinity | [A55](https://github.com/grpc/proposal/blob/master/A55-xds-stateful-session-affinity.md), [A60](https://github.com/grpc/proposal/blob/master/A60-xds-stateful-session-affinity-weighted-clusters.md), [A75](https://github.com/grpc/proposal/blob/master/A75-xds-aggregate-cluster-behavior-fixes.md) | v1.61.0 | | | | xDS Locality label for OpenTelemetry metrics | [A78](https://github.com/grpc/proposal/blob/master/A78-grpc-metrics-wrr-pf-xds.md) | v1.63.0 (C++) | v1.64.0 | | | diff --git a/examples/cpp/route_guide/CMakeLists.txt b/examples/cpp/route_guide/CMakeLists.txt index f3a286e2ab78c..90cebda39b17c 100644 --- a/examples/cpp/route_guide/CMakeLists.txt +++ b/examples/cpp/route_guide/CMakeLists.txt @@ -72,7 +72,8 @@ target_link_libraries(route_guide_helper # Targets route_guide_(client|server) foreach(_target - route_guide_client route_guide_server) + route_guide_client route_guide_server + route_guide_callback_client route_guide_callback_server) add_executable(${_target} "${_target}.cc") target_link_libraries(${_target} diff --git a/examples/python/helloworld/helloworld_pb2.py b/examples/python/helloworld/helloworld_pb2.py index 88f8715f99716..6a876593d5af2 100644 --- a/examples/python/helloworld/helloworld_pb2.py +++ b/examples/python/helloworld/helloworld_pb2.py @@ -1,12 +1,22 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE # source: helloworld.proto -# Protobuf Python Version: 5.26.1 +# Protobuf Python Version: 5.27.2 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 27, + 2, + '', + 'helloworld.proto' +) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() diff --git a/examples/python/helloworld/helloworld_pb2_grpc.py b/examples/python/helloworld/helloworld_pb2_grpc.py index a991c8fd3f308..f3cd60f1bab90 100644 --- a/examples/python/helloworld/helloworld_pb2_grpc.py +++ b/examples/python/helloworld/helloworld_pb2_grpc.py @@ -5,10 +5,10 @@ import helloworld_pb2 as helloworld__pb2 -GRPC_GENERATED_VERSION = '1.64.0.dev0' +GRPC_GENERATED_VERSION = '1.66.0.dev0' GRPC_VERSION = grpc.__version__ -EXPECTED_ERROR_RELEASE = '1.65.0' -SCHEDULED_RELEASE_DATE = 'June 25, 2024' +EXPECTED_ERROR_RELEASE = '1.66.0' +SCHEDULED_RELEASE_DATE = 'August 6, 2024' _version_not_supported = False try: diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 2063af2711824..fe2176500b47c 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -22,7 +22,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-C++' # TODO (mxyan): use version that match gRPC version when pod is stabilized - version = '1.66.0-dev' + version = '1.67.0-dev' s.version = version s.summary = 'gRPC C++ library' s.homepage = 'https://grpc.io' @@ -374,7 +374,6 @@ Pod::Spec.new do |s| 'src/core/ext/transport/chttp2/transport/huffsyms.h', 'src/core/ext/transport/chttp2/transport/internal.h', 'src/core/ext/transport/chttp2/transport/legacy_frame.h', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.h', 'src/core/ext/transport/chttp2/transport/ping_callbacks.h', 'src/core/ext/transport/chttp2/transport/ping_rate_policy.h', @@ -1178,7 +1177,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_refcount.h', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/call.h', 'src/core/lib/surface/call_test_only.h', 'src/core/lib/surface/call_utils.h', @@ -1323,10 +1321,12 @@ Pod::Spec.new do |s| 'src/core/util/json/json_util.h', 'src/core/util/json/json_writer.h', 'src/core/util/latent_see.h', + 'src/core/util/ring_buffer.h', 'src/core/util/spinlock.h', 'src/core/util/string.h', 'src/core/util/time_precise.h', 'src/core/util/tmpfile.h', + 'src/core/util/unique_ptr_with_bitset.h', 'src/core/util/upb_utils.h', 'src/core/util/useful.h', 'src/core/xds/grpc/certificate_provider_store.h', @@ -1658,7 +1658,6 @@ Pod::Spec.new do |s| 'src/core/ext/transport/chttp2/transport/huffsyms.h', 'src/core/ext/transport/chttp2/transport/internal.h', 'src/core/ext/transport/chttp2/transport/legacy_frame.h', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.h', 'src/core/ext/transport/chttp2/transport/ping_callbacks.h', 'src/core/ext/transport/chttp2/transport/ping_rate_policy.h', @@ -2462,7 +2461,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_refcount.h', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/call.h', 'src/core/lib/surface/call_test_only.h', 'src/core/lib/surface/call_utils.h', @@ -2607,10 +2605,12 @@ Pod::Spec.new do |s| 'src/core/util/json/json_util.h', 'src/core/util/json/json_writer.h', 'src/core/util/latent_see.h', + 'src/core/util/ring_buffer.h', 'src/core/util/spinlock.h', 'src/core/util/string.h', 'src/core/util/time_precise.h', 'src/core/util/tmpfile.h', + 'src/core/util/unique_ptr_with_bitset.h', 'src/core/util/upb_utils.h', 'src/core/util/useful.h', 'src/core/xds/grpc/certificate_provider_store.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index a0900b009c689..10002b9dfe654 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-Core' - version = '1.66.0-dev' + version = '1.67.0-dev' s.version = version s.summary = 'Core cross-platform gRPC library, written in C' s.homepage = 'https://grpc.io' @@ -199,7 +199,7 @@ Pod::Spec.new do |s| ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.35' + ss.dependency 'BoringSSL-GRPC', '0.0.36' ss.dependency 'abseil/algorithm/container', abseil_version ss.dependency 'abseil/base/base', abseil_version ss.dependency 'abseil/base/config', abseil_version @@ -364,8 +364,6 @@ Pod::Spec.new do |s| 'src/core/ext/transport/chttp2/transport/huffsyms.h', 'src/core/ext/transport/chttp2/transport/internal.h', 'src/core/ext/transport/chttp2/transport/legacy_frame.h', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h', 'src/core/ext/transport/chttp2/transport/parsing.cc', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.h', @@ -1757,7 +1755,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_refcount.h', 'src/core/lib/slice/slice_string_helpers.cc', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/byte_buffer.cc', 'src/core/lib/surface/byte_buffer_reader.cc', 'src/core/lib/surface/call.cc', @@ -2059,6 +2056,7 @@ Pod::Spec.new do |s| 'src/core/util/posix/sync.cc', 'src/core/util/posix/time.cc', 'src/core/util/posix/tmpfile.cc', + 'src/core/util/ring_buffer.h', 'src/core/util/spinlock.h', 'src/core/util/string.cc', 'src/core/util/string.h', @@ -2068,6 +2066,7 @@ Pod::Spec.new do |s| 'src/core/util/time_precise.cc', 'src/core/util/time_precise.h', 'src/core/util/tmpfile.h', + 'src/core/util/unique_ptr_with_bitset.h', 'src/core/util/upb_utils.h', 'src/core/util/useful.h', 'src/core/util/windows/cpu.cc', @@ -2439,7 +2438,6 @@ Pod::Spec.new do |s| 'src/core/ext/transport/chttp2/transport/huffsyms.h', 'src/core/ext/transport/chttp2/transport/internal.h', 'src/core/ext/transport/chttp2/transport/legacy_frame.h', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.h', 'src/core/ext/transport/chttp2/transport/ping_callbacks.h', 'src/core/ext/transport/chttp2/transport/ping_rate_policy.h', @@ -3243,7 +3241,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_refcount.h', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/call.h', 'src/core/lib/surface/call_test_only.h', 'src/core/lib/surface/call_utils.h', @@ -3388,10 +3385,12 @@ Pod::Spec.new do |s| 'src/core/util/json/json_util.h', 'src/core/util/json/json_writer.h', 'src/core/util/latent_see.h', + 'src/core/util/ring_buffer.h', 'src/core/util/spinlock.h', 'src/core/util/string.h', 'src/core/util/time_precise.h', 'src/core/util/tmpfile.h', + 'src/core/util/unique_ptr_with_bitset.h', 'src/core/util/upb_utils.h', 'src/core/util/useful.h', 'src/core/xds/grpc/certificate_provider_store.h', diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index faa604d228826..a53a69dfaee4b 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-ProtoRPC' - version = '1.66.0-dev' + version = '1.67.0-dev' s.version = version s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.homepage = 'https://grpc.io' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index da292b55b37bf..59c41799e9504 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-RxLibrary' - version = '1.66.0-dev' + version = '1.67.0-dev' s.version = version s.summary = 'Reactive Extensions library for iOS/OSX.' s.homepage = 'https://grpc.io' diff --git a/gRPC.podspec b/gRPC.podspec index 9fb3fc6158dee..a5e82d19c36a8 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.name = 'gRPC' - version = '1.66.0-dev' + version = '1.67.0-dev' s.version = version s.summary = 'gRPC client library for iOS/OSX' s.homepage = 'https://grpc.io' diff --git a/grpc.def b/grpc.def index 6679a51c5cae4..ddc6440f34f77 100644 --- a/grpc.def +++ b/grpc.def @@ -232,10 +232,7 @@ EXPORTS gpr_cpu_current_cpu gpr_log gpr_should_log - gpr_log_message - gpr_set_log_verbosity gpr_log_verbosity_init - gpr_set_log_function gpr_format_message gpr_strdup gpr_asprintf diff --git a/grpc.gemspec b/grpc.gemspec index 0608a1907de96..2fb9d03a2d4eb 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -250,8 +250,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.h ) s.files += %w( src/core/ext/transport/chttp2/transport/internal.h ) s.files += %w( src/core/ext/transport/chttp2/transport/legacy_frame.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h ) s.files += %w( src/core/ext/transport/chttp2/transport/parsing.cc ) s.files += %w( src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc ) s.files += %w( src/core/ext/transport/chttp2/transport/ping_abuse_policy.h ) @@ -1643,7 +1641,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/slice/slice_refcount.h ) s.files += %w( src/core/lib/slice/slice_string_helpers.cc ) s.files += %w( src/core/lib/slice/slice_string_helpers.h ) - s.files += %w( src/core/lib/surface/api_trace.h ) s.files += %w( src/core/lib/surface/byte_buffer.cc ) s.files += %w( src/core/lib/surface/byte_buffer_reader.cc ) s.files += %w( src/core/lib/surface/call.cc ) @@ -1945,6 +1942,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/util/posix/sync.cc ) s.files += %w( src/core/util/posix/time.cc ) s.files += %w( src/core/util/posix/tmpfile.cc ) + s.files += %w( src/core/util/ring_buffer.h ) s.files += %w( src/core/util/spinlock.h ) s.files += %w( src/core/util/string.cc ) s.files += %w( src/core/util/string.h ) @@ -1954,6 +1952,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/util/time_precise.cc ) s.files += %w( src/core/util/time_precise.h ) s.files += %w( src/core/util/tmpfile.h ) + s.files += %w( src/core/util/unique_ptr_with_bitset.h ) s.files += %w( src/core/util/upb_utils.h ) s.files += %w( src/core/util/useful.h ) s.files += %w( src/core/util/windows/cpu.cc ) diff --git a/include/grpc/event_engine/extensible.h b/include/grpc/event_engine/extensible.h index 51812f935c6f0..9af4f37682b83 100644 --- a/include/grpc/event_engine/extensible.h +++ b/include/grpc/event_engine/extensible.h @@ -60,6 +60,9 @@ class Extensible { /// if (endpoint != nullptr) endpoint->Process(); /// virtual void* QueryExtension(absl::string_view /*id*/) { return nullptr; } + + protected: + ~Extensible() = default; }; } // namespace experimental diff --git a/include/grpc/support/log.h b/include/grpc/support/log.h index 7df1969f1b22e..88e7628e0cc5c 100644 --- a/include/grpc/support/log.h +++ b/include/grpc/support/log.h @@ -53,30 +53,8 @@ GPRAPI void gpr_log(const char* file, int line, gpr_log_severity severity, GPRAPI int gpr_should_log(gpr_log_severity severity); -GPRAPI void gpr_log_message(const char* file, int line, - gpr_log_severity severity, const char* message); - -/** Set global log verbosity */ -GPRAPI void gpr_set_log_verbosity(gpr_log_severity deprecated_setting); - GPRAPI void gpr_log_verbosity_init(void); -/** Log overrides: applications can use this API to intercept logging calls - and use their own implementations */ - -struct gpr_log_func_args { - const char* file; - int line; - gpr_log_severity severity; - const char* message; -}; - -typedef struct gpr_log_func_args gpr_log_func_args; - -typedef void (*gpr_log_func)(gpr_log_func_args* args); - -GPRAPI void gpr_set_log_function(gpr_log_func deprecated_setting); - #ifdef __cplusplus } #endif diff --git a/include/grpcpp/impl/codegen/config_protobuf.h b/include/grpcpp/impl/codegen/config_protobuf.h index 06561cf121047..b4095ff08f599 100644 --- a/include/grpcpp/impl/codegen/config_protobuf.h +++ b/include/grpcpp/impl/codegen/config_protobuf.h @@ -71,6 +71,7 @@ #define GRPC_CUSTOM_ZEROCOPYINPUTSTREAM \ ::google::protobuf::io::ZeroCopyInputStream #define GRPC_CUSTOM_CODEDINPUTSTREAM ::google::protobuf::io::CodedInputStream +#define GRPC_CUSTOM_CODEDOUTPUTSTREAM ::google::protobuf::io::CodedOutputStream #endif #ifndef GRPC_CUSTOM_JSONUTIL @@ -113,6 +114,7 @@ namespace io { typedef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream; typedef GRPC_CUSTOM_ZEROCOPYINPUTSTREAM ZeroCopyInputStream; typedef GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream; +typedef GRPC_CUSTOM_CODEDOUTPUTSTREAM CodedOutputStream; } // namespace io } // namespace protobuf diff --git a/include/grpcpp/impl/proto_utils.h b/include/grpcpp/impl/proto_utils.h index 20d1435842621..f2cd8d21b76c4 100644 --- a/include/grpcpp/impl/proto_utils.h +++ b/include/grpcpp/impl/proto_utils.h @@ -61,7 +61,9 @@ Status GenericSerialize(const grpc::protobuf::MessageLite& msg, ByteBuffer* bb, return grpc::Status::OK; } ProtoBufferWriter writer(bb, kProtoBufferWriterMaxBufferLength, byte_size); - return msg.SerializeToZeroCopyStream(&writer) + protobuf::io::CodedOutputStream cs(&writer); + msg.SerializeWithCachedSizes(&cs); + return !cs.HadError() ? grpc::Status::OK : Status(StatusCode::INTERNAL, "Failed to serialize message"); } diff --git a/include/grpcpp/version_info.h b/include/grpcpp/version_info.h index dfab77a30207d..f3785e640cbd7 100644 --- a/include/grpcpp/version_info.h +++ b/include/grpcpp/version_info.h @@ -19,9 +19,9 @@ #define GRPCPP_VERSION_INFO_H #define GRPC_CPP_VERSION_MAJOR 1 -#define GRPC_CPP_VERSION_MINOR 66 +#define GRPC_CPP_VERSION_MINOR 67 #define GRPC_CPP_VERSION_PATCH 0 #define GRPC_CPP_VERSION_TAG "dev" -#define GRPC_CPP_VERSION_STRING "1.66.0-dev" +#define GRPC_CPP_VERSION_STRING "1.67.0-dev" #endif // GRPCPP_VERSION_INFO_H diff --git a/package.xml b/package.xml index 339828a27b397..7b3a1bbdb60e2 100644 --- a/package.xml +++ b/package.xml @@ -13,8 +13,8 @@ 2019-09-24 - 1.66.0dev - 1.66.0dev + 1.67.0dev + 1.67.0dev beta @@ -22,7 +22,7 @@ Apache 2.0 -- gRPC Core 1.66.0 update +- gRPC Core 1.67.0 update @@ -232,8 +232,6 @@ - - @@ -1625,7 +1623,6 @@ - @@ -1927,6 +1924,7 @@ + @@ -1936,6 +1934,7 @@ + diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h index faa1bc2ad475b..3d9b880017f43 100644 --- a/src/boringssl/boringssl_prefix_symbols.h +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -1,4 +1,4 @@ -// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: b8a2bffc598f230484ff48a247526a9820facfc2 +// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 16c8d3db1af20fcc04b5190b25242aadcb1fbb30 // Copyright (c) 2018, Google Inc. // @@ -1350,6 +1350,7 @@ #define DILITHIUM_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_marshal_public_key) #define DILITHIUM_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_parse_private_key) #define DILITHIUM_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_parse_public_key) +#define DILITHIUM_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_public_from_private) #define DILITHIUM_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_sign) #define DILITHIUM_sign_deterministic BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_sign_deterministic) #define DILITHIUM_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_verify) @@ -2041,6 +2042,7 @@ #define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) #define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) #define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) +#define OPENSSL_init_cpuid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_cpuid) #define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) #define OPENSSL_isalnum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_isalnum) #define OPENSSL_isalpha BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_isalpha) @@ -2886,8 +2888,11 @@ #define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) #define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) #define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) +#define aes_hw_encrypt_key_to_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt_key_to_decrypt_key) #define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) #define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) +#define aes_hw_set_encrypt_key_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key_alt) +#define aes_hw_set_encrypt_key_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key_base) #define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) #define aes_nohw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_ctr32_encrypt_blocks) #define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) diff --git a/src/compiler/python_generator.cc b/src/compiler/python_generator.cc index bb3b0ab84aaad..11bc2c5cec9b8 100644 --- a/src/compiler/python_generator.cc +++ b/src/compiler/python_generator.cc @@ -744,8 +744,8 @@ bool PrivateGenerator::PrintPreamble(grpc_generator::Printer* out) { var["ToolsVersion"] = config.grpc_tools_version; out->Print(var, "\nGRPC_GENERATED_VERSION = '$ToolsVersion$'\n"); out->Print("GRPC_VERSION = grpc.__version__\n"); - out->Print("EXPECTED_ERROR_RELEASE = '1.65.0'\n"); - out->Print("SCHEDULED_RELEASE_DATE = 'June 25, 2024'\n"); + out->Print("EXPECTED_ERROR_RELEASE = '1.66.0'\n"); + out->Print("SCHEDULED_RELEASE_DATE = 'August 6, 2024'\n"); out->Print("_version_not_supported = False\n\n"); out->Print("try:\n"); { diff --git a/src/core/BUILD b/src/core/BUILD index 4af318d88ece0..ff913a4ed042a 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -148,10 +148,25 @@ grpc_cc_library( ], deps = [ "per_cpu", + "ring_buffer", "//:gpr", ], ) +grpc_cc_library( + name = "ring_buffer", + srcs = [], + hdrs = [ + "util/ring_buffer.h", + ], + external_deps = [ + "absl/types:optional", + ], + deps = [ + "//:gpr_platform", + ], +) + grpc_cc_library( name = "transport_fwd", hdrs = [ @@ -274,6 +289,17 @@ grpc_cc_library( deps = ["//:gpr_platform"], ) +grpc_cc_library( + name = "unique_ptr_with_bitset", + hdrs = ["util/unique_ptr_with_bitset.h"], + external_deps = [ + "absl/log:check", + "absl/numeric:bits", + ], + language = "c++", + deps = ["//:gpr_platform"], +) + grpc_cc_library( name = "examine_stack", srcs = [ @@ -4102,7 +4128,6 @@ grpc_cc_library( "iomgr_fwd", "unique_type_name", "useful", - "//:api_trace", "//:channel_arg_names", "//:debug_location", "//:exec_ctx", @@ -4161,7 +4186,6 @@ grpc_cc_library( "unique_type_name", "useful", "//:alts_util", - "//:api_trace", "//:channel_arg_names", "//:exec_ctx", "//:gpr", @@ -4238,7 +4262,6 @@ grpc_cc_library( "status_helper", "unique_type_name", "useful", - "//:api_trace", "//:channel_arg_names", "//:debug_location", "//:exec_ctx", @@ -4281,7 +4304,6 @@ grpc_cc_library( "slice", "unique_type_name", "useful", - "//:api_trace", "//:exec_ctx", "//:gpr", "//:grpc_base", @@ -4332,7 +4354,6 @@ grpc_cc_library( "time", "unique_type_name", "useful", - "//:api_trace", "//:gpr", "//:grpc_base", "//:grpc_core_credentials_header", @@ -5253,6 +5274,7 @@ grpc_cc_library( deps = [ "grpc_matchers", "json", + "match", "validation_errors", ], ) @@ -5712,7 +5734,6 @@ grpc_cc_library( "xds_http_filter", "xds_listener", "xds_route_config", - "//:api_trace", "//:config", "//:debug_location", "//:exec_ctx", @@ -7194,23 +7215,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "max_concurrent_streams_policy", - srcs = [ - "ext/transport/chttp2/transport/max_concurrent_streams_policy.cc", - ], - hdrs = [ - "ext/transport/chttp2/transport/max_concurrent_streams_policy.h", - ], - external_deps = [ - "absl/log:check", - ], - deps = [ - "//:gpr", - "//:gpr_platform", - ], -) - grpc_cc_library( name = "huffsyms", srcs = [ @@ -7306,7 +7310,6 @@ grpc_cc_library( "tcp_connect_handshaker", "time", "unique_type_name", - "//:api_trace", "//:channel", "//:channel_arg_names", "//:channel_create", @@ -7368,7 +7371,6 @@ grpc_cc_library( "status_helper", "time", "unique_type_name", - "//:api_trace", "//:channel_arg_names", "//:channelz", "//:chttp2_legacy_frame", @@ -7428,7 +7430,6 @@ grpc_cc_library( "status_helper", "time", "try_seq", - "//:api_trace", "//:channel", "//:channel_arg_names", "//:channel_create", @@ -8112,7 +8113,6 @@ grpc_cc_library( "ref_counted_string", "slice", "useful", - "//:api_trace", "//:gpr", "//:grpc_public_hdrs", "//:grpc_trace", @@ -8237,7 +8237,6 @@ grpc_cc_library( "time", "try_seq", "wait_for_callback", - "//:api_trace", "//:channel", "//:channel_create", "//:config", diff --git a/src/core/client_channel/retry_filter_legacy_call_data.cc b/src/core/client_channel/retry_filter_legacy_call_data.cc index 303b40a304069..15a07e1c6408a 100644 --- a/src/core/client_channel/retry_filter_legacy_call_data.cc +++ b/src/core/client_channel/retry_filter_legacy_call_data.cc @@ -167,10 +167,9 @@ RetryFilter::LegacyCallData::CallAttempt::CallAttempt( } RetryFilter::LegacyCallData::CallAttempt::~CallAttempt() { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld_->chand_ << " calld=" << calld_ - << " attempt=" << this << ": destroying call attempt"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld_->chand_ << " calld=" << calld_ + << " attempt=" << this << ": destroying call attempt"; } void RetryFilter::LegacyCallData::CallAttempt:: @@ -520,10 +519,9 @@ void RetryFilter::LegacyCallData::CallAttempt::AddRetriableBatches( } void RetryFilter::LegacyCallData::CallAttempt::StartRetriableBatches() { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld_->chand_ << " calld=" << calld_ - << " attempt=" << this << ": constructing retriable batches"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld_->chand_ << " calld=" << calld_ + << " attempt=" << this << ": constructing retriable batches"; // Construct list of closures to execute, one for each pending batch. CallCombinerClosureList closures; AddRetriableBatches(&closures); @@ -556,10 +554,9 @@ bool RetryFilter::LegacyCallData::CallAttempt::ShouldRetry( if (calld_->retry_throttle_data_ != nullptr) { calld_->retry_throttle_data_->RecordSuccess(); } - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld_->chand_ << " calld=" << calld_ - << " attempt=" << this << ": call succeeded"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld_->chand_ << " calld=" << calld_ + << " attempt=" << this << ": call succeeded"; return false; } // Status is not OK. Check whether the status is retryable. @@ -582,18 +579,16 @@ bool RetryFilter::LegacyCallData::CallAttempt::ShouldRetry( // checks, so that we don't fail to record failures due to other factors. if (calld_->retry_throttle_data_ != nullptr && !calld_->retry_throttle_data_->RecordFailure()) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld_->chand_ << " calld=" << calld_ - << " attempt=" << this << ": retries throttled"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld_->chand_ << " calld=" << calld_ + << " attempt=" << this << ": retries throttled"; return false; } // Check whether the call is committed. if (calld_->retry_committed_) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld_->chand_ << " calld=" << calld_ - << " attempt=" << this << ": retries already committed"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld_->chand_ << " calld=" << calld_ + << " attempt=" << this << ": retries already committed"; return false; } // Check whether we have retries remaining. @@ -1295,10 +1290,9 @@ void RetryFilter::LegacyCallData::CallAttempt::BatchData::OnComplete( // recv_trailing_metadata comes back. if (GPR_UNLIKELY(!calld->retry_committed_ && !error.ok() && !call_attempt->completed_recv_trailing_metadata_)) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << calld->chand_ << " calld=" << calld - << " attempt=" << call_attempt << ": deferring on_complete"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << calld->chand_ << " calld=" << calld + << " attempt=" << call_attempt << ": deferring on_complete"; call_attempt->on_complete_deferred_batches_.emplace_back( std::move(batch_data), error); CallCombinerClosureList closures; @@ -1479,10 +1473,8 @@ grpc_error_handle RetryFilter::LegacyCallData::Init( grpc_call_element* elem, const grpc_call_element_args* args) { auto* chand = static_cast(elem->channel_data); new (elem->call_data) RetryFilter::LegacyCallData(chand, *args); - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand << " calld=" << elem->call_data - << ": created call"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << chand << " calld=" << elem->call_data << ": created call"; return absl::OkStatus(); } @@ -1608,10 +1600,8 @@ void RetryFilter::LegacyCallData::StartTransportStreamOpBatch( } // Cancel retry timer if needed. if (retry_timer_handle_.has_value()) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": cancelling retry timer"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": cancelling retry timer"; if (chand_->event_engine()->Cancel(*retry_timer_handle_)) { GRPC_CALL_STACK_UNREF(owning_call_, "OnRetryTimer"); } @@ -1672,19 +1662,16 @@ void RetryFilter::LegacyCallData::StartTransportStreamOpBatch( // Otherwise, create a call attempt. // The attempt will automatically start any necessary replays or // pending batches. - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": creating call attempt"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << chand_ << " calld=" << this << ": creating call attempt"; retry_codepath_started_ = true; CreateCallAttempt(/*is_transparent_retry=*/false); return; } // Send batches to call attempt. - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": starting batch on attempt=" << call_attempt_.get(); - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << chand_ << " calld=" << this + << ": starting batch on attempt=" << call_attempt_.get(); call_attempt_->StartRetriableBatches(); } @@ -1739,28 +1726,22 @@ void RetryFilter::LegacyCallData::MaybeCacheSendOpsForBatch( } void RetryFilter::LegacyCallData::FreeCachedSendInitialMetadata() { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": destroying send_initial_metadata"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": destroying send_initial_metadata"; send_initial_metadata_.Clear(); } void RetryFilter::LegacyCallData::FreeCachedSendMessage(size_t idx) { if (send_messages_[idx].slices != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": destroying send_messages[" << idx << "]"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": destroying send_messages[" << idx << "]"; Destruct(std::exchange(send_messages_[idx].slices, nullptr)); } } void RetryFilter::LegacyCallData::FreeCachedSendTrailingMetadata() { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": destroying send_trailing_metadata"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": destroying send_trailing_metadata"; send_trailing_metadata_.Clear(); } @@ -1796,10 +1777,8 @@ RetryFilter::LegacyCallData::PendingBatch* RetryFilter::LegacyCallData::PendingBatchesAdd( grpc_transport_stream_op_batch* batch) { const size_t idx = GetBatchIndex(batch); - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": adding pending batch at index " << idx; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": adding pending batch at index " << idx; PendingBatch* pending = &pending_batches_[idx]; CHECK_EQ(pending->batch, nullptr); pending->batch = batch; @@ -1826,10 +1805,8 @@ RetryFilter::LegacyCallData::PendingBatchesAdd( // ops have already been sent, and we commit to that attempt. if (GPR_UNLIKELY(bytes_buffered_for_retry_ > chand_->per_rpc_retry_buffer_size())) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": exceeded retry buffer size, committing"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": exceeded retry buffer size, committing"; RetryCommit(call_attempt_.get()); } return pending; @@ -1862,10 +1839,8 @@ void RetryFilter::LegacyCallData::MaybeClearPendingBatch( (!batch->recv_trailing_metadata || batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready == nullptr)) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": clearing pending batch"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": clearing pending batch"; PendingBatchClear(pending); } } @@ -1918,10 +1893,9 @@ RetryFilter::LegacyCallData::PendingBatchFind(const char* log_message, PendingBatch* pending = &pending_batches_[i]; grpc_transport_stream_op_batch* batch = pending->batch; if (batch != nullptr && predicate(batch)) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this << ": " - << log_message << " pending batch at index " << i; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << chand_ << " calld=" << this << ": " << log_message + << " pending batch at index " << i; return pending; } } @@ -1935,10 +1909,8 @@ RetryFilter::LegacyCallData::PendingBatchFind(const char* log_message, void RetryFilter::LegacyCallData::RetryCommit(CallAttempt* call_attempt) { if (retry_committed_) return; retry_committed_ = true; - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": committing retries"; - } + GRPC_TRACE_LOG(retry, INFO) + << "chand=" << chand_ << " calld=" << this << ": committing retries"; if (call_attempt != nullptr) { // If the call attempt's LB call has been committed, invoke the // call's on_commit callback. @@ -2003,10 +1975,8 @@ void RetryFilter::LegacyCallData::OnRetryTimerLocked( void RetryFilter::LegacyCallData::AddClosureToStartTransparentRetry( CallCombinerClosureList* closures) { - if (GRPC_TRACE_FLAG_ENABLED(retry)) { - LOG(INFO) << "chand=" << chand_ << " calld=" << this - << ": scheduling transparent retry"; - } + GRPC_TRACE_LOG(retry, INFO) << "chand=" << chand_ << " calld=" << this + << ": scheduling transparent retry"; GRPC_CALL_STACK_REF(owning_call_, "OnRetryTimer"); GRPC_CLOSURE_INIT(&retry_closure_, StartTransparentRetry, this, nullptr); closures->Add(&retry_closure_, absl::OkStatus(), "start transparent retry"); diff --git a/src/core/client_channel/subchannel.cc b/src/core/client_channel/subchannel.cc index cee164a64aeeb..4bef59df69662 100644 --- a/src/core/client_channel/subchannel.cc +++ b/src/core/client_channel/subchannel.cc @@ -602,10 +602,9 @@ void Subchannel::ThrottleKeepaliveTime(int new_keepalive_time) { // Only update the value if the new keepalive time is larger. if (new_keepalive_time > keepalive_time_) { keepalive_time_ = new_keepalive_time; - if (GRPC_TRACE_FLAG_ENABLED(subchannel)) { - LOG(INFO) << "subchannel " << this << " " << key_.ToString() - << ": throttling keepalive time to " << new_keepalive_time; - } + GRPC_TRACE_LOG(subchannel, INFO) + << "subchannel " << this << " " << key_.ToString() + << ": throttling keepalive time to " << new_keepalive_time; args_ = args_.Set(GRPC_ARG_KEEPALIVE_TIME_MS, new_keepalive_time); } } @@ -758,10 +757,9 @@ void Subchannel::OnRetryTimer() { void Subchannel::OnRetryTimerLocked() { if (shutdown_) return; - if (GRPC_TRACE_FLAG_ENABLED(subchannel)) { - LOG(INFO) << "subchannel " << this << " " << key_.ToString() - << ": backoff delay elapsed, reporting IDLE"; - } + GRPC_TRACE_LOG(subchannel, INFO) + << "subchannel " << this << " " << key_.ToString() + << ": backoff delay elapsed, reporting IDLE"; SetConnectivityStateLocked(GRPC_CHANNEL_IDLE, absl::OkStatus()); } diff --git a/src/core/ext/filters/backend_metrics/backend_metric_filter.cc b/src/core/ext/filters/backend_metrics/backend_metric_filter.cc index 24ac03bc38d40..54b90df875cfd 100644 --- a/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +++ b/src/core/ext/filters/backend_metrics/backend_metric_filter.cc @@ -135,10 +135,9 @@ void BackendMetricFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) { } absl::optional serialized = MaybeSerializeBackendMetrics(ctx); if (serialized.has_value() && !serialized->empty()) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric_filter)) { - LOG(INFO) << "[" << this - << "] Backend metrics serialized. size: " << serialized->size(); - } + GRPC_TRACE_LOG(backend_metric_filter, INFO) + << "[" << this + << "] Backend metrics serialized. size: " << serialized->size(); md.Set(EndpointLoadMetricsBinMetadata(), Slice::FromCopiedString(std::move(*serialized))); } else if (GRPC_TRACE_FLAG_ENABLED(backend_metric_filter)) { diff --git a/src/core/ext/filters/census/grpc_context.cc b/src/core/ext/filters/census/grpc_context.cc index e2affd09a4b92..77965df7ecdb9 100644 --- a/src/core/ext/filters/census/grpc_context.cc +++ b/src/core/ext/filters/census/grpc_context.cc @@ -22,18 +22,18 @@ #include #include "src/core/lib/debug/trace.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" void grpc_census_call_set_context(grpc_call* call, census_context* context) { - GRPC_API_TRACE("grpc_census_call_set_context(call=%p, census_context=%p)", 2, - (call, context)); + GRPC_TRACE_LOG(api, INFO) << "grpc_census_call_set_context(call=" << call + << ", census_context=" << context << ")"; if (context != nullptr) { grpc_call_get_arena(call)->SetContext(context); } } census_context* grpc_census_call_get_context(grpc_call* call) { - GRPC_API_TRACE("grpc_census_call_get_context(call=%p)", 1, (call)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_census_call_get_context(call=" << call << ")"; return grpc_call_get_arena(call)->GetContext(); } diff --git a/src/core/ext/filters/fault_injection/fault_injection_filter.cc b/src/core/ext/filters/fault_injection/fault_injection_filter.cc index b4bf623bbb185..6576c6df96dc6 100644 --- a/src/core/ext/filters/fault_injection/fault_injection_filter.cc +++ b/src/core/ext/filters/fault_injection/fault_injection_filter.cc @@ -150,10 +150,9 @@ FaultInjectionFilter::FaultInjectionFilter(ChannelFilter::Args filter_args) ArenaPromise FaultInjectionFilter::Call::OnClientInitialMetadata( ClientMetadata& md, FaultInjectionFilter* filter) { auto decision = filter->MakeInjectionDecision(md); - if (GRPC_TRACE_FLAG_ENABLED(fault_injection_filter)) { - LOG(INFO) << "chand=" << this << ": Fault injection triggered " - << decision.ToString(); - } + GRPC_TRACE_LOG(fault_injection_filter, INFO) + << "chand=" << this << ": Fault injection triggered " + << decision.ToString(); auto delay = decision.DelayUntil(); return TrySeq(Sleep(delay), [decision = std::move(decision)]() { return decision.MaybeAbort(); diff --git a/src/core/ext/filters/http/message_compress/compression_filter.cc b/src/core/ext/filters/http/message_compress/compression_filter.cc index 33491f1e6c409..47126c835b497 100644 --- a/src/core/ext/filters/http/message_compress/compression_filter.cc +++ b/src/core/ext/filters/http/message_compress/compression_filter.cc @@ -111,10 +111,9 @@ ChannelCompression::ChannelCompression(const ChannelArgs& args) MessageHandle ChannelCompression::CompressMessage( MessageHandle message, grpc_compression_algorithm algorithm) const { - if (GRPC_TRACE_FLAG_ENABLED(compression)) { - LOG(INFO) << "CompressMessage: len=" << message->payload()->Length() - << " alg=" << algorithm << " flags=" << message->flags(); - } + GRPC_TRACE_LOG(compression, INFO) + << "CompressMessage: len=" << message->payload()->Length() + << " alg=" << algorithm << " flags=" << message->flags(); auto* call_tracer = MaybeGetContext(); if (call_tracer != nullptr) { call_tracer->RecordSendMessage(*message->payload()); diff --git a/src/core/ext/filters/http/server/http_server_filter.cc b/src/core/ext/filters/http/server/http_server_filter.cc index 5cfe96f7170a3..fa6a38ddcc045 100644 --- a/src/core/ext/filters/http/server/http_server_filter.cc +++ b/src/core/ext/filters/http/server/http_server_filter.cc @@ -139,10 +139,8 @@ ServerMetadataHandle HttpServerFilter::Call::OnClientInitialMetadata( } void HttpServerFilter::Call::OnServerInitialMetadata(ServerMetadata& md) { - if (GRPC_TRACE_FLAG_ENABLED(call)) { - LOG(INFO) << GetContext()->DebugTag() - << "[http-server] Write metadata"; - } + GRPC_TRACE_LOG(call, INFO) + << GetContext()->DebugTag() << "[http-server] Write metadata"; FilterOutgoingMetadata(&md); md.Set(HttpStatusMetadata(), 200); md.Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index 269bafd6c22d6..c00d7d8fed4a4 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -165,14 +165,12 @@ ServerMetadataHandle CheckPayload(const Message& msg, << " len:" << msg.payload()->Length() << " max:" << *max_length; } if (msg.payload()->Length() <= *max_length) return nullptr; - auto r = Arena::MakePooled(); - r->Set(GrpcStatusMetadata(), GRPC_STATUS_RESOURCE_EXHAUSTED); - r->Set(GrpcMessageMetadata(), - Slice::FromCopiedString(absl::StrFormat( - "%s: %s message larger than max (%u vs. %d)", - is_client ? "CLIENT" : "SERVER", is_send ? "Sent" : "Received", - msg.payload()->Length(), *max_length))); - return r; + return ServerMetadataFromStatus( + GRPC_STATUS_RESOURCE_EXHAUSTED, + absl::StrFormat("%s: %s message larger than max (%u vs. %d)", + is_client ? "CLIENT" : "SERVER", + is_send ? "Sent" : "Received", msg.payload()->Length(), + *max_length)); } } // namespace diff --git a/src/core/ext/transport/binder/client/channel_create_impl.cc b/src/core/ext/transport/binder/client/channel_create_impl.cc index 197361104b2a6..cf3a0caab6976 100644 --- a/src/core/ext/transport/binder/client/channel_create_impl.cc +++ b/src/core/ext/transport/binder/client/channel_create_impl.cc @@ -28,7 +28,6 @@ #include "src/core/ext/transport/binder/wire_format/binder.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/config/core_configuration.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_create.h" diff --git a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h index 71a4aa45869bd..903b8024a6fba 100644 --- a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h +++ b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h @@ -125,10 +125,9 @@ class ChaoticGoodTransport : public RefCounted { FrameLimits limits) { auto s = frame.Deserialize(&parser_, header, bitgen_, arena, std::move(buffers), limits); - if (GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { - LOG(INFO) << "CHAOTIC_GOOD: DeserializeFrame " - << (s.ok() ? frame.ToString() : s.ToString()); - } + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: DeserializeFrame " + << (s.ok() ? frame.ToString() : s.ToString()); return s; } diff --git a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc index 46d17ddf4fefe..ca8cab47cc208 100644 --- a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc +++ b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc @@ -61,7 +61,6 @@ #include "src/core/lib/resource_quota/resource_quota.h" #include "src/core/lib/slice/slice.h" #include "src/core/lib/slice/slice_buffer.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_create.h" #include "src/core/lib/transport/error_utils.h" @@ -373,8 +372,9 @@ class ChaoticGoodChannelFactory final : public ClientChannelFactory { grpc_channel* grpc_chaotic_good_channel_create(const char* target, const grpc_channel_args* args) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_chaotic_good_channel_create(target=%s, args=%p)", 2, - (target, (void*)args)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_chaotic_good_channel_create(target=" << target + << ", args=" << (void*)args << ")"; grpc_channel* channel = nullptr; grpc_error_handle error; // Create channel. diff --git a/src/core/ext/transport/chaotic_good/client_transport.cc b/src/core/ext/transport/chaotic_good/client_transport.cc index 4c932a35b402b..f4d6a3ab6c2bb 100644 --- a/src/core/ext/transport/chaotic_good/client_transport.cc +++ b/src/core/ext/transport/chaotic_good/client_transport.cc @@ -254,7 +254,11 @@ uint32_t ChaoticGoodClientTransport::MakeStream(CallHandler call_handler) { const uint32_t stream_id = next_stream_id_++; stream_map_.emplace(stream_id, call_handler); lock.Release(); - call_handler.OnDone([this, stream_id]() { + call_handler.OnDone([this, stream_id](bool cancelled) { + if (cancelled) { + outgoing_frames_.MakeSender().UnbufferedImmediateSend( + CancelFrame{stream_id}); + } MutexLock lock(&mu_); stream_map_.erase(stream_id); }); @@ -280,10 +284,8 @@ auto ChaoticGoodClientTransport::CallOutboundLoop(uint32_t stream_id, // Wait for initial metadata then send it out. call_handler.PullClientInitialMetadata(), [send_fragment](ClientMetadataHandle md) mutable { - if (GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { - LOG(INFO) << "CHAOTIC_GOOD: Sending initial metadata: " - << md->DebugString(); - } + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Sending initial metadata: " << md->DebugString(); ClientFragmentFrame frame; frame.headers = std::move(md); return send_fragment(std::move(frame)); @@ -319,24 +321,23 @@ void ChaoticGoodClientTransport::StartCall(CallHandler call_handler) { "outbound_loop", [self = RefAsSubclass(), call_handler]() mutable { const uint32_t stream_id = self->MakeStream(call_handler); - return Map(self->CallOutboundLoop(stream_id, call_handler), - [stream_id, sender = self->outgoing_frames_.MakeSender()]( - absl::Status result) mutable { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "CHAOTIC_GOOD: Call " << stream_id - << " finished with " << result.ToString(); - if (!result.ok()) { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "CHAOTIC_GOOD: Send cancel"; - CancelFrame frame; - frame.stream_id = stream_id; - if (!sender.UnbufferedImmediateSend(std::move(frame))) { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "CHAOTIC_GOOD: Send cancel failed"; - } - } - return result; - }); + return Map( + self->CallOutboundLoop(stream_id, call_handler), + [stream_id, sender = self->outgoing_frames_.MakeSender()]( + absl::Status result) mutable { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Call " << stream_id << " finished with " + << result.ToString(); + if (!result.ok()) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Send cancel"; + if (!sender.UnbufferedImmediateSend(CancelFrame{stream_id})) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Send cancel failed"; + } + } + return result; + }); }); } diff --git a/src/core/ext/transport/chaotic_good/frame.cc b/src/core/ext/transport/chaotic_good/frame.cc index bbfb25d1b304b..4a165e9aa8967 100644 --- a/src/core/ext/transport/chaotic_good/frame.cc +++ b/src/core/ext/transport/chaotic_good/frame.cc @@ -154,7 +154,7 @@ absl::StatusOr> ReadMetadata( if (!maybe_slices.ok()) return maybe_slices.status(); auto& slices = *maybe_slices; CHECK_NE(arena, nullptr); - Arena::PoolPtr metadata = Arena::MakePooled(); + Arena::PoolPtr metadata = Arena::MakePooledForOverwrite(); parser->BeginFrame( metadata.get(), std::numeric_limits::max(), std::numeric_limits::max(), diff --git a/src/core/ext/transport/chaotic_good/frame.h b/src/core/ext/transport/chaotic_good/frame.h index d521a4831013d..548280858bfdf 100644 --- a/src/core/ext/transport/chaotic_good/frame.h +++ b/src/core/ext/transport/chaotic_good/frame.h @@ -156,6 +156,9 @@ struct ServerFragmentFrame final : public FrameInterface { }; struct CancelFrame final : public FrameInterface { + CancelFrame() = default; + explicit CancelFrame(uint32_t stream_id) : stream_id(stream_id) {} + absl::Status Deserialize(HPackParser* parser, const FrameHeader& header, absl::BitGenRef bitsrc, Arena* arena, BufferPair buffers, FrameLimits limits) override; diff --git a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc index 4b1ae3de0fd42..4354903662227 100644 --- a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc +++ b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc @@ -488,7 +488,7 @@ int grpc_server_add_chaotic_good_port(grpc_server* server, const char* addr) { grpc_event_engine::experimental::CreateResolvedAddress(resolved_addr); std::string addr_str = *grpc_event_engine::experimental::ResolvedAddressToString(ee_addr); - LOG(INFO) << "BIND: " << addr_str; + GRPC_TRACE_LOG(chaotic_good, INFO) << "BIND: " << addr_str; auto bind_result = listener->Bind(ee_addr); if (!bind_result.ok()) { error_list.push_back( @@ -510,7 +510,8 @@ int grpc_server_add_chaotic_good_port(grpc_server* server, const char* addr) { } else if (!error_list.empty()) { LOG(INFO) << "Failed to bind some addresses for " << addr; for (const auto& error : error_list) { - LOG(INFO) << " " << error.first << ": " << error.second; + GRPC_TRACE_LOG(chaotic_good, INFO) + << "Binding Failed: " << error.first << ": " << error.second; } } return port_num; diff --git a/src/core/ext/transport/chaotic_good/server_transport.cc b/src/core/ext/transport/chaotic_good/server_transport.cc index 619c0b50fe63c..21fa69022cf1f 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.cc +++ b/src/core/ext/transport/chaotic_good/server_transport.cc @@ -72,13 +72,10 @@ auto ChaoticGoodServerTransport::TransportWriteLoop( } auto ChaoticGoodServerTransport::PushFragmentIntoCall( - CallInitiator call_initiator, ClientFragmentFrame frame, - uint32_t stream_id) { + CallInitiator call_initiator, ClientFragmentFrame frame) { DCHECK(frame.headers == nullptr); - if (GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { - LOG(INFO) << "CHAOTIC_GOOD: PushFragmentIntoCall: frame=" - << frame.ToString(); - } + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: PushFragmentIntoCall: frame=" << frame.ToString(); return Seq(If( frame.message.has_value(), [&call_initiator, &frame]() mutable { @@ -86,17 +83,15 @@ auto ChaoticGoodServerTransport::PushFragmentIntoCall( std::move(frame.message->message)); }, []() -> StatusFlag { return Success{}; }), - [this, call_initiator, end_of_stream = frame.end_of_stream, - stream_id](StatusFlag status) mutable -> StatusFlag { + [call_initiator, end_of_stream = frame.end_of_stream]( + StatusFlag status) mutable -> StatusFlag { if (!status.ok() && GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { LOG(INFO) << "CHAOTIC_GOOD: Failed PushFragmentIntoCall"; } if (end_of_stream || !status.ok()) { call_initiator.FinishSends(); - // We have received end_of_stream. It is now safe to remove - // the call from the stream map. - MutexLock lock(&mu_); - stream_map_.erase(stream_id); + // Note that we cannot remove from the stream map yet, as we + // may yet receive a cancellation. } return Success{}; }); @@ -104,17 +99,16 @@ auto ChaoticGoodServerTransport::PushFragmentIntoCall( auto ChaoticGoodServerTransport::MaybePushFragmentIntoCall( absl::optional call_initiator, absl::Status error, - ClientFragmentFrame frame, uint32_t stream_id) { + ClientFragmentFrame frame) { return If( call_initiator.has_value() && error.ok(), - [this, &call_initiator, &frame, &stream_id]() { + [this, &call_initiator, &frame]() { return Map( call_initiator->SpawnWaitable( "push-fragment", - [call_initiator, frame = std::move(frame), stream_id, - this]() mutable { - return call_initiator->CancelIfFails(PushFragmentIntoCall( - *call_initiator, std::move(frame), stream_id)); + [call_initiator, frame = std::move(frame), this]() mutable { + return call_initiator->CancelIfFails( + PushFragmentIntoCall(*call_initiator, std::move(frame))); }), [](StatusFlag status) { return StatusCast(status); }); }, @@ -185,10 +179,9 @@ auto ChaoticGoodServerTransport::SendCallInitialMetadataAndBody( call_initiator.PullServerInitialMetadata(), [stream_id, outgoing_frames, call_initiator, this](absl::optional md) mutable { - if (GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { - LOG(INFO) << "CHAOTIC_GOOD: SendCallInitialMetadataAndBody: md=" - << (md.has_value() ? (*md)->DebugString() : "null"); - } + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: SendCallInitialMetadataAndBody: md=" + << (md.has_value() ? (*md)->DebugString() : "null"); return If( md.has_value(), [&md, stream_id, &outgoing_frames, &call_initiator, this]() { @@ -258,8 +251,7 @@ auto ChaoticGoodServerTransport::DeserializeAndPushFragmentToNewCall( } } return MaybePushFragmentIntoCall(std::move(call_initiator), std::move(status), - std::move(fragment_frame), - frame_header.stream_id); + std::move(fragment_frame)); } auto ChaoticGoodServerTransport::DeserializeAndPushFragmentToExistingCall( @@ -274,8 +266,7 @@ auto ChaoticGoodServerTransport::DeserializeAndPushFragmentToExistingCall( frame_header, std::move(buffers), arena, fragment_frame, FrameLimits{1024 * 1024 * 1024, aligned_bytes_ - 1}); return MaybePushFragmentIntoCall(std::move(call_initiator), std::move(status), - std::move(fragment_frame), - frame_header.stream_id); + std::move(fragment_frame)); } auto ChaoticGoodServerTransport::ReadOneFrame(ChaoticGoodTransport& transport) { @@ -308,6 +299,10 @@ auto ChaoticGoodServerTransport::ReadOneFrame(ChaoticGoodTransport& transport) { [this, &frame_header]() { absl::optional call_initiator = ExtractStream(frame_header.stream_id); + GRPC_TRACE_LOG(chaotic_good, INFO) + << "Cancel stream " << frame_header.stream_id + << (call_initiator.has_value() ? " (active)" + : " (not found)"); return If( call_initiator.has_value(), [&call_initiator]() { @@ -340,10 +335,9 @@ auto ChaoticGoodServerTransport::OnTransportActivityDone( absl::string_view activity) { return [self = RefAsSubclass(), activity](absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(chaotic_good)) { - LOG(INFO) << "CHAOTIC_GOOD: OnTransportActivityDone: activity=" - << activity << " status=" << status; - } + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: OnTransportActivityDone: activity=" << activity + << " status=" << status; self->AbortWithError(); }; } @@ -414,6 +408,8 @@ void ChaoticGoodServerTransport::AbortWithError() { absl::optional ChaoticGoodServerTransport::LookupStream( uint32_t stream_id) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD " << this << " LookupStream " << stream_id; MutexLock lock(&mu_); auto it = stream_map_.find(stream_id); if (it == stream_map_.end()) return absl::nullopt; @@ -422,6 +418,8 @@ absl::optional ChaoticGoodServerTransport::LookupStream( absl::optional ChaoticGoodServerTransport::ExtractStream( uint32_t stream_id) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD " << this << " ExtractStream " << stream_id; MutexLock lock(&mu_); auto it = stream_map_.find(stream_id); if (it == stream_map_.end()) return absl::nullopt; @@ -432,6 +430,8 @@ absl::optional ChaoticGoodServerTransport::ExtractStream( absl::Status ChaoticGoodServerTransport::NewStream( uint32_t stream_id, CallInitiator call_initiator) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD " << this << " NewStream " << stream_id; MutexLock lock(&mu_); auto it = stream_map_.find(stream_id); if (it != stream_map_.end()) { @@ -441,10 +441,20 @@ absl::Status ChaoticGoodServerTransport::NewStream( return absl::InternalError("Stream id is not increasing"); } stream_map_.emplace(stream_id, call_initiator); - call_initiator.OnDone([this, stream_id]() { - MutexLock lock(&mu_); - stream_map_.erase(stream_id); - }); + call_initiator.OnDone( + [self = RefAsSubclass(), stream_id](bool) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD " << self.get() << " OnDone " << stream_id; + absl::optional call_initiator = + self->ExtractStream(stream_id); + if (call_initiator.has_value()) { + auto c = std::move(*call_initiator); + c.SpawnInfallible("cancel", [c]() mutable { + c.Cancel(); + return Empty{}; + }); + } + }); return absl::OkStatus(); } diff --git a/src/core/ext/transport/chaotic_good/server_transport.h b/src/core/ext/transport/chaotic_good/server_transport.h index 2cd1fb5974cd6..e343b2455064d 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.h +++ b/src/core/ext/transport/chaotic_good/server_transport.h @@ -131,10 +131,9 @@ class ChaoticGoodServerTransport final : public ServerTransport { FrameHeader frame_header, BufferPair buffers, ChaoticGoodTransport& transport); auto MaybePushFragmentIntoCall(absl::optional call_initiator, - absl::Status error, ClientFragmentFrame frame, - uint32_t stream_id); + absl::Status error, ClientFragmentFrame frame); auto PushFragmentIntoCall(CallInitiator call_initiator, - ClientFragmentFrame frame, uint32_t stream_id); + ClientFragmentFrame frame); RefCountedPtr call_destination_; const RefCountedPtr call_arena_allocator_; diff --git a/src/core/ext/transport/chaotic_good/settings_metadata.cc b/src/core/ext/transport/chaotic_good/settings_metadata.cc index 9d395e8ae25c4..a6e5cc02993cb 100644 --- a/src/core/ext/transport/chaotic_good/settings_metadata.cc +++ b/src/core/ext/transport/chaotic_good/settings_metadata.cc @@ -24,7 +24,7 @@ namespace grpc_core { namespace chaotic_good { Arena::PoolPtr SettingsMetadata::ToMetadataBatch() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); auto add = [&md](absl::string_view key, std::string value) { md->Append(key, Slice::FromCopiedString(value), [key, value](absl::string_view error, const Slice&) { diff --git a/src/core/ext/transport/chttp2/client/chttp2_connector.cc b/src/core/ext/transport/chttp2/client/chttp2_connector.cc index 7fca6202c1236..48204fd2c6ccc 100644 --- a/src/core/ext/transport/chttp2/client/chttp2_connector.cc +++ b/src/core/ext/transport/chttp2/client/chttp2_connector.cc @@ -65,7 +65,6 @@ #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/insecure/insecure_credentials.h" #include "src/core/lib/security/security_connector/security_connector.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_create.h" #include "src/core/lib/surface/channel_stack_type.h" @@ -310,8 +309,9 @@ grpc_channel* grpc_channel_create(const char* target, grpc_channel_credentials* creds, const grpc_channel_args* c_args) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_secure_channel_create(target=%s, creds=%p, args=%p)", 3, - (target, (void*)creds, (void*)c_args)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_secure_channel_create(target=" << target + << ", creds=" << (void*)creds << ", args=" << (void*)c_args << ")"; grpc_channel* channel = nullptr; grpc_error_handle error; if (creds != nullptr) { @@ -350,9 +350,9 @@ grpc_channel* grpc_channel_create_from_fd(const char* target, int fd, grpc_channel_credentials* creds, const grpc_channel_args* args) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_channel_create_from_fd(target=%p, fd=%d, creds=%p, args=%p)", 4, - (target, fd, creds, args)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_create_from_fd(target=" << target << ", fd=" << fd + << ", creds=" << creds << ", args=" << args << ")"; // For now, we only support insecure channel credentials. if (creds == nullptr || creds->type() != grpc_core::InsecureCredentials::Type()) { diff --git a/src/core/ext/transport/chttp2/server/chttp2_server.cc b/src/core/ext/transport/chttp2/server/chttp2_server.cc index 37196c21b608e..f8f0c04f6a45d 100644 --- a/src/core/ext/transport/chttp2/server/chttp2_server.cc +++ b/src/core/ext/transport/chttp2/server/chttp2_server.cc @@ -84,7 +84,6 @@ #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/insecure/insecure_credentials.h" #include "src/core/lib/security/security_connector/security_connector.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/error_utils.h" #include "src/core/lib/transport/transport.h" #include "src/core/lib/uri/uri_parser.h" @@ -617,9 +616,6 @@ void Chttp2ServerListener::ActiveConnection::Start( RefCountedPtr listener, OrphanablePtr endpoint, const ChannelArgs& args) { listener_ = std::move(listener); - if (listener_->tcp_server_ != nullptr) { - grpc_tcp_server_ref(listener_->tcp_server_); - } RefCountedPtr handshaking_state_ref; { MutexLock lock(&mu_); @@ -870,16 +866,20 @@ void Chttp2ServerListener::OnAccept(void* arg, grpc_endpoint* tcp, // connection manager has changed. if (!self->shutdown_ && self->is_serving_ && connection_manager == self->connection_manager_) { - // This ref needs to be taken in the critical region after having made - // sure that the listener has not been Orphaned, so as to avoid - // heap-use-after-free issues where `Ref()` is invoked when the ref of - // tcp_server_ has already reached 0. (Ref() implementation of - // Chttp2ServerListener is grpc_tcp_server_ref().) + // The ref for both the listener and tcp_server need to be taken in the + // critical region after having made sure that the listener has not been + // Orphaned, so as to avoid heap-use-after-free issues where `Ref()` is + // invoked when the listener is already shutdown. Note that the listener + // holds a ref to the tcp_server but this ref is given away when the + // listener is orphaned (shutdown). + if (self->tcp_server_ != nullptr) { + grpc_tcp_server_ref(self->tcp_server_); + } listener_ref = self->RefAsSubclass(); self->connections_.emplace(connection.get(), std::move(connection)); } } - if (connection == nullptr) { + if (connection == nullptr && listener_ref != nullptr) { connection_ref->Start(std::move(listener_ref), std::move(endpoint), args); } } @@ -1078,8 +1078,8 @@ int grpc_server_add_http2_port(grpc_server* server, const char* addr, int port_num = 0; grpc_core::Server* core_server = grpc_core::Server::FromC(server); grpc_core::ChannelArgs args = core_server->channel_args(); - GRPC_API_TRACE("grpc_server_add_http2_port(server=%p, addr=%s, creds=%p)", 3, - (server, addr, creds)); + GRPC_TRACE_LOG(api, INFO) << "grpc_server_add_http2_port(server=" << server + << ", addr=" << addr << ", creds=" << creds << ")"; // Create security context. if (creds == nullptr) { err = GRPC_ERROR_CREATE( @@ -1174,8 +1174,9 @@ absl::Status grpc_server_add_passive_listener( std::shared_ptr passive_listener) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_add_passive_listener(server=%p, credentials=%p)", - 2, (server, credentials)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_add_passive_listener(server=" << server + << ", credentials=" << credentials << ")"; // Create security context. if (credentials == nullptr) { return absl::UnavailableError( diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 3a5c6ea754477..5c48b14746c57 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -65,7 +65,6 @@ #include "src/core/ext/transport/chttp2/transport/http2_settings.h" #include "src/core/ext/transport/chttp2/transport/internal.h" #include "src/core/ext/transport/chttp2/transport/legacy_frame.h" -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h" #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h" @@ -547,7 +546,6 @@ static void read_channel_args(grpc_chttp2_transport* t, value = channel_args.GetInt(GRPC_ARG_MAX_CONCURRENT_STREAMS).value_or(-1); if (value >= 0) { t->settings.mutable_local().SetMaxConcurrentStreams(value); - t->max_concurrent_streams_policy.SetTarget(value); } } else if (channel_args.Contains(GRPC_ARG_MAX_CONCURRENT_STREAMS)) { VLOG(2) << GRPC_ARG_MAX_CONCURRENT_STREAMS @@ -1026,6 +1024,7 @@ static const char* begin_writing_desc(bool partial) { static void write_action_begin_locked( grpc_core::RefCountedPtr t, grpc_error_handle /*error_ignored*/) { + GRPC_LATENT_SEE_INNER_SCOPE("write_action_begin_locked"); CHECK(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE); grpc_chttp2_begin_write_result r; if (!t->closed_with_error.ok()) { @@ -1652,10 +1651,9 @@ void grpc_chttp2_transport::PerformStreamOp( } } - if (GRPC_TRACE_FLAG_ENABLED(http)) { - LOG(INFO) << "perform_stream_op[s=" << s << "; op=" << op - << "]: " << grpc_transport_stream_op_batch_string(op, false); - } + GRPC_TRACE_LOG(http, INFO) + << "perform_stream_op[s=" << s << "; op=" << op + << "]: " << grpc_transport_stream_op_batch_string(op, false); GRPC_CHTTP2_STREAM_REF(s, "perform_stream_op"); op->handler_private.extra_arg = gs; @@ -1760,62 +1758,65 @@ void grpc_chttp2_ack_ping(grpc_chttp2_transport* t, uint64_t id) { void grpc_chttp2_keepalive_timeout( grpc_core::RefCountedPtr t) { - t->combiner->Run(grpc_core::NewClosure([t](grpc_error_handle) { - LOG(INFO) << t->peer_string.as_string_view() - << ": Keepalive timeout. Closing transport."; - send_goaway(t.get(), - grpc_error_set_int( - GRPC_ERROR_CREATE("keepalive_timeout"), - grpc_core::StatusIntProperty::kHttp2Error, - GRPC_HTTP2_ENHANCE_YOUR_CALM), - /*immediate_disconnect_hint=*/true); - close_transport_locked( - t.get(), grpc_error_set_int( - GRPC_ERROR_CREATE("keepalive timeout"), - grpc_core::StatusIntProperty::kRpcStatus, - GRPC_STATUS_UNAVAILABLE)); - }), - absl::OkStatus()); + t->combiner->Run( + grpc_core::NewClosure([t](grpc_error_handle) { + GRPC_TRACE_LOG(http, INFO) << t->peer_string.as_string_view() + << ": Keepalive timeout. Closing transport."; + send_goaway( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("keepalive_timeout"), + grpc_core::StatusIntProperty::kHttp2Error, + GRPC_HTTP2_ENHANCE_YOUR_CALM), + /*immediate_disconnect_hint=*/true); + close_transport_locked( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("keepalive timeout"), + grpc_core::StatusIntProperty::kRpcStatus, + GRPC_STATUS_UNAVAILABLE)); + }), + absl::OkStatus()); } void grpc_chttp2_ping_timeout( grpc_core::RefCountedPtr t) { - t->combiner->Run(grpc_core::NewClosure([t](grpc_error_handle) { - LOG(INFO) << t->peer_string.as_string_view() - << ": Ping timeout. Closing transport."; - send_goaway(t.get(), - grpc_error_set_int( - GRPC_ERROR_CREATE("ping_timeout"), - grpc_core::StatusIntProperty::kHttp2Error, - GRPC_HTTP2_ENHANCE_YOUR_CALM), - /*immediate_disconnect_hint=*/true); - close_transport_locked( - t.get(), grpc_error_set_int( - GRPC_ERROR_CREATE("ping timeout"), - grpc_core::StatusIntProperty::kRpcStatus, - GRPC_STATUS_UNAVAILABLE)); - }), - absl::OkStatus()); + t->combiner->Run( + grpc_core::NewClosure([t](grpc_error_handle) { + GRPC_TRACE_LOG(http, INFO) << t->peer_string.as_string_view() + << ": Ping timeout. Closing transport."; + send_goaway( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("ping_timeout"), + grpc_core::StatusIntProperty::kHttp2Error, + GRPC_HTTP2_ENHANCE_YOUR_CALM), + /*immediate_disconnect_hint=*/true); + close_transport_locked( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("ping timeout"), + grpc_core::StatusIntProperty::kRpcStatus, + GRPC_STATUS_UNAVAILABLE)); + }), + absl::OkStatus()); } void grpc_chttp2_settings_timeout( grpc_core::RefCountedPtr t) { - t->combiner->Run(grpc_core::NewClosure([t](grpc_error_handle) { - LOG(INFO) << t->peer_string.as_string_view() - << ": Settings timeout. Closing transport."; - send_goaway(t.get(), - grpc_error_set_int( - GRPC_ERROR_CREATE("settings_timeout"), - grpc_core::StatusIntProperty::kHttp2Error, - GRPC_HTTP2_SETTINGS_TIMEOUT), - /*immediate_disconnect_hint=*/true); - close_transport_locked( - t.get(), grpc_error_set_int( - GRPC_ERROR_CREATE("settings timeout"), - grpc_core::StatusIntProperty::kRpcStatus, - GRPC_STATUS_UNAVAILABLE)); - }), - absl::OkStatus()); + t->combiner->Run( + grpc_core::NewClosure([t](grpc_error_handle) { + GRPC_TRACE_LOG(http, INFO) << t->peer_string.as_string_view() + << ": Settings timeout. Closing transport."; + send_goaway( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("settings_timeout"), + grpc_core::StatusIntProperty::kHttp2Error, + GRPC_HTTP2_SETTINGS_TIMEOUT), + /*immediate_disconnect_hint=*/true); + close_transport_locked( + t.get(), + grpc_error_set_int(GRPC_ERROR_CREATE("settings timeout"), + grpc_core::StatusIntProperty::kRpcStatus, + GRPC_STATUS_UNAVAILABLE)); + }), + absl::OkStatus()); } namespace { @@ -1996,10 +1997,8 @@ static void perform_transport_op_locked(void* stream_op, } void grpc_chttp2_transport::PerformOp(grpc_transport_op* op) { - if (GRPC_TRACE_FLAG_ENABLED(http)) { - LOG(INFO) << "perform_transport_op[t=" << this - << "]: " << grpc_transport_op_string(op); - } + GRPC_TRACE_LOG(http, INFO) << "perform_transport_op[t=" << this + << "]: " << grpc_transport_op_string(op); op->handler_private.extra_arg = this; Ref().release()->combiner->Run( GRPC_CLOSURE_INIT(&op->handler_private.closure, @@ -2673,6 +2672,7 @@ static void read_action(grpc_core::RefCountedPtr t, static void read_action_parse_loop_locked( grpc_core::RefCountedPtr t, grpc_error_handle error) { + GRPC_LATENT_SEE_INNER_SCOPE("read_action_parse_loop_locked"); if (t->closed_with_error.ok()) { grpc_error_handle errors[3] = {error, absl::OkStatus(), absl::OkStatus()}; size_t requests_started = 0; @@ -2813,10 +2813,9 @@ static void start_bdp_ping(grpc_core::RefCountedPtr t, static void start_bdp_ping_locked( grpc_core::RefCountedPtr t, grpc_error_handle error) { - if (GRPC_TRACE_FLAG_ENABLED(http)) { - LOG(INFO) << t->peer_string.as_string_view() - << ": Start BDP ping err=" << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(http, INFO) + << t->peer_string.as_string_view() + << ": Start BDP ping err=" << grpc_core::StatusToString(error); if (!error.ok() || !t->closed_with_error.ok()) { return; } @@ -2839,10 +2838,9 @@ static void finish_bdp_ping(grpc_core::RefCountedPtr t, static void finish_bdp_ping_locked( grpc_core::RefCountedPtr t, grpc_error_handle error) { - if (GRPC_TRACE_FLAG_ENABLED(http)) { - LOG(INFO) << t->peer_string.as_string_view() - << ": Complete BDP ping err=" << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(http, INFO) + << t->peer_string.as_string_view() + << ": Complete BDP ping err=" << grpc_core::StatusToString(error); if (!error.ok() || !t->closed_with_error.ok()) { return; } @@ -3104,10 +3102,9 @@ static void benign_reclaimer_locked( if (error.ok() && t->stream_map.empty()) { // Channel with no active streams: send a goaway to try and make it // disconnect cleanly - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "HTTP2: " << t->peer_string.as_string_view() - << " - send goaway to free memory"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "HTTP2: " << t->peer_string.as_string_view() + << " - send goaway to free memory"; send_goaway(t.get(), grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"), grpc_core::StatusIntProperty::kHttp2Error, @@ -3131,10 +3128,9 @@ static void destructive_reclaimer_locked( if (error.ok() && !t->stream_map.empty()) { // As stream_map is a hash map, this selects effectively a random stream. grpc_chttp2_stream* s = t->stream_map.begin()->second; - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "HTTP2: " << t->peer_string.as_string_view() - << " - abandon stream id " << s->id; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "HTTP2: " << t->peer_string.as_string_view() + << " - abandon stream id " << s->id; grpc_chttp2_cancel_stream( t.get(), s, grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"), diff --git a/src/core/ext/transport/chttp2/transport/flow_control.cc b/src/core/ext/transport/chttp2/transport/flow_control.cc index 39c0d08299eee..c80fdd8307353 100644 --- a/src/core/ext/transport/chttp2/transport/flow_control.cc +++ b/src/core/ext/transport/chttp2/transport/flow_control.cc @@ -233,10 +233,9 @@ void TransportFlowControl::UpdateSetting( FlowControlAction& (FlowControlAction::*set)(FlowControlAction::Urgency, uint32_t)) { if (new_desired_value != *desired_value) { - if (GRPC_TRACE_FLAG_ENABLED(flowctl)) { - LOG(INFO) << "[flowctl] UPDATE SETTING " << name << " from " - << *desired_value << " to " << new_desired_value; - } + GRPC_TRACE_LOG(flowctl, INFO) + << "[flowctl] UPDATE SETTING " << name << " from " << *desired_value + << " to " << new_desired_value; // Reaching zero can only happen for initial window size, and if it occurs // we really want to wake up writes and ensure all the queued stream // window updates are flushed, since stream flow control operates diff --git a/src/core/ext/transport/chttp2/transport/frame_ping.cc b/src/core/ext/transport/chttp2/transport/frame_ping.cc index 764f9842cfbcd..e124b586a9af8 100644 --- a/src/core/ext/transport/chttp2/transport/frame_ping.cc +++ b/src/core/ext/transport/chttp2/transport/frame_ping.cc @@ -93,10 +93,9 @@ grpc_error_handle grpc_chttp2_ping_parser_parse(void* parser, if (p->byte == 8) { CHECK(is_last); if (p->is_ack) { - if (GRPC_TRACE_FLAG_ENABLED(http2_ping)) { - LOG(INFO) << (t->is_client ? "CLIENT" : "SERVER") << "[" << t - << "]: received ping ack " << p->opaque_8bytes; - } + GRPC_TRACE_LOG(http2_ping, INFO) + << (t->is_client ? "CLIENT" : "SERVER") << "[" << t + << "]: received ping ack " << p->opaque_8bytes; grpc_chttp2_ack_ping(t, p->opaque_8bytes); } else { if (!t->is_client) { diff --git a/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc b/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc index 540d4faaf2a8f..93e33a14a0f7f 100644 --- a/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +++ b/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc @@ -113,10 +113,9 @@ grpc_error_handle grpc_chttp2_rst_stream_parser_parse(void* parser, ((static_cast(p->reason_bytes[1])) << 16) | ((static_cast(p->reason_bytes[2])) << 8) | ((static_cast(p->reason_bytes[3]))); - if (GRPC_TRACE_FLAG_ENABLED(http)) { - LOG(INFO) << "[chttp2 transport=" << t << " stream=" << s - << "] received RST_STREAM(reason=" << reason << ")"; - } + GRPC_TRACE_LOG(http, INFO) + << "[chttp2 transport=" << t << " stream=" << s + << "] received RST_STREAM(reason=" << reason << ")"; grpc_error_handle error; if (reason != GRPC_HTTP2_NO_ERROR || s->trailing_metadata_buffer.empty()) { error = grpc_error_set_int( diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.cc b/src/core/ext/transport/chttp2/transport/hpack_parser.cc index ba6031b89ccb5..04c64dd5df9d1 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.cc @@ -90,12 +90,14 @@ constexpr Base64InverseTable kBase64InverseTable; class HPackParser::Input { public: Input(grpc_slice_refcount* current_slice_refcount, const uint8_t* begin, - const uint8_t* end, absl::BitGenRef bitsrc, HpackParseResult& error) + const uint8_t* end, absl::BitGenRef bitsrc, + HpackParseResult& frame_error, HpackParseResult& field_error) : current_slice_refcount_(current_slice_refcount), begin_(begin), end_(end), frontier_(begin), - error_(error), + frame_error_(frame_error), + field_error_(field_error), bitsrc_(bitsrc) {} // If input is backed by a slice, retrieve its refcount. If not, return @@ -214,14 +216,18 @@ class HPackParser::Input { // Check if we saw an EOF bool eof_error() const { - return min_progress_size_ != 0 || error_.connection_error(); + return min_progress_size_ != 0 || frame_error_.connection_error(); + } + + // Reset the field error to be ok + void ClearFieldError() { + if (field_error_.ok()) return; + field_error_ = HpackParseResult(); } // Minimum number of bytes to unstuck the current parse size_t min_progress_size() const { return min_progress_size_; } - bool has_error() const { return !error_.ok(); } - // Set the current error - tweaks the error to include a stream id so that // chttp2 does not close the connection. // Intended for errors that are specific to a stream and recoverable. @@ -245,10 +251,7 @@ class HPackParser::Input { // read prior to being able to get further in this parse. void UnexpectedEOF(size_t min_progress_size) { CHECK_GT(min_progress_size, 0u); - if (min_progress_size_ != 0 || error_.connection_error()) { - DCHECK(eof_error()); - return; - } + if (eof_error()) return; // Set min progress size, taking into account bytes parsed already but not // consumed. min_progress_size_ = min_progress_size + (begin_ - frontier_); @@ -301,13 +304,18 @@ class HPackParser::Input { // Do not use this directly, instead use SetErrorAndContinueParsing or // SetErrorAndStopParsing. void SetError(HpackParseResult error) { - if (!error_.ok() || min_progress_size_ > 0) { - if (error.connection_error() && !error_.connection_error()) { - error_ = std::move(error); // connection errors dominate + SetErrorFor(frame_error_, error); + SetErrorFor(field_error_, std::move(error)); + } + + void SetErrorFor(HpackParseResult& error, HpackParseResult new_error) { + if (!error.ok() || min_progress_size_ > 0) { + if (new_error.connection_error() && !error.connection_error()) { + error = std::move(new_error); // connection errors dominate } return; } - error_ = std::move(error); + error = std::move(new_error); } // Refcount if we are backed by a slice @@ -319,7 +327,8 @@ class HPackParser::Input { // Frontier denotes the first byte past successfully processed input const uint8_t* frontier_; // Current error - HpackParseResult& error_; + HpackParseResult& frame_error_; + HpackParseResult& field_error_; // If the error was EOF, we flag it here by noting how many more bytes would // be needed to make progress size_t min_progress_size_ = 0; @@ -596,6 +605,7 @@ class HPackParser::Parser { bool ParseTop() { DCHECK(state_.parse_state == ParseState::kTop); auto cur = *input_->Next(); + input_->ClearFieldError(); switch (cur >> 4) { // Literal header not indexed - First byte format: 0000xxxx // Literal header never indexed - First byte format: 0001xxxx @@ -700,20 +710,21 @@ class HPackParser::Parser { type = "???"; break; } - VLOG(2) << "HTTP:" << log_info_.stream_id << ":" << type << ":" - << (log_info_.is_client ? "CLI" : "SVR") << ": " - << memento.md.DebugString() - << (memento.parse_status == nullptr - ? "" - : absl::StrCat( - " (parse error: ", - memento.parse_status->Materialize().ToString(), ")")); + LOG(INFO) << "HTTP:" << log_info_.stream_id << ":" << type << ":" + << (log_info_.is_client ? "CLI" : "SVR") << ": " + << memento.md.DebugString() + << (memento.parse_status.get() == nullptr + ? "" + : absl::StrCat( + " (parse error: ", + memento.parse_status->Materialize().ToString(), + ")")); } void EmitHeader(const HPackTable::Memento& md) { // Pass up to the transport state_.frame_length += md.md.transport_size(); - if (md.parse_status != nullptr) { + if (md.parse_status.get() != nullptr) { // Reject any requests with invalid metadata. input_->SetErrorAndContinueParsing(*md.parse_status); } @@ -950,11 +961,10 @@ class HPackParser::Parser { state_.string_length) : String::Parse(input_, state_.is_string_huff_compressed, state_.string_length); - HpackParseResult& status = state_.frame_error; absl::string_view key_string; if (auto* s = absl::get_if(&state_.key)) { key_string = s->as_string_view(); - if (status.ok()) { + if (state_.field_error.ok()) { auto r = ValidateKey(key_string); if (r != ValidateMetadataResult::kOk) { input_->SetErrorAndContinueParsing( @@ -964,7 +974,7 @@ class HPackParser::Parser { } else { const auto* memento = absl::get(state_.key); key_string = memento->md.key(); - if (status.ok() && memento->parse_status != nullptr) { + if (state_.field_error.ok() && memento->parse_status.get() != nullptr) { input_->SetErrorAndContinueParsing(*memento->parse_status); } } @@ -991,15 +1001,15 @@ class HPackParser::Parser { key_string.size() + value.wire_size + hpack_constants::kEntryOverhead; auto md = grpc_metadata_batch::Parse( key_string, std::move(value_slice), state_.add_to_table, transport_size, - [key_string, &status, this](absl::string_view message, const Slice&) { - if (!status.ok()) return; + [key_string, this](absl::string_view message, const Slice&) { + if (!state_.field_error.ok()) return; input_->SetErrorAndContinueParsing( HpackParseResult::MetadataParseError(key_string)); LOG(ERROR) << "Error parsing '" << key_string << "' metadata: " << message; }); - HPackTable::Memento memento{std::move(md), - status.PersistentStreamErrorOrNullptr()}; + HPackTable::Memento memento{ + std::move(md), state_.field_error.PersistentStreamErrorOrNullptr()}; input_->UpdateFrontier(); state_.parse_state = ParseState::kTop; if (state_.add_to_table) { @@ -1112,13 +1122,13 @@ grpc_error_handle HPackParser::Parse( std::vector buffer = std::move(unparsed_bytes_); return ParseInput( Input(nullptr, buffer.data(), buffer.data() + buffer.size(), bitsrc, - state_.frame_error), + state_.frame_error, state_.field_error), is_last, call_tracer); } - return ParseInput( - Input(slice.refcount, GRPC_SLICE_START_PTR(slice), - GRPC_SLICE_END_PTR(slice), bitsrc, state_.frame_error), - is_last, call_tracer); + return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice), + GRPC_SLICE_END_PTR(slice), bitsrc, state_.frame_error, + state_.field_error), + is_last, call_tracer); } grpc_error_handle HPackParser::ParseInput( diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.h b/src/core/ext/transport/chttp2/transport/hpack_parser.h index 463e051dc27a5..9df4487f31a9d 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.h +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.h @@ -235,6 +235,8 @@ class HPackParser { HPackTable hpack_table; // Error so far for this frame (set by class Input) HpackParseResult frame_error; + // Error so far for this field (set by class Input) + HpackParseResult field_error; // Length of frame so far. uint32_t frame_length = 0; // Length of the string being parsed diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc b/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc index f27f7a1019d9d..7a0b7bd849828 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc @@ -37,6 +37,7 @@ #include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/slice/slice.h" +#include "src/core/telemetry/stats.h" namespace grpc_core { @@ -47,6 +48,10 @@ void HPackTable::MementoRingBuffer::Put(Memento m) { return entries_.push_back(std::move(m)); } size_t index = (first_entry_ + num_entries_) % max_entries_; + if (timestamp_index_ == kNoTimestamp) { + timestamp_index_ = index; + timestamp_ = Timestamp::Now(); + } entries_[index] = std::move(m); ++num_entries_; } @@ -54,12 +59,31 @@ void HPackTable::MementoRingBuffer::Put(Memento m) { auto HPackTable::MementoRingBuffer::PopOne() -> Memento { CHECK_GT(num_entries_, 0u); size_t index = first_entry_ % max_entries_; + if (index == timestamp_index_) { + global_stats().IncrementHttp2HpackEntryLifetime( + (Timestamp::Now() - timestamp_).millis()); + timestamp_index_ = kNoTimestamp; + } ++first_entry_; --num_entries_; - return std::move(entries_[index]); + auto& entry = entries_[index]; + if (!entry.parse_status.TestBit(Memento::kUsedBit)) { + global_stats().IncrementHttp2HpackMisses(); + } + return std::move(entry); } -auto HPackTable::MementoRingBuffer::Lookup(uint32_t index) const +auto HPackTable::MementoRingBuffer::Lookup(uint32_t index) -> const Memento* { + if (index >= num_entries_) return nullptr; + uint32_t offset = (num_entries_ - 1u - index + first_entry_) % max_entries_; + auto& entry = entries_[offset]; + const bool was_used = entry.parse_status.TestBit(Memento::kUsedBit); + entry.parse_status.SetBit(Memento::kUsedBit); + if (!was_used) global_stats().IncrementHttp2HpackHits(); + return &entry; +} + +auto HPackTable::MementoRingBuffer::Peek(uint32_t index) const -> const Memento* { if (index >= num_entries_) return nullptr; uint32_t offset = (num_entries_ - 1u - index + first_entry_) % max_entries_; @@ -79,14 +103,22 @@ void HPackTable::MementoRingBuffer::Rebuild(uint32_t max_entries) { entries_.swap(entries); } -void HPackTable::MementoRingBuffer::ForEach( - absl::FunctionRef f) const { +template +void HPackTable::MementoRingBuffer::ForEach(F f) const { uint32_t index = 0; - while (auto* m = Lookup(index++)) { + while (auto* m = Peek(index++)) { f(index, *m); } } +HPackTable::MementoRingBuffer::~MementoRingBuffer() { + ForEach([](uint32_t, const Memento& m) { + if (!m.parse_status.TestBit(Memento::kUsedBit)) { + global_stats().IncrementHttp2HpackMisses(); + } + }); +} + // Evict one element from the table void HPackTable::EvictOne() { auto first_entry = entries_.PopOne(); diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser_table.h b/src/core/ext/transport/chttp2/transport/hpack_parser_table.h index d126b3eeb4370..06e0aeb7f4255 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +++ b/src/core/ext/transport/chttp2/transport/hpack_parser_table.h @@ -21,6 +21,8 @@ #include +#include +#include #include #include #include @@ -34,6 +36,7 @@ #include "src/core/lib/gprpp/no_destruct.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/transport/parsed_metadata.h" +#include "src/core/util/unique_ptr_with_bitset.h" namespace grpc_core { @@ -54,11 +57,14 @@ class HPackTable { struct Memento { ParsedMetadata md; - std::unique_ptr parse_status; + // Alongside parse_status we store one bit indicating whether this memento + // has been looked up (and therefore consumed) or not. + UniquePtrWithBitset parse_status; + static const int kUsedBit = 0; }; // Lookup, but don't ref. - const Memento* Lookup(uint32_t index) const { + const Memento* Lookup(uint32_t index) { // Static table comes first, just return an entry from it. // NB: This imposes the constraint that the first // GRPC_CHTTP2_LAST_STATIC_ENTRY entries in the core static metadata table @@ -97,6 +103,14 @@ class HPackTable { class MementoRingBuffer { public: + MementoRingBuffer() {} + ~MementoRingBuffer(); + + MementoRingBuffer(const MementoRingBuffer&) = delete; + MementoRingBuffer& operator=(const MementoRingBuffer&) = delete; + MementoRingBuffer(MementoRingBuffer&&) = default; + MementoRingBuffer& operator=(MementoRingBuffer&&) = default; + // Rebuild this buffer with a new max_entries_ size. void Rebuild(uint32_t max_entries); @@ -109,10 +123,11 @@ class HPackTable { Memento PopOne(); // Lookup the entry at index, or return nullptr if none exists. - const Memento* Lookup(uint32_t index) const; + const Memento* Lookup(uint32_t index); + const Memento* Peek(uint32_t index) const; - void ForEach(absl::FunctionRef - f) const; + template + void ForEach(F f) const; uint32_t max_entries() const { return max_entries_; } uint32_t num_entries() const { return num_entries_; } @@ -126,11 +141,17 @@ class HPackTable { // Maximum number of entries we could possibly fit in the table, given // defined overheads. uint32_t max_entries_ = hpack_constants::kInitialTableEntries; + // Which index holds a timestamp (or kNoTimestamp if none do). + static constexpr uint32_t kNoTimestamp = + std::numeric_limits::max(); + uint32_t timestamp_index_ = kNoTimestamp; + // The timestamp associated with timestamp_entry_. + Timestamp timestamp_; std::vector entries_; }; - const Memento* LookupDynamic(uint32_t index) const { + const Memento* LookupDynamic(uint32_t index) { // Not static - find the value in the list of valid entries const uint32_t tbl_index = index - (hpack_constants::kLastStaticEntry + 1); return entries_.Lookup(tbl_index); diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index ae306c925dee8..64f398807ba4a 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -52,7 +52,6 @@ #include "src/core/ext/transport/chttp2/transport/hpack_parser.h" #include "src/core/ext/transport/chttp2/transport/http2_settings.h" #include "src/core/ext/transport/chttp2/transport/legacy_frame.h" -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h" #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h" @@ -383,8 +382,6 @@ struct grpc_chttp2_transport final : public grpc_core::FilterStackTransport, grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid; grpc_closure retry_initiate_ping_locked; - grpc_core::Chttp2MaxConcurrentStreamsPolicy max_concurrent_streams_policy; - /// ping acks size_t ping_ack_count = 0; size_t ping_ack_capacity = 0; @@ -545,6 +542,8 @@ struct grpc_chttp2_transport final : public grpc_core::FilterStackTransport, // What percentage of rst_stream frames on the server should cause a ping // frame to be generated. uint8_t ping_on_rst_stream_percent; + + GPR_NO_UNIQUE_ADDRESS grpc_core::latent_see::Flow write_flow; }; typedef enum { diff --git a/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc b/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc deleted file mode 100644 index 355e40898a659..0000000000000 --- a/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" - -#include - -#include "absl/log/check.h" - -#include -#include - -namespace grpc_core { - -void Chttp2MaxConcurrentStreamsPolicy::AddDemerit() { - ++new_demerits_; - ++unacked_demerits_; -} - -void Chttp2MaxConcurrentStreamsPolicy::FlushedSettings() { - sent_demerits_ += std::exchange(new_demerits_, 0); -} - -void Chttp2MaxConcurrentStreamsPolicy::AckLastSend() { - CHECK(unacked_demerits_ >= sent_demerits_); - unacked_demerits_ -= std::exchange(sent_demerits_, 0); -} - -uint32_t Chttp2MaxConcurrentStreamsPolicy::AdvertiseValue() const { - if (target_ < unacked_demerits_) return 0; - return target_ - unacked_demerits_; -} - -} // namespace grpc_core diff --git a/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h b/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h deleted file mode 100644 index a2a56d2bfe5f8..0000000000000 --- a/src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MAX_CONCURRENT_STREAMS_POLICY_H -#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MAX_CONCURRENT_STREAMS_POLICY_H - -#include -#include - -#include - -namespace grpc_core { - -class Chttp2MaxConcurrentStreamsPolicy { - public: - // Set the target number of concurrent streams. - // If everything is idle we should advertise this number. - void SetTarget(uint32_t target) { target_ = target; } - - // Add one demerit to the current target. - // We need to do one full settings round trip after this to clear this - // demerit. - // It will reduce our advertised max concurrent streams by one. - void AddDemerit(); - - // Notify the policy that we've sent a settings frame. - // Newly added demerits since the last settings frame was sent will be cleared - // once that settings frame is acknowledged. - void FlushedSettings(); - - // Notify the policy that we've received an acknowledgement for the last - // settings frame we sent. - void AckLastSend(); - - // Returns what we should advertise as max concurrent streams. - uint32_t AdvertiseValue() const; - - private: - uint32_t target_ = std::numeric_limits::max(); - // Demerit flow: - // When we add a demerit, we add to both new & unacked. - // When we flush settings, we move new to sent. - // When we ack settings, we remove what we sent from unacked. - // eg: - // we add 10 demerits - now new=10, sent=0, unacked=10 - // we send settings - now new=0, sent=10, unacked=10 - // we add 5 demerits - now new=5, sent=10, unacked=15 - // we get the settings ack - now new=5, sent=0, unacked=5 - uint32_t new_demerits_ = 0; - uint32_t sent_demerits_ = 0; - uint32_t unacked_demerits_ = 0; -}; - -} // namespace grpc_core - -#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MAX_CONCURRENT_STREAMS_POLICY_H diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc index 82c5a188b47c3..070294b2cf4b0 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.cc +++ b/src/core/ext/transport/chttp2/transport/parsing.cc @@ -55,7 +55,6 @@ #include "src/core/ext/transport/chttp2/transport/http2_settings.h" #include "src/core/ext/transport/chttp2/transport/internal.h" #include "src/core/ext/transport/chttp2/transport/legacy_frame.h" -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h" #include "src/core/lib/backoff/random_early_detection.h" #include "src/core/lib/debug/trace.h" @@ -205,6 +204,8 @@ std::string FrameTypeString(uint8_t frame_type, uint8_t flags) { absl::variant grpc_chttp2_perform_read( grpc_chttp2_transport* t, const grpc_slice& slice, size_t& requests_started) { + GRPC_LATENT_SEE_INNER_SCOPE("grpc_chttp2_perform_read"); + const uint8_t* beg = GRPC_SLICE_START_PTR(slice); const uint8_t* end = GRPC_SLICE_END_PTR(slice); const uint8_t* cur = beg; @@ -648,7 +649,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t, } else if (GPR_UNLIKELY( t->max_concurrent_streams_overload_protection && t->streams_allocated.load(std::memory_order_relaxed) > - t->max_concurrent_streams_policy.AdvertiseValue())) { + t->settings.local().max_concurrent_streams())) { // We have more streams allocated than we'd like, so apply some pushback // by refusing this stream. ++t->num_pending_induced_frames; @@ -657,13 +658,12 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t, GRPC_HTTP2_REFUSED_STREAM, nullptr)); grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM); return init_header_skip_frame_parser(t, priority_type, is_eoh); - } else if (GPR_UNLIKELY( - t->stream_map.size() >= - t->max_concurrent_streams_policy.AdvertiseValue() && - grpc_core::RandomEarlyDetection( - t->max_concurrent_streams_policy.AdvertiseValue(), - t->settings.acked().max_concurrent_streams()) - .Reject(t->stream_map.size(), t->bitgen))) { + } else if (GPR_UNLIKELY(t->stream_map.size() >= + t->settings.local().max_concurrent_streams() && + grpc_core::RandomEarlyDetection( + t->settings.local().max_concurrent_streams(), + t->settings.acked().max_concurrent_streams()) + .Reject(t->stream_map.size(), t->bitgen))) { // We are under the limit of max concurrent streams for the current // setting, but are over the next value that will be advertised. // Apply some backpressure by randomly not accepting new streams. @@ -825,9 +825,6 @@ static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport* t) { s->call_tracer_wrapper.RecordIncomingBytes({9, 0, 0}); t->parser = grpc_chttp2_transport::Parser{ "rst_stream", grpc_chttp2_rst_stream_parser_parse, &t->simple.rst_stream}; - if (!t->is_client && grpc_core::IsRstpitEnabled()) { - t->max_concurrent_streams_policy.AddDemerit(); - } return absl::OkStatus(); } @@ -852,7 +849,6 @@ static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) { return err; } if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) { - t->max_concurrent_streams_policy.AckLastSend(); if (!t->settings.AckLastSend()) { return GRPC_ERROR_CREATE("Received unexpected settings ack"); } diff --git a/src/core/ext/transport/chttp2/transport/stream_lists.cc b/src/core/ext/transport/chttp2/transport/stream_lists.cc index 2466f950267d1..f2ac00e957a72 100644 --- a/src/core/ext/transport/chttp2/transport/stream_lists.cc +++ b/src/core/ext/transport/chttp2/transport/stream_lists.cc @@ -90,10 +90,9 @@ static void stream_list_remove(grpc_chttp2_transport* t, grpc_chttp2_stream* s, } else { t->lists[id].tail = s->links[id].prev; } - if (GRPC_TRACE_FLAG_ENABLED(http2_stream_state)) { - LOG(INFO) << t << "[" << s->id << "][" << (t->is_client ? "cli" : "svr") - << "]: remove from " << stream_list_id_string(id); - } + GRPC_TRACE_LOG(http2_stream_state, INFO) + << t << "[" << s->id << "][" << (t->is_client ? "cli" : "svr") + << "]: remove from " << stream_list_id_string(id); } static bool stream_list_maybe_remove(grpc_chttp2_transport* t, @@ -122,10 +121,9 @@ static void stream_list_add_tail(grpc_chttp2_transport* t, } t->lists[id].tail = s; s->included.set(id); - if (GRPC_TRACE_FLAG_ENABLED(http2_stream_state)) { - LOG(INFO) << t << "[" << s->id << "][" << (t->is_client ? "cli" : "svr") - << "]: add to " << stream_list_id_string(id); - } + GRPC_TRACE_LOG(http2_stream_state, INFO) + << t << "[" << s->id << "][" << (t->is_client ? "cli" : "svr") + << "]: add to " << stream_list_id_string(id); } static bool stream_list_add(grpc_chttp2_transport* t, grpc_chttp2_stream* s, diff --git a/src/core/ext/transport/chttp2/transport/writing.cc b/src/core/ext/transport/chttp2/transport/writing.cc index 2f423069b635d..029608120cc2b 100644 --- a/src/core/ext/transport/chttp2/transport/writing.cc +++ b/src/core/ext/transport/chttp2/transport/writing.cc @@ -49,7 +49,6 @@ #include "src/core/ext/transport/chttp2/transport/http2_settings.h" #include "src/core/ext/transport/chttp2/transport/internal.h" #include "src/core/ext/transport/chttp2/transport/legacy_frame.h" -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h" #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h" #include "src/core/ext/transport/chttp2/transport/write_size_policy.h" @@ -260,8 +259,6 @@ class WriteContext { } void FlushSettings() { - t_->settings.mutable_local().SetMaxConcurrentStreams( - t_->max_concurrent_streams_policy.AdvertiseValue()); auto update = t_->settings.MaybeSendUpdate(); if (update.has_value()) { grpc_core::Http2Frame frame(std::move(*update)); @@ -280,7 +277,6 @@ class WriteContext { }); } t_->flow_control.FlushedSettings(); - t_->max_concurrent_streams_policy.FlushedSettings(); grpc_core::global_stats().IncrementHttp2SettingsWrites(); } } @@ -677,6 +673,8 @@ class StreamWriteContext { grpc_chttp2_begin_write_result grpc_chttp2_begin_write( grpc_chttp2_transport* t) { + GRPC_LATENT_SEE_INNER_SCOPE("grpc_chttp2_begin_write"); + int64_t outbuf_relative_start_pos = 0; WriteContext ctx(t); ctx.FlushSettings(); @@ -732,12 +730,17 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( maybe_initiate_ping(t); + t->write_flow.Begin(GRPC_LATENT_SEE_METADATA("write")); + return ctx.Result(); } void grpc_chttp2_end_write(grpc_chttp2_transport* t, grpc_error_handle error) { + GRPC_LATENT_SEE_INNER_SCOPE("grpc_chttp2_end_write"); grpc_chttp2_stream* s; + t->write_flow.End(); + if (t->channelz_socket != nullptr) { t->channelz_socket->RecordMessagesSent(t->num_messages_in_next_write); } diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.cc b/src/core/ext/transport/cronet/transport/cronet_transport.cc index a0ae160b19f19..26b0938228578 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.cc +++ b/src/core/ext/transport/cronet/transport/cronet_transport.cc @@ -67,11 +67,6 @@ #define GRPC_HEADER_SIZE_IN_BYTES 5 #define GRPC_FLUSH_READ_SIZE 4096 -#define CRONET_LOG(...) \ - do { \ - if (GRPC_TRACE_FLAG_ENABLED(cronet)) gpr_log(__VA_ARGS__); \ - } while (0) - enum e_op_result { ACTION_TAKEN_WITH_CALLBACK, ACTION_TAKEN_NO_CALLBACK, @@ -327,7 +322,7 @@ static void read_grpc_header(stream_obj* s) { s->state.rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; s->state.rs.received_bytes = 0; s->state.rs.compressed = false; - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) << "bidirectional_stream_read(" << s->cbs << ")"; bidirectional_stream_read(s->cbs, s->state.rs.read_buffer, s->state.rs.remaining_bytes); } @@ -365,8 +360,8 @@ static void add_to_storage(struct stream_obj* s, if (op->recv_trailing_metadata) { s->state.pending_recv_trailing_metadata = true; } - CRONET_LOG(GPR_DEBUG, "adding new op %p. %d in the queue.", new_op, - storage->num_pending_ops); + GRPC_TRACE_VLOG(cronet, 2) << "adding new op " << new_op << ". " + << storage->num_pending_ops << " in the queue."; gpr_mu_unlock(&s->mu); } @@ -383,19 +378,21 @@ static void remove_from_storage(struct stream_obj* s, s->storage.head = oas->next; delete oas; s->storage.num_pending_ops--; - CRONET_LOG(GPR_DEBUG, "Freed %p. Now %d in the queue", oas, - s->storage.num_pending_ops); + GRPC_TRACE_VLOG(cronet, 2) << "Freed " << oas << ". Now " + << s->storage.num_pending_ops << " in the queue"; } else { for (curr = s->storage.head; curr != nullptr; curr = curr->next) { if (curr->next == oas) { curr->next = oas->next; s->storage.num_pending_ops--; - CRONET_LOG(GPR_DEBUG, "Freed %p. Now %d in the queue", oas, - s->storage.num_pending_ops); + GRPC_TRACE_VLOG(cronet, 2) + << "Freed " << oas << ". Now " << s->storage.num_pending_ops + << " in the queue"; delete oas; break; } else if (GPR_UNLIKELY(curr->next == nullptr)) { - CRONET_LOG(GPR_ERROR, "Reached end of LL and did not find op to free"); + GRPC_TRACE_LOG(cronet, ERROR) + << "Reached end of LL and did not find op to free"; } } } @@ -410,11 +407,12 @@ static void remove_from_storage(struct stream_obj* s, static void execute_from_storage(stream_obj* s) { gpr_mu_lock(&s->mu); for (struct op_and_state* curr = s->storage.head; curr != nullptr;) { - CRONET_LOG(GPR_DEBUG, "calling op at %p. done = %d", curr, curr->done); + GRPC_TRACE_VLOG(cronet, 2) + << "calling op at " << curr << ". done = " << curr->done; CHECK(!curr->done); enum e_op_result result = execute_stream_op(curr); - CRONET_LOG(GPR_DEBUG, "execute_stream_op[%p] returns %s", curr, - op_result_string(result)); + GRPC_TRACE_VLOG(cronet, 2) << "execute_stream_op[" << curr << "] returns " + << op_result_string(result); // if this op is done, then remove it and free memory if (curr->done) { struct op_and_state* next = curr->next; @@ -434,8 +432,8 @@ static void convert_cronet_array_to_metadata( const bidirectional_stream_header_array* header_array, grpc_metadata_batch* mds) { for (size_t i = 0; i < header_array->count; i++) { - CRONET_LOG(GPR_DEBUG, "header key=%s, value=%s", - header_array->headers[i].key, header_array->headers[i].value); + GRPC_TRACE_VLOG(cronet, 2) << "header key=" << header_array->headers[i].key + << ", value=" << header_array->headers[i].value; grpc_slice value; if (absl::EndsWith(header_array->headers[i].key, "-bin")) { value = grpc_slice_from_static_string(header_array->headers[i].value); @@ -485,7 +483,7 @@ static void on_failed(bidirectional_stream* stream, int net_error) { // Cronet callback // static void on_canceled(bidirectional_stream* stream) { - CRONET_LOG(GPR_DEBUG, "on_canceled(%p)", stream); + GRPC_TRACE_VLOG(cronet, 2) << "on_canceled(" << stream << ")"; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; @@ -512,7 +510,7 @@ static void on_canceled(bidirectional_stream* stream) { // Cronet callback // static void on_succeeded(bidirectional_stream* stream) { - CRONET_LOG(GPR_DEBUG, "on_succeeded(%p)", stream); + GRPC_TRACE_VLOG(cronet, 2) << "on_succeeded(" << stream << ")"; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; @@ -531,7 +529,7 @@ static void on_succeeded(bidirectional_stream* stream) { // Cronet callback // static void on_stream_ready(bidirectional_stream* stream) { - CRONET_LOG(GPR_DEBUG, "W: on_stream_ready(%p)", stream); + GRPC_TRACE_VLOG(cronet, 2) << "W: on_stream_ready(" << stream << ")"; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; stream_obj* s = static_cast(stream->annotation); @@ -548,7 +546,8 @@ static void on_stream_ready(bidirectional_stream* stream) { // SEND_TRAILING_METADATA ops pending if (t->use_packet_coalescing) { if (s->state.flush_cronet_when_ready) { - CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_flush (%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) + << "cronet_bidirectional_stream_flush (" << s->cbs << ")"; bidirectional_stream_flush(stream); } } @@ -565,8 +564,9 @@ static void on_response_headers_received( const char* negotiated_protocol) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - CRONET_LOG(GPR_DEBUG, "R: on_response_headers_received(%p, %p, %s)", stream, - headers, negotiated_protocol); + GRPC_TRACE_VLOG(cronet, 2) + << "R: on_response_headers_received(" << stream << ", " << headers << ", " + << negotiated_protocol << ")"; stream_obj* s = static_cast(stream->annotation); // Identify if this is a header or a trailer (in a trailer-only response case) @@ -603,7 +603,8 @@ static void on_write_completed(bidirectional_stream* stream, const char* data) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; stream_obj* s = static_cast(stream->annotation); - CRONET_LOG(GPR_DEBUG, "W: on_write_completed(%p, %s)", stream, data); + GRPC_TRACE_VLOG(cronet, 2) + << "W: on_write_completed(" << stream << ", " << data << ")"; gpr_mu_lock(&s->mu); if (s->state.ws.write_buffer) { gpr_free(s->state.ws.write_buffer); @@ -622,12 +623,12 @@ static void on_read_completed(bidirectional_stream* stream, char* data, grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; stream_obj* s = static_cast(stream->annotation); - CRONET_LOG(GPR_DEBUG, "R: on_read_completed(%p, %p, %d)", stream, data, - count); + GRPC_TRACE_VLOG(cronet, 2) << "R: on_read_completed(" << stream << ", " + << data << ", " << count << ")"; gpr_mu_lock(&s->mu); s->state.state_callback_received[OP_RECV_MESSAGE] = true; if (count > 0 && s->state.flush_read) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) << "bidirectional_stream_read(" << s->cbs << ")"; bidirectional_stream_read(s->cbs, s->state.rs.read_buffer, GRPC_FLUSH_READ_SIZE); gpr_mu_unlock(&s->mu); @@ -635,7 +636,8 @@ static void on_read_completed(bidirectional_stream* stream, char* data, s->state.rs.received_bytes += count; s->state.rs.remaining_bytes -= count; if (s->state.rs.remaining_bytes > 0) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_read(" << s->cbs << ")"; s->state.state_op_done[OP_READ_REQ_MADE] = true; bidirectional_stream_read( s->cbs, s->state.rs.read_buffer + s->state.rs.received_bytes, @@ -661,8 +663,8 @@ static void on_response_trailers_received( const bidirectional_stream_header_array* trailers) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - CRONET_LOG(GPR_DEBUG, "R: on_response_trailers_received(%p,%p)", stream, - trailers); + GRPC_TRACE_VLOG(cronet, 2) << "R: on_response_trailers_received(" << stream + << ", " << trailers << ")"; stream_obj* s = static_cast(stream->annotation); grpc_cronet_transport* t = s->curr_ct; gpr_mu_lock(&s->mu); @@ -677,11 +679,13 @@ static void on_response_trailers_received( if (!s->state.state_op_done[OP_SEND_TRAILING_METADATA] && !(s->state.state_op_done[OP_CANCEL_ERROR] || s->state.state_callback_received[OP_FAILED])) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_write (" << s->cbs << ", 0)"; s->state.state_callback_received[OP_SEND_MESSAGE] = false; bidirectional_stream_write(s->cbs, "", 0, true); if (t->use_packet_coalescing) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_flush (%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_flush (" << s->cbs << ")"; bidirectional_stream_flush(s->cbs); } s->state.state_op_done[OP_SEND_TRAILING_METADATA] = true; @@ -790,7 +794,7 @@ class CronetMetadataEncoder { } else { value = grpc_slice_to_c_string(value_slice.c_slice()); } - CRONET_LOG(GPR_DEBUG, "header %s = %s", key, value); + GRPC_TRACE_VLOG(cronet, 2) << "header " << key << " = " << value; CHECK_LT(count_, capacity_); headers_[count_].key = key; headers_[count_].value = value; @@ -852,34 +856,34 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, stream_state->state_callback_received[OP_FAILED]; if (is_canceled_or_failed) { if (op_id == OP_SEND_INITIAL_METADATA) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } if (op_id == OP_SEND_MESSAGE) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } if (op_id == OP_SEND_TRAILING_METADATA) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } if (op_id == OP_CANCEL_ERROR) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } // already executed if (op_id == OP_RECV_INITIAL_METADATA && stream_state->state_op_done[OP_RECV_INITIAL_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } if (op_id == OP_RECV_MESSAGE && op_state->state_op_done[OP_RECV_MESSAGE]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } if (op_id == OP_RECV_TRAILING_METADATA && stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } // ON_COMPLETE can be processed if one of the following conditions is met: @@ -892,7 +896,7 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, stream_state->state_callback_received[OP_CANCELED] || stream_state->state_callback_received[OP_SUCCEEDED] || !stream_state->state_op_done[OP_SEND_INITIAL_METADATA])) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } } else if (op_id == OP_SEND_INITIAL_METADATA) { @@ -974,7 +978,7 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, if (op_state->state_op_done[OP_ON_COMPLETE]) { // already executed (note we're checking op specific state, not stream // state) - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } // Check if every op that was asked for is done. @@ -984,36 +988,36 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, // there are still recv ops pending. else if (curr_op->send_initial_metadata && !stream_state->state_callback_received[OP_SEND_INITIAL_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->send_message && !op_state->state_op_done[OP_SEND_MESSAGE]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->send_message && !stream_state->state_callback_received[OP_SEND_MESSAGE]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->send_trailing_metadata && !stream_state->state_op_done[OP_SEND_TRAILING_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->recv_initial_metadata && !stream_state->state_op_done[OP_RECV_INITIAL_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->recv_message && !op_state->state_op_done[OP_RECV_MESSAGE]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->cancel_stream && !stream_state->state_callback_received[OP_CANCELED]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } else if (curr_op->recv_trailing_metadata) { // We aren't done with trailing metadata yet if (!stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } // We've asked for actual message in an earlier op, and it hasn't been @@ -1023,7 +1027,7 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, // op has asked), and the read hasn't been delivered. if (!curr_op->recv_message && !stream_state->state_callback_received[OP_SUCCEEDED]) { - CRONET_LOG(GPR_DEBUG, "Because"); + GRPC_TRACE_VLOG(cronet, 2) << "Because"; result = false; } } @@ -1035,357 +1039,445 @@ static bool op_can_be_run(grpc_transport_stream_op_batch* curr_op, result = false; } } - CRONET_LOG(GPR_DEBUG, "op_can_be_run %s : %s", op_id_string(op_id), - result ? "YES" : "NO"); + GRPC_TRACE_VLOG(cronet, 2) << "op_can_be_run " << op_id_string(op_id) << " : " + << (result ? "YES" : "NO"); return result; } -// -// TODO (makdharma): Break down this function in smaller chunks for readability. -// -static enum e_op_result execute_stream_op(struct op_and_state* oas) { +static enum e_op_result execute_stream_op_send_initial_metadata( + struct op_and_state* oas) { grpc_transport_stream_op_batch* stream_op = &oas->op; struct stream_obj* s = oas->s; grpc_cronet_transport* t = s->curr_ct; struct op_state* stream_state = &s->state; - enum e_op_result result = NO_ACTION_POSSIBLE; - if (stream_op->send_initial_metadata && - op_can_be_run(stream_op, s, &oas->state, OP_SEND_INITIAL_METADATA)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_INITIAL_METADATA", oas); - // Start new cronet stream. It is destroyed in on_succeeded, on_canceled, - // on_failed - CHECK_EQ(s->cbs, nullptr); - CHECK(!stream_state->state_op_done[OP_SEND_INITIAL_METADATA]); - s->cbs = - bidirectional_stream_create(t->engine, s->curr_gs, &cronet_callbacks); - CRONET_LOG(GPR_DEBUG, "%p = bidirectional_stream_create()", s->cbs); - if (t->use_packet_coalescing) { - bidirectional_stream_disable_auto_flush(s->cbs, true); - bidirectional_stream_delay_request_headers_until_flush(s->cbs, true); - } - std::string url; - const char* method = "POST"; - s->header_array.headers = nullptr; - convert_metadata_to_cronet_headers( - stream_op->payload->send_initial_metadata.send_initial_metadata, - t->host, &url, &s->header_array.headers, &s->header_array.count, - &method); - s->header_array.capacity = s->header_array.count; - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_start(%p, %s)", s->cbs, - url.c_str()); - bidirectional_stream_start(s->cbs, url.c_str(), 0, method, &s->header_array, - false); - unsigned int header_index; - for (header_index = 0; header_index < s->header_array.count; - header_index++) { - gpr_free(const_cast(s->header_array.headers[header_index].key)); - gpr_free(const_cast(s->header_array.headers[header_index].value)); - } - stream_state->state_op_done[OP_SEND_INITIAL_METADATA] = true; - if (t->use_packet_coalescing) { - if (!stream_op->send_message && !stream_op->send_trailing_metadata) { - s->state.flush_cronet_when_ready = true; - } + GRPC_TRACE_VLOG(cronet, 2) + << "running: " << oas << " OP_SEND_INITIAL_METADATA"; + // Start new cronet stream. It is destroyed in on_succeeded, on_canceled, + // on_failed + CHECK_EQ(s->cbs, nullptr); + CHECK(!stream_state->state_op_done[OP_SEND_INITIAL_METADATA]); + s->cbs = + bidirectional_stream_create(t->engine, s->curr_gs, &cronet_callbacks); + GRPC_TRACE_VLOG(cronet, 2) << s->cbs << " = bidirectional_stream_create()"; + if (t->use_packet_coalescing) { + bidirectional_stream_disable_auto_flush(s->cbs, true); + bidirectional_stream_delay_request_headers_until_flush(s->cbs, true); + } + std::string url; + const char* method = "POST"; + s->header_array.headers = nullptr; + convert_metadata_to_cronet_headers( + stream_op->payload->send_initial_metadata.send_initial_metadata, t->host, + &url, &s->header_array.headers, &s->header_array.count, &method); + s->header_array.capacity = s->header_array.count; + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_start(" << s->cbs << ", " << url.c_str() << ")"; + bidirectional_stream_start(s->cbs, url.c_str(), 0, method, &s->header_array, + false); + unsigned int header_index; + for (header_index = 0; header_index < s->header_array.count; header_index++) { + gpr_free(const_cast(s->header_array.headers[header_index].key)); + gpr_free(const_cast(s->header_array.headers[header_index].value)); + } + stream_state->state_op_done[OP_SEND_INITIAL_METADATA] = true; + if (t->use_packet_coalescing) { + if (!stream_op->send_message && !stream_op->send_trailing_metadata) { + s->state.flush_cronet_when_ready = true; } - result = ACTION_TAKEN_WITH_CALLBACK; - } else if (stream_op->send_message && - op_can_be_run(stream_op, s, &oas->state, OP_SEND_MESSAGE)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_MESSAGE", oas); - stream_state->pending_send_message = false; - if (stream_state->state_op_done[OP_CANCEL_ERROR] || - stream_state->state_callback_received[OP_FAILED] || - stream_state->state_callback_received[OP_SUCCEEDED]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is either cancelled, failed or finished"); - } else { - size_t write_buffer_size; - create_grpc_frame( - stream_op->payload->send_message.send_message->c_slice_buffer(), - &stream_state->ws.write_buffer, &write_buffer_size, - stream_op->payload->send_message.flags); - if (write_buffer_size > 0) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, %p)", s->cbs, - stream_state->ws.write_buffer); - stream_state->state_callback_received[OP_SEND_MESSAGE] = false; - bidirectional_stream_write(s->cbs, stream_state->ws.write_buffer, - static_cast(write_buffer_size), false); - if (t->use_packet_coalescing) { - if (!stream_op->send_trailing_metadata) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_flush (%p)", s->cbs); - bidirectional_stream_flush(s->cbs); - result = ACTION_TAKEN_WITH_CALLBACK; - } else { - stream_state->pending_write_for_trailer = true; - result = ACTION_TAKEN_NO_CALLBACK; - } - } else { + } + return ACTION_TAKEN_WITH_CALLBACK; +} + +static enum e_op_result execute_stream_op_send_message( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + grpc_cronet_transport* t = s->curr_ct; + struct op_state* stream_state = &s->state; + enum e_op_result result = NO_ACTION_POSSIBLE; + + GRPC_TRACE_VLOG(cronet, 2) << "running: " << oas << " OP_SEND_MESSAGE"; + stream_state->pending_send_message = false; + if (stream_state->state_op_done[OP_CANCEL_ERROR] || + stream_state->state_callback_received[OP_FAILED] || + stream_state->state_callback_received[OP_SUCCEEDED]) { + result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) + << "Stream is either cancelled, failed or finished"; + } else { + size_t write_buffer_size; + create_grpc_frame( + stream_op->payload->send_message.send_message->c_slice_buffer(), + &stream_state->ws.write_buffer, &write_buffer_size, + stream_op->payload->send_message.flags); + if (write_buffer_size > 0) { + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_write (" << s->cbs << ", " + << stream_state->ws.write_buffer << ")"; + stream_state->state_callback_received[OP_SEND_MESSAGE] = false; + bidirectional_stream_write(s->cbs, stream_state->ws.write_buffer, + static_cast(write_buffer_size), false); + if (t->use_packet_coalescing) { + if (!stream_op->send_trailing_metadata) { + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_flush (" << s->cbs << ")"; + bidirectional_stream_flush(s->cbs); result = ACTION_TAKEN_WITH_CALLBACK; + } else { + stream_state->pending_write_for_trailer = true; + result = ACTION_TAKEN_NO_CALLBACK; } } else { - // Should never reach here - grpc_core::Crash("unreachable"); + result = ACTION_TAKEN_WITH_CALLBACK; } - } - stream_state->state_op_done[OP_SEND_MESSAGE] = true; - oas->state.state_op_done[OP_SEND_MESSAGE] = true; - } else if (stream_op->send_trailing_metadata && - op_can_be_run(stream_op, s, &oas->state, - OP_SEND_TRAILING_METADATA)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_TRAILING_METADATA", oas); - if (stream_state->state_op_done[OP_CANCEL_ERROR] || - stream_state->state_callback_received[OP_FAILED] || - stream_state->state_callback_received[OP_SUCCEEDED]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is either cancelled, failed or finished"); } else { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs); - stream_state->state_callback_received[OP_SEND_MESSAGE] = false; - bidirectional_stream_write(s->cbs, "", 0, true); - if (t->use_packet_coalescing) { - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_flush (%p)", s->cbs); - bidirectional_stream_flush(s->cbs); - } - result = ACTION_TAKEN_WITH_CALLBACK; + // Should never reach here + grpc_core::Crash("unreachable"); } - stream_state->state_op_done[OP_SEND_TRAILING_METADATA] = true; - } else if (stream_op->recv_initial_metadata && - op_can_be_run(stream_op, s, &oas->state, - OP_RECV_INITIAL_METADATA)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_RECV_INITIAL_METADATA", oas); - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, - absl::OkStatus()); - } else if (stream_state->state_callback_received[OP_FAILED]) { - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, - absl::OkStatus()); - } else if (stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) { - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, - absl::OkStatus()); - } else { - *stream_op->payload->recv_initial_metadata.recv_initial_metadata = - std::move(oas->s->state.rs.initial_metadata); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, - absl::OkStatus()); + } + stream_state->state_op_done[OP_SEND_MESSAGE] = true; + oas->state.state_op_done[OP_SEND_MESSAGE] = true; + + return result; +} + +static enum e_op_result execute_stream_op_send_trailing_metadata( + struct op_and_state* oas) { + struct stream_obj* s = oas->s; + grpc_cronet_transport* t = s->curr_ct; + struct op_state* stream_state = &s->state; + enum e_op_result result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) + << "running: " << oas << " OP_SEND_TRAILING_METADATA"; + if (stream_state->state_op_done[OP_CANCEL_ERROR] || + stream_state->state_callback_received[OP_FAILED] || + stream_state->state_callback_received[OP_SUCCEEDED]) { + result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) + << "Stream is either cancelled, failed or finished"; + } else { + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_write (" << s->cbs << ", 0)"; + stream_state->state_callback_received[OP_SEND_MESSAGE] = false; + bidirectional_stream_write(s->cbs, "", 0, true); + if (t->use_packet_coalescing) { + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_flush (" << s->cbs << ")"; + bidirectional_stream_flush(s->cbs); } - stream_state->state_op_done[OP_RECV_INITIAL_METADATA] = true; + result = ACTION_TAKEN_WITH_CALLBACK; + } + stream_state->state_op_done[OP_SEND_TRAILING_METADATA] = true; + + return result; +} + +static enum e_op_result execute_stream_op_recv_initial_metadata( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + struct op_state* stream_state = &s->state; + GRPC_TRACE_VLOG(cronet, 2) + << "running: " << oas << " OP_RECV_INITIAL_METADATA"; + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, + stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, + absl::OkStatus()); + } else if (stream_state->state_callback_received[OP_FAILED]) { + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, + stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, + absl::OkStatus()); + } else if (stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) { + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, + stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, + absl::OkStatus()); + } else { + *stream_op->payload->recv_initial_metadata.recv_initial_metadata = + std::move(oas->s->state.rs.initial_metadata); + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, + stream_op->payload->recv_initial_metadata.recv_initial_metadata_ready, + absl::OkStatus()); + } + stream_state->state_op_done[OP_RECV_INITIAL_METADATA] = true; + return ACTION_TAKEN_NO_CALLBACK; +} + +static enum e_op_result execute_stream_op_recv_message( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + struct op_state* stream_state = &s->state; + enum e_op_result result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) << "running: " << oas << " OP_RECV_MESSAGE"; + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + GRPC_TRACE_VLOG(cronet, 2) << "Stream is cancelled."; + grpc_core::ExecCtx::Run(DEBUG_LOCATION, + stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; result = ACTION_TAKEN_NO_CALLBACK; - } else if (stream_op->recv_message && - op_can_be_run(stream_op, s, &oas->state, OP_RECV_MESSAGE)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_RECV_MESSAGE", oas); - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - CRONET_LOG(GPR_DEBUG, "Stream is cancelled."); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - result = ACTION_TAKEN_NO_CALLBACK; - } else if (stream_state->state_callback_received[OP_FAILED]) { - CRONET_LOG(GPR_DEBUG, "Stream failed."); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - result = ACTION_TAKEN_NO_CALLBACK; - } else if (stream_state->rs.read_stream_closed) { - // No more data will be received - CRONET_LOG(GPR_DEBUG, "read stream closed"); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - result = ACTION_TAKEN_NO_CALLBACK; - } else if (stream_state->flush_read) { - CRONET_LOG(GPR_DEBUG, "flush read"); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - result = ACTION_TAKEN_NO_CALLBACK; - } else if (!stream_state->rs.length_field_received) { - if (stream_state->rs.received_bytes == GRPC_HEADER_SIZE_IN_BYTES && - stream_state->rs.remaining_bytes == 0) { - // Start a read operation for data - stream_state->rs.length_field_received = true; - parse_grpc_header( - reinterpret_cast(stream_state->rs.read_buffer), - &stream_state->rs.length_field, &stream_state->rs.compressed); - CRONET_LOG(GPR_DEBUG, "length field = %d", - stream_state->rs.length_field); - if (stream_state->rs.length_field > 0) { - stream_state->rs.read_buffer = static_cast( - gpr_malloc(static_cast(stream_state->rs.length_field))); - CHECK(stream_state->rs.read_buffer); - stream_state->rs.remaining_bytes = stream_state->rs.length_field; - stream_state->rs.received_bytes = 0; - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); - stream_state->state_op_done[OP_READ_REQ_MADE] = - true; // Indicates that at least one read request has been made - bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer, - stream_state->rs.remaining_bytes); - result = ACTION_TAKEN_WITH_CALLBACK; - } else { - stream_state->rs.remaining_bytes = 0; - CRONET_LOG(GPR_DEBUG, "read operation complete. Empty response."); - // Clean up read_slice_buffer in case there is unread data. - stream_state->rs.read_slice_buffer.Clear(); - uint32_t flags = 0; - if (stream_state->rs.compressed) { - flags |= GRPC_WRITE_INTERNAL_COMPRESS; - } - *stream_op->payload->recv_message.flags = flags; - *stream_op->payload->recv_message.recv_message = - std::move(stream_state->rs.read_slice_buffer); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - - // Extra read to trigger on_succeed - stream_state->rs.length_field_received = false; - stream_state->state_op_done[OP_READ_REQ_MADE] = - true; // Indicates that at least one read request has been made - read_grpc_header(s); - result = ACTION_TAKEN_NO_CALLBACK; - } - } else if (stream_state->rs.remaining_bytes == 0) { - // Start a read operation for first 5 bytes (GRPC header) - stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes; - stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; + } else if (stream_state->state_callback_received[OP_FAILED]) { + GRPC_TRACE_VLOG(cronet, 2) << "Stream failed."; + grpc_core::ExecCtx::Run(DEBUG_LOCATION, + stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; + result = ACTION_TAKEN_NO_CALLBACK; + } else if (stream_state->rs.read_stream_closed) { + // No more data will be received + GRPC_TRACE_VLOG(cronet, 2) << "read stream closed"; + grpc_core::ExecCtx::Run(DEBUG_LOCATION, + stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; + result = ACTION_TAKEN_NO_CALLBACK; + } else if (stream_state->flush_read) { + GRPC_TRACE_VLOG(cronet, 2) << "flush read"; + grpc_core::ExecCtx::Run(DEBUG_LOCATION, + stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; + result = ACTION_TAKEN_NO_CALLBACK; + } else if (!stream_state->rs.length_field_received) { + if (stream_state->rs.received_bytes == GRPC_HEADER_SIZE_IN_BYTES && + stream_state->rs.remaining_bytes == 0) { + // Start a read operation for data + stream_state->rs.length_field_received = true; + parse_grpc_header( + reinterpret_cast(stream_state->rs.read_buffer), + &stream_state->rs.length_field, &stream_state->rs.compressed); + GRPC_TRACE_VLOG(cronet, 2) + << "length field = " << stream_state->rs.length_field; + if (stream_state->rs.length_field > 0) { + stream_state->rs.read_buffer = static_cast( + gpr_malloc(static_cast(stream_state->rs.length_field))); + CHECK(stream_state->rs.read_buffer); + stream_state->rs.remaining_bytes = stream_state->rs.length_field; stream_state->rs.received_bytes = 0; - stream_state->rs.compressed = false; - CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_read(" << s->cbs << ")"; stream_state->state_op_done[OP_READ_REQ_MADE] = true; // Indicates that at least one read request has been made bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer, stream_state->rs.remaining_bytes); result = ACTION_TAKEN_WITH_CALLBACK; } else { - result = NO_ACTION_POSSIBLE; + stream_state->rs.remaining_bytes = 0; + GRPC_TRACE_VLOG(cronet, 2) + << "read operation complete. Empty response."; + // Clean up read_slice_buffer in case there is unread data. + stream_state->rs.read_slice_buffer.Clear(); + uint32_t flags = 0; + if (stream_state->rs.compressed) { + flags |= GRPC_WRITE_INTERNAL_COMPRESS; + } + *stream_op->payload->recv_message.flags = flags; + *stream_op->payload->recv_message.recv_message = + std::move(stream_state->rs.read_slice_buffer); + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; + + // Extra read to trigger on_succeed + stream_state->rs.length_field_received = false; + stream_state->state_op_done[OP_READ_REQ_MADE] = + true; // Indicates that at least one read request has been made + read_grpc_header(s); + result = ACTION_TAKEN_NO_CALLBACK; } } else if (stream_state->rs.remaining_bytes == 0) { - CRONET_LOG(GPR_DEBUG, "read operation complete"); - grpc_slice read_data_slice = - GRPC_SLICE_MALLOC((uint32_t)stream_state->rs.length_field); - uint8_t* dst_p = GRPC_SLICE_START_PTR(read_data_slice); - memcpy(dst_p, stream_state->rs.read_buffer, - static_cast(stream_state->rs.length_field)); - null_and_maybe_free_read_buffer(s); - // Clean up read_slice_buffer in case there is unread data. - stream_state->rs.read_slice_buffer.Clear(); - stream_state->rs.read_slice_buffer.Append( - grpc_core::Slice(read_data_slice)); - uint32_t flags = 0; - if (stream_state->rs.compressed) { - flags = GRPC_WRITE_INTERNAL_COMPRESS; - } - *stream_op->payload->recv_message.flags = flags; - *stream_op->payload->recv_message.recv_message = - std::move(stream_state->rs.read_slice_buffer); + // Start a read operation for first 5 bytes (GRPC header) + stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes; + stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; + stream_state->rs.received_bytes = 0; + stream_state->rs.compressed = false; + GRPC_TRACE_VLOG(cronet, 2) + << "bidirectional_stream_read(" << s->cbs << ")"; + stream_state->state_op_done[OP_READ_REQ_MADE] = + true; // Indicates that at least one read request has been made + bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer, + stream_state->rs.remaining_bytes); + result = ACTION_TAKEN_WITH_CALLBACK; + } else { + result = NO_ACTION_POSSIBLE; + } + } else if (stream_state->rs.remaining_bytes == 0) { + GRPC_TRACE_VLOG(cronet, 2) << "read operation complete"; + grpc_slice read_data_slice = + GRPC_SLICE_MALLOC((uint32_t)stream_state->rs.length_field); + uint8_t* dst_p = GRPC_SLICE_START_PTR(read_data_slice); + memcpy(dst_p, stream_state->rs.read_buffer, + static_cast(stream_state->rs.length_field)); + null_and_maybe_free_read_buffer(s); + // Clean up read_slice_buffer in case there is unread data. + stream_state->rs.read_slice_buffer.Clear(); + stream_state->rs.read_slice_buffer.Append( + grpc_core::Slice(read_data_slice)); + uint32_t flags = 0; + if (stream_state->rs.compressed) { + flags = GRPC_WRITE_INTERNAL_COMPRESS; + } + *stream_op->payload->recv_message.flags = flags; + *stream_op->payload->recv_message.recv_message = + std::move(stream_state->rs.read_slice_buffer); + grpc_core::ExecCtx::Run(DEBUG_LOCATION, + stream_op->payload->recv_message.recv_message_ready, + absl::OkStatus()); + stream_state->state_op_done[OP_RECV_MESSAGE] = true; + oas->state.state_op_done[OP_RECV_MESSAGE] = true; + // Do an extra read to trigger on_succeeded() callback in case connection + // is closed + stream_state->rs.length_field_received = false; + read_grpc_header(s); + result = ACTION_TAKEN_NO_CALLBACK; + } + return result; +} + +static enum e_op_result execute_stream_op_recv_trailing_metadata( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + struct op_state* stream_state = &s->state; + + GRPC_TRACE_VLOG(cronet, 2) + << "running: " << oas << " OP_RECV_TRAILING_METADATA"; + grpc_error_handle error; + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + error = stream_state->cancel_error; + } else if (stream_state->state_callback_received[OP_FAILED]) { + grpc_status_code grpc_error_code = + cronet_net_error_to_grpc_error(stream_state->net_error); + const char* desc = cronet_net_error_as_string(stream_state->net_error); + error = + make_error_with_desc(grpc_error_code, stream_state->net_error, desc); + } else if (oas->s->state.rs.trailing_metadata_valid) { + *stream_op->payload->recv_trailing_metadata.recv_trailing_metadata = + std::move(oas->s->state.rs.trailing_metadata); + stream_state->rs.trailing_metadata_valid = false; + } + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, + stream_op->payload->recv_trailing_metadata.recv_trailing_metadata_ready, + error); + stream_state->state_op_done[OP_RECV_TRAILING_METADATA] = true; + + return ACTION_TAKEN_NO_CALLBACK; +} + +static enum e_op_result execute_stream_op_cancel_stream( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + struct op_state* stream_state = &s->state; + enum e_op_result result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) << "running: " << oas << " OP_CANCEL_ERROR"; + if (s->cbs) { + GRPC_TRACE_VLOG(cronet, 2) + << "W: bidirectional_stream_cancel(" << s->cbs << ")"; + bidirectional_stream_cancel(s->cbs); + result = ACTION_TAKEN_WITH_CALLBACK; + } else { + result = ACTION_TAKEN_NO_CALLBACK; + } + stream_state->state_op_done[OP_CANCEL_ERROR] = true; + if (stream_state->cancel_error.ok()) { + stream_state->cancel_error = stream_op->payload->cancel_stream.cancel_error; + } + + return result; +} + +static enum e_op_result execute_stream_op_on_complete( + struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + struct op_state* stream_state = &s->state; + enum e_op_result result = NO_ACTION_POSSIBLE; + GRPC_TRACE_VLOG(cronet, 2) << "running: " << oas << " OP_ON_COMPLETE"; + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + if (stream_op->on_complete) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, stream_op->on_complete, + stream_state->cancel_error); + } + } else if (stream_state->state_callback_received[OP_FAILED]) { + if (stream_op->on_complete) { + const char* error_message = + cronet_net_error_as_string(stream_state->net_error); + grpc_status_code grpc_error_code = + cronet_net_error_to_grpc_error(stream_state->net_error); grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->payload->recv_message.recv_message_ready, - absl::OkStatus()); - stream_state->state_op_done[OP_RECV_MESSAGE] = true; - oas->state.state_op_done[OP_RECV_MESSAGE] = true; - // Do an extra read to trigger on_succeeded() callback in case connection - // is closed - stream_state->rs.length_field_received = false; - read_grpc_header(s); - result = ACTION_TAKEN_NO_CALLBACK; + DEBUG_LOCATION, stream_op->on_complete, + make_error_with_desc(grpc_error_code, stream_state->net_error, + error_message)); } + } else { + // All actions in this stream_op are complete. Call the on_complete + // callback + // + if (stream_op->on_complete) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, stream_op->on_complete, + absl::OkStatus()); + } + } + oas->state.state_op_done[OP_ON_COMPLETE] = true; + oas->done = true; + // reset any send message state, only if this ON_COMPLETE is about a send. + // + if (stream_op->send_message) { + stream_state->state_callback_received[OP_SEND_MESSAGE] = false; + stream_state->state_op_done[OP_SEND_MESSAGE] = false; + } + result = ACTION_TAKEN_NO_CALLBACK; + // If this is the on_complete callback being called for a received message - + // make a note + if (stream_op->recv_message) { + stream_state->state_op_done[OP_RECV_MESSAGE_AND_ON_COMPLETE] = true; + } + + return result; +} + +static enum e_op_result execute_stream_op(struct op_and_state* oas) { + grpc_transport_stream_op_batch* stream_op = &oas->op; + struct stream_obj* s = oas->s; + enum e_op_result result = NO_ACTION_POSSIBLE; + if (stream_op->send_initial_metadata && + op_can_be_run(stream_op, s, &oas->state, OP_SEND_INITIAL_METADATA)) { + result = execute_stream_op_send_initial_metadata(oas); + } else if (stream_op->send_message && + op_can_be_run(stream_op, s, &oas->state, OP_SEND_MESSAGE)) { + result = execute_stream_op_send_message(oas); + } else if (stream_op->send_trailing_metadata && + op_can_be_run(stream_op, s, &oas->state, + OP_SEND_TRAILING_METADATA)) { + result = execute_stream_op_send_trailing_metadata(oas); + } else if (stream_op->recv_initial_metadata && + op_can_be_run(stream_op, s, &oas->state, + OP_RECV_INITIAL_METADATA)) { + result = execute_stream_op_recv_initial_metadata(oas); + } else if (stream_op->recv_message && + op_can_be_run(stream_op, s, &oas->state, OP_RECV_MESSAGE)) { + result = execute_stream_op_recv_message(oas); } else if (stream_op->recv_trailing_metadata && op_can_be_run(stream_op, s, &oas->state, OP_RECV_TRAILING_METADATA)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_RECV_TRAILING_METADATA", oas); - grpc_error_handle error; - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - error = stream_state->cancel_error; - } else if (stream_state->state_callback_received[OP_FAILED]) { - grpc_status_code grpc_error_code = - cronet_net_error_to_grpc_error(stream_state->net_error); - const char* desc = cronet_net_error_as_string(stream_state->net_error); - error = - make_error_with_desc(grpc_error_code, stream_state->net_error, desc); - } else if (oas->s->state.rs.trailing_metadata_valid) { - *stream_op->payload->recv_trailing_metadata.recv_trailing_metadata = - std::move(oas->s->state.rs.trailing_metadata); - stream_state->rs.trailing_metadata_valid = false; - } - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, - stream_op->payload->recv_trailing_metadata.recv_trailing_metadata_ready, - error); - stream_state->state_op_done[OP_RECV_TRAILING_METADATA] = true; - result = ACTION_TAKEN_NO_CALLBACK; + result = execute_stream_op_recv_trailing_metadata(oas); } else if (stream_op->cancel_stream && op_can_be_run(stream_op, s, &oas->state, OP_CANCEL_ERROR)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_CANCEL_ERROR", oas); - if (s->cbs) { - CRONET_LOG(GPR_DEBUG, "W: bidirectional_stream_cancel(%p)", s->cbs); - bidirectional_stream_cancel(s->cbs); - result = ACTION_TAKEN_WITH_CALLBACK; - } else { - result = ACTION_TAKEN_NO_CALLBACK; - } - stream_state->state_op_done[OP_CANCEL_ERROR] = true; - if (stream_state->cancel_error.ok()) { - stream_state->cancel_error = - stream_op->payload->cancel_stream.cancel_error; - } + result = execute_stream_op_cancel_stream(oas); } else if (op_can_be_run(stream_op, s, &oas->state, OP_ON_COMPLETE)) { - CRONET_LOG(GPR_DEBUG, "running: %p OP_ON_COMPLETE", oas); - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - if (stream_op->on_complete) { - grpc_core::ExecCtx::Run(DEBUG_LOCATION, stream_op->on_complete, - stream_state->cancel_error); - } - } else if (stream_state->state_callback_received[OP_FAILED]) { - if (stream_op->on_complete) { - const char* error_message = - cronet_net_error_as_string(stream_state->net_error); - grpc_status_code grpc_error_code = - cronet_net_error_to_grpc_error(stream_state->net_error); - grpc_core::ExecCtx::Run( - DEBUG_LOCATION, stream_op->on_complete, - make_error_with_desc(grpc_error_code, stream_state->net_error, - error_message)); - } - } else { - // All actions in this stream_op are complete. Call the on_complete - // callback - // - if (stream_op->on_complete) { - grpc_core::ExecCtx::Run(DEBUG_LOCATION, stream_op->on_complete, - absl::OkStatus()); - } - } - oas->state.state_op_done[OP_ON_COMPLETE] = true; - oas->done = true; - // reset any send message state, only if this ON_COMPLETE is about a send. - // - if (stream_op->send_message) { - stream_state->state_callback_received[OP_SEND_MESSAGE] = false; - stream_state->state_op_done[OP_SEND_MESSAGE] = false; - } - result = ACTION_TAKEN_NO_CALLBACK; - // If this is the on_complete callback being called for a received message - - // make a note - if (stream_op->recv_message) { - stream_state->state_op_done[OP_RECV_MESSAGE_AND_ON_COMPLETE] = true; - } + result = execute_stream_op_on_complete(oas); } else { result = NO_ACTION_POSSIBLE; } @@ -1418,7 +1510,7 @@ void grpc_cronet_transport::InitStream(grpc_stream* gs, void grpc_cronet_transport::PerformStreamOp( grpc_stream* gs, grpc_transport_stream_op_batch* op) { - CRONET_LOG(GPR_DEBUG, "perform_stream_op"); + GRPC_TRACE_VLOG(cronet, 2) << "perform_stream_op"; if (op->send_initial_metadata && header_has_authority( op->payload->send_initial_metadata.send_initial_metadata)) { diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index ab196056b9980..a967b4c0d9bbb 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -77,7 +77,8 @@ class InprocServerTransport final : public ServerTransport { void SetPollset(grpc_stream*, grpc_pollset*) override {} void SetPollsetSet(grpc_stream*, grpc_pollset_set*) override {} void PerformOp(grpc_transport_op* op) override { - LOG(INFO) << "inproc server op: " << grpc_transport_op_string(op); + GRPC_TRACE_LOG(inproc, INFO) + << "inproc server op: " << grpc_transport_op_string(op); if (op->start_connectivity_watch != nullptr) { connected_state()->AddWatcher(op->start_connectivity_watch_state, std::move(op->start_connectivity_watch)); diff --git a/src/core/ext/transport/inproc/legacy_inproc_transport.cc b/src/core/ext/transport/inproc/legacy_inproc_transport.cc index fd8699f9b998e..ae2441db5d4b5 100644 --- a/src/core/ext/transport/inproc/legacy_inproc_transport.cc +++ b/src/core/ext/transport/inproc/legacy_inproc_transport.cc @@ -40,7 +40,6 @@ #include #include #include -#include #include #include @@ -60,7 +59,6 @@ #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice.h" #include "src/core/lib/slice/slice_buffer.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_create.h" #include "src/core/lib/surface/channel_stack_type.h" @@ -69,13 +67,6 @@ #include "src/core/lib/transport/transport.h" #include "src/core/server/server.h" -#define INPROC_LOG(...) \ - do { \ - if (GRPC_TRACE_FLAG_ENABLED(inproc)) { \ - gpr_log(__VA_ARGS__); \ - } \ - } while (0) - namespace { struct inproc_stream; bool cancel_stream_locked(inproc_stream* s, grpc_error_handle error); @@ -149,16 +140,16 @@ struct inproc_transport final : public grpc_core::FilterStackTransport { void Orphan() override; void ref() { - INPROC_LOG(GPR_INFO, "ref_transport %p", this); + GRPC_TRACE_LOG(inproc, INFO) << "ref_transport " << this; gpr_ref(&refs); } void unref() { - INPROC_LOG(GPR_INFO, "unref_transport %p", this); + GRPC_TRACE_LOG(inproc, INFO) << "unref_transport " << this; if (!gpr_unref(&refs)) { return; } - INPROC_LOG(GPR_INFO, "really_destroy_transport %p", this); + GRPC_TRACE_LOG(inproc, INFO) << "really_destroy_transport " << this; this->~inproc_transport(); gpr_free(this); } @@ -202,8 +193,9 @@ struct inproc_stream { // Pass the client-side stream address to the server-side for a ref ref("inproc_init_stream:clt"); // ref it now on behalf of server // side to avoid destruction - INPROC_LOG(GPR_INFO, "calling accept stream cb %p %p", - st->accept_stream_cb, st->accept_stream_data); + GRPC_TRACE_LOG(inproc, INFO) + << "calling accept stream cb " << st->accept_stream_cb << " " + << st->accept_stream_data; (*st->accept_stream_cb)(st->accept_stream_data, t, this); } else { // This is the server-side and is being called through accept_stream_cb @@ -252,12 +244,12 @@ struct inproc_stream { #define STREAM_UNREF(refs, reason) grpc_stream_unref(refs) #endif void ref(const char* reason) { - INPROC_LOG(GPR_INFO, "ref_stream %p %s", this, reason); + GRPC_TRACE_LOG(inproc, INFO) << "ref_stream " << this << " " << reason; STREAM_REF(refs, reason); } void unref(const char* reason) { - INPROC_LOG(GPR_INFO, "unref_stream %p %s", this, reason); + GRPC_TRACE_LOG(inproc, INFO) << "unref_stream " << this << " " << reason; STREAM_UNREF(refs, reason); } #undef STREAM_REF @@ -373,7 +365,8 @@ void inproc_transport::InitStream(grpc_stream* gs, grpc_stream_refcount* refcount, const void* server_data, grpc_core::Arena* arena) { - INPROC_LOG(GPR_INFO, "init_stream %p %p %p", this, gs, server_data); + GRPC_TRACE_LOG(inproc, INFO) + << "init_stream " << this << " " << gs << " " << server_data; new (gs) inproc_stream(this, refcount, server_data, arena); } @@ -435,8 +428,9 @@ void complete_if_batch_end_locked(inproc_stream* s, grpc_error_handle error, int is_rtm = static_cast(op == s->recv_trailing_md_op); if ((is_sm + is_stm + is_rim + is_rm + is_rtm) == 1) { - INPROC_LOG(GPR_INFO, "%s %p %p %p %s", msg, s, op, op->on_complete, - grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << msg << " " << s << " " << op << " " << op->on_complete << " " + << grpc_core::StatusToString(error); grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->on_complete, error); } } @@ -449,7 +443,7 @@ void maybe_process_ops_locked(inproc_stream* s, grpc_error_handle error) { } void fail_helper_locked(inproc_stream* s, grpc_error_handle error) { - INPROC_LOG(GPR_INFO, "op_state_machine %p fail_helper", s); + GRPC_TRACE_LOG(inproc, INFO) << "op_state_machine " << s << " fail_helper"; // If we're failing this side, we need to make sure that // we also send or have already sent trailing metadata if (!s->trailing_md_sent) { @@ -501,10 +495,10 @@ void fail_helper_locked(inproc_stream* s, grpc_error_handle error) { *s->recv_initial_md_op->payload->recv_initial_metadata .trailing_metadata_available = true; } - INPROC_LOG(GPR_INFO, - "fail_helper %p scheduling initial-metadata-ready %s %s", s, - grpc_core::StatusToString(error).c_str(), - grpc_core::StatusToString(err).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "fail_helper " << s << " scheduling initial-metadata-ready " + << grpc_core::StatusToString(error) << " " + << grpc_core::StatusToString(err); grpc_core::ExecCtx::Run( DEBUG_LOCATION, s->recv_initial_md_op->payload->recv_initial_metadata @@ -518,8 +512,9 @@ void fail_helper_locked(inproc_stream* s, grpc_error_handle error) { s->recv_initial_md_op = nullptr; } if (s->recv_message_op) { - INPROC_LOG(GPR_INFO, "fail_helper %p scheduling message-ready %s", s, - grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "fail_helper " << s << " scheduling message-ready " + << grpc_core::StatusToString(error); if (s->recv_message_op->payload->recv_message .call_failed_before_recv_message != nullptr) { *s->recv_message_op->payload->recv_message @@ -547,15 +542,17 @@ void fail_helper_locked(inproc_stream* s, grpc_error_handle error) { s->send_trailing_md_op = nullptr; } if (s->recv_trailing_md_op) { - INPROC_LOG(GPR_INFO, "fail_helper %p scheduling trailing-metadata-ready %s", - s, grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "fail_helper " << s << " scheduling trailing-metadata-ready " + << grpc_core::StatusToString(error); grpc_core::ExecCtx::Run( DEBUG_LOCATION, s->recv_trailing_md_op->payload->recv_trailing_metadata .recv_trailing_metadata_ready, error); - INPROC_LOG(GPR_INFO, "fail_helper %p scheduling trailing-md-on-complete %s", - s, grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "fail_helper " << s << " scheduling trailing-md-on-complete " + << grpc_core::StatusToString(error); complete_if_batch_end_locked( s, error, s->recv_trailing_md_op, "fail_helper scheduling recv-trailing-metadata-on-complete"); @@ -579,8 +576,8 @@ void message_transfer_locked(inproc_stream* sender, inproc_stream* receiver) { *receiver->recv_message_op->payload->recv_message.flags = sender->send_message_op->payload->send_message.flags; - INPROC_LOG(GPR_INFO, "message_transfer_locked %p scheduling message-ready", - receiver); + GRPC_TRACE_LOG(inproc, INFO) + << "message_transfer_locked " << receiver << " scheduling message-ready"; grpc_core::ExecCtx::Run( DEBUG_LOCATION, receiver->recv_message_op->payload->recv_message.recv_message_ready, @@ -606,7 +603,7 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { bool needs_close = false; - INPROC_LOG(GPR_INFO, "op_state_machine %p", s); + GRPC_TRACE_LOG(inproc, INFO) << "op_state_machine " << s; // cancellation takes precedence inproc_stream* other = s->other_side; @@ -653,7 +650,7 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { : &other->to_read_trailing_md_filled; if (*destfilled || s->trailing_md_sent) { // The buffer is already in use; that's an error! - INPROC_LOG(GPR_INFO, "Extra trailing metadata %p", s); + GRPC_TRACE_LOG(inproc, INFO) << "Extra trailing metadata " << s; new_err = GRPC_ERROR_CREATE("Extra trailing metadata"); fail_helper_locked(s, new_err); goto done; @@ -669,15 +666,15 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { *s->send_trailing_md_op->payload->send_trailing_metadata.sent = true; } if (!s->t->is_client && s->trailing_md_recvd && s->recv_trailing_md_op) { - INPROC_LOG(GPR_INFO, - "op_state_machine %p scheduling trailing-metadata-ready", s); + GRPC_TRACE_LOG(inproc, INFO) << "op_state_machine " << s + << " scheduling trailing-metadata-ready"; grpc_core::ExecCtx::Run( DEBUG_LOCATION, s->recv_trailing_md_op->payload->recv_trailing_metadata .recv_trailing_metadata_ready, absl::OkStatus()); - INPROC_LOG(GPR_INFO, - "op_state_machine %p scheduling trailing-md-on-complete", s); + GRPC_TRACE_LOG(inproc, INFO) << "op_state_machine " << s + << " scheduling trailing-md-on-complete"; grpc_core::ExecCtx::Run(DEBUG_LOCATION, s->recv_trailing_md_op->on_complete, absl::OkStatus()); @@ -694,11 +691,11 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { if (s->recv_initial_md_op) { if (s->initial_md_recvd) { new_err = GRPC_ERROR_CREATE("Already recvd initial md"); - INPROC_LOG( - GPR_INFO, - "op_state_machine %p scheduling on_complete errors for already " - "recvd initial md %s", - s, grpc_core::StatusToString(new_err).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s + << " scheduling on_complete errors for already " + "recvd initial md " + << grpc_core::StatusToString(new_err); fail_helper_locked(s, new_err); goto done; } @@ -749,20 +746,20 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { if (s->to_read_trailing_md_filled) { if (s->trailing_md_recvd) { if (s->trailing_md_recvd_implicit_only) { - INPROC_LOG(GPR_INFO, - "op_state_machine %p already implicitly received trailing " - "metadata, so ignoring new trailing metadata from client", - s); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s + << " already implicitly received trailing metadata, so " + "ignoring new trailing metadata from client"; s->to_read_trailing_md.Clear(); s->to_read_trailing_md_filled = false; s->trailing_md_recvd_implicit_only = false; } else { new_err = GRPC_ERROR_CREATE("Already recvd trailing md"); - INPROC_LOG( - GPR_INFO, - "op_state_machine %p scheduling on_complete errors for already " - "recvd trailing md %s", - s, grpc_core::StatusToString(new_err).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s + << " scheduling on_complete errors for already recvd trailing " + "md " + << grpc_core::StatusToString(new_err); fail_helper_locked(s, new_err); goto done; } @@ -771,7 +768,8 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { // This message needs to be wrapped up because it will never be // satisfied s->recv_message_op->payload->recv_message.recv_message->reset(); - INPROC_LOG(GPR_INFO, "op_state_machine %p scheduling message-ready", s); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s << " scheduling message-ready"; grpc_core::ExecCtx::Run( DEBUG_LOCATION, s->recv_message_op->payload->recv_message.recv_message_ready, @@ -822,9 +820,9 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { needs_close = s->trailing_md_sent; } } else if (!s->trailing_md_recvd) { - INPROC_LOG( - GPR_INFO, - "op_state_machine %p has trailing md but not yet waiting for it", s); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s + << " has trailing md but not yet waiting for it"; } } if (!s->t->is_client && s->trailing_md_sent && @@ -832,8 +830,9 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { // In this case, we don't care to receive the write-close from the client // because we have already sent status and the RPC is over as far as we // are concerned. - INPROC_LOG(GPR_INFO, "op_state_machine %p scheduling trailing-md-ready %s", - s, grpc_core::StatusToString(new_err).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s << " scheduling trailing-md-ready " + << grpc_core::StatusToString(new_err); grpc_core::ExecCtx::Run( DEBUG_LOCATION, s->recv_trailing_md_op->payload->recv_trailing_metadata @@ -851,7 +850,8 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { if (s->trailing_md_recvd && s->recv_message_op) { // No further message will come on this stream, so finish off the // recv_message_op - INPROC_LOG(GPR_INFO, "op_state_machine %p scheduling message-ready", s); + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s << " scheduling message-ready"; s->recv_message_op->payload->recv_message.recv_message->reset(); grpc_core::ExecCtx::Run( DEBUG_LOCATION, @@ -873,12 +873,12 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { } if (s->send_message_op || s->send_trailing_md_op || s->recv_initial_md_op || s->recv_message_op || s->recv_trailing_md_op) { - // Didn't get the item we wanted so we still need to get - // rescheduled - INPROC_LOG( - GPR_INFO, "op_state_machine %p still needs closure %p %p %p %p %p", s, - s->send_message_op, s->send_trailing_md_op, s->recv_initial_md_op, - s->recv_message_op, s->recv_trailing_md_op); + // Didn't get the item we wanted so we still need to get rescheduled + GRPC_TRACE_LOG(inproc, INFO) + << "op_state_machine " << s << " still needs closure " + << s->send_message_op << " " << s->send_trailing_md_op << " " + << s->recv_initial_md_op << " " << s->recv_message_op << " " + << s->recv_trailing_md_op; s->ops_needed = true; } done: @@ -890,8 +890,8 @@ void op_state_machine_locked(inproc_stream* s, grpc_error_handle error) { bool cancel_stream_locked(inproc_stream* s, grpc_error_handle error) { bool ret = false; // was the cancel accepted - INPROC_LOG(GPR_INFO, "cancel_stream %p with %s", s, - grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "cancel_stream " << s << " with " << grpc_core::StatusToString(error); if (s->cancel_self_error.ok()) { ret = true; s->cancel_self_error = error; @@ -944,7 +944,8 @@ bool cancel_stream_locked(inproc_stream* s, grpc_error_handle error) { void inproc_transport::PerformStreamOp(grpc_stream* gs, grpc_transport_stream_op_batch* op) { - INPROC_LOG(GPR_INFO, "perform_stream_op %p %p %p", this, gs, op); + GRPC_TRACE_LOG(inproc, INFO) + << "perform_stream_op " << this << " " << gs << " " << op; inproc_stream* s = reinterpret_cast(gs); gpr_mu* mu = &s->t->mu->mu; // save aside in case s gets closed gpr_mu_lock(mu); @@ -980,14 +981,15 @@ void inproc_transport::PerformStreamOp(grpc_stream* gs, // already self-canceled so still give it an error error = s->cancel_self_error; } else { - INPROC_LOG(GPR_INFO, "perform_stream_op %p %s%s%s%s%s%s%s", s, - s->t->is_client ? "client" : "server", - op->send_initial_metadata ? " send_initial_metadata" : "", - op->send_message ? " send_message" : "", - op->send_trailing_metadata ? " send_trailing_metadata" : "", - op->recv_initial_metadata ? " recv_initial_metadata" : "", - op->recv_message ? " recv_message" : "", - op->recv_trailing_metadata ? " recv_trailing_metadata" : ""); + GRPC_TRACE_LOG(inproc, INFO) + << "perform_stream_op " << s + << (s->t->is_client ? " client" : " server") + << (op->send_initial_metadata ? " send_initial_metadata" : "") + << (op->send_message ? " send_message" : "") + << (op->send_trailing_metadata ? " send_trailing_metadata" : "") + << (op->recv_initial_metadata ? " recv_initial_metadata" : "") + << (op->recv_message ? " recv_message" : "") + << (op->recv_trailing_metadata ? " recv_trailing_metadata" : ""); } inproc_stream* other = s->other_side; @@ -1003,7 +1005,7 @@ void inproc_transport::PerformStreamOp(grpc_stream* gs, : &other->to_read_initial_md_filled; if (*destfilled || s->initial_md_sent) { // The buffer is already in use; that's an error! - INPROC_LOG(GPR_INFO, "Extra initial metadata %p", s); + GRPC_TRACE_LOG(inproc, INFO) << "Extra initial metadata " << s; error = GRPC_ERROR_CREATE("Extra initial metadata"); } else { if (!s->other_side_closed) { @@ -1081,20 +1083,18 @@ void inproc_transport::PerformStreamOp(grpc_stream* gs, *op->payload->recv_initial_metadata.trailing_metadata_available = true; } - INPROC_LOG( - GPR_INFO, - "perform_stream_op error %p scheduling initial-metadata-ready %s", - s, grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) << "perform_stream_op error " << s + << " scheduling initial-metadata-ready " + << grpc_core::StatusToString(error); grpc_core::ExecCtx::Run( DEBUG_LOCATION, op->payload->recv_initial_metadata.recv_initial_metadata_ready, error); } if (op->recv_message) { - INPROC_LOG( - GPR_INFO, - "perform_stream_op error %p scheduling recv message-ready %s", s, - grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) << "perform_stream_op error " << s + << " scheduling recv message-ready " + << grpc_core::StatusToString(error); if (op->payload->recv_message.call_failed_before_recv_message != nullptr) { *op->payload->recv_message.call_failed_before_recv_message = true; @@ -1104,25 +1104,27 @@ void inproc_transport::PerformStreamOp(grpc_stream* gs, error); } if (op->recv_trailing_metadata) { - INPROC_LOG(GPR_INFO, - "perform_stream_op error %p scheduling " - "trailing-metadata-ready %s", - s, grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) << "perform_stream_op error " << s + << " scheduling trailing-metadata-ready " + << grpc_core::StatusToString(error); grpc_core::ExecCtx::Run( DEBUG_LOCATION, op->payload->recv_trailing_metadata.recv_trailing_metadata_ready, error); } } - INPROC_LOG(GPR_INFO, "perform_stream_op %p scheduling on_complete %s", s, - grpc_core::StatusToString(error).c_str()); + GRPC_TRACE_LOG(inproc, INFO) + << "perform_stream_op " << s << " scheduling on_complete " + << grpc_core::StatusToString(error); grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_complete, error); } gpr_mu_unlock(mu); } void close_transport_locked(inproc_transport* t) { - INPROC_LOG(GPR_INFO, "close_transport %p %d", t, t->is_closed); + GRPC_TRACE_LOG(inproc, INFO) + << "close_transport " << t << " " << t->is_closed; + t->state_tracker.SetState(GRPC_CHANNEL_SHUTDOWN, absl::Status(), "close transport"); if (!t->is_closed) { @@ -1140,7 +1142,7 @@ void close_transport_locked(inproc_transport* t) { } void inproc_transport::PerformOp(grpc_transport_op* op) { - INPROC_LOG(GPR_INFO, "perform_transport_op %p %p", this, op); + GRPC_TRACE_LOG(inproc, INFO) << "perform_transport_op " << this << " " << op; gpr_mu_lock(&mu->mu); if (op->start_connectivity_watch != nullptr) { state_tracker.AddWatcher(op->start_connectivity_watch_state, @@ -1174,7 +1176,8 @@ void inproc_transport::PerformOp(grpc_transport_op* op) { void inproc_transport::DestroyStream(grpc_stream* gs, grpc_closure* then_schedule_closure) { - INPROC_LOG(GPR_INFO, "destroy_stream %p %p", gs, then_schedule_closure); + GRPC_TRACE_LOG(inproc, INFO) + << "destroy_stream " << gs << " " << then_schedule_closure; inproc_stream* s = reinterpret_cast(gs); gpr_mu_lock(&mu->mu); close_stream_locked(s); @@ -1185,7 +1188,7 @@ void inproc_transport::DestroyStream(grpc_stream* gs, } void inproc_transport::Orphan() { - INPROC_LOG(GPR_INFO, "destroy_transport %p", this); + GRPC_TRACE_LOG(inproc, INFO) << "destroy_transport " << this; gpr_mu_lock(&mu->mu); close_transport_locked(this); gpr_mu_unlock(&mu->mu); @@ -1218,7 +1221,7 @@ void inproc_transport::SetPollsetSet(grpc_stream* /*gs*/, // void inproc_transports_create(grpc_core::Transport** server_transport, grpc_core::Transport** client_transport) { - INPROC_LOG(GPR_INFO, "inproc_transports_create"); + GRPC_TRACE_LOG(inproc, INFO) << "inproc_transports_create"; shared_mu* mu = new (gpr_malloc(sizeof(*mu))) shared_mu(); inproc_transport* st = new (gpr_malloc(sizeof(*st))) inproc_transport(mu, /*is_client=*/false); @@ -1234,8 +1237,8 @@ void inproc_transports_create(grpc_core::Transport** server_transport, grpc_channel* grpc_legacy_inproc_channel_create(grpc_server* server, const grpc_channel_args* args, void* /*reserved*/) { - GRPC_API_TRACE("grpc_inproc_channel_create(server=%p, args=%p)", 2, - (server, args)); + GRPC_TRACE_LOG(api, INFO) << "grpc_inproc_channel_create(server=" << server + << ", args=" << args << ")"; grpc_core::ExecCtx exec_ctx; diff --git a/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h b/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h index cf63b13a13050..fbf094cd6c07c 100644 --- a/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +++ b/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h @@ -270,7 +270,7 @@ typedef enum { envoy_config_cluster_v3_Cluster_cluster_discovery_type_NOT_SET = 0 } envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases; UPB_INLINE envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases envoy_config_cluster_v3_Cluster_cluster_discovery_type_case(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; return (envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases)upb_Message_WhichOneofFieldNumber( UPB_UPCAST(msg), &field); } @@ -283,36 +283,36 @@ typedef enum { envoy_config_cluster_v3_Cluster_lb_config_NOT_SET = 0 } envoy_config_cluster_v3_Cluster_lb_config_oneofcases; UPB_INLINE envoy_config_cluster_v3_Cluster_lb_config_oneofcases envoy_config_cluster_v3_Cluster_lb_config_case(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return (envoy_config_cluster_v3_Cluster_lb_config_oneofcases)upb_Message_WhichOneofFieldNumber( UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_name(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {1, UPB_SIZE(192, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, UPB_SIZE(196, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE upb_StringView envoy_config_cluster_v3_Cluster_name(const envoy_config_cluster_v3_Cluster* msg) { upb_StringView default_val = upb_StringView_FromString(""); upb_StringView ret; - const upb_MiniTableField field = {1, UPB_SIZE(192, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, UPB_SIZE(196, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_type(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE int32_t envoy_config_cluster_v3_Cluster_type(const envoy_config_cluster_v3_Cluster* msg) { int32_t default_val = 0; int32_t ret; - const upb_MiniTableField field = {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_type(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_eds_cluster_config(envoy_config_cluster_v3_Cluster* msg) { @@ -596,19 +596,19 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_lb_subset_config(const envoy return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_ring_hash_lb_config(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_RingHashLbConfig* envoy_config_cluster_v3_Cluster_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_RingHashLbConfig* default_val = NULL; const envoy_config_cluster_v3_Cluster_RingHashLbConfig* ret; - const upb_MiniTableField field = {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_transport_socket(envoy_config_cluster_v3_Cluster* msg) { @@ -672,13 +672,13 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_common_lb_config(const envoy return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_alt_stat_name(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {28, UPB_SIZE(200, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {28, UPB_SIZE(204, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE upb_StringView envoy_config_cluster_v3_Cluster_alt_stat_name(const envoy_config_cluster_v3_Cluster* msg) { upb_StringView default_val = upb_StringView_FromString(""); upb_StringView ret; - const upb_MiniTableField field = {28, UPB_SIZE(200, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {28, UPB_SIZE(204, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; @@ -756,19 +756,19 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_load_assignment(const envoy_ return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_original_dst_lb_config(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {34, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {34, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_config_cluster_v3_Cluster_original_dst_lb_config(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* default_val = NULL; const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* ret; - const upb_MiniTableField field = {34, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {34, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_original_dst_lb_config(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {34, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {34, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_typed_extension_protocol_options(envoy_config_cluster_v3_Cluster* msg) { @@ -801,35 +801,35 @@ UPB_INLINE upb_Map* _envoy_config_cluster_v3_Cluster_typed_extension_protocol_op return _upb_Message_GetOrCreateMutableMap(UPB_UPCAST(msg), &field, 0, sizeof(struct google_protobuf_Any*), a); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_least_request_lb_config(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {37, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {37, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_config_cluster_v3_Cluster_least_request_lb_config(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* default_val = NULL; const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* ret; - const upb_MiniTableField field = {37, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {37, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_least_request_lb_config(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {37, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {37, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_cluster_type(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {38, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {38, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_CustomClusterType* envoy_config_cluster_v3_Cluster_cluster_type(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_CustomClusterType* default_val = NULL; const envoy_config_cluster_v3_Cluster_CustomClusterType* ret; - const upb_MiniTableField field = {38, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {38, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_cluster_type(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {38, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {38, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_respect_dns_ttl(envoy_config_cluster_v3_Cluster* msg) { @@ -1057,19 +1057,19 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_connection_pool_per_downstream_c return ret; } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_maglev_lb_config(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {52, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {52, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_maglev_lb_config(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_MaglevLbConfig* default_val = NULL; const envoy_config_cluster_v3_Cluster_MaglevLbConfig* ret; - const upb_MiniTableField field = {52, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {52, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_maglev_lb_config(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {52, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {52, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_dns_resolution_config(envoy_config_cluster_v3_Cluster* msg) { @@ -1121,28 +1121,60 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_typed_dns_resolver_config(co return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_round_robin_lb_config(envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {56, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {56, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE const envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* envoy_config_cluster_v3_Cluster_round_robin_lb_config(const envoy_config_cluster_v3_Cluster* msg) { const envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* default_val = NULL; const envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* ret; - const upb_MiniTableField field = {56, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {56, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_round_robin_lb_config(const envoy_config_cluster_v3_Cluster* msg) { - const upb_MiniTableField field = {56, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {56, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } +UPB_INLINE void envoy_config_cluster_v3_Cluster_clear_lrs_report_endpoint_metrics(envoy_config_cluster_v3_Cluster* msg) { + const upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE upb_StringView const* envoy_config_cluster_v3_Cluster_lrs_report_endpoint_metrics(const envoy_config_cluster_v3_Cluster* msg, size_t* size) { + const upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_Array* arr = upb_Message_GetArray(UPB_UPCAST(msg), &field); + if (arr) { + if (size) *size = arr->UPB_PRIVATE(size); + return (upb_StringView const*)upb_Array_DataPtr(arr); + } else { + if (size) *size = 0; + return NULL; + } +} +UPB_INLINE const upb_Array* _envoy_config_cluster_v3_Cluster_lrs_report_endpoint_metrics_upb_array(const envoy_config_cluster_v3_Cluster* msg, size_t* size) { + const upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_Array* arr = upb_Message_GetArray(UPB_UPCAST(msg), &field); + if (size) { + *size = arr ? arr->UPB_PRIVATE(size) : 0; + } + return arr; +} +UPB_INLINE upb_Array* _envoy_config_cluster_v3_Cluster_lrs_report_endpoint_metrics_mutable_upb_array(envoy_config_cluster_v3_Cluster* msg, size_t* size, upb_Arena* arena) { + const upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Array* arr = upb_Message_GetOrCreateMutableArray(UPB_UPCAST(msg), + &field, arena); + if (size) { + *size = arr ? arr->UPB_PRIVATE(size) : 0; + } + return arr; +} UPB_INLINE void envoy_config_cluster_v3_Cluster_set_name(envoy_config_cluster_v3_Cluster *msg, upb_StringView value) { - const upb_MiniTableField field = {1, UPB_SIZE(192, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, UPB_SIZE(196, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_type(envoy_config_cluster_v3_Cluster *msg, int32_t value) { - const upb_MiniTableField field = {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_eds_cluster_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_EdsClusterConfig* value) { @@ -1358,7 +1390,7 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_LbSubsetConfig* envoy_config_c return sub; } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_ring_hash_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_RingHashLbConfig* value) { - const upb_MiniTableField field = {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_RingHashLbConfig* envoy_config_cluster_v3_Cluster_mutable_ring_hash_lb_config(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1410,7 +1442,7 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_CommonLbConfig* envoy_config_c return sub; } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_alt_stat_name(envoy_config_cluster_v3_Cluster *msg, upb_StringView value) { - const upb_MiniTableField field = {28, UPB_SIZE(200, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {28, UPB_SIZE(204, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_common_http_protocol_options(envoy_config_cluster_v3_Cluster *msg, struct envoy_config_core_v3_HttpProtocolOptions* value) { @@ -1458,7 +1490,7 @@ UPB_INLINE struct envoy_config_endpoint_v3_ClusterLoadAssignment* envoy_config_c return sub; } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_original_dst_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* value) { - const upb_MiniTableField field = {34, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {34, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_config_cluster_v3_Cluster_mutable_original_dst_lb_config(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1495,7 +1527,7 @@ UPB_INLINE envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry* e return (envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry*)_upb_map_next(map, iter); } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_least_request_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* value) { - const upb_MiniTableField field = {37, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {37, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_config_cluster_v3_Cluster_mutable_least_request_lb_config(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1507,7 +1539,7 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_co return sub; } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_cluster_type(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_CustomClusterType* value) { - const upb_MiniTableField field = {38, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {38, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_CustomClusterType* envoy_config_cluster_v3_Cluster_mutable_cluster_type(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1679,7 +1711,7 @@ UPB_INLINE void envoy_config_cluster_v3_Cluster_set_connection_pool_per_downstre upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_maglev_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_MaglevLbConfig* value) { - const upb_MiniTableField field = {52, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {52, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_mutable_maglev_lb_config(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1727,7 +1759,7 @@ UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_cluste return sub; } UPB_INLINE void envoy_config_cluster_v3_Cluster_set_round_robin_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* value) { - const upb_MiniTableField field = {56, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {56, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE struct envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* envoy_config_cluster_v3_Cluster_mutable_round_robin_lb_config(envoy_config_cluster_v3_Cluster* msg, upb_Arena* arena) { @@ -1738,6 +1770,34 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_RoundRobinLbConfig* envoy_conf } return sub; } +UPB_INLINE upb_StringView* envoy_config_cluster_v3_Cluster_mutable_lrs_report_endpoint_metrics(envoy_config_cluster_v3_Cluster* msg, size_t* size) { + upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Array* arr = upb_Message_GetMutableArray(UPB_UPCAST(msg), &field); + if (arr) { + if (size) *size = arr->UPB_PRIVATE(size); + return (upb_StringView*)upb_Array_MutableDataPtr(arr); + } else { + if (size) *size = 0; + return NULL; + } +} +UPB_INLINE upb_StringView* envoy_config_cluster_v3_Cluster_resize_lrs_report_endpoint_metrics(envoy_config_cluster_v3_Cluster* msg, size_t size, upb_Arena* arena) { + upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return (upb_StringView*)upb_Message_ResizeArrayUninitialized(UPB_UPCAST(msg), + &field, size, arena); +} +UPB_INLINE bool envoy_config_cluster_v3_Cluster_add_lrs_report_endpoint_metrics(envoy_config_cluster_v3_Cluster* msg, upb_StringView val, upb_Arena* arena) { + upb_MiniTableField field = {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Array* arr = upb_Message_GetOrCreateMutableArray( + UPB_UPCAST(msg), &field, arena); + if (!arr || !UPB_PRIVATE(_upb_Array_ResizeUninitialized)( + arr, arr->UPB_PRIVATE(size) + 1, arena)) { + return false; + } + UPB_PRIVATE(_upb_Array_Set) + (arr, arr->UPB_PRIVATE(size) - 1, &val, sizeof(val)); + return true; +} /* envoy.config.cluster.v3.Cluster.TransportSocketMatch */ diff --git a/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c b/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c index ef74fb4e27d34..f3ab3dda433fb 100644 --- a/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +++ b/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c @@ -95,9 +95,9 @@ static const upb_MiniTableSub envoy_config_cluster_v3_Cluster_submsgs[39] = { {.UPB_PRIVATE(submsg) = &envoy__config__cluster__v3__Cluster__RoundRobinLbConfig_msg_init}, }; -static const upb_MiniTableField envoy_config_cluster_v3_Cluster__fields[51] = { - {1, UPB_SIZE(192, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, - {2, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}, +static const upb_MiniTableField envoy_config_cluster_v3_Cluster__fields[52] = { + {1, UPB_SIZE(196, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, + {2, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}, {3, UPB_SIZE(12, 56), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {4, UPB_SIZE(16, 64), 65, 1, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {5, UPB_SIZE(20, 72), 66, 2, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, @@ -114,21 +114,21 @@ static const upb_MiniTableField envoy_config_cluster_v3_Cluster__fields[51] = { {20, UPB_SIZE(64, 144), 73, 11, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {21, UPB_SIZE(68, 152), 74, 12, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {22, UPB_SIZE(72, 160), 75, 13, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {23, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {23, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 14, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {24, UPB_SIZE(76, 168), 76, 15, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {25, UPB_SIZE(80, 176), 77, 16, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {26, UPB_SIZE(84, 20), 0, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}, {27, UPB_SIZE(88, 184), 78, 17, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {28, UPB_SIZE(200, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, + {28, UPB_SIZE(204, 192), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, {29, UPB_SIZE(92, 208), 79, 18, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {30, UPB_SIZE(96, 216), 80, 19, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {31, UPB_SIZE(100, 24), 0, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)}, {32, UPB_SIZE(101, 25), 0, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)}, {33, UPB_SIZE(104, 224), 81, 20, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {34, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {34, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 21, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {36, UPB_SIZE(108, 232), 0, 22, 11, (int)kUpb_FieldMode_Map | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {37, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {38, UPB_SIZE(184, 336), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {37, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 23, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {38, UPB_SIZE(188, 344), UPB_SIZE(-113, -29), 24, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {39, UPB_SIZE(116, 32), 0, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)}, {40, UPB_SIZE(120, 240), 0, 25, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {41, UPB_SIZE(124, 248), 82, 26, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, @@ -142,24 +142,25 @@ static const upb_MiniTableField envoy_config_cluster_v3_Cluster__fields[51] = { {49, UPB_SIZE(156, 296), 87, 32, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {50, UPB_SIZE(160, 304), 88, 33, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {51, UPB_SIZE(164, 35), 0, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)}, - {52, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {52, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 34, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {53, UPB_SIZE(168, 312), 89, 35, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {54, UPB_SIZE(172, 320), 90, 36, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {55, UPB_SIZE(176, 328), 91, 37, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {56, UPB_SIZE(188, 344), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {56, UPB_SIZE(192, 352), UPB_SIZE(-181, -37), 38, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {57, UPB_SIZE(184, 336), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, }; const upb_MiniTable envoy__config__cluster__v3__Cluster_msg_init = { &envoy_config_cluster_v3_Cluster_submsgs[0], &envoy_config_cluster_v3_Cluster__fields[0], - UPB_SIZE(208, 352), 51, kUpb_ExtMode_NonExtendable, 6, UPB_FASTTABLE_MASK(248), 0, + UPB_SIZE(216, 360), 52, kUpb_ExtMode_NonExtendable, 6, UPB_FASTTABLE_MASK(248), 0, #ifdef UPB_TRACING_ENABLED "envoy.config.cluster.v3.Cluster", #endif UPB_FASTTABLE_INIT({ {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, {0x002800003f00000a, &upb_pss_1bt}, - {0x0150001c02000010, &upb_pov4_1bt}, + {0x0158001c02000010, &upb_pov4_1bt}, {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, @@ -177,12 +178,12 @@ const upb_MiniTable envoy__config__cluster__v3__Cluster_msg_init = { {0x001000003f000188, &upb_psv4_2bt}, {0x008000003f090192, &upb_prm_2bt_maxmaxb}, {0x002300003f000398, &upb_psb1_2bt}, - {0x01580024342203a2, &upb_pom_2bt_max64b}, - {0x01580024251702aa, &upb_pom_2bt_max64b}, - {0x0150001c261802b2, &upb_pom_2bt_max64b}, - {0x01580024170e01ba, &upb_pom_2bt_max64b}, + {0x01600024342203a2, &upb_pom_2bt_max64b}, + {0x01600024251702aa, &upb_pom_2bt_max64b}, + {0x0158001c261802b2, &upb_pom_2bt_max64b}, + {0x01600024170e01ba, &upb_pom_2bt_max64b}, {0x00f000003f1902c2, &upb_prm_2bt_maxmaxb}, - {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, + {0x015000003f0003ca, &upb_prs_2bt}, {0x001400003f0001d0, &upb_psv4_2bt}, {0x010800003f1c02da, &upb_prm_2bt_max64b}, {0x00c000003f0001e2, &upb_pss_2bt}, diff --git a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb.h b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb.h index b511d3af6f503..75d43e45e8dd5 100644 --- a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb.h +++ b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb.h @@ -31,6 +31,7 @@ extern "C" { typedef struct envoy_config_endpoint_v3_UpstreamLocalityStats { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_UpstreamLocalityStats; typedef struct envoy_config_endpoint_v3_UpstreamEndpointStats { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_UpstreamEndpointStats; typedef struct envoy_config_endpoint_v3_EndpointLoadMetricStats { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_EndpointLoadMetricStats; +typedef struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats; typedef struct envoy_config_endpoint_v3_ClusterStats { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_ClusterStats; typedef struct envoy_config_endpoint_v3_ClusterStats_DroppedRequests { upb_Message UPB_PRIVATE(base); } envoy_config_endpoint_v3_ClusterStats_DroppedRequests; struct envoy_config_core_v3_Address; @@ -93,37 +94,37 @@ UPB_INLINE bool envoy_config_endpoint_v3_UpstreamLocalityStats_has_locality(cons return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_successful_requests(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {2, UPB_SIZE(32, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(40, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_successful_requests(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {2, UPB_SIZE(32, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(40, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_requests_in_progress(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {3, UPB_SIZE(40, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(48, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_requests_in_progress(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {3, UPB_SIZE(40, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(48, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_error_requests(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {4, UPB_SIZE(48, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {4, UPB_SIZE(56, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_error_requests(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {4, UPB_SIZE(48, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {4, UPB_SIZE(56, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; @@ -205,53 +206,101 @@ UPB_INLINE upb_Array* _envoy_config_endpoint_v3_UpstreamLocalityStats_upstream_e return arr; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_issued_requests(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {8, UPB_SIZE(56, 64), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {8, 64, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_issued_requests(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {8, UPB_SIZE(56, 64), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {8, 64, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_active_connections(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {9, UPB_SIZE(64, 72), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {9, 72, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_active_connections(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {9, UPB_SIZE(64, 72), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {9, 72, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_new_connections(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {10, UPB_SIZE(72, 80), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {10, 80, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_new_connections(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {10, UPB_SIZE(72, 80), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {10, 80, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_total_fail_connections(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { - const upb_MiniTableField field = {11, UPB_SIZE(80, 88), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {11, 88, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE uint64_t envoy_config_endpoint_v3_UpstreamLocalityStats_total_fail_connections(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { uint64_t default_val = (uint64_t)0ull; uint64_t ret; - const upb_MiniTableField field = {11, UPB_SIZE(80, 88), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {11, 88, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_cpu_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {12, UPB_SIZE(28, 96), 65, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_cpu_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* default_val = NULL; + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* ret; + const upb_MiniTableField field = {12, UPB_SIZE(28, 96), 65, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE bool envoy_config_endpoint_v3_UpstreamLocalityStats_has_cpu_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {12, UPB_SIZE(28, 96), 65, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_mem_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {13, UPB_SIZE(32, 104), 66, 4, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_mem_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* default_val = NULL; + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* ret; + const upb_MiniTableField field = {13, UPB_SIZE(32, 104), 66, 4, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE bool envoy_config_endpoint_v3_UpstreamLocalityStats_has_mem_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {13, UPB_SIZE(32, 104), 66, 4, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_clear_application_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {14, UPB_SIZE(36, 112), 67, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_application_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* default_val = NULL; + const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* ret; + const upb_MiniTableField field = {14, UPB_SIZE(36, 112), 67, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE bool envoy_config_endpoint_v3_UpstreamLocalityStats_has_application_utilization(const envoy_config_endpoint_v3_UpstreamLocalityStats* msg) { + const upb_MiniTableField field = {14, UPB_SIZE(36, 112), 67, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); +} UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_locality(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, struct envoy_config_core_v3_Locality* value) { const upb_MiniTableField field = {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; @@ -266,15 +315,15 @@ UPB_INLINE struct envoy_config_core_v3_Locality* envoy_config_endpoint_v3_Upstre return sub; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_successful_requests(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {2, UPB_SIZE(32, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(40, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_requests_in_progress(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {3, UPB_SIZE(40, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(48, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_error_requests(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {4, UPB_SIZE(48, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {4, UPB_SIZE(56, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE envoy_config_endpoint_v3_EndpointLoadMetricStats** envoy_config_endpoint_v3_UpstreamLocalityStats_mutable_load_metric_stats(envoy_config_endpoint_v3_UpstreamLocalityStats* msg, size_t* size) { @@ -342,21 +391,57 @@ UPB_INLINE struct envoy_config_endpoint_v3_UpstreamEndpointStats* envoy_config_e return sub; } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_issued_requests(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {8, UPB_SIZE(56, 64), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {8, 64, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_active_connections(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {9, UPB_SIZE(64, 72), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {9, 72, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_new_connections(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {10, UPB_SIZE(72, 80), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {10, 80, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_fail_connections(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, uint64_t value) { - const upb_MiniTableField field = {11, UPB_SIZE(80, 88), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {11, 88, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_cpu_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* value) { + const upb_MiniTableField field = {12, UPB_SIZE(28, 96), 65, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_mutable_cpu_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg, upb_Arena* arena) { + struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)envoy_config_endpoint_v3_UpstreamLocalityStats_cpu_utilization(msg); + if (sub == NULL) { + sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)_upb_Message_New(&envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, arena); + if (sub) envoy_config_endpoint_v3_UpstreamLocalityStats_set_cpu_utilization(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_mem_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* value) { + const upb_MiniTableField field = {13, UPB_SIZE(32, 104), 66, 4, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_mutable_mem_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg, upb_Arena* arena) { + struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)envoy_config_endpoint_v3_UpstreamLocalityStats_mem_utilization(msg); + if (sub == NULL) { + sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)_upb_Message_New(&envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, arena); + if (sub) envoy_config_endpoint_v3_UpstreamLocalityStats_set_mem_utilization(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_config_endpoint_v3_UpstreamLocalityStats_set_application_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats *msg, envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* value) { + const upb_MiniTableField field = {14, UPB_SIZE(36, 112), 67, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } +UPB_INLINE struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UpstreamLocalityStats_mutable_application_utilization(envoy_config_endpoint_v3_UpstreamLocalityStats* msg, upb_Arena* arena) { + struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)envoy_config_endpoint_v3_UpstreamLocalityStats_application_utilization(msg); + if (sub == NULL) { + sub = (struct envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)_upb_Message_New(&envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, arena); + if (sub) envoy_config_endpoint_v3_UpstreamLocalityStats_set_application_utilization(msg, sub); + } + return sub; +} /* envoy.config.endpoint.v3.UpstreamEndpointStats */ @@ -664,6 +749,76 @@ UPB_INLINE void envoy_config_endpoint_v3_EndpointLoadMetricStats_set_total_metri upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } +/* envoy.config.endpoint.v3.UnnamedEndpointLoadMetricStats */ + +UPB_INLINE envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_new(upb_Arena* arena) { + return (envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats*)_upb_Message_New(&envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, arena); +} +UPB_INLINE envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_parse(const char* buf, size_t size, upb_Arena* arena) { + envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* ret = envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, UPB_UPCAST(ret), &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, NULL, 0, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* ret = envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, UPB_UPCAST(ret), &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, extreg, options, + arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_serialize(const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg, upb_Arena* arena, size_t* len) { + char* ptr; + (void)upb_Encode(UPB_UPCAST(msg), &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, 0, arena, &ptr, len); + return ptr; +} +UPB_INLINE char* envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_serialize_ex(const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg, int options, + upb_Arena* arena, size_t* len) { + char* ptr; + (void)upb_Encode(UPB_UPCAST(msg), &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, options, arena, &ptr, len); + return ptr; +} +UPB_INLINE void envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_clear_num_requests_finished_with_metric(envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg) { + const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE uint64_t envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_num_requests_finished_with_metric(const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg) { + uint64_t default_val = (uint64_t)0ull; + uint64_t ret; + const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE void envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_clear_total_metric_value(envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg) { + const upb_MiniTableField field = {2, 16, 0, kUpb_NoSub, 1, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE double envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_total_metric_value(const envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats* msg) { + double default_val = 0; + double ret; + const upb_MiniTableField field = {2, 16, 0, kUpb_NoSub, 1, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} + +UPB_INLINE void envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_set_num_requests_finished_with_metric(envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats *msg, uint64_t value) { + const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE void envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_set_total_metric_value(envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats *msg, double value) { + const upb_MiniTableField field = {2, 16, 0, kUpb_NoSub, 1, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} + /* envoy.config.endpoint.v3.ClusterStats */ UPB_INLINE envoy_config_endpoint_v3_ClusterStats* envoy_config_endpoint_v3_ClusterStats_new(upb_Arena* arena) { diff --git a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c index 1e861feabea7e..366f1fd6788a6 100644 --- a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c +++ b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c @@ -20,30 +20,36 @@ // Must be last. #include "upb/port/def.inc" -static const upb_MiniTableSub envoy_config_endpoint_v3_UpstreamLocalityStats_submsgs[3] = { +static const upb_MiniTableSub envoy_config_endpoint_v3_UpstreamLocalityStats_submsgs[6] = { {.UPB_PRIVATE(submsg) = &envoy__config__core__v3__Locality_msg_init}, {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__EndpointLoadMetricStats_msg_init}, {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__UpstreamEndpointStats_msg_init}, + {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init}, + {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init}, + {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init}, }; -static const upb_MiniTableField envoy_config_endpoint_v3_UpstreamLocalityStats__fields[11] = { +static const upb_MiniTableField envoy_config_endpoint_v3_UpstreamLocalityStats__fields[14] = { {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {2, UPB_SIZE(32, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, - {3, UPB_SIZE(40, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, - {4, UPB_SIZE(48, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {2, UPB_SIZE(40, 24), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {3, UPB_SIZE(48, 32), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {4, UPB_SIZE(56, 40), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, {5, UPB_SIZE(16, 48), 0, 1, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, {6, UPB_SIZE(20, 12), 0, kUpb_NoSub, 13, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)}, {7, UPB_SIZE(24, 56), 0, 2, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, - {8, UPB_SIZE(56, 64), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, - {9, UPB_SIZE(64, 72), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, - {10, UPB_SIZE(72, 80), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, - {11, UPB_SIZE(80, 88), 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {8, 64, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {9, 72, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {10, 80, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {11, 88, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {12, UPB_SIZE(28, 96), 65, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {13, UPB_SIZE(32, 104), 66, 4, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, + {14, UPB_SIZE(36, 112), 67, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, }; const upb_MiniTable envoy__config__endpoint__v3__UpstreamLocalityStats_msg_init = { &envoy_config_endpoint_v3_UpstreamLocalityStats_submsgs[0], &envoy_config_endpoint_v3_UpstreamLocalityStats__fields[0], - UPB_SIZE(88, 96), 11, kUpb_ExtMode_NonExtendable, 11, UPB_FASTTABLE_MASK(120), 0, + UPB_SIZE(96, 120), 14, kUpb_ExtMode_NonExtendable, 14, UPB_FASTTABLE_MASK(120), 0, #ifdef UPB_TRACING_ENABLED "envoy.config.endpoint.v3.UpstreamLocalityStats", #endif @@ -123,6 +129,26 @@ const upb_MiniTable envoy__config__endpoint__v3__EndpointLoadMetricStats_msg_ini }) }; +static const upb_MiniTableField envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats__fields[2] = { + {1, 8, 0, kUpb_NoSub, 4, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, + {2, 16, 0, kUpb_NoSub, 1, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_8Byte << kUpb_FieldRep_Shift)}, +}; + +const upb_MiniTable envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init = { + NULL, + &envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats__fields[0], + 24, 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(24), 0, +#ifdef UPB_TRACING_ENABLED + "envoy.config.endpoint.v3.UnnamedEndpointLoadMetricStats", +#endif + UPB_FASTTABLE_INIT({ + {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, + {0x000800003f000008, &upb_psv8_1bt}, + {0x001000003f000011, &upb_psf8_1bt}, + {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, + }) +}; + static const upb_MiniTableSub envoy_config_endpoint_v3_ClusterStats_submsgs[3] = { {.UPB_PRIVATE(submsg) = &envoy__config__endpoint__v3__UpstreamLocalityStats_msg_init}, {.UPB_PRIVATE(submsg) = &google__protobuf__Duration_msg_init}, @@ -177,10 +203,11 @@ const upb_MiniTable envoy__config__endpoint__v3__ClusterStats__DroppedRequests_m }) }; -static const upb_MiniTable *messages_layout[5] = { +static const upb_MiniTable *messages_layout[6] = { &envoy__config__endpoint__v3__UpstreamLocalityStats_msg_init, &envoy__config__endpoint__v3__UpstreamEndpointStats_msg_init, &envoy__config__endpoint__v3__EndpointLoadMetricStats_msg_init, + &envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init, &envoy__config__endpoint__v3__ClusterStats_msg_init, &envoy__config__endpoint__v3__ClusterStats__DroppedRequests_msg_init, }; @@ -189,7 +216,7 @@ const upb_MiniTableFile envoy_config_endpoint_v3_load_report_proto_upb_file_layo messages_layout, NULL, NULL, - 5, + 6, 0, 0, }; diff --git a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.h b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.h index 2bfb250c74d6f..001a307d7a6bf 100644 --- a/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.h +++ b/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.h @@ -20,6 +20,7 @@ extern "C" { extern const upb_MiniTable envoy__config__endpoint__v3__UpstreamLocalityStats_msg_init; extern const upb_MiniTable envoy__config__endpoint__v3__UpstreamEndpointStats_msg_init; extern const upb_MiniTable envoy__config__endpoint__v3__EndpointLoadMetricStats_msg_init; +extern const upb_MiniTable envoy__config__endpoint__v3__UnnamedEndpointLoadMetricStats_msg_init; extern const upb_MiniTable envoy__config__endpoint__v3__ClusterStats_msg_init; extern const upb_MiniTable envoy__config__endpoint__v3__ClusterStats__DroppedRequests_msg_init; diff --git a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb.h b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb.h index e0fa265a5b598..ffc331ed4929c 100644 --- a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb.h +++ b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb.h @@ -12,6 +12,7 @@ #include "envoy/config/trace/v3/datadog.upb_minitable.h" +#include "google/protobuf/duration.upb_minitable.h" #include "udpa/annotations/migrate.upb_minitable.h" #include "udpa/annotations/status.upb_minitable.h" #include "udpa/annotations/versioning.upb_minitable.h" @@ -24,10 +25,78 @@ extern "C" { #endif +typedef struct envoy_config_trace_v3_DatadogRemoteConfig { upb_Message UPB_PRIVATE(base); } envoy_config_trace_v3_DatadogRemoteConfig; typedef struct envoy_config_trace_v3_DatadogConfig { upb_Message UPB_PRIVATE(base); } envoy_config_trace_v3_DatadogConfig; +struct google_protobuf_Duration; +/* envoy.config.trace.v3.DatadogRemoteConfig */ + +UPB_INLINE envoy_config_trace_v3_DatadogRemoteConfig* envoy_config_trace_v3_DatadogRemoteConfig_new(upb_Arena* arena) { + return (envoy_config_trace_v3_DatadogRemoteConfig*)_upb_Message_New(&envoy__config__trace__v3__DatadogRemoteConfig_msg_init, arena); +} +UPB_INLINE envoy_config_trace_v3_DatadogRemoteConfig* envoy_config_trace_v3_DatadogRemoteConfig_parse(const char* buf, size_t size, upb_Arena* arena) { + envoy_config_trace_v3_DatadogRemoteConfig* ret = envoy_config_trace_v3_DatadogRemoteConfig_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, UPB_UPCAST(ret), &envoy__config__trace__v3__DatadogRemoteConfig_msg_init, NULL, 0, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE envoy_config_trace_v3_DatadogRemoteConfig* envoy_config_trace_v3_DatadogRemoteConfig_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + envoy_config_trace_v3_DatadogRemoteConfig* ret = envoy_config_trace_v3_DatadogRemoteConfig_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, UPB_UPCAST(ret), &envoy__config__trace__v3__DatadogRemoteConfig_msg_init, extreg, options, + arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* envoy_config_trace_v3_DatadogRemoteConfig_serialize(const envoy_config_trace_v3_DatadogRemoteConfig* msg, upb_Arena* arena, size_t* len) { + char* ptr; + (void)upb_Encode(UPB_UPCAST(msg), &envoy__config__trace__v3__DatadogRemoteConfig_msg_init, 0, arena, &ptr, len); + return ptr; +} +UPB_INLINE char* envoy_config_trace_v3_DatadogRemoteConfig_serialize_ex(const envoy_config_trace_v3_DatadogRemoteConfig* msg, int options, + upb_Arena* arena, size_t* len) { + char* ptr; + (void)upb_Encode(UPB_UPCAST(msg), &envoy__config__trace__v3__DatadogRemoteConfig_msg_init, options, arena, &ptr, len); + return ptr; +} +UPB_INLINE void envoy_config_trace_v3_DatadogRemoteConfig_clear_polling_interval(envoy_config_trace_v3_DatadogRemoteConfig* msg) { + const upb_MiniTableField field = {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE const struct google_protobuf_Duration* envoy_config_trace_v3_DatadogRemoteConfig_polling_interval(const envoy_config_trace_v3_DatadogRemoteConfig* msg) { + const struct google_protobuf_Duration* default_val = NULL; + const struct google_protobuf_Duration* ret; + const upb_MiniTableField field = {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE bool envoy_config_trace_v3_DatadogRemoteConfig_has_polling_interval(const envoy_config_trace_v3_DatadogRemoteConfig* msg) { + const upb_MiniTableField field = {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); +} + +UPB_INLINE void envoy_config_trace_v3_DatadogRemoteConfig_set_polling_interval(envoy_config_trace_v3_DatadogRemoteConfig *msg, struct google_protobuf_Duration* value) { + const upb_MiniTableField field = {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE struct google_protobuf_Duration* envoy_config_trace_v3_DatadogRemoteConfig_mutable_polling_interval(envoy_config_trace_v3_DatadogRemoteConfig* msg, upb_Arena* arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_trace_v3_DatadogRemoteConfig_polling_interval(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)_upb_Message_New(&google__protobuf__Duration_msg_init, arena); + if (sub) envoy_config_trace_v3_DatadogRemoteConfig_set_polling_interval(msg, sub); + } + return sub; +} + /* envoy.config.trace.v3.DatadogConfig */ UPB_INLINE envoy_config_trace_v3_DatadogConfig* envoy_config_trace_v3_DatadogConfig_new(upb_Arena* arena) { @@ -65,54 +134,82 @@ UPB_INLINE char* envoy_config_trace_v3_DatadogConfig_serialize_ex(const envoy_co return ptr; } UPB_INLINE void envoy_config_trace_v3_DatadogConfig_clear_collector_cluster(envoy_config_trace_v3_DatadogConfig* msg) { - const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, 16, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE upb_StringView envoy_config_trace_v3_DatadogConfig_collector_cluster(const envoy_config_trace_v3_DatadogConfig* msg) { upb_StringView default_val = upb_StringView_FromString(""); upb_StringView ret; - const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, 16, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_trace_v3_DatadogConfig_clear_service_name(envoy_config_trace_v3_DatadogConfig* msg) { - const upb_MiniTableField field = {2, UPB_SIZE(16, 24), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(24, 32), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE upb_StringView envoy_config_trace_v3_DatadogConfig_service_name(const envoy_config_trace_v3_DatadogConfig* msg) { upb_StringView default_val = upb_StringView_FromString(""); upb_StringView ret; - const upb_MiniTableField field = {2, UPB_SIZE(16, 24), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(24, 32), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } UPB_INLINE void envoy_config_trace_v3_DatadogConfig_clear_collector_hostname(envoy_config_trace_v3_DatadogConfig* msg) { - const upb_MiniTableField field = {3, UPB_SIZE(24, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(32, 48), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); } UPB_INLINE upb_StringView envoy_config_trace_v3_DatadogConfig_collector_hostname(const envoy_config_trace_v3_DatadogConfig* msg) { upb_StringView default_val = upb_StringView_FromString(""); upb_StringView ret; - const upb_MiniTableField field = {3, UPB_SIZE(24, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(32, 48), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, &default_val, &ret); return ret; } +UPB_INLINE void envoy_config_trace_v3_DatadogConfig_clear_remote_config(envoy_config_trace_v3_DatadogConfig* msg) { + const upb_MiniTableField field = {4, UPB_SIZE(12, 64), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + upb_Message_ClearBaseField(UPB_UPCAST(msg), &field); +} +UPB_INLINE const envoy_config_trace_v3_DatadogRemoteConfig* envoy_config_trace_v3_DatadogConfig_remote_config(const envoy_config_trace_v3_DatadogConfig* msg) { + const envoy_config_trace_v3_DatadogRemoteConfig* default_val = NULL; + const envoy_config_trace_v3_DatadogRemoteConfig* ret; + const upb_MiniTableField field = {4, UPB_SIZE(12, 64), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + _upb_Message_GetNonExtensionField(UPB_UPCAST(msg), &field, + &default_val, &ret); + return ret; +} +UPB_INLINE bool envoy_config_trace_v3_DatadogConfig_has_remote_config(const envoy_config_trace_v3_DatadogConfig* msg) { + const upb_MiniTableField field = {4, UPB_SIZE(12, 64), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; + return upb_Message_HasBaseField(UPB_UPCAST(msg), &field); +} UPB_INLINE void envoy_config_trace_v3_DatadogConfig_set_collector_cluster(envoy_config_trace_v3_DatadogConfig *msg, upb_StringView value) { - const upb_MiniTableField field = {1, 8, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {1, 16, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_trace_v3_DatadogConfig_set_service_name(envoy_config_trace_v3_DatadogConfig *msg, upb_StringView value) { - const upb_MiniTableField field = {2, UPB_SIZE(16, 24), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {2, UPB_SIZE(24, 32), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } UPB_INLINE void envoy_config_trace_v3_DatadogConfig_set_collector_hostname(envoy_config_trace_v3_DatadogConfig *msg, upb_StringView value) { - const upb_MiniTableField field = {3, UPB_SIZE(24, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + const upb_MiniTableField field = {3, UPB_SIZE(32, 48), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}; + upb_Message_SetBaseField((upb_Message *)msg, &field, &value); +} +UPB_INLINE void envoy_config_trace_v3_DatadogConfig_set_remote_config(envoy_config_trace_v3_DatadogConfig *msg, envoy_config_trace_v3_DatadogRemoteConfig* value) { + const upb_MiniTableField field = {4, UPB_SIZE(12, 64), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}; upb_Message_SetBaseField((upb_Message *)msg, &field, &value); } +UPB_INLINE struct envoy_config_trace_v3_DatadogRemoteConfig* envoy_config_trace_v3_DatadogConfig_mutable_remote_config(envoy_config_trace_v3_DatadogConfig* msg, upb_Arena* arena) { + struct envoy_config_trace_v3_DatadogRemoteConfig* sub = (struct envoy_config_trace_v3_DatadogRemoteConfig*)envoy_config_trace_v3_DatadogConfig_remote_config(msg); + if (sub == NULL) { + sub = (struct envoy_config_trace_v3_DatadogRemoteConfig*)_upb_Message_New(&envoy__config__trace__v3__DatadogRemoteConfig_msg_init, arena); + if (sub) envoy_config_trace_v3_DatadogConfig_set_remote_config(msg, sub); + } + return sub; +} #ifdef __cplusplus } /* extern "C" */ diff --git a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c index c6674469fab03..03e5cb999563e 100644 --- a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c +++ b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c @@ -8,6 +8,7 @@ #include #include "upb/generated_code_support.h" #include "envoy/config/trace/v3/datadog.upb_minitable.h" +#include "google/protobuf/duration.upb_minitable.h" #include "udpa/annotations/migrate.upb_minitable.h" #include "udpa/annotations/status.upb_minitable.h" #include "udpa/annotations/versioning.upb_minitable.h" @@ -16,28 +17,51 @@ // Must be last. #include "upb/port/def.inc" -static const upb_MiniTableField envoy_config_trace_v3_DatadogConfig__fields[3] = { - {1, 8, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, - {2, UPB_SIZE(16, 24), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, - {3, UPB_SIZE(24, 40), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, +static const upb_MiniTableSub envoy_config_trace_v3_DatadogRemoteConfig_submsgs[1] = { + {.UPB_PRIVATE(submsg) = &google__protobuf__Duration_msg_init}, +}; + +static const upb_MiniTableField envoy_config_trace_v3_DatadogRemoteConfig__fields[1] = { + {1, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, +}; + +const upb_MiniTable envoy__config__trace__v3__DatadogRemoteConfig_msg_init = { + &envoy_config_trace_v3_DatadogRemoteConfig_submsgs[0], + &envoy_config_trace_v3_DatadogRemoteConfig__fields[0], + UPB_SIZE(16, 24), 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(255), 0, +#ifdef UPB_TRACING_ENABLED + "envoy.config.trace.v3.DatadogRemoteConfig", +#endif +}; + +static const upb_MiniTableSub envoy_config_trace_v3_DatadogConfig_submsgs[1] = { + {.UPB_PRIVATE(submsg) = &envoy__config__trace__v3__DatadogRemoteConfig_msg_init}, +}; + +static const upb_MiniTableField envoy_config_trace_v3_DatadogConfig__fields[4] = { + {1, 16, 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, + {2, UPB_SIZE(24, 32), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, + {3, UPB_SIZE(32, 48), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)}, + {4, UPB_SIZE(12, 64), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)}, }; const upb_MiniTable envoy__config__trace__v3__DatadogConfig_msg_init = { - NULL, + &envoy_config_trace_v3_DatadogConfig_submsgs[0], &envoy_config_trace_v3_DatadogConfig__fields[0], - UPB_SIZE(32, 56), 3, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(24), 0, + UPB_SIZE(40, 72), 4, kUpb_ExtMode_NonExtendable, 4, UPB_FASTTABLE_MASK(24), 0, #ifdef UPB_TRACING_ENABLED "envoy.config.trace.v3.DatadogConfig", #endif UPB_FASTTABLE_INIT({ {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric}, - {0x000800003f00000a, &upb_pss_1bt}, - {0x001800003f000012, &upb_pss_1bt}, - {0x002800003f00001a, &upb_pss_1bt}, + {0x001000003f00000a, &upb_pss_1bt}, + {0x002000003f000012, &upb_pss_1bt}, + {0x003000003f00001a, &upb_pss_1bt}, }) }; -static const upb_MiniTable *messages_layout[1] = { +static const upb_MiniTable *messages_layout[2] = { + &envoy__config__trace__v3__DatadogRemoteConfig_msg_init, &envoy__config__trace__v3__DatadogConfig_msg_init, }; @@ -45,7 +69,7 @@ const upb_MiniTableFile envoy_config_trace_v3_datadog_proto_upb_file_layout = { messages_layout, NULL, NULL, - 1, + 2, 0, 0, }; diff --git a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.h b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.h index 80622a1d9aef4..9378ae585df03 100644 --- a/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.h +++ b/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.h @@ -17,6 +17,7 @@ extern "C" { #endif +extern const upb_MiniTable envoy__config__trace__v3__DatadogRemoteConfig_msg_init; extern const upb_MiniTable envoy__config__trace__v3__DatadogConfig_msg_init; extern const upb_MiniTableFile envoy_config_trace_v3_datadog_proto_upb_file_layout; diff --git a/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c b/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c index cadcd22285e74..7fa62797ac85a 100644 --- a/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +++ b/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c @@ -33,7 +33,7 @@ extern _upb_DefPool_Init udpa_annotations_security_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_status_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_versioning_proto_upbdefinit; extern _upb_DefPool_Init validate_validate_proto_upbdefinit; -static const char descriptor[13010] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', +static const char descriptor[13073] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\027', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '\032', '-', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'i', 'r', 'c', 'u', 'i', 't', '_', 'b', 'r', @@ -72,7 +72,7 @@ static const char descriptor[13010] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'K', '\n', '\021', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '6', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', -'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\227', +'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\326', 'S', '\n', '\007', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'o', '\n', '\030', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 's', '\030', '+', ' ', '\003', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', @@ -241,319 +241,321 @@ static const char descriptor[13010] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'A', '\n', '\n', 'l', 'r', 's', '_', 's', 'e', 'r', 'v', 'e', 'r', '\030', '*', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', -'r', 's', 'S', 'e', 'r', 'v', 'e', 'r', '\022', '?', '\n', '\025', 't', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', -'_', 'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '/', ' ', '\001', '(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', -'.', '0', 'R', '\023', 't', 'r', 'a', 'c', 'k', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', 'S', -'\n', '\017', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '0', ' ', '\001', '(', '\013', '2', '*', -'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', -'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 's', 't', 'r', 'e', -'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z', '\n', '\023', 't', 'r', 'a', 'c', 'k', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', -'_', 's', 't', 'a', 't', 's', '\030', '1', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', -'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', -'r', 'S', 't', 'a', 't', 's', 'R', '\021', 't', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', -'\022', '^', '\n', '\021', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '2', ' ', '\001', -'(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', -'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', -'i', 'c', 'y', 'R', '\020', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', -'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'p', 'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', -'t', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', -'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'o', 'o', 'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', -'m', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\032', '\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', -'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', -'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', -'\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', -'t', 'r', 'u', 'c', 't', 'R', '\005', 'm', 'a', 't', 'c', 'h', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', -'_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', -'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', -'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', -'+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', -'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', -'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', -'\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', -'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', -'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', -'i', 'g', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', -'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', -'\246', '\001', '\n', '\020', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', -'d', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', -'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', -'e', 'R', '\t', 'e', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', -'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', ':', ',', '\232', -'\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', -'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\244', '\n', '\n', '\016', 'L', 'b', -'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', -'p', 'o', 'l', 'i', 'c', 'y', '\030', '\001', ' ', '\001', '(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', -'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', -'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', -'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', -'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '>', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'u', 'b', -'s', 'e', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', -'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's', 'e', 't', '\022', -'k', '\n', '\020', 's', 'u', 'b', 's', 'e', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', -'2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', +'r', 's', 'S', 'e', 'r', 'v', 'e', 'r', '\022', '=', '\n', '\033', 'l', 'r', 's', '_', 'r', 'e', 'p', 'o', 'r', 't', '_', 'e', 'n', +'d', 'p', 'o', 'i', 'n', 't', '_', 'm', 'e', 't', 'r', 'i', 'c', 's', '\030', '9', ' ', '\003', '(', '\t', 'R', '\030', 'l', 'r', 's', +'R', 'e', 'p', 'o', 'r', 't', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'M', 'e', 't', 'r', 'i', 'c', 's', '\022', '?', '\n', '\025', +'t', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '/', ' ', '\001', +'(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\023', 't', 'r', 'a', 'c', 'k', 'T', 'i', 'm', +'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', 'S', '\n', '\017', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', +'o', 'n', 'f', 'i', 'g', '\030', '0', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', +'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', +'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z', '\n', '\023', +'t', 'r', 'a', 'c', 'k', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '1', ' ', '\001', '(', '\013', +'2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', +'3', '.', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', 'R', '\021', 't', 'r', 'a', 'c', +'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '^', '\n', '\021', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', +'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '2', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', +'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', +'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\020', 'p', 'r', 'e', 'c', 'o', 'n', 'n', +'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'p', +'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', +'t', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'o', 'o', +'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\032', +'\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\022', +'\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', +'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', +'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'm', 'a', 't', 'c', 'h', +'\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\003', ' ', '\001', '(', +'\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', +'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', +'t', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', +'.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', +'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', +'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', +'\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', +'\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', +'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', +'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', +'m', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', '\246', '\001', '\n', '\020', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', +'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', +'\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', +'3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'e', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', +'\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\013', 's', +'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', +'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', +'C', 'o', 'n', 'f', 'i', 'g', '\032', '\244', '\n', '\n', '\016', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', +'\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\001', ' ', '\001', '(', '\016', +'2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', -'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's', 'e', 't', 'S', -'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\022', '2', '\n', '\025', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', -'h', 't', '_', 'a', 'w', 'a', 'r', 'e', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', -'e', 'i', 'g', 'h', 't', 'A', 'w', 'a', 'r', 'e', '\022', '2', '\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o', 'c', 'a', 'l', -'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l', 'e', 'L', 'o', -'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', '\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_', 'm', 'o', 'd', -'e', '_', 'a', 'n', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e', 'A', 'n', 'y', -'\022', '\036', '\n', '\013', 'l', 'i', 's', 't', '_', 'a', 's', '_', 'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\t', 'l', 'i', -'s', 't', 'A', 's', 'A', 'n', 'y', '\022', '\222', '\001', '\n', '\030', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'f', 'a', 'l', 'l', -'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\010', ' ', '\001', '(', '\016', '2', 'N', '.', 'e', 'n', 'v', 'o', 'y', -'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', -'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', -'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', -'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\026', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', -'P', 'o', 'l', 'i', 'c', 'y', '\032', '\332', '\003', '\n', '\020', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', -'o', 'r', '\022', '\022', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y', 's', '\022', '3', '\n', -'\026', 's', 'i', 'n', 'g', 'l', 'e', '_', 'h', 'o', 's', 't', '_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\004', -' ', '\001', '(', '\010', 'R', '\023', 's', 'i', 'n', 'g', 'l', 'e', 'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u', 'b', 's', 'e', 't', -'\022', '\222', '\001', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\002', ' ', '\001', '(', -'\016', '2', '_', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', -'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', -'.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', -'t', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', -'\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', -'0', '\n', '\024', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\003', -' ', '\003', '(', '\t', 'R', '\022', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b', 's', 'e', 't', '\"', -'y', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', -'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N', 'E', 'D', '\020', '\000', -'\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', -'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\002', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', -'S', 'E', 'T', '\020', '\003', '\022', '\017', '\n', '\013', 'K', 'E', 'Y', 'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\004', ':', ';', '\232', -'\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', -'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', -'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\"', 'O', '\n', '\026', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', -'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', -'\000', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022', '\n', '\016', 'D', 'E', -'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\002', '\"', 'M', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's', 'e', -'t', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\030', -'\n', '\024', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', '_', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', -'\021', '\n', '\r', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '_', 'L', 'I', 'S', 'T', '\020', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', -'\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', -'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\343', '\001', '\n', '\017', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', -'t', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\021', 's', 'l', 'o', 'w', '_', 's', 't', 'a', 'r', 't', '_', 'w', 'i', 'n', -'d', 'o', 'w', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', -'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\017', 's', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'W', 'i', 'n', -'d', 'o', 'w', '\022', 'C', '\n', '\n', 'a', 'g', 'g', 'r', 'e', 's', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', -'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', -'t', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\n', 'a', 'g', 'g', 'r', 'e', 's', 's', 'i', 'o', 'n', '\022', 'D', '\n', -'\022', 'm', 'i', 'n', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', 'p', 'e', 'r', 'c', 'e', 'n', 't', '\030', '\003', ' ', '\001', '(', '\013', -'2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', -'\020', 'm', 'i', 'n', 'W', 'e', 'i', 'g', 'h', 't', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\032', 'r', '\n', '\022', 'R', 'o', 'u', 'n', -'d', 'R', 'o', 'b', 'i', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\\', '\n', '\021', 's', 'l', 'o', 'w', '_', 's', 't', -'a', 'r', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', -'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', -'.', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\017', 's', 'l', 'o', 'w', 'S', 't', 'a', -'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\305', '\002', '\n', '\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', -'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014', 'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o', 'u', 'n', 't', '\030', -'\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', -'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013', 'c', 'h', 'o', 'i', -'c', 'e', 'C', 'o', 'u', 'n', 't', '\022', 'S', '\n', '\023', 'a', 'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', -'_', 'b', 'i', 'a', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', -'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\021', -'a', 'c', 't', 'i', 'v', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'B', 'i', 'a', 's', '\022', '\\', '\n', '\021', 's', 'l', 'o', 'w', -'_', 's', 't', 'a', 'r', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', -'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', -'t', 'e', 'r', '.', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\017', 's', 'l', 'o', 'w', -'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', -'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', -'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\221', '\003', '\n', '\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', -'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', -'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', -'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', -'\004', 'R', '\017', 'm', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a', 's', -'h', '_', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', -'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', -'.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u', 'n', -'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n', 'c', -'t', 'i', 'o', 'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', -'\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', -'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', -'m', 'a', 'x', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F', 'u', -'n', 'c', 't', 'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', '_', 'H', 'A', 'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M', 'U', -'R', 'M', 'U', 'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', '\001', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', -'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', -'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\002', '\020', '\003', '\032', 'Y', '\n', '\016', 'M', 'a', 'g', 'l', 'e', 'v', -'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'G', '\n', '\n', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', -'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', -'t', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\313', '\226', '\261', '\002', 'R', '\t', 't', 'a', 'b', -'l', 'e', 'S', 'i', 'z', 'e', '\032', '\277', '\002', '\n', '\023', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', -'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', '_', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', -'\001', ' ', '\001', '(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', 't', 'p', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '(', '\n', '\020', 'h', -'t', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\016', 'h', 't', -'t', 'p', 'H', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', ']', '\n', '\026', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', -'p', 'o', 'r', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', -'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', -'\t', '\372', 'B', '\006', '*', '\004', '\030', '\377', '\377', '\003', 'R', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'P', 'o', 'r', 't', 'O', -'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'F', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\004', -' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't', -'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', -'a', 'K', 'e', 'y', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', -'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', -'f', 'i', 'g', '\032', '\325', '\013', '\n', '\016', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', -'\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'p', 'a', 'n', 'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', -'\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', -'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o', -'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n', 'e', '_', 'a', 'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', -'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', -'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', -'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', -'\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033', -'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', -'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'H', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', -'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', -'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', -'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\030', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', -'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'I', '\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g', -'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', -'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M', -'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C', '\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_', -'h', 'o', 's', 't', 's', '_', 'u', 'n', 't', 'i', 'l', '_', 'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(', -'\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e', 'N', 'e', 'w', 'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r', -'s', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', -'_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 's', 'e', 't', '_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010', -'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S', -'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022', '\212', '\001', '\n', '\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h', -'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.', -'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', -'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', -'s', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c', -'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', -'W', '\n', '\024', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 'h', 'o', 's', 't', '_', 's', 't', 'a', 't', 'u', 's', '\030', '\010', -' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', -'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'S', 't', 'a', 't', 'u', 's', 'S', 'e', 't', 'R', '\022', 'o', 'v', 'e', 'r', 'r', -'i', 'd', 'e', 'H', 'o', 's', 't', 'S', 't', 'a', 't', 'u', 's', '\032', '\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', -'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', '\n', '\017', 'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e', 'n', 'a', -'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', -'3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'o', 'u', 't', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l', 'e', 'd', -'\022', 'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ', '\001', '(', -'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', -'4', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022', '1', '\n', -'\025', 'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030', '\003', ' ', -'\001', '(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c', ':', '<', -'\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', -'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', -'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', '\n', '\030', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', -'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e', 'n', 'v', -'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', -'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', -'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', -'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7', '\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's', 't', 'n', -'a', 'm', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025', 'u', 's', -'e', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', 'H', 'a', 's', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023', 'h', 'a', -'s', 'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', 'a', 'c', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', -'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', -'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', 'R', '\021', 'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n', 'c', 'e', -'F', 'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', '?', '\n', '=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', -'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', -'.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', -'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', -'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n', '\031', 'l', -'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\032', -'\322', '\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', -'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', -'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', -'*', '\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n', '\014', 'm', -'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', -'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', -'\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'', '\232', '\305', -'\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', -'.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\032', '\203', '\002', '\n', '\020', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', -'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'x', '\n', '\035', 'p', 'e', 'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', -'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', -'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', -'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', -'\360', '?', 'R', '\032', 'p', 'e', 'r', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', -'R', 'a', 't', 'i', 'o', '\022', 'u', '\n', '\033', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e', 'c', 'o', -'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', -'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', -'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\031', 'p', -'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\032', -'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', -'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', -'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', -'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', -'\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n', '\006', 'S', -'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n', 'S', 'T', 'R', 'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001', '\022', '\017', -'\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D', 'N', 'S', '\020', '\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020', '\003', '\022', -'\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L', 'b', 'P', -'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O', 'U', 'N', 'D', '_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022', '\021', '\n', -'\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N', 'G', '_', -'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R', 'A', 'N', 'D', 'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M', 'A', 'G', -'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L', 'U', 'S', 'T', 'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D', 'E', 'D', -'\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_', 'B', 'A', 'L', 'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O', 'L', 'I', -'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007', '\"', '\004', '\010', '\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G', 'I', 'N', -'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', 'P', '\n', '\017', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', -'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L', 'Y', '\020', -'\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L', 'Y', '\020', '\002', '\022', '\020', '\n', '\014', 'V', '4', '_', 'P', 'R', 'E', 'F', -'E', 'R', 'R', 'E', 'D', '\020', '\003', '\022', '\007', '\n', '\003', 'A', 'L', 'L', '\020', '\004', '\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't', -'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S', -'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033', -'\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', 'R', 'E', 'A', 'M', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', -'\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', -'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', -'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020', -'\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010', '\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$', -'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't', -'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\332', -'\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', -'\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', -'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', -'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', -'i', 'e', 's', '\032', '\310', '\001', '\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '`', '\n', '\026', 't', 'y', 'p', 'e', 'd', '_', 'e', -'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '*', '.', 'e', -'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', -'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't', -'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', -'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', -'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', -'\003', '\020', '\004', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'R', '\004', 'n', 'a', 'm', 'e', 'R', '\014', 't', 'y', 'p', 'e', 'd', '_', -'c', 'o', 'n', 'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', -'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\273', '\005', -'\n', '\031', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', -'n', 's', '\022', 'G', '\n', '\r', 't', 'c', 'p', '_', 'k', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\001', ' ', '\001', '(', '\013', -'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', -'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'R', '\014', 't', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', -'\022', 'd', '\n', '0', 's', 'e', 't', '_', 'l', 'o', 'c', 'a', 'l', '_', 'i', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', '_', 'n', -'a', 'm', 'e', '_', 'o', 'n', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', -'n', 's', '\030', '\002', ' ', '\001', '(', '\010', 'R', '*', 's', 'e', 't', 'L', 'o', 'c', 'a', 'l', 'I', 'n', 't', 'e', 'r', 'f', 'a', -'c', 'e', 'N', 'a', 'm', 'e', 'O', 'n', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', -'n', 's', '\022', 'z', '\n', '\025', 'h', 'a', 'p', 'p', 'y', '_', 'e', 'y', 'e', 'b', 'a', 'l', 'l', 's', '_', 'c', 'o', 'n', 'f', -'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', -'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', -'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'a', 'p', 'p', 'y', 'E', 'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', -'o', 'n', 'f', 'i', 'g', 'R', '\023', 'h', 'a', 'p', 'p', 'y', 'E', 'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', 'o', 'n', 'f', 'i', -'g', '\032', '\211', '\002', '\n', '\023', 'H', 'a', 'p', 'p', 'y', 'E', 'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', 'o', 'n', 'f', 'i', 'g', -'\022', '\215', '\001', '\n', '\034', 'f', 'i', 'r', 's', 't', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'f', 'a', 'm', 'i', 'l', 'y', -'_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', 'L', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', -'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', -'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'F', 'i', 'r', 's', 't', 'A', 'd', 'd', -'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\031', 'f', 'i', 'r', 's', 't', 'A', -'d', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', 'b', '\n', '\032', 'f', 'i', -'r', 's', 't', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'f', 'a', 'm', 'i', 'l', 'y', '_', 'c', 'o', 'u', 'n', 't', '\030', -'\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', -'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\027', 'f', 'i', 'r', 's', -'t', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', 'C', 'o', 'u', 'n', 't', '\"', '8', '\n', '\031', 'F', 'i', -'r', 's', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\013', -'\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\006', '\n', '\002', 'V', '4', '\020', '\001', '\022', '\006', '\n', '\002', 'V', '6', -'\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', -'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', -'\240', '\001', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'', '\n', '\017', -'t', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016', 't', 'i', -'m', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', '4', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'r', -'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z', 'e', 's', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e', 'q', 'u', -'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'S', 'i', 'z', 'e', 's', '\022', ',', '\n', '\022', 'p', 'e', 'r', '_', 'e', -'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't', 'a', 't', 's', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'e', 'r', 'E', -'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', 'B', '\211', '\001', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', -'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', -'r', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', 'H', 'g', 'i', 't', -'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', 'n', -'t', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', -'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', ';', 'c', 'l', 'u', 's', 't', 'e', 'r', 'v', '3', '\272', '\200', '\310', '\321', '\006', '\002', -'\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', +'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', +'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '>', +'\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', +'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\r', 'd', +'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's', 'e', 't', '\022', 'k', '\n', '\020', 's', 'u', 'b', 's', 'e', 't', '_', 's', 'e', +'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', +'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', +'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', +'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\022', '2', '\n', '\025', +'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', 'a', 'w', 'a', 'r', 'e', '\030', '\004', ' ', '\001', +'(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'A', 'w', 'a', 'r', 'e', '\022', '2', +'\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\005', +' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l', 'e', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', +'\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_', 'm', 'o', 'd', 'e', '_', 'a', 'n', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', +'\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e', 'A', 'n', 'y', '\022', '\036', '\n', '\013', 'l', 'i', 's', 't', '_', 'a', 's', '_', +'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\t', 'l', 'i', 's', 't', 'A', 's', 'A', 'n', 'y', '\022', '\222', '\001', '\n', '\030', +'m', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', +'\010', ' ', '\001', '(', '\016', '2', 'N', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', +'t', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', +'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', 'l', +'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\026', 'm', 'e', 't', +'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\032', '\332', '\003', '\n', '\020', 'L', +'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\022', '\022', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', +' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y', 's', '\022', '3', '\n', '\026', 's', 'i', 'n', 'g', 'l', 'e', '_', 'h', 'o', 's', 't', +'_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 's', 'i', 'n', 'g', 'l', 'e', +'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u', 'b', 's', 'e', 't', '\022', '\222', '\001', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', +'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\002', ' ', '\001', '(', '\016', '2', '_', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', +'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', +'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', +'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', +'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', +'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '0', '\n', '\024', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', +'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\022', 'f', 'a', 'l', 'l', 'b', 'a', +'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b', 's', 'e', 't', '\"', 'y', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', +'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', +'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N', 'E', 'D', '\020', '\000', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', +'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\002', '\022', '\022', +'\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\003', '\022', '\017', '\n', '\013', 'K', 'E', 'Y', +'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\004', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', +'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', +'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\"', 'O', '\n', '\026', +'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', +'\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', +'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', +'\020', '\002', '\"', 'M', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'a', 'l', +'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\030', '\n', '\024', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', '_', 'N', +'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', '\021', '\n', '\r', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '_', +'L', 'I', 'S', 'T', '\020', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', +'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', +'\032', '\343', '\001', '\n', '\017', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\021', 's', +'l', 'o', 'w', '_', 's', 't', 'a', 'r', 't', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', +'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', +'\017', 's', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C', '\n', '\n', 'a', 'g', 'g', 'r', 'e', +'s', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', +'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\n', +'a', 'g', 'g', 'r', 'e', 's', 's', 'i', 'o', 'n', '\022', 'D', '\n', '\022', 'm', 'i', 'n', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', +'p', 'e', 'r', 'c', 'e', 'n', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', +'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\020', 'm', 'i', 'n', 'W', 'e', 'i', 'g', 'h', 't', 'P', 'e', +'r', 'c', 'e', 'n', 't', '\032', 'r', '\n', '\022', 'R', 'o', 'u', 'n', 'd', 'R', 'o', 'b', 'i', 'n', 'L', 'b', 'C', 'o', 'n', 'f', +'i', 'g', '\022', '\\', '\n', '\021', 's', 'l', 'o', 'w', '_', 's', 't', 'a', 'r', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', +' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', +'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', +'n', 'f', 'i', 'g', 'R', '\017', 's', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\305', '\002', '\n', +'\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014', +'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o', 'u', 'n', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', +'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', +'\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013', 'c', 'h', 'o', 'i', 'c', 'e', 'C', 'o', 'u', 'n', 't', '\022', 'S', '\n', '\023', 'a', +'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'i', 'a', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', +'#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', +'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\021', 'a', 'c', 't', 'i', 'v', 'e', 'R', 'e', 'q', 'u', 'e', 's', +'t', 'B', 'i', 'a', 's', '\022', '\\', '\n', '\021', 's', 'l', 'o', 'w', '_', 's', 't', 'a', 'r', 't', '_', 'c', 'o', 'n', 'f', 'i', +'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', +'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'S', 'l', 'o', 'w', 'S', 't', 'a', 'r', +'t', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\017', 's', 'l', 'o', 'w', 'S', 't', 'a', 'r', 't', 'C', 'o', 'n', 'f', 'i', 'g', ':', +'0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', +'t', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', +'\221', '\003', '\n', '\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', +'i', 'n', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', +'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', +'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', +'n', 'g', 'S', 'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a', 's', 'h', '_', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', +' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', +'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', +'o', 'n', 'f', 'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', +'\002', '\020', '\001', 'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', +'m', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', +'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', +'\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'a', 'x', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', +'i', 'z', 'e', '\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', +'_', 'H', 'A', 'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M', 'U', 'R', 'M', 'U', 'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', +'\001', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', +'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', +'\002', '\020', '\003', '\032', 'Y', '\n', '\016', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'G', '\n', '\n', +'t', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', +'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', +'\007', '2', '\005', '\030', '\313', '\226', '\261', '\002', 'R', '\t', 't', 'a', 'b', 'l', 'e', 'S', 'i', 'z', 'e', '\032', '\277', '\002', '\n', '\023', 'O', +'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', +'_', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', +'t', 'p', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '(', '\n', '\020', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', +'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\016', 'h', 't', 't', 'p', 'H', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', +'\022', ']', '\n', '\026', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'p', 'o', 'r', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', +'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', +'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '\377', '\377', '\003', 'R', '\024', +'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'P', 'o', 'r', 't', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'F', '\n', '\014', 'm', +'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\004', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', +'.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', +'a', 'K', 'e', 'y', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', +'(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', +'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\325', '\013', '\n', '\016', 'C', 'o', 'm', 'm', +'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', '\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'p', 'a', 'n', +'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', +'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a', 'l', 't', 'h', +'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n', 'e', '_', 'a', +'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A', '.', 'e', 'n', +'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', +'s', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', +'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', +'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', +'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'H', '.', 'e', +'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', +'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', +'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\030', 'l', +'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'I', +'\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g', 'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\004', ' ', '\001', +'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', +'t', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M', 'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C', +'\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_', 'h', 'o', 's', 't', 's', '_', 'u', 'n', 't', 'i', 'l', '_', +'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e', 'N', 'e', 'w', +'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r', 's', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c', 'l', 'o', 's', +'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 's', 'e', 't', +'_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', +'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S', 'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022', '\212', '\001', '\n', +'\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b', '_', 'c', 'o', +'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', +'.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', +'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', +'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', +'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'W', '\n', '\024', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', +'h', 'o', 's', 't', '_', 's', 't', 'a', 't', 'u', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', +'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'S', 't', 'a', +'t', 'u', 's', 'S', 'e', 't', 'R', '\022', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'H', 'o', 's', 't', 'S', 't', 'a', 't', 'u', +'s', '\032', '\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', +'\n', '\017', 'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', +'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', +'o', 'u', 't', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', +'t', 'e', 'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', +'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', +'l', 'u', 's', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022', '1', '\n', '\025', 'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', +'c', '_', 'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', +'f', 'f', 'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', +'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', +'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', +'\n', '\030', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', +'g', ':', 'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', +'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', +'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', +'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', +'\022', '7', '\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', +'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025', 'u', 's', 'e', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', +'H', 'a', 's', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023', 'h', 'a', 's', 'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', +'a', 'c', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', +'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', +'R', '\021', 'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'F', 'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', +'?', '\n', '=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', +'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', +'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', +'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', +'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n', '\031', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', +'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\032', '\322', '\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', +'a', 't', 'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', +'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', +'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '*', '\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', +'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', +'\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', +'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', +'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', +'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', +'\032', '\203', '\002', '\n', '\020', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'x', '\n', '\035', +'p', 'e', 'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', +'a', 't', 'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', +'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', +'\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\032', 'p', 'e', 'r', 'U', 'p', 's', 't', 'r', +'e', 'a', 'm', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\022', 'u', '\n', '\033', 'p', 'r', 'e', +'d', 'i', 'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', +'\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', +'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', +'@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\031', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', 'P', 'r', 'e', +'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\032', 'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', +'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', +'\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', +'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', +'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c', 'o', +'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n', '\006', 'S', 'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n', 'S', +'T', 'R', 'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001', '\022', '\017', '\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D', 'N', +'S', '\020', '\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020', '\003', '\022', '\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', +'D', 'S', 'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O', 'U', +'N', 'D', '_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022', '\021', '\n', '\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U', 'E', +'S', 'T', '\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N', 'G', '_', 'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R', 'A', +'N', 'D', 'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M', 'A', 'G', 'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L', 'U', +'S', 'T', 'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D', 'E', 'D', '\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_', 'B', +'A', 'L', 'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O', 'L', 'I', 'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007', '\"', +'\004', '\010', '\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', 'P', '\n', +'\017', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', +'\000', '\022', '\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L', 'Y', +'\020', '\002', '\022', '\020', '\n', '\014', 'V', '4', '_', 'P', 'R', 'E', 'F', 'E', 'R', 'R', 'E', 'D', '\020', '\003', '\022', '\007', '\n', '\003', 'A', +'L', 'L', '\020', '\004', '\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', +'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', +'_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', +'R', 'E', 'A', 'M', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', +'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', +'u', 's', 't', 'e', 'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', +'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', +'\010', 'J', '\004', '\010', '\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$', 'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', +'_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', +'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\332', '\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', +'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', +'\003', '(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', +'r', '.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', +'P', 'o', 'l', 'i', 'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', '\310', '\001', '\n', '\006', 'P', 'o', 'l', 'i', +'c', 'y', '\022', '`', '\n', '\026', 't', 'y', 'p', 'e', 'd', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'c', 'o', 'n', +'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', +'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', +'f', 'i', 'g', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', +':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', +'d', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', +'\010', '\002', '\020', '\003', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'R', +'\004', 'n', 'a', 'm', 'e', 'R', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', +'\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', +'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\273', '\005', '\n', '\031', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', +'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'G', '\n', '\r', 't', 'c', 'p', '_', 'k', 'e', +'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', +'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'R', +'\014', 't', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\022', 'd', '\n', '0', 's', 'e', 't', '_', 'l', 'o', 'c', 'a', +'l', '_', 'i', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', '_', 'n', 'a', 'm', 'e', '_', 'o', 'n', '_', 'u', 'p', 's', 't', 'r', +'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '\030', '\002', ' ', '\001', '(', '\010', 'R', '*', 's', 'e', +'t', 'L', 'o', 'c', 'a', 'l', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 'N', 'a', 'm', 'e', 'O', 'n', 'U', 'p', 's', 't', +'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '\022', 'z', '\n', '\025', 'h', 'a', 'p', 'p', 'y', '_', +'e', 'y', 'e', 'b', 'a', 'l', 'l', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'F', '.', 'e', +'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'U', 'p', +'s', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', +'a', 'p', 'p', 'y', 'E', 'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'h', 'a', 'p', 'p', 'y', +'E', 'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\211', '\002', '\n', '\023', 'H', 'a', 'p', 'p', 'y', 'E', +'y', 'e', 'b', 'a', 'l', 'l', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\215', '\001', '\n', '\034', 'f', 'i', 'r', 's', 't', '_', 'a', +'d', 'd', 'r', 'e', 's', 's', '_', 'f', 'a', 'm', 'i', 'l', 'y', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', +'(', '\016', '2', 'L', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', +'.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', +'i', 'o', 'n', 's', '.', 'F', 'i', 'r', 's', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', 'V', 'e', +'r', 's', 'i', 'o', 'n', 'R', '\031', 'f', 'i', 'r', 's', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', 'l', 'y', +'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', 'b', '\n', '\032', 'f', 'i', 'r', 's', 't', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', +'f', 'a', 'm', 'i', 'l', 'y', '_', 'c', 'o', 'u', 'n', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', +'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', +'\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\027', 'f', 'i', 'r', 's', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', 'm', 'i', +'l', 'y', 'C', 'o', 'u', 'n', 't', '\"', '8', '\n', '\031', 'F', 'i', 'r', 's', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'F', 'a', +'m', 'i', 'l', 'y', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', +'\006', '\n', '\002', 'V', '4', '\020', '\001', '\022', '\006', '\n', '\002', 'V', '6', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', +'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', +'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\240', '\001', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', +'s', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'', '\n', '\017', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', +'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016', 't', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', +'\022', '4', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z', 'e', +'s', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'S', +'i', 'z', 'e', 's', '\022', ',', '\n', '\022', 'p', 'e', 'r', '_', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't', 'a', 't', +'s', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'e', 'r', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', +'B', '\211', '\001', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', +'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't', 'e', +'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', 'H', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', +'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', +'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', ';', 'c', 'l', +'u', 's', 't', 'e', 'r', 'v', '3', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', }; static _upb_DefPool_Init *deps[25] = { @@ -588,5 +590,5 @@ _upb_DefPool_Init envoy_config_cluster_v3_cluster_proto_upbdefinit = { deps, &envoy_config_cluster_v3_cluster_proto_upb_file_layout, "envoy/config/cluster/v3/cluster.proto", - UPB_STRINGVIEW_INIT(descriptor, 13010) + UPB_STRINGVIEW_INIT(descriptor, 13073) }; diff --git a/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c b/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c index 890cf39466516..3fd2033650711 100644 --- a/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c +++ b/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c @@ -17,7 +17,7 @@ extern _upb_DefPool_Init xds_annotations_v3_status_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_status_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_versioning_proto_upbdefinit; extern _upb_DefPool_Init validate_validate_proto_upbdefinit; -static const char descriptor[2655] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v', +static const char descriptor[3123] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v', '3', '/', 'l', 'o', 'a', 'd', '_', 'r', 'e', 'p', 'o', 'r', 't', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', @@ -30,7 +30,7 @@ static const char descriptor[2655] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', ' 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', -'\"', '\214', '\006', '\n', '\025', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', +'\"', '\305', '\010', '\n', '\025', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', '\022', ':', '\n', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'R', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\022', ':', '\n', '\031', 't', 'o', 't', 'a', 'l', '_', 's', 'u', 'c', 'c', @@ -50,80 +50,98 @@ static const char descriptor[2655] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', ' 'N', 'e', 'w', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '\022', '>', '\n', '\026', 't', 'o', 't', 'a', 'l', '_', 'f', 'a', 'i', 'l', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '\030', '\013', ' ', '\001', '(', '\004', 'B', '\010', '\322', '\306', '\244', '\341', '\006', '\002', '\010', '\001', 'R', '\024', 't', 'o', 't', 'a', 'l', 'F', 'a', 'i', 'l', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', -'o', 'n', 's', '\022', ']', '\n', '\021', 'l', 'o', 'a', 'd', '_', 'm', 'e', 't', 'r', 'i', 'c', '_', 's', 't', 'a', 't', 's', '\030', -'\005', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', -'o', 'i', 'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', -'c', 'S', 't', 'a', 't', 's', 'R', '\017', 'l', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\022', 'g', -'\n', '\027', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't', 'a', 't', 's', -'\030', '\007', ' ', '\003', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', -'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', -'S', 't', 'a', 't', 's', 'R', '\025', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', -'a', 't', 's', '\022', '\032', '\n', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\006', ' ', '\001', '(', '\r', 'R', '\010', 'p', 'r', -'i', 'o', 'r', 'i', 't', 'y', ':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', -'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', -'i', 't', 'y', 'S', 't', 'a', 't', 's', '\"', '\367', '\003', '\n', '\025', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', -'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', '\022', '7', '\n', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ', '\001', '(', -'\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', -'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', -'a', 't', 'a', '\030', '\006', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', -'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', ':', '\n', '\031', 't', 'o', -'t', 'a', 'l', '_', 's', 'u', 'c', 'c', 'e', 's', 's', 'f', 'u', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\002', -' ', '\001', '(', '\004', 'R', '\027', 't', 'o', 't', 'a', 'l', 'S', 'u', 'c', 'c', 'e', 's', 's', 'f', 'u', 'l', 'R', 'e', 'q', 'u', -'e', 's', 't', 's', '\022', ';', '\n', '\032', 't', 'o', 't', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'i', 'n', -'_', 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', '\030', '\003', ' ', '\001', '(', '\004', 'R', '\027', 't', 'o', 't', 'a', 'l', 'R', 'e', 'q', -'u', 'e', 's', 't', 's', 'I', 'n', 'P', 'r', 'o', 'g', 'r', 'e', 's', 's', '\022', '0', '\n', '\024', 't', 'o', 't', 'a', 'l', '_', -'e', 'r', 'r', 'o', 'r', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\004', ' ', '\001', '(', '\004', 'R', '\022', 't', 'o', 't', -'a', 'l', 'E', 'r', 'r', 'o', 'r', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '2', '\n', '\025', 't', 'o', 't', 'a', 'l', '_', -'i', 's', 's', 'u', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\007', ' ', '\001', '(', '\004', 'R', '\023', 't', 'o', -'t', 'a', 'l', 'I', 's', 's', 'u', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', ']', '\n', '\021', 'l', 'o', 'a', 'd', -'_', 'm', 'e', 't', 'r', 'i', 'c', '_', 's', 't', 'a', 't', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', -'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', -'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\017', 'l', 'o', 'a', -'d', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', ':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', -'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', -'m', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', '\"', '\350', '\001', '\n', '\027', 'E', 'n', 'd', 'p', 'o', 'i', -'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\022', '\037', '\n', '\013', 'm', 'e', 't', 'r', -'i', 'c', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\n', 'm', 'e', 't', 'r', 'i', 'c', 'N', 'a', 'm', 'e', -'\022', 'H', '\n', '!', 'n', 'u', 'm', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'f', 'i', 'n', 'i', 's', 'h', 'e', 'd', -'_', 'w', 'i', 't', 'h', '_', 'm', 'e', 't', 'r', 'i', 'c', '\030', '\002', ' ', '\001', '(', '\004', 'R', '\035', 'n', 'u', 'm', 'R', 'e', -'q', 'u', 'e', 's', 't', 's', 'F', 'i', 'n', 'i', 's', 'h', 'e', 'd', 'W', 'i', 't', 'h', 'M', 'e', 't', 'r', 'i', 'c', '\022', -',', '\n', '\022', 't', 'o', 't', 'a', 'l', '_', 'm', 'e', 't', 'r', 'i', 'c', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', -'(', '\001', 'R', '\020', 't', 'o', 't', 'a', 'l', 'M', 'e', 't', 'r', 'i', 'c', 'V', 'a', 'l', 'u', 'e', ':', '4', '\232', '\305', '\210', -'\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', -'.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\"', -'\211', '\005', '\n', '\014', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '*', '\n', '\014', 'c', 'l', 'u', 's', 't', -'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\013', 'c', -'l', 'u', 's', 't', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '0', '\n', '\024', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'e', 'r', -'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\022', 'c', 'l', 'u', 's', 't', 'e', 'r', 'S', -'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', '\022', 'q', '\n', '\027', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'l', 'o', -'c', 'a', 'l', 'i', 't', 'y', '_', 's', 't', 'a', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', -'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'U', 'p', 's', 't', -'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', -'\010', '\001', 'R', '\025', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', -'\022', '4', '\n', '\026', 't', 'o', 't', 'a', 'l', '_', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', -'s', '\030', '\003', ' ', '\001', '(', '\004', 'R', '\024', 't', 'o', 't', 'a', 'l', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', -'e', 's', 't', 's', '\022', 'a', '\n', '\020', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', -'\005', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', -'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '.', 'D', 'r', 'o', 'p', -'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'R', '\017', 'd', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', -'s', 't', 's', '\022', 'K', '\n', '\024', 'l', 'o', 'a', 'd', '_', 'r', 'e', 'p', 'o', 'r', 't', '_', 'i', 'n', 't', 'e', 'r', 'v', -'a', 'l', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', -'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\022', 'l', 'o', 'a', 'd', 'R', 'e', 'p', 'o', 'r', 't', 'I', 'n', 't', -'e', 'r', 'v', 'a', 'l', '\032', '\226', '\001', '\n', '\017', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', -'\022', '#', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', -'\020', '\001', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', '#', '\n', '\r', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'c', -'o', 'u', 'n', 't', '\030', '\002', ' ', '\001', '(', '\004', 'R', '\014', 'd', 'r', 'o', 'p', 'p', 'e', 'd', 'C', 'o', 'u', 'n', 't', ':', -'9', '\232', '\305', '\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', -'o', 'i', 'n', 't', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '.', 'D', 'r', 'o', 'p', 'p', 'e', 'd', -'R', 'e', 'q', 'u', 'e', 's', 't', 's', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', -'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', -'s', 'B', '\217', '\001', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', -'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\017', 'L', 'o', 'a', 'd', -'R', 'e', 'p', 'o', 'r', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', 'J', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', -'/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', -'a', 'n', 'e', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', -'/', 'v', '3', ';', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'v', '3', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', -'r', 'o', 't', 'o', '3', +'o', 'n', 's', '\022', 'a', '\n', '\017', 'c', 'p', 'u', '_', 'u', 't', 'i', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', '\030', '\014', ' ', +'\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', +'n', 't', '.', 'v', '3', '.', 'U', 'n', 'n', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', +'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\016', 'c', 'p', 'u', 'U', 't', 'i', 'l', 'i', 'z', 'a', 't', 'i', +'o', 'n', '\022', 'a', '\n', '\017', 'm', 'e', 'm', '_', 'u', 't', 'i', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', '\030', '\r', ' ', '\001', +'(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', +'t', '.', 'v', '3', '.', 'U', 'n', 'n', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', +'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\016', 'm', 'e', 'm', 'U', 't', 'i', 'l', 'i', 'z', 'a', 't', 'i', 'o', +'n', '\022', 'q', '\n', '\027', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', '_', 'u', 't', 'i', 'l', 'i', 'z', 'a', 't', +'i', 'o', 'n', '\030', '\016', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', +'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'U', 'n', 'n', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', +'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\026', 'a', 'p', 'p', 'l', 'i', 'c', +'a', 't', 'i', 'o', 'n', 'U', 't', 'i', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', '\022', ']', '\n', '\021', 'l', 'o', 'a', 'd', '_', +'m', 'e', 't', 'r', 'i', 'c', '_', 's', 't', 'a', 't', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', +'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', +'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\017', 'l', 'o', 'a', 'd', +'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\022', 'g', '\n', '\027', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', +'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't', 'a', 't', 's', '\030', '\007', ' ', '\003', '(', '\013', '2', '/', '.', 'e', 'n', 'v', +'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'U', 'p', 's', +'t', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', 'R', '\025', 'u', 'p', 's', 't', 'r', +'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', '\022', '\032', '\n', '\010', 'p', 'r', 'i', 'o', 'r', +'i', 't', 'y', '\030', '\006', ' ', '\001', '(', '\r', 'R', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', ':', '2', '\232', '\305', '\210', '\036', +'-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', +'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', '\"', '\367', '\003', '\n', +'\025', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 't', 's', '\022', '7', '\n', +'\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', +'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\007', 'a', 'd', 'd', +'r', 'e', 's', 's', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\006', ' ', '\001', '(', '\013', '2', '\027', '.', +'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\010', 'm', +'e', 't', 'a', 'd', 'a', 't', 'a', '\022', ':', '\n', '\031', 't', 'o', 't', 'a', 'l', '_', 's', 'u', 'c', 'c', 'e', 's', 's', 'f', +'u', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\002', ' ', '\001', '(', '\004', 'R', '\027', 't', 'o', 't', 'a', 'l', 'S', +'u', 'c', 'c', 'e', 's', 's', 'f', 'u', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', ';', '\n', '\032', 't', 'o', 't', 'a', +'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'i', 'n', '_', 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', '\030', '\003', ' ', +'\001', '(', '\004', 'R', '\027', 't', 'o', 't', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'I', 'n', 'P', 'r', 'o', 'g', 'r', +'e', 's', 's', '\022', '0', '\n', '\024', 't', 'o', 't', 'a', 'l', '_', 'e', 'r', 'r', 'o', 'r', '_', 'r', 'e', 'q', 'u', 'e', 's', +'t', 's', '\030', '\004', ' ', '\001', '(', '\004', 'R', '\022', 't', 'o', 't', 'a', 'l', 'E', 'r', 'r', 'o', 'r', 'R', 'e', 'q', 'u', 'e', +'s', 't', 's', '\022', '2', '\n', '\025', 't', 'o', 't', 'a', 'l', '_', 'i', 's', 's', 'u', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', +'s', 't', 's', '\030', '\007', ' ', '\001', '(', '\004', 'R', '\023', 't', 'o', 't', 'a', 'l', 'I', 's', 's', 'u', 'e', 'd', 'R', 'e', 'q', +'u', 'e', 's', 't', 's', '\022', ']', '\n', '\021', 'l', 'o', 'a', 'd', '_', 'm', 'e', 't', 'r', 'i', 'c', '_', 's', 't', 'a', 't', +'s', '\030', '\005', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', +'d', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', +'r', 'i', 'c', 'S', 't', 'a', 't', 's', 'R', '\017', 'l', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', +':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', +'p', 'o', 'i', 'n', 't', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', +'t', 's', '\"', '\350', '\001', '\n', '\027', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', +'S', 't', 'a', 't', 's', '\022', '\037', '\n', '\013', 'm', 'e', 't', 'r', 'i', 'c', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', +'\t', 'R', '\n', 'm', 'e', 't', 'r', 'i', 'c', 'N', 'a', 'm', 'e', '\022', 'H', '\n', '!', 'n', 'u', 'm', '_', 'r', 'e', 'q', 'u', +'e', 's', 't', 's', '_', 'f', 'i', 'n', 'i', 's', 'h', 'e', 'd', '_', 'w', 'i', 't', 'h', '_', 'm', 'e', 't', 'r', 'i', 'c', +'\030', '\002', ' ', '\001', '(', '\004', 'R', '\035', 'n', 'u', 'm', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'F', 'i', 'n', 'i', 's', 'h', +'e', 'd', 'W', 'i', 't', 'h', 'M', 'e', 't', 'r', 'i', 'c', '\022', ',', '\n', '\022', 't', 'o', 't', 'a', 'l', '_', 'm', 'e', 't', +'r', 'i', 'c', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\001', 'R', '\020', 't', 'o', 't', 'a', 'l', 'M', 'e', 't', +'r', 'i', 'c', 'V', 'a', 'l', 'u', 'e', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', +'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', +'d', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\"', '\230', '\001', '\n', '\036', 'U', 'n', 'n', 'a', 'm', 'e', 'd', 'E', +'n', 'd', 'p', 'o', 'i', 'n', 't', 'L', 'o', 'a', 'd', 'M', 'e', 't', 'r', 'i', 'c', 'S', 't', 'a', 't', 's', '\022', 'H', '\n', +'!', 'n', 'u', 'm', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'f', 'i', 'n', 'i', 's', 'h', 'e', 'd', '_', 'w', 'i', +'t', 'h', '_', 'm', 'e', 't', 'r', 'i', 'c', '\030', '\001', ' ', '\001', '(', '\004', 'R', '\035', 'n', 'u', 'm', 'R', 'e', 'q', 'u', 'e', +'s', 't', 's', 'F', 'i', 'n', 'i', 's', 'h', 'e', 'd', 'W', 'i', 't', 'h', 'M', 'e', 't', 'r', 'i', 'c', '\022', ',', '\n', '\022', +'t', 'o', 't', 'a', 'l', '_', 'm', 'e', 't', 'r', 'i', 'c', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\001', 'R', +'\020', 't', 'o', 't', 'a', 'l', 'M', 'e', 't', 'r', 'i', 'c', 'V', 'a', 'l', 'u', 'e', '\"', '\211', '\005', '\n', '\014', 'C', 'l', 'u', +'s', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '*', '\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e', +'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', +'a', 'm', 'e', '\022', '0', '\n', '\024', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', +'m', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\022', 'c', 'l', 'u', 's', 't', 'e', 'r', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'N', +'a', 'm', 'e', '\022', 'q', '\n', '\027', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', +'s', 't', 'a', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', +'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'L', 'o', 'c', +'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\025', 'u', 'p', 's', +'t', 'r', 'e', 'a', 'm', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'S', 't', 'a', 't', 's', '\022', '4', '\n', '\026', 't', 'o', 't', +'a', 'l', '_', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\003', ' ', '\001', '(', '\004', +'R', '\024', 't', 'o', 't', 'a', 'l', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', 'a', '\n', +'\020', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', '6', +'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', +'.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '.', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', +'e', 's', 't', 's', 'R', '\017', 'd', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', 'K', '\n', '\024', +'l', 'o', 'a', 'd', '_', 'r', 'e', 'p', 'o', 'r', 't', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\004', ' ', '\001', '(', +'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', +'i', 'o', 'n', 'R', '\022', 'l', 'o', 'a', 'd', 'R', 'e', 'p', 'o', 'r', 't', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\032', '\226', +'\001', '\n', '\017', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '#', '\n', '\010', 'c', 'a', 't', +'e', 'g', 'o', 'r', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\010', 'c', 'a', 't', +'e', 'g', 'o', 'r', 'y', '\022', '#', '\n', '\r', 'd', 'r', 'o', 'p', 'p', 'e', 'd', '_', 'c', 'o', 'u', 'n', 't', '\030', '\002', ' ', +'\001', '(', '\004', 'R', '\014', 'd', 'r', 'o', 'p', 'p', 'e', 'd', 'C', 'o', 'u', 'n', 't', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', +'2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'C', 'l', +'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '.', 'D', 'r', 'o', 'p', 'p', 'e', 'd', 'R', 'e', 'q', 'u', 'e', 's', 't', +'s', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'e', 'n', +'d', 'p', 'o', 'i', 'n', 't', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', 'B', '\217', '\001', '\n', '&', 'i', +'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', +'.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\017', 'L', 'o', 'a', 'd', 'R', 'e', 'p', 'o', 'r', 't', 'P', +'r', 'o', 't', 'o', 'P', '\001', 'Z', 'J', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', +'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', 'n', 'v', +'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v', '3', ';', 'e', 'n', 'd', +'p', 'o', 'i', 'n', 't', 'v', '3', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', }; static _upb_DefPool_Init *deps[9] = { @@ -142,5 +160,5 @@ _upb_DefPool_Init envoy_config_endpoint_v3_load_report_proto_upbdefinit = { deps, &envoy_config_endpoint_v3_load_report_proto_upb_file_layout, "envoy/config/endpoint/v3/load_report.proto", - UPB_STRINGVIEW_INIT(descriptor, 2655) + UPB_STRINGVIEW_INIT(descriptor, 3123) }; diff --git a/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h b/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h index 5e8cbfd3a042e..f26c2d0ee1d83 100644 --- a/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h +++ b/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h @@ -33,6 +33,11 @@ UPB_INLINE const upb_MessageDef *envoy_config_endpoint_v3_EndpointLoadMetricStat return upb_DefPool_FindMessageByName(s, "envoy.config.endpoint.v3.EndpointLoadMetricStats"); } +UPB_INLINE const upb_MessageDef *envoy_config_endpoint_v3_UnnamedEndpointLoadMetricStats_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &envoy_config_endpoint_v3_load_report_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "envoy.config.endpoint.v3.UnnamedEndpointLoadMetricStats"); +} + UPB_INLINE const upb_MessageDef *envoy_config_endpoint_v3_ClusterStats_getmsgdef(upb_DefPool *s) { _upb_DefPool_LoadDefInit(s, &envoy_config_endpoint_v3_load_report_proto_upbdefinit); return upb_DefPool_FindMessageByName(s, "envoy.config.endpoint.v3.ClusterStats"); diff --git a/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c b/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c index dc1736c01e65d..75b33079d2e07 100644 --- a/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c +++ b/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c @@ -9,37 +9,47 @@ #include "envoy/config/trace/v3/datadog.upbdefs.h" #include "envoy/config/trace/v3/datadog.upb_minitable.h" +extern _upb_DefPool_Init google_protobuf_duration_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_migrate_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_status_proto_upbdefinit; extern _upb_DefPool_Init udpa_annotations_versioning_proto_upbdefinit; extern _upb_DefPool_Init validate_validate_proto_upbdefinit; -static const char descriptor[580] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'd', +static const char descriptor[786] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'd', 'a', 't', 'a', 'd', 'o', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', -'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', -'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', -'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', -'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', -'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', -'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\314', '\001', '\n', '\r', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'C', 'o', 'n', 'f', 'i', +'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', +'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', +'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', +'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', +'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', +'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', +'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '[', '\n', '\023', 'D', 'a', 't', 'a', 'd', 'o', +'g', 'R', 'e', 'm', 'o', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'D', '\n', '\020', 'p', 'o', 'l', 'l', 'i', 'n', 'g', '_', +'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', +'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\017', 'p', 'o', 'l', 'l', 'i', 'n', 'g', +'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\"', '\235', '\002', '\n', '\r', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '4', '\n', '\021', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 'r', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\020', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 'r', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', '*', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', '\022', '-', '\n', '\022', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 'r', '_', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '\030', '\003', ' ', '\001', -'(', '\t', 'R', '\021', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 'r', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', ':', '*', '\232', '\305', -'\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', -'2', '.', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\263', '\001', '\n', '#', 'i', 'o', '.', 'e', 'n', -'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', -'c', 'e', '.', 'v', '3', 'B', '\014', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', 'D', 'g', 'i', -'t', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', -'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', -'t', 'r', 'a', 'c', 'e', '/', 'v', '3', ';', 't', 'r', 'a', 'c', 'e', 'v', '3', '\362', '\230', '\376', '\217', '\005', '*', '\022', '(', 'e', -'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'c', 'e', 'r', 's', '.', 'd', -'a', 't', 'a', 'd', 'o', 'g', '.', 'v', '4', 'a', 'l', 'p', 'h', 'a', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', -'r', 'o', 't', 'o', '3', +'(', '\t', 'R', '\021', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 'r', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', '\022', 'O', '\n', '\r', +'r', 'e', 'm', 'o', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', +'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'd', 'o', +'g', 'R', 'e', 'm', 'o', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\014', 'r', 'e', 'm', 'o', 't', 'e', 'C', 'o', 'n', 'f', +'i', 'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', +'r', 'a', 'c', 'e', '.', 'v', '2', '.', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\263', '\001', '\n', +'#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', +'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', 'B', '\014', 'D', 'a', 't', 'a', 'd', 'o', 'g', 'P', 'r', 'o', 't', 'o', +'P', '\001', 'Z', 'D', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', +'/', 'g', 'o', '-', 'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', +'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', ';', 't', 'r', 'a', 'c', 'e', 'v', '3', '\362', '\230', '\376', +'\217', '\005', '*', '\022', '(', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', +'c', 'e', 'r', 's', '.', 'd', 'a', 't', 'a', 'd', 'o', 'g', '.', 'v', '4', 'a', 'l', 'p', 'h', 'a', '\272', '\200', '\310', '\321', '\006', +'\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', }; -static _upb_DefPool_Init *deps[5] = { +static _upb_DefPool_Init *deps[6] = { + &google_protobuf_duration_proto_upbdefinit, &udpa_annotations_migrate_proto_upbdefinit, &udpa_annotations_status_proto_upbdefinit, &udpa_annotations_versioning_proto_upbdefinit, @@ -51,5 +61,5 @@ _upb_DefPool_Init envoy_config_trace_v3_datadog_proto_upbdefinit = { deps, &envoy_config_trace_v3_datadog_proto_upb_file_layout, "envoy/config/trace/v3/datadog.proto", - UPB_STRINGVIEW_INIT(descriptor, 580) + UPB_STRINGVIEW_INIT(descriptor, 786) }; diff --git a/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h b/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h index 4515edd1bb85e..5d8bc2f4d92e6 100644 --- a/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h +++ b/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h @@ -18,6 +18,11 @@ extern "C" { extern _upb_DefPool_Init envoy_config_trace_v3_datadog_proto_upbdefinit; +UPB_INLINE const upb_MessageDef *envoy_config_trace_v3_DatadogRemoteConfig_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &envoy_config_trace_v3_datadog_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "envoy.config.trace.v3.DatadogRemoteConfig"); +} + UPB_INLINE const upb_MessageDef *envoy_config_trace_v3_DatadogConfig_getmsgdef(upb_DefPool *s) { _upb_DefPool_LoadDefInit(s, &envoy_config_trace_v3_datadog_proto_upbdefinit); return upb_DefPool_FindMessageByName(s, "envoy.config.trace.v3.DatadogConfig"); diff --git a/src/core/handshaker/handshaker.cc b/src/core/handshaker/handshaker.cc index 66824008fd7ea..9e48b1ff8eab4 100644 --- a/src/core/handshaker/handshaker.cc +++ b/src/core/handshaker/handshaker.cc @@ -139,17 +139,14 @@ void HandshakeManager::DoHandshake( void HandshakeManager::Shutdown(absl::Status error) { MutexLock lock(&mu_); if (!is_shutdown_) { - if (GRPC_TRACE_FLAG_ENABLED(handshaker)) { - LOG(INFO) << "handshake_manager " << this - << ": Shutdown() called: " << error; - } + GRPC_TRACE_LOG(handshaker, INFO) + << "handshake_manager " << this << ": Shutdown() called: " << error; is_shutdown_ = true; // Shutdown the handshaker that's currently in progress, if any. if (index_ > 0) { - if (GRPC_TRACE_FLAG_ENABLED(handshaker)) { - LOG(INFO) << "handshake_manager " << this - << ": shutting down handshaker at index " << index_ - 1; - } + GRPC_TRACE_LOG(handshaker, INFO) + << "handshake_manager " << this + << ": shutting down handshaker at index " << index_ - 1; handshakers_[index_ - 1]->Shutdown(std::move(error)); } } diff --git a/src/core/handshaker/http_connect/http_connect_handshaker.cc b/src/core/handshaker/http_connect/http_connect_handshaker.cc index 0868190ef651e..2260224d10dd1 100644 --- a/src/core/handshaker/http_connect/http_connect_handshaker.cc +++ b/src/core/handshaker/http_connect/http_connect_handshaker.cc @@ -296,8 +296,8 @@ void HttpConnectHandshaker::DoHandshake( // Log connection via proxy. std::string proxy_name(grpc_endpoint_get_peer(args->endpoint.get())); std::string server_name_string(*server_name); - LOG(INFO) << "Connecting to server " << server_name_string - << " via HTTP proxy " << proxy_name; + VLOG(2) << "Connecting to server " << server_name_string << " via HTTP proxy " + << proxy_name; // Construct HTTP CONNECT request. grpc_http_request request; request.method = const_cast("CONNECT"); diff --git a/src/core/handshaker/http_connect/http_proxy_mapper.cc b/src/core/handshaker/http_connect/http_proxy_mapper.cc index 9de72aa1d92a6..93c8e2fe8ebfd 100644 --- a/src/core/handshaker/http_connect/http_proxy_mapper.cc +++ b/src/core/handshaker/http_connect/http_proxy_mapper.cc @@ -217,12 +217,11 @@ absl::optional HttpProxyMapper::MapName( return absl::nullopt; } if (uri->scheme() == "unix") { - LOG(INFO) << "not using proxy for Unix domain socket '" << server_uri - << "'"; + VLOG(2) << "not using proxy for Unix domain socket '" << server_uri << "'"; return absl::nullopt; } if (uri->scheme() == "vsock") { - LOG(INFO) << "not using proxy for VSock '" << server_uri << "'"; + VLOG(2) << "not using proxy for VSock '" << server_uri << "'"; return absl::nullopt; } // Prefer using 'no_grpc_proxy'. Fallback on 'no_proxy' if it is not set. @@ -235,17 +234,17 @@ absl::optional HttpProxyMapper::MapName( std::string server_port; if (!SplitHostPort(absl::StripPrefix(uri->path(), "/"), &server_host, &server_port)) { - LOG(INFO) << "unable to split host and port, not checking no_proxy list " - "for host '" - << server_uri << "'"; + VLOG(2) << "unable to split host and port, not checking no_proxy list " + "for host '" + << server_uri << "'"; } else { auto address = StringToSockaddr(server_host, 0); if (AddressIncluded(address.ok() ? absl::optional(*address) : absl::nullopt, server_host, *no_proxy_str)) { - LOG(INFO) << "not using proxy for host in no_proxy list '" << server_uri - << "'"; + VLOG(2) << "not using proxy for host in no_proxy list '" << server_uri + << "'"; return absl::nullopt; } } diff --git a/src/core/handshaker/security/secure_endpoint.cc b/src/core/handshaker/security/secure_endpoint.cc index 8210ff57d74be..0c5380124679a 100644 --- a/src/core/handshaker/security/secure_endpoint.cc +++ b/src/core/handshaker/security/secure_endpoint.cc @@ -108,7 +108,6 @@ struct secure_endpoint : public grpc_endpoint { } ~secure_endpoint() { - memory_owner.Reset(); tsi_frame_protector_destroy(protector); tsi_zero_copy_grpc_protector_destroy(zero_copy_protector); grpc_slice_buffer_destroy(&source_buffer); @@ -380,13 +379,17 @@ static void flush_write_staging_buffer(secure_endpoint* ep, uint8_t** cur, static void on_write(void* user_data, grpc_error_handle error) { secure_endpoint* ep = static_cast(user_data); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, std::exchange(ep->write_cb, nullptr), - std::move(error)); + grpc_closure* cb = ep->write_cb; + ep->write_cb = nullptr; SECURE_ENDPOINT_UNREF(ep, "write"); + grpc_core::EnsureRunInExecCtx([cb, error = std::move(error)]() { + grpc_core::Closure::Run(DEBUG_LOCATION, cb, error); + }); } static void endpoint_write(grpc_endpoint* secure_ep, grpc_slice_buffer* slices, grpc_closure* cb, void* arg, int max_frame_size) { + GRPC_LATENT_SEE_INNER_SCOPE("secure_endpoint write"); unsigned i; tsi_result result = TSI_OK; secure_endpoint* ep = reinterpret_cast(secure_ep); @@ -504,6 +507,7 @@ static void endpoint_write(grpc_endpoint* secure_ep, grpc_slice_buffer* slices, static void endpoint_destroy(grpc_endpoint* secure_ep) { secure_endpoint* ep = reinterpret_cast(secure_ep); ep->wrapped_ep.reset(); + ep->memory_owner.Reset(); SECURE_ENDPOINT_UNREF(ep, "destroy"); } diff --git a/src/core/handshaker/security/security_handshaker.cc b/src/core/handshaker/security/security_handshaker.cc index 58c9a16eaeebd..ad3df9b94eff8 100644 --- a/src/core/handshaker/security/security_handshaker.cc +++ b/src/core/handshaker/security/security_handshaker.cc @@ -88,27 +88,27 @@ class SecurityHandshaker : public Handshaker { private: grpc_error_handle DoHandshakerNextLocked(const unsigned char* bytes_received, - size_t bytes_received_size); + size_t bytes_received_size) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); grpc_error_handle OnHandshakeNextDoneLocked( tsi_result result, const unsigned char* bytes_to_send, - size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result); - void HandshakeFailedLocked(absl::Status error); + size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + void HandshakeFailedLocked(absl::Status error) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); void Finish(absl::Status status); void OnHandshakeDataReceivedFromPeerFn(absl::Status error); void OnHandshakeDataSentToPeerFn(absl::Status error); - static void OnHandshakeDataReceivedFromPeerFnScheduler( - void* arg, grpc_error_handle error); - static void OnHandshakeDataSentToPeerFnScheduler(void* arg, - grpc_error_handle error); + void OnHandshakeDataReceivedFromPeerFnScheduler(grpc_error_handle error); + void OnHandshakeDataSentToPeerFnScheduler(grpc_error_handle error); static void OnHandshakeNextDoneGrpcWrapper( tsi_result result, void* user_data, const unsigned char* bytes_to_send, size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result); - static void OnPeerCheckedFn(void* arg, grpc_error_handle error); - void OnPeerCheckedInner(grpc_error_handle error); + void OnPeerCheckedFn(grpc_error_handle error); size_t MoveReadBufferIntoHandshakeBuffer(); - grpc_error_handle CheckPeerLocked(); + grpc_error_handle CheckPeerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); // State set at creation time. tsi_handshaker* handshaker_; @@ -125,13 +125,11 @@ class SecurityHandshaker : public Handshaker { size_t handshake_buffer_size_; unsigned char* handshake_buffer_; SliceBuffer outgoing_; - grpc_closure on_handshake_data_sent_to_peer_; - grpc_closure on_handshake_data_received_from_peer_; - grpc_closure on_peer_checked_; RefCountedPtr auth_context_; tsi_handshaker_result* handshaker_result_ = nullptr; size_t max_frame_size_ = 0; std::string tsi_handshake_error_; + grpc_closure* on_peer_checked_ ABSL_GUARDED_BY(mu_) = nullptr; }; SecurityHandshaker::SecurityHandshaker(tsi_handshaker* handshaker, @@ -143,10 +141,7 @@ SecurityHandshaker::SecurityHandshaker(tsi_handshaker* handshaker, handshake_buffer_( static_cast(gpr_malloc(handshake_buffer_size_))), max_frame_size_( - std::max(0, args.GetInt(GRPC_ARG_TSI_MAX_FRAME_SIZE).value_or(0))) { - GRPC_CLOSURE_INIT(&on_peer_checked_, &SecurityHandshaker::OnPeerCheckedFn, - this, grpc_schedule_on_exec_ctx); -} + std::max(0, args.GetInt(GRPC_ARG_TSI_MAX_FRAME_SIZE).value_or(0))) {} SecurityHandshaker::~SecurityHandshaker() { tsi_handshaker_destroy(handshaker_); @@ -220,8 +215,9 @@ MakeChannelzSecurityFromAuthContext(grpc_auth_context* auth_context) { } // namespace -void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) { +void SecurityHandshaker::OnPeerCheckedFn(grpc_error_handle error) { MutexLock lock(&mu_); + on_peer_checked_ = nullptr; if (!error.ok() || is_shutdown_) { HandshakeFailedLocked(error); return; @@ -317,11 +313,6 @@ void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) { Finish(absl::OkStatus()); } -void SecurityHandshaker::OnPeerCheckedFn(void* arg, grpc_error_handle error) { - RefCountedPtr(static_cast(arg)) - ->OnPeerCheckedInner(error); -} - grpc_error_handle SecurityHandshaker::CheckPeerLocked() { tsi_peer peer; tsi_result result = @@ -330,8 +321,12 @@ grpc_error_handle SecurityHandshaker::CheckPeerLocked() { return GRPC_ERROR_CREATE(absl::StrCat("Peer extraction failed (", tsi_result_to_string(result), ")")); } + on_peer_checked_ = NewClosure( + [self = RefAsSubclass()](absl::Status status) { + self->OnPeerCheckedFn(std::move(status)); + }); connector_->check_peer(peer, args_->endpoint.get(), args_->args, - &auth_context_, &on_peer_checked_); + &auth_context_, on_peer_checked_); grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name( auth_context_.get(), GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME); const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it); @@ -356,10 +351,10 @@ grpc_error_handle SecurityHandshaker::OnHandshakeNextDoneLocked( CHECK_EQ(bytes_to_send_size, 0u); grpc_endpoint_read( args_->endpoint.get(), args_->read_buffer.c_slice_buffer(), - GRPC_CLOSURE_INIT( - &on_handshake_data_received_from_peer_, - &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler, - this, grpc_schedule_on_exec_ctx), + NewClosure([self = RefAsSubclass()]( + absl::Status status) { + self->OnHandshakeDataReceivedFromPeerFnScheduler(std::move(status)); + }), /*urgent=*/true, /*min_progress_size=*/1); return error; } @@ -387,19 +382,19 @@ grpc_error_handle SecurityHandshaker::OnHandshakeNextDoneLocked( reinterpret_cast(bytes_to_send), bytes_to_send_size)); grpc_endpoint_write( args_->endpoint.get(), outgoing_.c_slice_buffer(), - GRPC_CLOSURE_INIT( - &on_handshake_data_sent_to_peer_, - &SecurityHandshaker::OnHandshakeDataSentToPeerFnScheduler, this, - grpc_schedule_on_exec_ctx), + NewClosure( + [self = RefAsSubclass()](absl::Status status) { + self->OnHandshakeDataSentToPeerFnScheduler(std::move(status)); + }), nullptr, /*max_frame_size=*/INT_MAX); } else if (handshaker_result == nullptr) { // There is nothing to send, but need to read from peer. grpc_endpoint_read( args_->endpoint.get(), args_->read_buffer.c_slice_buffer(), - GRPC_CLOSURE_INIT( - &on_handshake_data_received_from_peer_, - &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler, - this, grpc_schedule_on_exec_ctx), + NewClosure([self = RefAsSubclass()]( + absl::Status status) { + self->OnHandshakeDataReceivedFromPeerFnScheduler(std::move(status)); + }), /*urgent=*/true, /*min_progress_size=*/1); } else { // Handshake has finished, check peer and so on. @@ -418,8 +413,6 @@ void SecurityHandshaker::OnHandshakeNextDoneGrpcWrapper( result, bytes_to_send, bytes_to_send_size, handshaker_result); if (!error.ok()) { h->HandshakeFailedLocked(std::move(error)); - } else { - h.release(); // Avoid unref } } @@ -429,13 +422,15 @@ grpc_error_handle SecurityHandshaker::DoHandshakerNextLocked( const unsigned char* bytes_to_send = nullptr; size_t bytes_to_send_size = 0; tsi_handshaker_result* hs_result = nullptr; + auto self = RefAsSubclass(); tsi_result result = tsi_handshaker_next( handshaker_, bytes_received, bytes_received_size, &bytes_to_send, - &bytes_to_send_size, &hs_result, &OnHandshakeNextDoneGrpcWrapper, this, - &tsi_handshake_error_); + &bytes_to_send_size, &hs_result, &OnHandshakeNextDoneGrpcWrapper, + self.get(), &tsi_handshake_error_); if (result == TSI_ASYNC) { - // Handshaker operating asynchronously. Nothing else to do here; - // callback will be invoked in a TSI thread. + // Handshaker operating asynchronously. Callback will be invoked in a TSI + // thread. We no longer own the ref held in self. + self.release(); return absl::OkStatus(); } // Handshaker returned synchronously. Invoke callback directly in @@ -449,18 +444,18 @@ grpc_error_handle SecurityHandshaker::DoHandshakerNextLocked( // TODO(roth): This will no longer be necessary once we migrate to the // EventEngine endpoint API. void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler( - void* arg, grpc_error_handle error) { - SecurityHandshaker* handshaker = static_cast(arg); - handshaker->args_->event_engine->Run( - [handshaker, error = std::move(error)]() mutable { - ApplicationCallbackExecCtx callback_exec_ctx; - ExecCtx exec_ctx; - handshaker->OnHandshakeDataReceivedFromPeerFn(std::move(error)); - }); + grpc_error_handle error) { + args_->event_engine->Run([self = RefAsSubclass(), + error = std::move(error)]() mutable { + ApplicationCallbackExecCtx callback_exec_ctx; + ExecCtx exec_ctx; + self->OnHandshakeDataReceivedFromPeerFn(std::move(error)); + // Avoid destruction outside of an ExecCtx (since this is non-cancelable). + self.reset(); + }); } void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn(absl::Status error) { - RefCountedPtr handshaker(this); MutexLock lock(&mu_); if (!error.ok() || is_shutdown_) { HandshakeFailedLocked( @@ -473,8 +468,6 @@ void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn(absl::Status error) { error = DoHandshakerNextLocked(handshake_buffer_, bytes_received_size); if (!error.ok()) { HandshakeFailedLocked(std::move(error)); - } else { - handshaker.release(); // Avoid unref } } @@ -483,18 +476,18 @@ void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn(absl::Status error) { // TODO(roth): This will no longer be necessary once we migrate to the // EventEngine endpoint API. void SecurityHandshaker::OnHandshakeDataSentToPeerFnScheduler( - void* arg, grpc_error_handle error) { - SecurityHandshaker* handshaker = static_cast(arg); - handshaker->args_->event_engine->Run( - [handshaker, error = std::move(error)]() mutable { - ApplicationCallbackExecCtx callback_exec_ctx; - ExecCtx exec_ctx; - handshaker->OnHandshakeDataSentToPeerFn(std::move(error)); - }); + grpc_error_handle error) { + args_->event_engine->Run([self = RefAsSubclass(), + error = std::move(error)]() mutable { + ApplicationCallbackExecCtx callback_exec_ctx; + ExecCtx exec_ctx; + self->OnHandshakeDataSentToPeerFn(std::move(error)); + // Avoid destruction outside of an ExecCtx (since this is non-cancelable). + self.reset(); + }); } void SecurityHandshaker::OnHandshakeDataSentToPeerFn(absl::Status error) { - RefCountedPtr handshaker(this); MutexLock lock(&mu_); if (!error.ok() || is_shutdown_) { HandshakeFailedLocked( @@ -505,10 +498,10 @@ void SecurityHandshaker::OnHandshakeDataSentToPeerFn(absl::Status error) { if (handshaker_result_ == nullptr) { grpc_endpoint_read( args_->endpoint.get(), args_->read_buffer.c_slice_buffer(), - GRPC_CLOSURE_INIT( - &on_handshake_data_received_from_peer_, - &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler, - this, grpc_schedule_on_exec_ctx), + NewClosure([self = RefAsSubclass()]( + absl::Status status) { + self->OnHandshakeDataReceivedFromPeerFnScheduler(std::move(status)); + }), /*urgent=*/true, /*min_progress_size=*/1); } else { error = CheckPeerLocked(); @@ -517,7 +510,6 @@ void SecurityHandshaker::OnHandshakeDataSentToPeerFn(absl::Status error) { return; } } - handshaker.release(); // Avoid unref } // @@ -528,7 +520,7 @@ void SecurityHandshaker::Shutdown(grpc_error_handle error) { MutexLock lock(&mu_); if (!is_shutdown_) { is_shutdown_ = true; - connector_->cancel_check_peer(&on_peer_checked_, std::move(error)); + connector_->cancel_check_peer(on_peer_checked_, std::move(error)); tsi_handshaker_shutdown(handshaker_); args_->endpoint.reset(); } @@ -537,7 +529,6 @@ void SecurityHandshaker::Shutdown(grpc_error_handle error) { void SecurityHandshaker::DoHandshake( HandshakerArgs* args, absl::AnyInvocable on_handshake_done) { - auto ref = Ref(); MutexLock lock(&mu_); args_ = args; on_handshake_done_ = std::move(on_handshake_done); @@ -546,8 +537,6 @@ void SecurityHandshaker::DoHandshake( DoHandshakerNextLocked(handshake_buffer_, bytes_received_size); if (!error.ok()) { HandshakeFailedLocked(error); - } else { - ref.release(); // Avoid unref } } diff --git a/src/core/lib/channel/promise_based_filter.cc b/src/core/lib/channel/promise_based_filter.cc index a5c2bed786c04..6af8436b1871d 100644 --- a/src/core/lib/channel/promise_based_filter.cc +++ b/src/core/lib/channel/promise_based_filter.cc @@ -207,10 +207,8 @@ void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) { uintptr_t& refcnt = *RefCountField(batch); if (refcnt == 0) { // refcnt==0 ==> cancelled - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << releaser->call()->DebugTag() - << "RESUME BATCH REQUEST CANCELLED"; - } + GRPC_TRACE_LOG(channel, INFO) + << releaser->call()->DebugTag() << "RESUME BATCH REQUEST CANCELLED"; return; } if (--refcnt == 0) { @@ -244,7 +242,10 @@ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error, /////////////////////////////////////////////////////////////////////////////// // BaseCallData::Flusher -BaseCallData::Flusher::Flusher(BaseCallData* call) : call_(call) { +BaseCallData::Flusher::Flusher(BaseCallData* call) + : latent_see::InnerScope( + GRPC_LATENT_SEE_METADATA("PromiseBasedFilter Flusher")), + call_(call) { GRPC_CALL_STACK_REF(call_->call_stack(), "flusher"); } @@ -263,10 +264,9 @@ BaseCallData::Flusher::~Flusher() { auto* batch = static_cast(p); BaseCallData* call = static_cast(batch->handler_private.extra_arg); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << "FLUSHER:forward batch via closure: " - << grpc_transport_stream_op_batch_string(batch, false); - } + GRPC_TRACE_LOG(channel, INFO) + << "FLUSHER:forward batch via closure: " + << grpc_transport_stream_op_batch_string(batch, false); grpc_call_next_op(call->elem(), batch); GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch"); }; @@ -275,10 +275,9 @@ BaseCallData::Flusher::~Flusher() { if (call_->call() != nullptr && call_->call()->traced()) { batch->is_traced = true; } - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << "FLUSHER:queue batch to forward in closure: " - << grpc_transport_stream_op_batch_string(release_[i], false); - } + GRPC_TRACE_LOG(channel, INFO) + << "FLUSHER:queue batch to forward in closure: " + << grpc_transport_stream_op_batch_string(release_[i], false); batch->handler_private.extra_arg = call_; GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch, nullptr); @@ -287,10 +286,9 @@ BaseCallData::Flusher::~Flusher() { "flusher_batch"); } call_closures_.RunClosuresWithoutYielding(call_->call_combiner()); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << "FLUSHER:forward batch: " - << grpc_transport_stream_op_batch_string(release_[0], false); - } + GRPC_TRACE_LOG(channel, INFO) + << "FLUSHER:forward batch: " + << grpc_transport_stream_op_batch_string(release_[0], false); if (call_->call() != nullptr && call_->call()->traced()) { release_[0]->is_traced = true; } @@ -328,10 +326,8 @@ const char* BaseCallData::SendMessage::StateString(State state) { } void BaseCallData::SendMessage::StartOp(CapturedBatch batch) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " SendMessage.StartOp st=" << StateString(state_); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() << " SendMessage.StartOp st=" << StateString(state_); switch (state_) { case State::kInitial: state_ = State::kGotBatchNoPipe; @@ -356,10 +352,8 @@ void BaseCallData::SendMessage::StartOp(CapturedBatch batch) { template void BaseCallData::SendMessage::GotPipe(T* pipe_end) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " SendMessage.GotPipe st=" << StateString(state_); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() << " SendMessage.GotPipe st=" << StateString(state_); CHECK_NE(pipe_end, nullptr); switch (state_) { case State::kInitial: @@ -404,11 +398,9 @@ bool BaseCallData::SendMessage::IsIdle() const { void BaseCallData::SendMessage::OnComplete(absl::Status status) { Flusher flusher(base_); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " SendMessage.OnComplete st=" << StateString(state_) - << " status=" << status; - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() << " SendMessage.OnComplete st=" << StateString(state_) + << " status=" << status; switch (state_) { case State::kInitial: case State::kIdle: @@ -435,11 +427,9 @@ void BaseCallData::SendMessage::OnComplete(absl::Status status) { void BaseCallData::SendMessage::Done(const ServerMetadata& metadata, Flusher* flusher) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " SendMessage.Done st=" << StateString(state_) - << " md=" << metadata.DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() << " SendMessage.Done st=" << StateString(state_) + << " md=" << metadata.DebugString(); switch (state_) { case State::kCancelled: case State::kCancelledButNotYetPolled: @@ -612,10 +602,9 @@ const char* BaseCallData::ReceiveMessage::StateString(State state) { } void BaseCallData::ReceiveMessage::StartOp(CapturedBatch& batch) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.StartOp st=" << StateString(state_); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() + << " ReceiveMessage.StartOp st=" << StateString(state_); switch (state_) { case State::kInitial: state_ = State::kForwardedBatchNoPipe; @@ -653,10 +642,9 @@ void BaseCallData::ReceiveMessage::StartOp(CapturedBatch& batch) { template void BaseCallData::ReceiveMessage::GotPipe(T* pipe_end) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.GotPipe st=" << StateString(state_); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() + << " ReceiveMessage.GotPipe st=" << StateString(state_); switch (state_) { case State::kInitial: state_ = State::kIdle; @@ -689,11 +677,10 @@ void BaseCallData::ReceiveMessage::GotPipe(T* pipe_end) { } void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.OnComplete st=" << StateString(state_) - << " status=" << status; - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() + << " ReceiveMessage.OnComplete st=" << StateString(state_) + << " status=" << status; switch (state_) { case State::kInitial: case State::kIdle: @@ -730,11 +717,9 @@ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) { void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata, Flusher* flusher) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.Done st=" << StateString(state_) - << " md=" << metadata.DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() << " ReceiveMessage.Done st=" << StateString(state_) + << " md=" << metadata.DebugString(); switch (state_) { case State::kInitial: state_ = State::kCancelled; @@ -850,11 +835,10 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher, CHECK(push_.has_value()); auto r_push = (*push_)(); if (auto* p = r_push.value_if_ready()) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.WakeInsideCombiner push complete: " - << (*p ? "true" : "false"); - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() + << " ReceiveMessage.WakeInsideCombiner push complete: " + << (*p ? "true" : "false"); // We haven't pulled through yet, so this certainly shouldn't succeed. CHECK(!*p); state_ = State::kCancelled; @@ -898,10 +882,9 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher, case State::kPulledFromPipe: { CHECK(push_.has_value()); if ((*push_)().ready()) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << base_->LogTag() - << " ReceiveMessage.WakeInsideCombiner push complete"; - } + GRPC_TRACE_LOG(channel, INFO) + << base_->LogTag() + << " ReceiveMessage.WakeInsideCombiner push complete"; if (state_ == State::kCompletedWhilePulledFromPipe) { interceptor()->Push()->Close(); state_ = State::kCancelled; @@ -1013,10 +996,9 @@ class ClientCallData::PollContext { void Run() { DCHECK(HasContext()); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << self_->LogTag() << " ClientCallData.PollContext.Run " - << self_->DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << self_->LogTag() << " ClientCallData.PollContext.Run " + << self_->DebugString(); CHECK(have_scoped_activity_); repoll_ = false; if (self_->send_message() != nullptr) { @@ -1376,9 +1358,7 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) { CapturedBatch batch(b); Flusher flusher(this); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " StartBatch " << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) << LogTag() << " StartBatch " << DebugString(); // If this is a cancel stream, cancel anything we have pending and propagate // the cancellation. @@ -1499,9 +1479,8 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) { // Handle cancellation. void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " Cancel error=" << error.ToString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << " Cancel error=" << error.ToString(); // Track the latest reason for cancellation. cancelled_error_ = error; // Stop running the promise. @@ -1578,11 +1557,10 @@ void ClientCallData::StartPromise(Flusher* flusher) { } void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " ClientCallData.RecvInitialMetadataReady " - << DebugString() << " error:" << error.ToString() - << " md:" << recv_initial_metadata_->metadata->DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << " ClientCallData.RecvInitialMetadataReady " + << DebugString() << " error:" << error.ToString() + << " md:" << recv_initial_metadata_->metadata->DebugString(); ScopedContext context(this); Flusher flusher(this); if (!error.ok()) { @@ -1661,10 +1639,8 @@ void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) { // - return a wrapper around PollTrailingMetadata as the promise. ArenaPromise ClientCallData::MakeNextPromise( CallArgs call_args) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " ClientCallData.MakeNextPromise " - << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << " ClientCallData.MakeNextPromise " << DebugString(); CHECK_NE(poll_ctx_, nullptr); CHECK(send_initial_state_ == SendInitialState::kQueued); send_initial_metadata_batch_->payload->send_initial_metadata @@ -1724,10 +1700,8 @@ ArenaPromise ClientCallData::MakeNextPromise( // All polls: await receiving the trailing metadata, then return it to the // application. Poll ClientCallData::PollTrailingMetadata() { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " ClientCallData.PollTrailingMetadata " - << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << " ClientCallData.PollTrailingMetadata " << DebugString(); CHECK_NE(poll_ctx_, nullptr); if (send_initial_state_ == SendInitialState::kQueued) { // First poll: pass the send_initial_metadata op down the stack. @@ -1988,9 +1962,8 @@ ServerCallData::ServerCallData(grpc_call_element* elem, } ServerCallData::~ServerCallData() { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " ~ServerCallData " << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << " ~ServerCallData " << DebugString(); if (send_initial_metadata_ != nullptr) { send_initial_metadata_->~SendInitialMetadata(); } @@ -2015,9 +1988,7 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) { Flusher flusher(this); bool wake = false; - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << " StartBatch: " << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) << LogTag() << " StartBatch: " << DebugString(); // If this is a cancel stream, cancel anything we have pending and // propagate the cancellation. @@ -2272,10 +2243,9 @@ ArenaPromise ServerCallData::MakeNextPromise( // All polls: await sending the trailing metadata, then foward it down the // stack. Poll ServerCallData::PollTrailingMetadata() { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() - << " PollTrailingMetadata: " << StateString(send_trailing_state_); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() + << " PollTrailingMetadata: " << StateString(send_trailing_state_); switch (send_trailing_state_) { case SendTrailingState::kInitial: case SendTrailingState::kQueuedBehindSendMessage: @@ -2303,10 +2273,9 @@ void ServerCallData::RecvTrailingMetadataReadyCallback( } void ServerCallData::RecvTrailingMetadataReady(grpc_error_handle error) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << ": RecvTrailingMetadataReady error=" << error - << " md=" << recv_trailing_metadata_->DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << ": RecvTrailingMetadataReady error=" << error + << " md=" << recv_trailing_metadata_->DebugString(); Flusher flusher(this); PollContext poll_ctx(this, &flusher); Completed(error, recv_trailing_metadata_->get(GrpcTarPit()).has_value(), @@ -2322,9 +2291,8 @@ void ServerCallData::RecvInitialMetadataReadyCallback(void* arg, void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) { Flusher flusher(this); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << ": RecvInitialMetadataReady " << error; - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << ": RecvInitialMetadataReady " << error; CHECK(recv_initial_state_ == RecvInitialState::kForwarded); // If there was an error we just propagate that through if (!error.ok()) { @@ -2386,9 +2354,8 @@ std::string ServerCallData::DebugString() const { // Wakeup and poll the promise if appropriate. void ServerCallData::WakeInsideCombiner(Flusher* flusher) { PollContext poll_ctx(this, flusher); - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << ": WakeInsideCombiner " << DebugString(); - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << ": WakeInsideCombiner " << DebugString(); poll_ctx.ClearRepoll(); if (send_initial_metadata_ != nullptr) { if (send_initial_metadata_->state == @@ -2408,12 +2375,12 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) { } if (send_initial_metadata_->metadata_push_.has_value()) { if ((*send_initial_metadata_->metadata_push_)().ready()) { - if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << ": WakeInsideCombiner: metadata_push done"; - } + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << ": WakeInsideCombiner: metadata_push done"; send_initial_metadata_->metadata_push_.reset(); - } else if (GRPC_TRACE_FLAG_ENABLED(channel)) { - LOG(INFO) << LogTag() << ": WakeInsideCombiner: metadata_push pending"; + } else { + GRPC_TRACE_LOG(channel, INFO) + << LogTag() << ": WakeInsideCombiner: metadata_push pending"; } } } diff --git a/src/core/lib/channel/promise_based_filter.h b/src/core/lib/channel/promise_based_filter.h index 1600697024307..3c9c64dbaa8e4 100644 --- a/src/core/lib/channel/promise_based_filter.h +++ b/src/core/lib/channel/promise_based_filter.h @@ -947,7 +947,7 @@ class BaseCallData : public Activity, private Wakeable { } }; - class Flusher { + class Flusher : public latent_see::InnerScope { public: explicit Flusher(BaseCallData* call); // Calls closures, schedules batches, relinquishes call combiner. diff --git a/src/core/lib/compression/compression.cc b/src/core/lib/compression/compression.cc index d3aa8878466c0..018e92a379aa9 100644 --- a/src/core/lib/compression/compression.cc +++ b/src/core/lib/compression/compression.cc @@ -29,7 +29,6 @@ #include "src/core/lib/compression/compression_internal.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/util/useful.h" int grpc_compression_algorithm_is_message(grpc_compression_algorithm) { @@ -54,8 +53,9 @@ int grpc_compression_algorithm_parse(grpc_slice name, int grpc_compression_algorithm_name(grpc_compression_algorithm algorithm, const char** name) { - GRPC_API_TRACE("grpc_compression_algorithm_name(algorithm=%d, name=%p)", 2, - ((int)algorithm, name)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_compression_algorithm_name(algorithm=" << (int)algorithm + << ", name=" << name << ")"; const char* result = grpc_core::CompressionAlgorithmAsString(algorithm); if (result != nullptr) { *name = result; diff --git a/src/core/lib/compression/message_compress.cc b/src/core/lib/compression/message_compress.cc index e26369ad276b4..9fb7a7956ac62 100644 --- a/src/core/lib/compression/message_compress.cc +++ b/src/core/lib/compression/message_compress.cc @@ -62,17 +62,17 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, } r = flate(zs, flush); if (r < 0 && r != Z_BUF_ERROR /* not fatal */) { - LOG(INFO) << "zlib error (" << r << ")"; + VLOG(2) << "zlib error (" << r << ")"; goto error; } } while (zs->avail_out == 0); if (zs->avail_in) { - LOG(INFO) << "zlib: not all input consumed"; + VLOG(2) << "zlib: not all input consumed"; goto error; } } if (r != Z_STREAM_END) { - LOG(INFO) << "zlib: Data error"; + VLOG(2) << "zlib: Data error"; goto error; } diff --git a/src/core/lib/event_engine/ares_resolver.cc b/src/core/lib/event_engine/ares_resolver.cc index a02f11b3f3c3f..00f50c27157df 100644 --- a/src/core/lib/event_engine/ares_resolver.cc +++ b/src/core/lib/event_engine/ares_resolver.cc @@ -84,6 +84,11 @@ namespace experimental { namespace { +// A hard limit on the number of records (A/AAAA or SRV) we may get from a +// single response. This is to be defensive to prevent a bad DNS response from +// OOMing the process. +constexpr int kMaxRecordSize = 65536; + absl::Status AresStatusToAbslStatus(int status, absl::string_view error_msg) { switch (status) { case ARES_ECANCELLED: @@ -92,6 +97,8 @@ absl::Status AresStatusToAbslStatus(int status, absl::string_view error_msg) { return absl::UnimplementedError(error_msg); case ARES_ENOTFOUND: return absl::NotFoundError(error_msg); + case ARES_ECONNREFUSED: + return absl::UnavailableError(error_msg); default: return absl::UnknownError(error_msg); } @@ -596,6 +603,10 @@ void AresResolver::OnHostbynameDoneLocked(void* arg, int status, "resolver:%p OnHostbynameDoneLocked name=%s ARES_SUCCESS", ares_resolver, hostname_qa->query_name.c_str()); for (size_t i = 0; hostent->h_addr_list[i] != nullptr; i++) { + if (hostname_qa->result.size() == kMaxRecordSize) { + LOG(ERROR) << "A/AAAA response exceeds maximum record size of 65536"; + break; + } switch (hostent->h_addrtype) { case AF_INET6: { size_t addr_len = sizeof(struct sockaddr_in6); @@ -704,6 +715,10 @@ void AresResolver::OnSRVQueryDoneLocked(void* arg, int status, int /*timeouts*/, std::vector result; for (struct ares_srv_reply* srv_it = reply; srv_it != nullptr; srv_it = srv_it->next) { + if (result.size() == kMaxRecordSize) { + LOG(ERROR) << "SRV response exceeds maximum record size of 65536"; + break; + } EventEngine::DNSResolver::SRVRecord record; record.host = srv_it->host; record.port = srv_it->port; diff --git a/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc b/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc index 337a5bc5a2fc2..47e67d8e4a48f 100644 --- a/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +++ b/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc @@ -331,6 +331,10 @@ void CFStreamEndpointImpl::DoWrite( size_t total_written_size = 0; for (size_t i = 0; i < data->Count(); i++) { auto slice = data->RefSlice(i); + if (slice.size() == 0) { + continue; + } + size_t written_size = CFWriteStreamWrite(cf_write_stream_, slice.begin(), slice.size()); diff --git a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc index c990fe4023377..402822e27edd1 100644 --- a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +++ b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc @@ -358,7 +358,7 @@ Epoll1Poller::Epoll1Poller(Scheduler* scheduler) CHECK_GE(g_epoll_set_.epfd, 0); GRPC_TRACE_LOG(event_engine_poller, INFO) << "grpc epoll fd: " << g_epoll_set_.epfd; - struct epoll_event ev; + struct epoll_event ev {}; ev.events = static_cast(EPOLLIN | EPOLLET); ev.data.ptr = wakeup_fd_.get(); CHECK(epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, wakeup_fd_->ReadFd(), diff --git a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h index 0bd86a7296b85..ed6b480bdeb55 100644 --- a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +++ b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h @@ -102,17 +102,17 @@ class Epoll1Poller : public PosixEventPoller { friend class Epoll1EventHandle; #ifdef GRPC_LINUX_EPOLL struct EpollSet { - int epfd; + int epfd = -1; // The epoll_events after the last call to epoll_wait() - struct epoll_event events[MAX_EPOLL_EVENTS]; + struct epoll_event events[MAX_EPOLL_EVENTS]{}; // The number of epoll_events after the last call to epoll_wait() - int num_events; + int num_events = 0; // Index of the first event in epoll_events that has to be processed. This // field is only valid if num_events > 0 - int cursor; + int cursor = 0; }; #else struct EpollSet {}; diff --git a/src/core/lib/event_engine/posix_engine/posix_endpoint.cc b/src/core/lib/event_engine/posix_engine/posix_endpoint.cc index b4c0c37688a40..41fcc89a8b841 100644 --- a/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +++ b/src/core/lib/event_engine/posix_engine/posix_endpoint.cc @@ -102,6 +102,7 @@ namespace { // of bytes sent. ssize_t TcpSend(int fd, const struct msghdr* msg, int* saved_errno, int additional_flags = 0) { + GRPC_LATENT_SEE_INNER_SCOPE("TcpSend"); ssize_t sent_length; do { sent_length = sendmsg(fd, msg, SENDMSG_FLAGS | additional_flags); @@ -286,6 +287,8 @@ absl::Status PosixEndpointImpl::TcpAnnotateError(absl::Status src_error) const { // Returns true if data available to read or error other than EAGAIN. bool PosixEndpointImpl::TcpDoRead(absl::Status& status) { + GRPC_LATENT_SEE_INNER_SCOPE("TcpDoRead"); + struct msghdr msg; struct iovec iov[MAX_READ_IOVEC]; ssize_t read_bytes; @@ -1297,9 +1300,9 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle, } if (zerocopy_enabled) { - LOG(INFO) << "Tx-zero copy enabled for gRPC sends. RLIMIT_MEMLOCK value " - << "=" << GetRLimitMemLockMax() - << ",ulimit hard memlock value = " << GetUlimitHardMemLock(); + VLOG(2) << "Tx-zero copy enabled for gRPC sends. RLIMIT_MEMLOCK value " + << "=" << GetRLimitMemLockMax() + << ",ulimit hard memlock value = " << GetUlimitHardMemLock(); } } #endif // GRPC_LINUX_ERRQUEUE diff --git a/src/core/lib/event_engine/posix_engine/posix_endpoint.h b/src/core/lib/event_engine/posix_engine/posix_endpoint.h index 3e919857d2857..0c42a5467c0fb 100644 --- a/src/core/lib/event_engine/posix_engine/posix_endpoint.h +++ b/src/core/lib/event_engine/posix_engine/posix_endpoint.h @@ -184,7 +184,7 @@ class TcpZerocopySendCtx { if (send_records_ == nullptr || free_send_records_ == nullptr) { gpr_free(send_records_); gpr_free(free_send_records_); - LOG(INFO) << "Disabling TCP TX zerocopy due to memory pressure.\n"; + VLOG(2) << "Disabling TCP TX zerocopy due to memory pressure.\n"; memory_limited_ = true; enabled_ = false; } else { diff --git a/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc b/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc index 0f47a2610283b..7aa624fc3cb93 100644 --- a/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +++ b/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc @@ -345,14 +345,14 @@ absl::StatusOr ListenerContainerAddWildcardAddresses( } if (assigned_port > 0) { if (!v6_sock.ok()) { - LOG(INFO) << "Failed to add :: listener, the environment may not support " - "IPv6: " - << v6_sock.status(); + VLOG(2) << "Failed to add :: listener, the environment may not support " + "IPv6: " + << v6_sock.status(); } if (!v4_sock.ok()) { - LOG(INFO) << "Failed to add 0.0.0.0 listener, " - "the environment may not support IPv4: " - << v4_sock.status(); + VLOG(2) << "Failed to add 0.0.0.0 listener, " + "the environment may not support IPv4: " + << v4_sock.status(); } return assigned_port; } else { diff --git a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc index e9edb0b1b944b..ae193ff2beba0 100644 --- a/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +++ b/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc @@ -636,8 +636,9 @@ void PosixSocketWrapper::TrySetSocketTcpUserTimeout( if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) { // This log is intentionally not protected behind a flag, so that users // know that TCP_USER_TIMEOUT is not being used. - LOG(INFO) << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT " - "won't be used thereafter"; + GRPC_TRACE_LOG(tcp, INFO) + << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT " + "won't be used thereafter"; g_socket_supports_tcp_user_timeout.store(-1); } else { GRPC_TRACE_LOG(tcp, INFO) @@ -691,7 +692,8 @@ bool PosixSocketWrapper::IsIpv6LoopbackAvailable() { int fd = socket(AF_INET6, SOCK_STREAM, 0); bool loopback_available = false; if (fd < 0) { - LOG(INFO) << "Disabling AF_INET6 sockets because socket() failed."; + GRPC_TRACE_LOG(tcp, INFO) + << "Disabling AF_INET6 sockets because socket() failed."; } else { sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); @@ -700,7 +702,8 @@ bool PosixSocketWrapper::IsIpv6LoopbackAvailable() { if (bind(fd, reinterpret_cast(&addr), sizeof(addr)) == 0) { loopback_available = true; } else { - LOG(INFO) << "Disabling AF_INET6 sockets because ::1 is not available."; + GRPC_TRACE_LOG(tcp, INFO) + << "Disabling AF_INET6 sockets because ::1 is not available."; } close(fd); } diff --git a/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc b/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc index b7ccaed956ccb..57c664f67bd99 100644 --- a/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +++ b/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc @@ -317,7 +317,8 @@ bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsQuiesced() { } void WorkStealingThreadPool::WorkStealingThreadPoolImpl::PrepareFork() { - LOG(INFO) << "WorkStealingThreadPoolImpl::PrepareFork"; + GRPC_TRACE_LOG(event_engine, INFO) + << "WorkStealingThreadPoolImpl::PrepareFork"; SetForking(true); work_signal_.SignalAll(); auto threads_were_shut_down = living_thread_count_.BlockUntilThreadCount( diff --git a/src/core/lib/event_engine/windows/win_socket.cc b/src/core/lib/event_engine/windows/win_socket.cc index ef1a0f0e46a70..8c18b09ae42b0 100644 --- a/src/core/lib/event_engine/windows/win_socket.cc +++ b/src/core/lib/event_engine/windows/win_socket.cc @@ -71,7 +71,8 @@ void WinSocket::Shutdown() { &ioctl_num_bytes, NULL, NULL); if (status != 0) { char* utf8_message = gpr_format_message(WSAGetLastError()); - LOG(INFO) << "Unable to retrieve DisconnectEx pointer : " << utf8_message; + GRPC_TRACE_LOG(event_engine_endpoint, INFO) + << "Unable to retrieve DisconnectEx pointer : " << utf8_message; gpr_free(utf8_message); } else if (DisconnectEx(socket_, NULL, 0, 0) == FALSE) { auto last_error = WSAGetLastError(); @@ -79,7 +80,8 @@ void WinSocket::Shutdown() { // error, and log all others. if (last_error != WSAENOTCONN) { char* utf8_message = gpr_format_message(last_error); - LOG(INFO) << "DisconnectEx failed: " << utf8_message; + GRPC_TRACE_LOG(event_engine_endpoint, INFO) + << "DisconnectEx failed: " << utf8_message; gpr_free(utf8_message); } } diff --git a/src/core/lib/event_engine/windows/windows_endpoint.cc b/src/core/lib/event_engine/windows/windows_endpoint.cc index d991d04675d59..d3bda779dd33e 100644 --- a/src/core/lib/event_engine/windows/windows_endpoint.cc +++ b/src/core/lib/event_engine/windows/windows_endpoint.cc @@ -42,7 +42,8 @@ constexpr int kMaxWSABUFCount = 16; void DumpSliceBuffer(SliceBuffer* buffer, absl::string_view context_string) { for (size_t i = 0; i < buffer->Count(); i++) { auto str = buffer->MutableSliceAt(i).as_string_view(); - LOG(INFO) << context_string << ": " << str; + GRPC_TRACE_LOG(event_engine_endpoint, INFO) + << context_string << ": " << str; } } @@ -160,8 +161,9 @@ bool WindowsEndpoint::Write(absl::AnyInvocable on_writable, if (GRPC_TRACE_FLAG_ENABLED(event_engine_endpoint_data)) { for (size_t i = 0; i < data->Count(); i++) { auto str = data->RefSlice(i).as_string_view(); - LOG(INFO) << "WindowsEndpoint::" << this - << " WRITE (peer=" << peer_address_string_ << "): " << str; + GRPC_TRACE_LOG(event_engine_endpoint, INFO) + << "WindowsEndpoint::" << this + << " WRITE (peer=" << peer_address_string_ << "): " << str; } } CHECK(data->Count() <= UINT_MAX); diff --git a/src/core/lib/experiments/config.cc b/src/core/lib/experiments/config.cc index 1f169f1f6efcf..ac1cf8838603d 100644 --- a/src/core/lib/experiments/config.cc +++ b/src/core/lib/experiments/config.cc @@ -220,6 +220,11 @@ bool IsTestExperimentEnabled(size_t experiment_id) { return (*g_test_experiments)[experiment_id]; } +// This is VLOG(2) for Open Source gRPC because of a lot of log noise +// complaints. However, internally we want LOG(INFO) so that it is easier for us +// to debug prod issues. +#define GRPC_EXPERIMENT_LOG VLOG(2) + void PrintExperimentsList() { std::map experiment_status; std::set defaulted_on_experiments; @@ -254,20 +259,20 @@ void PrintExperimentsList() { } if (experiment_status.empty()) { if (!defaulted_on_experiments.empty()) { - LOG(INFO) << "gRPC experiments enabled: " - << absl::StrJoin(defaulted_on_experiments, ", "); + GRPC_EXPERIMENT_LOG << "gRPC experiments enabled: " + << absl::StrJoin(defaulted_on_experiments, ", "); } } else { if (defaulted_on_experiments.empty()) { - LOG(INFO) << "gRPC experiments: " - << absl::StrJoin(experiment_status, ", ", - absl::PairFormatter(":")); + GRPC_EXPERIMENT_LOG << "gRPC experiments: " + << absl::StrJoin(experiment_status, ", ", + absl::PairFormatter(":")); } else { - LOG(INFO) << "gRPC experiments: " - << absl::StrJoin(experiment_status, ", ", - absl::PairFormatter(":")) - << "; default-enabled: " - << absl::StrJoin(defaulted_on_experiments, ", "); + GRPC_EXPERIMENT_LOG << "gRPC experiments: " + << absl::StrJoin(experiment_status, ", ", + absl::PairFormatter(":")) + << "; default-enabled: " + << absl::StrJoin(defaulted_on_experiments, ", "); } } } diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index 7413beb4c31d0..70847ae2ffd45 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -72,10 +72,6 @@ const char* const additional_constraints_pick_first_new = "{}"; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_rstpit = - "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " - "duration"; -const char* const additional_constraints_rstpit = "{}"; const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = @@ -147,8 +143,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, - false, true}, {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, @@ -227,10 +221,6 @@ const char* const additional_constraints_pick_first_new = "{}"; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_rstpit = - "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " - "duration"; -const char* const additional_constraints_rstpit = "{}"; const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = @@ -302,8 +292,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, - false, true}, {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, @@ -382,10 +370,6 @@ const char* const additional_constraints_pick_first_new = "{}"; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_rstpit = - "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " - "duration"; -const char* const additional_constraints_rstpit = "{}"; const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = @@ -457,8 +441,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, - false, true}, {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index fac6b6395b310..6eecb5179ea6d 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -76,7 +76,6 @@ inline bool IsPeerStateBasedFramingEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } -inline bool IsRstpitEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } @@ -111,7 +110,6 @@ inline bool IsPeerStateBasedFramingEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } -inline bool IsRstpitEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } @@ -145,7 +143,6 @@ inline bool IsPeerStateBasedFramingEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } -inline bool IsRstpitEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } @@ -175,7 +172,6 @@ enum ExperimentIds { kExperimentIdPeerStateBasedFraming, kExperimentIdPickFirstNew, kExperimentIdPromiseBasedInprocTransport, - kExperimentIdRstpit, kExperimentIdScheduleCancellationOverWrite, kExperimentIdServerPrivacy, kExperimentIdTcpFrameSizeTuning, @@ -246,10 +242,6 @@ inline bool IsPickFirstNewEnabled() { inline bool IsPromiseBasedInprocTransportEnabled() { return IsExperimentEnabled(); } -#define GRPC_EXPERIMENT_IS_INCLUDED_RSTPIT -inline bool IsRstpitEnabled() { - return IsExperimentEnabled(); -} #define GRPC_EXPERIMENT_IS_INCLUDED_SCHEDULE_CANCELLATION_OVER_WRITE inline bool IsScheduleCancellationOverWriteEnabled() { return IsExperimentEnabled(); diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index ce324025302ea..f93ddd8590dfa 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -55,14 +55,14 @@ - name: canary_client_privacy description: If set, canary client privacy - expiry: 2024/08/01 + expiry: 2024/12/01 owner: alishananda@google.com test_tags: [] allow_in_fuzzing_config: false - name: client_privacy description: If set, client privacy - expiry: 2024/08/01 + expiry: 2024/12/01 owner: alishananda@google.com test_tags: [] allow_in_fuzzing_config: false @@ -88,7 +88,7 @@ uses_polling: true - name: free_large_allocator description: If set, return all free bytes from a "big" allocator - expiry: 2024/08/01 + expiry: 2024/12/01 owner: alishananda@google.com test_tags: [resource_quota_test] - name: local_connector_secure @@ -135,12 +135,6 @@ owner: ctiller@google.com test_tags: [] allow_in_fuzzing_config: false # experiment currently crashes if enabled -- name: rstpit - description: - On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short duration - expiry: 2024/08/03 - owner: ctiller@google.com - test_tags: [flow_control_test] - name: schedule_cancellation_over_write description: Allow cancellation op to be scheduled over a write expiry: 2024/08/01 @@ -149,7 +143,7 @@ - name: server_privacy description: If set, server privacy - expiry: 2024/08/01 + expiry: 2024/12/01 owner: alishananda@google.com test_tags: [] allow_in_fuzzing_config: false diff --git a/src/core/lib/gprpp/bitset.h b/src/core/lib/gprpp/bitset.h index ea941b0e10bd4..c224bd257d541 100644 --- a/src/core/lib/gprpp/bitset.h +++ b/src/core/lib/gprpp/bitset.h @@ -138,7 +138,7 @@ class BitSet { uint32_t count() const { uint32_t count = 0; for (size_t i = 0; i < kUnits; i++) { - count += BitCount(units_[i]); + count += absl::popcount(units_[i]); } return count; } diff --git a/src/core/lib/gprpp/dual_ref_counted.h b/src/core/lib/gprpp/dual_ref_counted.h index 3f714e5765701..2d5ed351889ba 100644 --- a/src/core/lib/gprpp/dual_ref_counted.h +++ b/src/core/lib/gprpp/dual_ref_counted.h @@ -93,9 +93,9 @@ class DualRefCounted : public Impl { #ifndef NDEBUG const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " unref " << strong_refs << " -> " - << strong_refs - 1 << ", weak_ref " << weak_refs << " -> " - << weak_refs + 1; + VLOG(2) << trace_ << ":" << this << " unref " << strong_refs << " -> " + << strong_refs - 1 << ", weak_ref " << weak_refs << " -> " + << weak_refs + 1; } CHECK_GT(strong_refs, 0u); #endif @@ -112,10 +112,10 @@ class DualRefCounted : public Impl { #ifndef NDEBUG const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":" - << location.line() << " unref " << strong_refs << " -> " - << strong_refs - 1 << ", weak_ref " << weak_refs << " -> " - << weak_refs + 1 << ") " << reason; + VLOG(2) << trace_ << ":" << this << " " << location.file() << ":" + << location.line() << " unref " << strong_refs << " -> " + << strong_refs - 1 << ", weak_ref " << weak_refs << " -> " + << weak_refs + 1 << ") " << reason; } CHECK_GT(strong_refs, 0u); #else @@ -137,9 +137,9 @@ class DualRefCounted : public Impl { #ifndef NDEBUG const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " ref_if_non_zero " << strong_refs - << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs - << ")"; + VLOG(2) << trace_ << ":" << this << " ref_if_non_zero " << strong_refs + << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs + << ")"; } #endif if (strong_refs == 0) return nullptr; @@ -156,10 +156,10 @@ class DualRefCounted : public Impl { #ifndef NDEBUG const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":" - << location.line() << " ref_if_non_zero " << strong_refs - << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs - << ") " << reason; + VLOG(2) << trace_ << ":" << this << " " << location.file() << ":" + << location.line() << " ref_if_non_zero " << strong_refs + << " -> " << strong_refs + 1 << " (weak_refs=" << weak_refs + << ") " << reason; } #else // Avoid unused-parameter warnings for debug-only parameters @@ -214,8 +214,8 @@ class DualRefCounted : public Impl { const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); const uint32_t strong_refs = GetStrongRefs(prev_ref_pair); if (trace != nullptr) { - LOG(INFO) << trace << ":" << this << " weak_unref " << weak_refs << " -> " - << weak_refs - 1 << " (refs=" << strong_refs << ")"; + VLOG(2) << trace << ":" << this << " weak_unref " << weak_refs << " -> " + << weak_refs - 1 << " (refs=" << strong_refs << ")"; } CHECK_GT(weak_refs, 0u); #endif @@ -236,9 +236,9 @@ class DualRefCounted : public Impl { const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); const uint32_t strong_refs = GetStrongRefs(prev_ref_pair); if (trace != nullptr) { - LOG(INFO) << trace << ":" << this << " " << location.file() << ":" - << location.line() << " weak_unref " << weak_refs << " -> " - << weak_refs - 1 << " (refs=" << strong_refs << ") " << reason; + VLOG(2) << trace << ":" << this << " " << location.file() << ":" + << location.line() << " weak_unref " << weak_refs << " -> " + << weak_refs - 1 << " (refs=" << strong_refs << ") " << reason; } CHECK_GT(weak_refs, 0u); #else @@ -301,8 +301,8 @@ class DualRefCounted : public Impl { const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); CHECK_NE(strong_refs, 0u); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " ref " << strong_refs << " -> " - << strong_refs + 1 << "; (weak_refs=" << weak_refs << ")"; + VLOG(2) << trace_ << ":" << this << " ref " << strong_refs << " -> " + << strong_refs + 1 << "; (weak_refs=" << weak_refs << ")"; } #else refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed); @@ -316,10 +316,10 @@ class DualRefCounted : public Impl { const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); CHECK_NE(strong_refs, 0u); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":" - << location.line() << " ref " << strong_refs << " -> " - << strong_refs + 1 << " (weak_refs=" << weak_refs << ") " - << reason; + VLOG(2) << trace_ << ":" << this << " " << location.file() << ":" + << location.line() << " ref " << strong_refs << " -> " + << strong_refs + 1 << " (weak_refs=" << weak_refs << ") " + << reason; } #else // Use conditionally-important parameters @@ -336,8 +336,8 @@ class DualRefCounted : public Impl { const uint32_t strong_refs = GetStrongRefs(prev_ref_pair); const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " weak_ref " << weak_refs << " -> " - << weak_refs + 1 << "; (refs=" << strong_refs << ")"; + VLOG(2) << trace_ << ":" << this << " weak_ref " << weak_refs << " -> " + << weak_refs + 1 << "; (refs=" << strong_refs << ")"; } if (strong_refs == 0) CHECK_NE(weak_refs, 0u); #else @@ -352,9 +352,9 @@ class DualRefCounted : public Impl { const uint32_t strong_refs = GetStrongRefs(prev_ref_pair); const uint32_t weak_refs = GetWeakRefs(prev_ref_pair); if (trace_ != nullptr) { - LOG(INFO) << trace_ << ":" << this << " " << location.file() << ":" - << location.line() << " weak_ref " << weak_refs << " -> " - << weak_refs + 1 << " (refs=" << strong_refs << ") " << reason; + VLOG(2) << trace_ << ":" << this << " " << location.file() << ":" + << location.line() << " weak_ref " << weak_refs << " -> " + << weak_refs + 1 << " (refs=" << strong_refs << ") " << reason; } if (strong_refs == 0) CHECK_NE(weak_refs, 0u); #else diff --git a/src/core/lib/gprpp/table.h b/src/core/lib/gprpp/table.h index 8c6bc978543c4..7085bae0357dc 100644 --- a/src/core/lib/gprpp/table.h +++ b/src/core/lib/gprpp/table.h @@ -35,20 +35,28 @@ namespace grpc_core { namespace table_detail { // A tuple-like type that contains manually constructed elements. -template +template struct Elements; template -struct Elements : Elements { - union U { - U() {} - ~U() {} - GPR_NO_UNIQUE_ADDRESS T x; +struct Elements::value>, T, Ts...> + : Elements { + struct alignas(T) Data { + unsigned char bytes[sizeof(T)]; }; - U u; + Data x; + Elements() {} + T* ptr() { return reinterpret_cast(x.bytes); } + const T* ptr() const { return reinterpret_cast(x.bytes); } +}; +template +struct Elements::value>, T, Ts...> + : Elements { + T* ptr() { return reinterpret_cast(this); } + const T* ptr() const { return reinterpret_cast(this); } }; template <> -struct Elements<> {}; +struct Elements {}; // Element accessor for Elements<> // Provides a static method f that returns a pointer to the value of element I @@ -58,17 +66,17 @@ struct GetElem; template struct GetElem<0, T, Ts...> { - static T* f(Elements* e) { return &e->u.x; } - static const T* f(const Elements* e) { return &e->u.x; } + static T* f(Elements* e) { return e->ptr(); } + static const T* f(const Elements* e) { return e->ptr(); } }; template struct GetElem { - static auto f(Elements* e) + static auto f(Elements* e) -> decltype(GetElem::f(e)) { return GetElem::f(e); } - static auto f(const Elements* e) + static auto f(const Elements* e) -> decltype(GetElem::f(e)) { return GetElem::f(e); } @@ -326,6 +334,15 @@ class Table { absl::index_sequence()...>()); } + // Iterate through each set field in the table if it exists in Vs, in the + // order of Vs. For each existing field, call the filter function. If the + // function returns true, keep the field. Otherwise, remove the field. + template + void FilterIn(F f) { + FilterInImpl(std::move(f), + absl::index_sequence()...>()); + } + // Count the number of set fields in the table size_t count() const { return present_bits_.count(); } @@ -340,7 +357,7 @@ class Table { // the default) -- one bit for each type in Ts. using PresentBits = BitSet; // The tuple-like backing structure for Table. - using Elements = table_detail::Elements; + using Elements = table_detail::Elements; // Extractor from Elements template using GetElem = table_detail::GetElem; @@ -407,6 +424,18 @@ class Table { } } + // Call (*f)(value) if that value is in the table. + // If the value is present in the table and (*f)(value) returns false, remove + // the value from the table. + template + void FilterIf(F* f) { + if (auto* p = get()) { + if (!(*f)(*p)) { + clear(); + } + } + } + // For each field (element I=0, 1, ...) if that field is present, call its // destructor. template @@ -436,15 +465,22 @@ class Table { table_detail::do_these_things({(CallIf(&f), 1)...}); } + // For each field (element I=0, 1, ...) if that field is present, call f. If + // f returns false, remove the field from the table. + template + void FilterInImpl(F f, absl::index_sequence) { + table_detail::do_these_things({(FilterIf(&f), 1)...}); + } + template void ClearAllImpl(absl::index_sequence) { table_detail::do_these_things({(clear(), 1)...}); } // Bit field indicating which elements are set. - GPR_NO_UNIQUE_ADDRESS PresentBits present_bits_; + PresentBits present_bits_; // The memory to store the elements themselves. - GPR_NO_UNIQUE_ADDRESS Elements elements_; + Elements elements_; }; } // namespace grpc_core diff --git a/src/core/lib/gprpp/work_serializer.cc b/src/core/lib/gprpp/work_serializer.cc index 105aac28a1fe8..16ed3fd6e68f1 100644 --- a/src/core/lib/gprpp/work_serializer.cc +++ b/src/core/lib/gprpp/work_serializer.cc @@ -136,10 +136,9 @@ class WorkSerializer::LegacyWorkSerializer final : public WorkSerializerImpl { void WorkSerializer::LegacyWorkSerializer::Run(std::function callback, const DebugLocation& location) { - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer::Run() " << this << " Scheduling callback [" - << location.file() << ":" << location.line() << "]"; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer::Run() " << this << " Scheduling callback [" + << location.file() << ":" << location.line() << "]"; // Increment queue size for the new callback and owner count to attempt to // take ownership of the WorkSerializer. const uint64_t prev_ref_pair = @@ -162,9 +161,8 @@ void WorkSerializer::LegacyWorkSerializer::Run(std::function callback, refs_.fetch_sub(MakeRefPair(1, 0), std::memory_order_acq_rel); CallbackWrapper* cb_wrapper = new CallbackWrapper(std::move(callback), location); - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << " Scheduling on queue : item " << cb_wrapper; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << " Scheduling on queue : item " << cb_wrapper; queue_.Push(&cb_wrapper->mpscq_node); } } @@ -173,19 +171,15 @@ void WorkSerializer::LegacyWorkSerializer::Schedule( std::function callback, const DebugLocation& location) { CallbackWrapper* cb_wrapper = new CallbackWrapper(std::move(callback), location); - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer::Schedule() " << this - << " Scheduling callback " << cb_wrapper << " [" - << location.file() << ":" << location.line() << "]"; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer::Schedule() " << this << " Scheduling callback " + << cb_wrapper << " [" << location.file() << ":" << location.line() << "]"; refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_acq_rel); queue_.Push(&cb_wrapper->mpscq_node); } void WorkSerializer::LegacyWorkSerializer::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer::Orphan() " << this; - } + GRPC_TRACE_LOG(work_serializer, INFO) << "WorkSerializer::Orphan() " << this; const uint64_t prev_ref_pair = refs_.fetch_sub(MakeRefPair(0, 1), std::memory_order_acq_rel); if (GetOwners(prev_ref_pair) == 0 && GetSize(prev_ref_pair) == 1) { @@ -197,9 +191,8 @@ void WorkSerializer::LegacyWorkSerializer::Orphan() { // The thread that calls this loans itself to the work serializer so as to // execute all the scheduled callbacks. void WorkSerializer::LegacyWorkSerializer::DrainQueue() { - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer::DrainQueue() " << this; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer::DrainQueue() " << this; // Attempt to take ownership of the WorkSerializer. Also increment the queue // size as required by `DrainQueueOwned()`. const uint64_t prev_ref_pair = @@ -218,9 +211,8 @@ void WorkSerializer::LegacyWorkSerializer::DrainQueue() { } void WorkSerializer::LegacyWorkSerializer::DrainQueueOwned() { - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer::DrainQueueOwned() " << this; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer::DrainQueueOwned() " << this; while (true) { auto prev_ref_pair = refs_.fetch_sub(MakeRefPair(0, 1)); // It is possible that while draining the queue, the last callback ended @@ -265,11 +257,10 @@ void WorkSerializer::LegacyWorkSerializer::DrainQueueOwned() { GRPC_TRACE_LOG(work_serializer, INFO) << " Queue returned nullptr, trying again"; } - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << " Running item " << cb_wrapper - << " : callback scheduled at [" << cb_wrapper->location.file() - << ":" << cb_wrapper->location.line() << "]"; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << " Running item " << cb_wrapper << " : callback scheduled at [" + << cb_wrapper->location.file() << ":" << cb_wrapper->location.line() + << "]"; cb_wrapper->callback(); delete cb_wrapper; } @@ -405,10 +396,9 @@ void WorkSerializer::DispatchingWorkSerializer::Orphan() { // Implementation of WorkSerializerImpl::Run void WorkSerializer::DispatchingWorkSerializer::Run( std::function callback, const DebugLocation& location) { - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer[" << this << "] Scheduling callback [" - << location.file() << ":" << location.line() << "]"; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer[" << this << "] Scheduling callback [" + << location.file() << ":" << location.line() << "]"; global_stats().IncrementWorkSerializerItemsEnqueued(); MutexLock lock(&mu_); if (!running_) { @@ -438,10 +428,9 @@ void WorkSerializer::DispatchingWorkSerializer::Run() { // Grab the last element of processing_ - which is the next item in our // queue since processing_ is stored in reverse order. auto& cb = processing_.back(); - if (GRPC_TRACE_FLAG_ENABLED(work_serializer)) { - LOG(INFO) << "WorkSerializer[" << this << "] Executing callback [" - << cb.location.file() << ":" << cb.location.line() << "]"; - } + GRPC_TRACE_LOG(work_serializer, INFO) + << "WorkSerializer[" << this << "] Executing callback [" + << cb.location.file() << ":" << cb.location.line() << "]"; // Run the work item. const auto start = std::chrono::steady_clock::now(); SetCurrentThread(); diff --git a/src/core/lib/iomgr/endpoint_cfstream.cc b/src/core/lib/iomgr/endpoint_cfstream.cc index 1cc776a13bd45..dbe123a554e4f 100644 --- a/src/core/lib/iomgr/endpoint_cfstream.cc +++ b/src/core/lib/iomgr/endpoint_cfstream.cc @@ -76,8 +76,8 @@ static void CFStreamUnref(CFStreamEndpoint* ep, const char* reason, const char* file, int line) { if (GRPC_TRACE_FLAG_ENABLED(tcp)) { gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count); - VLOG(2) << "CFStream endpoint unref " << ep << " : " << reason << " " << val - << " -> " << val - 1; + VLOG(2).AtLocation(file, line) << "CFStream endpoint unref " << ep << " : " + << reason << " " << val << " -> " << val - 1; } if (gpr_unref(&ep->refcount)) { CFStreamFree(ep); @@ -87,8 +87,8 @@ static void CFStreamRef(CFStreamEndpoint* ep, const char* reason, const char* file, int line) { if (GRPC_TRACE_FLAG_ENABLED(tcp)) { gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count); - VLOG(2) << "CFStream endpoint ref " << ep << " : " << reason << " " << val - << " -> " << val + 1; + VLOG(2).AtLocation(file, line) << "CFStream endpoint ref " << ep << " : " + << reason << " " << val << " -> " << val + 1; } gpr_ref(&ep->refcount); } diff --git a/src/core/lib/iomgr/endpoint_pair_windows.cc b/src/core/lib/iomgr/endpoint_pair_windows.cc index c238a6db71bc4..2fd37b4127ef4 100644 --- a/src/core/lib/iomgr/endpoint_pair_windows.cc +++ b/src/core/lib/iomgr/endpoint_pair_windows.cc @@ -66,13 +66,13 @@ static void create_sockets(SOCKET sv[2]) { closesocket(lst_sock); grpc_error_handle error = grpc_tcp_prepare_socket(cli_sock); if (!error.ok()) { - LOG(INFO) << "Prepare cli_sock failed with error: " - << grpc_core::StatusToString(error); + VLOG(2) << "Prepare cli_sock failed with error: " + << grpc_core::StatusToString(error); } error = grpc_tcp_prepare_socket(svr_sock); if (!error.ok()) { - LOG(INFO) << "Prepare svr_sock failed with error: " - << grpc_core::StatusToString(error); + VLOG(2) << "Prepare svr_sock failed with error: " + << grpc_core::StatusToString(error); } sv[1] = cli_sock; diff --git a/src/core/lib/iomgr/ev_apple.cc b/src/core/lib/iomgr/ev_apple.cc index 77a9c4ee8e1d7..88f07921f3aaa 100644 --- a/src/core/lib/iomgr/ev_apple.cc +++ b/src/core/lib/iomgr/ev_apple.cc @@ -39,15 +39,6 @@ #include "src/core/lib/gprpp/time_util.h" #include "src/core/lib/iomgr/ev_apple.h" -#ifndef NDEBUG -#define GRPC_POLLING_TRACE(format, ...) \ - if (GRPC_TRACE_FLAG_ENABLED(apple_polling)) { \ - VLOG(2) << "(polling) " << absl::StrFormat(format, __VA_ARGS__); \ - } -#else -#define GRPC_POLLING_TRACE(...) -#endif // NDEBUG - #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) struct GlobalRunLoopContext { @@ -117,7 +108,8 @@ static void grpc_apple_register_write_stream_queue( /// the global run loop thread gGlobalRunLoopThread. static void grpc_apple_register_read_stream_run_loop( CFReadStreamRef read_stream, dispatch_queue_t /*dispatch_queue*/) { - GRPC_POLLING_TRACE("Register read stream: %p", read_stream); + GRPC_TRACE_VLOG(apple_polling, 2) + << "(polling) Register read stream: " << read_stream; grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); CFReadStreamScheduleWithRunLoop(read_stream, gGlobalRunLoopContext->run_loop, kCFRunLoopDefaultMode); @@ -130,7 +122,8 @@ static void grpc_apple_register_read_stream_run_loop( /// by the global run loop thread gGlobalRunLoopThread. static void grpc_apple_register_write_stream_run_loop( CFWriteStreamRef write_stream, dispatch_queue_t /*dispatch_queue*/) { - GRPC_POLLING_TRACE("Register write stream: %p", write_stream); + GRPC_TRACE_VLOG(apple_polling, 2) + << "(polling) Register write stream: " << write_stream; grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); CFWriteStreamScheduleWithRunLoop( write_stream, gGlobalRunLoopContext->run_loop, kCFRunLoopDefaultMode); @@ -220,9 +213,9 @@ static void pollset_global_shutdown(void) { static grpc_error_handle pollset_work(grpc_pollset* pollset, grpc_pollset_worker** worker, grpc_core::Timestamp deadline) { - GRPC_POLLING_TRACE("pollset work: %p, worker: %p, deadline: %" PRIu64, - pollset, worker, - deadline.milliseconds_after_process_epoch()); + GRPC_TRACE_VLOG(apple_polling, 2) + << "(polling) pollset work: " << pollset << ", worker: " << worker + << ", deadline: " << deadline.milliseconds_after_process_epoch(); GrpcApplePollset* apple_pollset = reinterpret_cast(pollset); GrpcAppleWorker actual_worker; @@ -276,7 +269,8 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, GrpcApplePollset* apple_pollset = reinterpret_cast(pollset); - GRPC_POLLING_TRACE("pollset kick: %p, worker:%p", pollset, specific_worker); + GRPC_TRACE_VLOG(apple_polling, 2) << "(polling) pollset kick: " << pollset + << ", worker:" << specific_worker; if (specific_worker == nullptr) { if (apple_pollset->workers.empty()) { @@ -299,7 +293,7 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, } static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { - GRPC_POLLING_TRACE("pollset init: %p", pollset); + GRPC_TRACE_VLOG(apple_polling, 2) << "(polling) pollset init: " << pollset; GrpcApplePollset* apple_pollset = new (pollset) GrpcApplePollset(); *mu = grpc_core::GetUnderlyingGprMu(&apple_pollset->mu); } @@ -307,7 +301,8 @@ static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { /// The caller must acquire the lock GrpcApplePollset.mu before calling this /// function. static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) { - GRPC_POLLING_TRACE("pollset shutdown: %p", pollset); + GRPC_TRACE_VLOG(apple_polling, 2) + << "(polling) pollset shutdown: " << pollset; GrpcApplePollset* apple_pollset = reinterpret_cast(pollset); @@ -323,7 +318,7 @@ static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) { } static void pollset_destroy(grpc_pollset* pollset) { - GRPC_POLLING_TRACE("pollset destroy: %p", pollset); + GRPC_TRACE_VLOG(apple_polling, 2) << "(polling) pollset destroy: " << pollset; GrpcApplePollset* apple_pollset = reinterpret_cast(pollset); apple_pollset->~GrpcApplePollset(); diff --git a/src/core/lib/iomgr/ev_epoll1_linux.cc b/src/core/lib/iomgr/ev_epoll1_linux.cc index 6217ba266675a..278e544bb792b 100644 --- a/src/core/lib/iomgr/ev_epoll1_linux.cc +++ b/src/core/lib/iomgr/ev_epoll1_linux.cc @@ -727,9 +727,8 @@ static grpc_error_handle do_epoll_wait(grpc_pollset* ps, if (r < 0) return GRPC_OS_ERROR(errno, "epoll_wait"); - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << "ps: " << ps << " poll got " << r << " events"; - } + GRPC_TRACE_LOG(polling, INFO) + << "ps: " << ps << " poll got " << r << " events"; gpr_atm_rel_store(&g_epoll_set.num_events, r); gpr_atm_rel_store(&g_epoll_set.cursor, 0); @@ -746,9 +745,8 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, worker->schedule_on_end_work = (grpc_closure_list)GRPC_CLOSURE_LIST_INIT; pollset->begin_refs++; - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << "PS:" << pollset << " BEGIN_STARTS:" << worker; - } + GRPC_TRACE_LOG(polling, INFO) + << "PS:" << pollset << " BEGIN_STARTS:" << worker; if (pollset->seen_inactive) { // pollset has been observed to be inactive, we need to move back to the @@ -765,11 +763,10 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, retry_lock_neighborhood: gpr_mu_lock(&neighborhood->mu); gpr_mu_lock(&pollset->mu); - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << "PS:" << pollset << " BEGIN_REORG:" << worker - << " kick_state=" << kick_state_string(worker->state) - << " is_reassigning=" << is_reassigning; - } + GRPC_TRACE_LOG(polling, INFO) + << "PS:" << pollset << " BEGIN_REORG:" << worker + << " kick_state=" << kick_state_string(worker->state) + << " is_reassigning=" << is_reassigning; if (pollset->seen_inactive) { if (neighborhood != pollset->neighborhood) { gpr_mu_unlock(&neighborhood->mu); @@ -818,11 +815,10 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, worker->initialized_cv = true; gpr_cv_init(&worker->cv); while (worker->state == UNKICKED && !pollset->shutting_down) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << "PS:" << pollset << " BEGIN_WAIT:" << worker - << " kick_state=" << kick_state_string(worker->state) - << " shutdown=" << pollset->shutting_down; - } + GRPC_TRACE_LOG(polling, INFO) + << "PS:" << pollset << " BEGIN_WAIT:" << worker + << " kick_state=" << kick_state_string(worker->state) + << " shutdown=" << pollset->shutting_down; if (gpr_cv_wait(&worker->cv, &pollset->mu, deadline.as_timespec(GPR_CLOCK_MONOTONIC)) && @@ -877,17 +873,15 @@ static bool check_neighborhood_for_available_poller( if (gpr_atm_no_barrier_cas( &g_active_poller, 0, reinterpret_cast(inspect_worker))) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. choose next poller to be " << inspect_worker; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. choose next poller to be " << inspect_worker; SET_KICK_STATE(inspect_worker, DESIGNATED_POLLER); if (inspect_worker->initialized_cv) { gpr_cv_signal(&inspect_worker->cv); } } else { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. beaten to choose next poller"; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. beaten to choose next poller"; } // even if we didn't win the cas, there's a worker, we can stop found_worker = true; @@ -903,9 +897,8 @@ static bool check_neighborhood_for_available_poller( } while (!found_worker && inspect_worker != inspect->root_worker); } if (!found_worker) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. mark pollset " << inspect << " inactive"; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. mark pollset " << inspect << " inactive"; inspect->seen_inactive = true; if (inspect == neighborhood->active_root) { neighborhood->active_root = @@ -922,9 +915,7 @@ static bool check_neighborhood_for_available_poller( static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, grpc_pollset_worker** worker_hdl) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << "PS:" << pollset << " END_WORKER:" << worker; - } + GRPC_TRACE_LOG(polling, INFO) << "PS:" << pollset << " END_WORKER:" << worker; if (worker_hdl != nullptr) *worker_hdl = nullptr; // Make sure we appear kicked SET_KICK_STATE(worker, KICKED); @@ -933,9 +924,8 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, if (gpr_atm_no_barrier_load(&g_active_poller) == reinterpret_cast(worker)) { if (worker->next != worker && worker->next->state == UNKICKED) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. choose next poller to be peer " << worker; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. choose next poller to be peer " << worker; CHECK(worker->next->initialized_cv); gpr_atm_no_barrier_store(&g_active_poller, (gpr_atm)worker->next); SET_KICK_STATE(worker->next, DESIGNATED_POLLER); @@ -984,9 +974,7 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, if (worker->initialized_cv) { gpr_cv_destroy(&worker->cv); } - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. remove worker"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. remove worker"; if (EMPTIED == worker_remove(pollset, worker)) { pollset_maybe_finish_shutdown(pollset); } @@ -1075,22 +1063,16 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, grpc_pollset_worker* root_worker = pollset->root_worker; if (root_worker == nullptr) { pollset->kicked_without_poller = true; - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kicked_without_poller"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kicked_without_poller"; goto done; } grpc_pollset_worker* next_worker = root_worker->next; if (root_worker->state == KICKED) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. already kicked " << root_worker; - } + GRPC_TRACE_LOG(polling, INFO) << " .. already kicked " << root_worker; SET_KICK_STATE(root_worker, KICKED); goto done; } else if (next_worker->state == KICKED) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. already kicked " << next_worker; - } + GRPC_TRACE_LOG(polling, INFO) << " .. already kicked " << next_worker; SET_KICK_STATE(next_worker, KICKED); goto done; } else if (root_worker == next_worker && // only try and wake up a poller @@ -1098,37 +1080,30 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, root_worker == reinterpret_cast( gpr_atm_no_barrier_load(&g_active_poller))) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kicked " << root_worker; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kicked " << root_worker; SET_KICK_STATE(root_worker, KICKED); ret_err = grpc_wakeup_fd_wakeup(&global_wakeup_fd); goto done; } else if (next_worker->state == UNKICKED) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kicked " << next_worker; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kicked " << next_worker; CHECK(next_worker->initialized_cv); SET_KICK_STATE(next_worker, KICKED); gpr_cv_signal(&next_worker->cv); goto done; } else if (next_worker->state == DESIGNATED_POLLER) { if (root_worker->state != DESIGNATED_POLLER) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kicked root non-poller " << root_worker - << " (initialized_cv=" << root_worker->initialized_cv - << ") (poller=" << next_worker << ")"; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. kicked root non-poller " << root_worker + << " (initialized_cv=" << root_worker->initialized_cv + << ") (poller=" << next_worker << ")"; SET_KICK_STATE(root_worker, KICKED); if (root_worker->initialized_cv) { gpr_cv_signal(&root_worker->cv); } goto done; } else { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. non-root poller " << next_worker - << " (root=" << root_worker << ")"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. non-root poller " << next_worker + << " (root=" << root_worker << ")"; SET_KICK_STATE(next_worker, KICKED); ret_err = grpc_wakeup_fd_wakeup(&global_wakeup_fd); goto done; @@ -1139,9 +1114,7 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, goto done; } } else { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kicked while waking up"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kicked while waking up"; goto done; } @@ -1149,36 +1122,27 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, } if (specific_worker->state == KICKED) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. specific worker already kicked"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. specific worker already kicked"; goto done; } else if (g_current_thread_worker == specific_worker) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. mark " << specific_worker << " kicked"; - } + GRPC_TRACE_LOG(polling, INFO) + << " .. mark " << specific_worker << " kicked"; SET_KICK_STATE(specific_worker, KICKED); goto done; } else if (specific_worker == reinterpret_cast( gpr_atm_no_barrier_load(&g_active_poller))) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kick active poller"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kick active poller"; SET_KICK_STATE(specific_worker, KICKED); ret_err = grpc_wakeup_fd_wakeup(&global_wakeup_fd); goto done; } else if (specific_worker->initialized_cv) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kick waiting worker"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kick waiting worker"; SET_KICK_STATE(specific_worker, KICKED); gpr_cv_signal(&specific_worker->cv); goto done; } else { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << " .. kick non-waiting worker"; - } + GRPC_TRACE_LOG(polling, INFO) << " .. kick non-waiting worker"; SET_KICK_STATE(specific_worker, KICKED); goto done; } diff --git a/src/core/lib/iomgr/ev_poll_posix.cc b/src/core/lib/iomgr/ev_poll_posix.cc index b2a3068633111..9d0728a97d081 100644 --- a/src/core/lib/iomgr/ev_poll_posix.cc +++ b/src/core/lib/iomgr/ev_poll_posix.cc @@ -1028,9 +1028,7 @@ static grpc_error_handle pollset_work(grpc_pollset* pollset, r = grpc_poll_function(pfds, pfd_count, timeout); GRPC_SCHEDULING_END_BLOCKING_REGION; - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << pollset << " poll=" << r; - } + GRPC_TRACE_LOG(polling, INFO) << pollset << " poll=" << r; if (r < 0) { if (errno != EINTR) { @@ -1052,9 +1050,7 @@ static grpc_error_handle pollset_work(grpc_pollset* pollset, } } else { if (pfds[0].revents & POLLIN_CHECK) { - if (GRPC_TRACE_FLAG_ENABLED(polling)) { - LOG(INFO) << pollset << ": got_wakeup"; - } + GRPC_TRACE_LOG(polling, INFO) << pollset << ": got_wakeup"; work_combine_error( &error, grpc_wakeup_fd_consume_wakeup(&worker.wakeup_fd->fd)); } diff --git a/src/core/lib/iomgr/ev_posix.cc b/src/core/lib/iomgr/ev_posix.cc index 06551a93cb703..c8983966ada65 100644 --- a/src/core/lib/iomgr/ev_posix.cc +++ b/src/core/lib/iomgr/ev_posix.cc @@ -104,7 +104,8 @@ static void try_engine(absl::string_view engine) { if (g_vtables[i] != nullptr && is(engine, g_vtables[i]->name) && g_vtables[i]->check_engine_available(engine == g_vtables[i]->name)) { g_event_engine = g_vtables[i]; - VLOG(2) << "Using polling engine: " << g_event_engine->name; + GRPC_TRACE_VLOG(polling_api, 2) + << "Using polling engine: " << g_event_engine->name; return; } } @@ -165,7 +166,8 @@ bool grpc_event_engine_run_in_background(void) { grpc_fd* grpc_fd_create(int fd, const char* name, bool track_err) { GRPC_POLLING_API_TRACE("fd_create(%d, %s, %d)", fd, name, track_err); - GRPC_FD_TRACE("fd_create(%d, %s, %d)", fd, name, track_err); + GRPC_TRACE_LOG(fd_trace, INFO) << "(fd-trace) fd_create(" << fd << ", " + << name << ", " << track_err << ")"; return g_event_engine->fd_create( fd, name, track_err && grpc_event_engine_can_track_errors()); } @@ -178,20 +180,24 @@ void grpc_fd_orphan(grpc_fd* fd, grpc_closure* on_done, int* release_fd, const char* reason) { GRPC_POLLING_API_TRACE("fd_orphan(%d, %p, %p, %s)", grpc_fd_wrapped_fd(fd), on_done, release_fd, reason); - GRPC_FD_TRACE("grpc_fd_orphan, fd:%d closed", grpc_fd_wrapped_fd(fd)); + GRPC_TRACE_LOG(fd_trace, INFO) + << "(fd-trace) grpc_fd_orphan, fd:" << grpc_fd_wrapped_fd(fd) + << " closed"; g_event_engine->fd_orphan(fd, on_done, release_fd, reason); } void grpc_fd_set_pre_allocated(grpc_fd* fd) { GRPC_POLLING_API_TRACE("fd_set_pre_allocated(%d)", grpc_fd_wrapped_fd(fd)); - GRPC_FD_TRACE("fd_set_pre_allocated(%d)", grpc_fd_wrapped_fd(fd)); + GRPC_TRACE_LOG(fd_trace, INFO) + << "(fd-trace) fd_set_pre_allocated(" << grpc_fd_wrapped_fd(fd) << ")"; g_event_engine->fd_set_pre_allocated(fd); } void grpc_fd_shutdown(grpc_fd* fd, grpc_error_handle why) { GRPC_POLLING_API_TRACE("fd_shutdown(%d)", grpc_fd_wrapped_fd(fd)); - GRPC_FD_TRACE("fd_shutdown(%d)", grpc_fd_wrapped_fd(fd)); + GRPC_TRACE_LOG(fd_trace, INFO) + << "(fd-trace) fd_shutdown(" << grpc_fd_wrapped_fd(fd) << ")"; g_event_engine->fd_shutdown(fd, why); } diff --git a/src/core/lib/iomgr/ev_posix.h b/src/core/lib/iomgr/ev_posix.h index 06d039faf34df..8573f0568bc0e 100644 --- a/src/core/lib/iomgr/ev_posix.h +++ b/src/core/lib/iomgr/ev_posix.h @@ -33,11 +33,6 @@ #include "src/core/lib/iomgr/pollset_set.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" -#define GRPC_FD_TRACE(format, ...) \ - if (GRPC_TRACE_FLAG_ENABLED(fd_trace)) { \ - LOG(INFO) << "(fd-trace) " << absl::StrFormat(format, __VA_ARGS__); \ - } - typedef struct grpc_fd grpc_fd; typedef struct grpc_event_engine_vtable { diff --git a/src/core/lib/iomgr/event_engine_shims/endpoint.cc b/src/core/lib/iomgr/event_engine_shims/endpoint.cc index 5b71ec378f825..08fcbc6199761 100644 --- a/src/core/lib/iomgr/event_engine_shims/endpoint.cc +++ b/src/core/lib/iomgr/event_engine_shims/endpoint.cc @@ -173,10 +173,9 @@ class EventEngineEndpointWrapper { void FinishPendingWrite(absl::Status status) { auto* write_buffer = reinterpret_cast(&eeep_->write_buffer); write_buffer->~SliceBuffer(); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP: " << this << " WRITE (peer=" << PeerAddress() - << ") error=" << status; - } + GRPC_TRACE_LOG(tcp, INFO) + << "TCP: " << this << " WRITE (peer=" << PeerAddress() + << ") error=" << status; grpc_closure* cb = pending_write_cb_; pending_write_cb_ = nullptr; if (grpc_core::ExecCtx::Get() == nullptr) { diff --git a/src/core/lib/iomgr/exec_ctx.h b/src/core/lib/iomgr/exec_ctx.h index 68340c7df1c5f..ef336aa6d56b1 100644 --- a/src/core/lib/iomgr/exec_ctx.h +++ b/src/core/lib/iomgr/exec_ctx.h @@ -41,6 +41,7 @@ #include "src/core/lib/gprpp/fork.h" #include "src/core/lib/gprpp/time.h" #include "src/core/lib/iomgr/closure.h" +#include "src/core/util/latent_see.h" #include "src/core/util/time_precise.h" #if !defined(_WIN32) || !defined(_DLL) @@ -109,17 +110,23 @@ class Combiner; /// since that implies a core re-entry outside of application /// callbacks. /// -class GRPC_DLL ExecCtx { +class GRPC_DLL ExecCtx : public latent_see::ParentScope { public: /// Default Constructor - ExecCtx() : flags_(GRPC_EXEC_CTX_FLAG_IS_FINISHED) { + ExecCtx() + : latent_see::ParentScope(GRPC_LATENT_SEE_METADATA("ExecCtx")), + flags_(GRPC_EXEC_CTX_FLAG_IS_FINISHED) { Fork::IncExecCtxCount(); Set(this); } /// Parameterised Constructor - explicit ExecCtx(uintptr_t fl) : flags_(fl) { + explicit ExecCtx(uintptr_t fl) + : ExecCtx(fl, GRPC_LATENT_SEE_METADATA("ExecCtx")) {} + + explicit ExecCtx(uintptr_t fl, latent_see::Metadata* latent_see_metadata) + : latent_see::ParentScope(latent_see_metadata), flags_(fl) { if (!(GRPC_EXEC_CTX_FLAG_IS_INTERNAL_THREAD & flags_)) { Fork::IncExecCtxCount(); } diff --git a/src/core/lib/iomgr/polling_entity.cc b/src/core/lib/iomgr/polling_entity.cc index 42233112c151d..8b225444c7e64 100644 --- a/src/core/lib/iomgr/polling_entity.cc +++ b/src/core/lib/iomgr/polling_entity.cc @@ -30,8 +30,12 @@ grpc_polling_entity grpc_polling_entity_create_from_pollset_set( grpc_pollset_set* pollset_set) { grpc_polling_entity pollent; - pollent.pollent.pollset_set = pollset_set; - pollent.tag = GRPC_POLLS_POLLSET_SET; + if (pollset_set == nullptr) { + pollent.tag = GRPC_POLLS_NONE; + } else { + pollent.pollent.pollset_set = pollset_set; + pollent.tag = GRPC_POLLS_POLLSET_SET; + } return pollent; } @@ -73,6 +77,8 @@ void grpc_polling_entity_add_to_pollset_set(grpc_polling_entity* pollent, } else if (pollent->tag == GRPC_POLLS_POLLSET_SET) { CHECK_NE(pollent->pollent.pollset_set, nullptr); grpc_pollset_set_add_pollset_set(pss_dst, pollent->pollent.pollset_set); + } else if (pollent->tag == GRPC_POLLS_NONE) { + // Do nothing. } else { grpc_core::Crash( absl::StrFormat("Invalid grpc_polling_entity tag '%d'", pollent->tag)); @@ -93,6 +99,8 @@ void grpc_polling_entity_del_from_pollset_set(grpc_polling_entity* pollent, } else if (pollent->tag == GRPC_POLLS_POLLSET_SET) { CHECK_NE(pollent->pollent.pollset_set, nullptr); grpc_pollset_set_del_pollset_set(pss_dst, pollent->pollent.pollset_set); + } else if (pollent->tag == GRPC_POLLS_NONE) { + // Do nothing. } else { grpc_core::Crash( absl::StrFormat("Invalid grpc_polling_entity tag '%d'", pollent->tag)); diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc index 0eb8ba34cd739..19c6ccab152df 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.cc +++ b/src/core/lib/iomgr/socket_utils_common_posix.cc @@ -373,20 +373,21 @@ grpc_error_handle grpc_set_socket_tcp_user_timeout( // if it is available. if (g_socket_supports_tcp_user_timeout.load() == 0) { if (0 != getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) { - LOG(INFO) << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT " - "won't be used thereafter"; + GRPC_TRACE_LOG(tcp, INFO) + << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't be " + "used thereafter"; g_socket_supports_tcp_user_timeout.store(-1); } else { - LOG(INFO) << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will " - "be used thereafter"; + GRPC_TRACE_LOG(tcp, INFO) + << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be used " + "thereafter"; g_socket_supports_tcp_user_timeout.store(1); } } if (g_socket_supports_tcp_user_timeout.load() > 0) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "Enabling TCP_USER_TIMEOUT with a timeout of " << timeout - << " ms"; - } + GRPC_TRACE_LOG(tcp, INFO) + << "Enabling TCP_USER_TIMEOUT with a timeout of " << timeout + << " ms"; if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout, sizeof(timeout))) { LOG(ERROR) << "setsockopt(TCP_USER_TIMEOUT) " @@ -399,9 +400,9 @@ grpc_error_handle grpc_set_socket_tcp_user_timeout( return absl::OkStatus(); } if (newval != timeout) { - LOG(INFO) << "Setting TCP_USER_TIMEOUT to value " << timeout - << " ms. Actual TCP_USER_TIMEOUT value is " << newval - << " ms"; + GRPC_TRACE_LOG(tcp, INFO) + << "Setting TCP_USER_TIMEOUT to value " << timeout + << " ms. Actual TCP_USER_TIMEOUT value is " << newval << " ms"; return absl::OkStatus(); } } @@ -438,7 +439,8 @@ static void probe_ipv6_once(void) { int fd = socket(AF_INET6, SOCK_STREAM, 0); g_ipv6_loopback_available = 0; if (fd < 0) { - LOG(INFO) << "Disabling AF_INET6 sockets because socket() failed."; + GRPC_TRACE_LOG(tcp, INFO) + << "Disabling AF_INET6 sockets because socket() failed."; } else { grpc_sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); @@ -447,7 +449,8 @@ static void probe_ipv6_once(void) { if (bind(fd, reinterpret_cast(&addr), sizeof(addr)) == 0) { g_ipv6_loopback_available = 1; } else { - LOG(INFO) << "Disabling AF_INET6 sockets because ::1 is not available."; + GRPC_TRACE_LOG(tcp, INFO) + << "Disabling AF_INET6 sockets because ::1 is not available."; } close(fd); } diff --git a/src/core/lib/iomgr/socket_windows.cc b/src/core/lib/iomgr/socket_windows.cc index 3bd40480ba571..e7a8b1e5fdd24 100644 --- a/src/core/lib/iomgr/socket_windows.cc +++ b/src/core/lib/iomgr/socket_windows.cc @@ -132,7 +132,7 @@ void grpc_winsocket_shutdown(grpc_winsocket* winsocket) { DisconnectEx(winsocket->socket, NULL, 0, 0); } else { char* utf8_message = gpr_format_message(WSAGetLastError()); - LOG(INFO) << "Unable to retrieve DisconnectEx pointer : " << utf8_message; + VLOG(2) << "Unable to retrieve DisconnectEx pointer : " << utf8_message; gpr_free(utf8_message); } // Calling closesocket triggers invocation of any pending I/O operations with @@ -216,7 +216,7 @@ static void probe_ipv6_once(void) { SOCKET s = socket(AF_INET6, SOCK_STREAM, 0); g_ipv6_loopback_available = 0; if (s == INVALID_SOCKET) { - LOG(INFO) << "Disabling AF_INET6 sockets because socket() failed."; + VLOG(2) << "Disabling AF_INET6 sockets because socket() failed."; } else { grpc_sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); @@ -225,7 +225,7 @@ static void probe_ipv6_once(void) { if (bind(s, reinterpret_cast(&addr), sizeof(addr)) == 0) { g_ipv6_loopback_available = 1; } else { - LOG(INFO) << "Disabling AF_INET6 sockets because ::1 is not available."; + VLOG(2) << "Disabling AF_INET6 sockets because ::1 is not available."; } closesocket(s); } diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index eed4b78e36261..b0d983df9b64b 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -141,10 +141,9 @@ static grpc_error_handle prepare_socket( static void tc_on_alarm(void* acp, grpc_error_handle error) { int done; async_connect* ac = static_cast(acp); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "CLIENT_CONNECT: " << ac->addr_str - << ": on_alarm: error=" << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(tcp, INFO) + << "CLIENT_CONNECT: " << ac->addr_str + << ": on_alarm: error=" << grpc_core::StatusToString(error); gpr_mu_lock(&ac->mu); if (ac->fd != nullptr) { grpc_fd_shutdown(ac->fd, GRPC_ERROR_CREATE("connect() timed out")); @@ -180,10 +179,9 @@ static void on_writable(void* acp, grpc_error_handle error) { std::string addr_str = ac->addr_str; grpc_fd* fd; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "CLIENT_CONNECT: " << ac->addr_str - << ": on_writable: error=" << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(tcp, INFO) + << "CLIENT_CONNECT: " << ac->addr_str + << ": on_writable: error=" << grpc_core::StatusToString(error); gpr_mu_lock(&ac->mu); CHECK(ac->fd); @@ -381,10 +379,8 @@ int64_t grpc_tcp_client_create_from_prepared_fd( grpc_schedule_on_exec_ctx); ac->options = options; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "CLIENT_CONNECT: " << ac->addr_str - << ": asynchronously connecting fd " << fdobj; - } + GRPC_TRACE_LOG(tcp, INFO) << "CLIENT_CONNECT: " << ac->addr_str + << ": asynchronously connecting fd " << fdobj; int shard_number = connection_id % (*g_connection_shards).size(); struct ConnectionShard* shard = &(*g_connection_shards)[shard_number]; diff --git a/src/core/lib/iomgr/tcp_posix.cc b/src/core/lib/iomgr/tcp_posix.cc index 8882e943c09bc..d0c68d40c7f1d 100644 --- a/src/core/lib/iomgr/tcp_posix.cc +++ b/src/core/lib/iomgr/tcp_posix.cc @@ -209,7 +209,8 @@ class TcpZerocopySendCtx { if (send_records_ == nullptr || free_send_records_ == nullptr) { gpr_free(send_records_); gpr_free(free_send_records_); - LOG(INFO) << "Disabling TCP TX zerocopy due to memory pressure.\n"; + GRPC_TRACE_LOG(tcp, INFO) + << "Disabling TCP TX zerocopy due to memory pressure.\n"; memory_limited_ = true; } else { for (int idx = 0; idx < max_sends_; ++idx) { @@ -617,18 +618,14 @@ static void tcp_drop_uncovered_then_handle_write(void* arg /* grpc_tcp */, static void done_poller(void* bp, grpc_error_handle /*error_ignored*/) { backup_poller* p = static_cast(bp); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " destroy"; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " destroy"; grpc_pollset_destroy(BACKUP_POLLER_POLLSET(p)); gpr_free(p); } static void run_poller(void* bp, grpc_error_handle /*error_ignored*/) { backup_poller* p = static_cast(bp); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " run"; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " run"; gpr_mu_lock(p->pollset_mu); grpc_core::Timestamp deadline = grpc_core::Timestamp::Now() + grpc_core::Duration::Seconds(10); @@ -643,17 +640,13 @@ static void run_poller(void* bp, grpc_error_handle /*error_ignored*/) { g_backup_poller = nullptr; g_uncovered_notifications_pending = 0; g_backup_poller_mu->Unlock(); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " shutdown"; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " shutdown"; grpc_pollset_shutdown(BACKUP_POLLER_POLLSET(p), GRPC_CLOSURE_INIT(&p->run_poller, done_poller, p, grpc_schedule_on_exec_ctx)); } else { g_backup_poller_mu->Unlock(); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " reschedule"; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " reschedule"; grpc_core::Executor::Run(&p->run_poller, absl::OkStatus(), grpc_core::ExecutorType::DEFAULT, grpc_core::ExecutorJobType::LONG); @@ -668,10 +661,8 @@ static void drop_uncovered(grpc_tcp* /*tcp*/) { old_count = g_uncovered_notifications_pending--; g_backup_poller_mu->Unlock(); CHECK_GT(old_count, 1); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " uncover cnt " << old_count << "->" - << old_count - 1; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " uncover cnt " + << old_count << "->" << old_count - 1; } // gRPC API considers a Write operation to be done the moment it clears ‘flow @@ -692,9 +683,7 @@ static void cover_self(grpc_tcp* tcp) { g_backup_poller = p; grpc_pollset_init(BACKUP_POLLER_POLLSET(p), &p->pollset_mu); g_backup_poller_mu->Unlock(); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " create"; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " create"; grpc_core::Executor::Run( GRPC_CLOSURE_INIT(&p->run_poller, run_poller, p, nullptr), absl::OkStatus(), grpc_core::ExecutorType::DEFAULT, @@ -704,24 +693,18 @@ static void cover_self(grpc_tcp* tcp) { p = g_backup_poller; g_backup_poller_mu->Unlock(); } - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "BACKUP_POLLER:" << p << " add " << tcp << " cnt " - << old_count - 1 << "->" << old_count; - } + GRPC_TRACE_LOG(tcp, INFO) << "BACKUP_POLLER:" << p << " add " << tcp + << " cnt " << old_count - 1 << "->" << old_count; grpc_pollset_add_fd(BACKUP_POLLER_POLLSET(p), tcp->em_fd); } static void notify_on_read(grpc_tcp* tcp) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " notify_on_read"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " notify_on_read"; grpc_fd_notify_on_read(tcp->em_fd, &tcp->read_done_closure); } static void notify_on_write(grpc_tcp* tcp) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " notify_on_write"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " notify_on_write"; if (!grpc_event_engine_run_in_background()) { cover_self(tcp); } @@ -730,10 +713,8 @@ static void notify_on_write(grpc_tcp* tcp) { static void tcp_drop_uncovered_then_handle_write(void* arg, grpc_error_handle error) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << arg - << " got_write: " << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(tcp, INFO) + << "TCP:" << arg << " got_write: " << grpc_core::StatusToString(error); drop_uncovered(static_cast(arg)); tcp_handle_write(arg, error); } @@ -820,9 +801,8 @@ static void tcp_destroy(grpc_endpoint* ep) { static void perform_reclamation(grpc_tcp* tcp) ABSL_LOCKS_EXCLUDED(tcp->read_mu) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "TCP: benign reclamation to free memory"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "TCP: benign reclamation to free memory"; tcp->read_mu.Lock(); if (tcp->incoming_buffer != nullptr) { grpc_slice_buffer_reset_and_unref(tcp->incoming_buffer); @@ -914,9 +894,8 @@ static void update_rcvlowat(grpc_tcp* tcp) #define MAX_READ_IOVEC 64 static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " do_read"; - } + GRPC_LATENT_SEE_INNER_SCOPE("tcp_do_read"); + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " do_read"; struct msghdr msg; struct iovec iov[MAX_READ_IOVEC]; ssize_t read_bytes; @@ -1127,10 +1106,8 @@ static void maybe_make_read_slices(grpc_tcp* tcp) static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) { grpc_tcp* tcp = static_cast(arg); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp - << " got_read: " << grpc_core::StatusToString(error); - } + GRPC_TRACE_LOG(tcp, INFO) + << "TCP:" << tcp << " got_read: " << grpc_core::StatusToString(error); tcp->read_mu.Lock(); grpc_error_handle tcp_read_error; if (GPR_LIKELY(error.ok()) && tcp->memory_owner.is_valid()) { @@ -1210,6 +1187,7 @@ static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer, // of bytes sent. ssize_t tcp_send(int fd, const struct msghdr* msg, int* saved_errno, int additional_flags = 0) { + GRPC_LATENT_SEE_INNER_SCOPE("tcp_send"); ssize_t sent_length; do { // TODO(klempner): Cork if this is a partial write @@ -1407,6 +1385,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg, /// messages from the queue. /// static bool process_errors(grpc_tcp* tcp) { + GRPC_LATENT_SEE_INNER_SCOPE("process_errors"); bool processed_err = false; struct iovec iov; iov.iov_base = nullptr; @@ -1468,10 +1447,9 @@ static bool process_errors(grpc_tcp* tcp) { } else { // Got a control message that is not a timestamp or zerocopy. Don't know // how to handle this. - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "unknown control message cmsg_level:" << cmsg->cmsg_level - << " cmsg_type:" << cmsg->cmsg_type; - } + GRPC_TRACE_LOG(tcp, INFO) + << "unknown control message cmsg_level:" << cmsg->cmsg_level + << " cmsg_type:" << cmsg->cmsg_type; return processed_err; } } @@ -1484,9 +1462,7 @@ static bool process_errors(grpc_tcp* tcp) { static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error_handle error) { grpc_tcp* tcp = static_cast(arg); - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " got_error: " << error; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " got_error: " << error; if (!error.ok() || static_cast(gpr_atm_acq_load(&tcp->stop_error_notification))) { @@ -1814,9 +1790,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, ? tcp_flush_zerocopy(tcp, tcp->current_zerocopy_send, &error) : tcp_flush(tcp, &error); if (!flush_result) { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "write: delayed"; - } + GRPC_TRACE_LOG(tcp, INFO) << "write: delayed"; notify_on_write(tcp); // tcp_flush does not populate error if it has returned false. DCHECK(error.ok()); @@ -1885,9 +1859,7 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf, TCP_REF(tcp, "write"); tcp->write_cb = cb; tcp->current_zerocopy_send = zerocopy_send_record; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "write: delayed"; - } + GRPC_TRACE_LOG(tcp, INFO) << "write: delayed"; notify_on_write(tcp); } else { GRPC_TRACE_LOG(tcp, INFO) << "write: " << grpc_core::StatusToString(error); diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index 832da72944bff..a45a0c8e32f7e 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -177,10 +177,9 @@ static grpc_error_handle CreateEventEngineListener( << addr_uri.status().ToString(); return; } - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "SERVER_CONNECT: incoming external connection: " - << addr_uri->c_str(); - } + GRPC_TRACE_LOG(tcp, INFO) << "SERVER_CONNECT: incoming external " + "connection: " + << addr_uri->c_str(); } read_notifier_pollset = (*(s->pollsets))[static_cast( @@ -421,8 +420,9 @@ static void on_read(void* arg, grpc_error_handle err) { int64_t dropped_connections_count = num_dropped_connections.fetch_add(1, std::memory_order_relaxed) + 1; if (dropped_connections_count % 1000 == 1) { - LOG(INFO) << "Dropped >= " << dropped_connections_count - << " new connection attempts due to high memory pressure"; + GRPC_TRACE_LOG(tcp, INFO) + << "Dropped >= " << dropped_connections_count + << " new connection attempts due to high memory pressure"; } close(fd); continue; @@ -459,9 +459,8 @@ static void on_read(void* arg, grpc_error_handle err) { LOG(ERROR) << "Invalid address: " << addr_uri.status(); goto error; } - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "SERVER_CONNECT: incoming connection: " << *addr_uri; - } + GRPC_TRACE_LOG(tcp, INFO) + << "SERVER_CONNECT: incoming connection: " << *addr_uri; std::string name = absl::StrCat("tcp-server-connection:", addr_uri.value()); grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true); @@ -540,14 +539,14 @@ static grpc_error_handle add_wildcard_addrs_to_server(grpc_tcp_server* s, } if (*out_port > 0) { if (!v6_err.ok()) { - LOG(INFO) << "Failed to add :: listener, " - << "the environment may not support IPv6: " - << grpc_core::StatusToString(v6_err); + GRPC_TRACE_LOG(tcp, INFO) << "Failed to add :: listener, " + << "the environment may not support IPv6: " + << grpc_core::StatusToString(v6_err); } if (!v4_err.ok()) { - LOG(INFO) << "Failed to add 0.0.0.0 listener, " - << "the environment may not support IPv4: " - << grpc_core::StatusToString(v4_err); + GRPC_TRACE_LOG(tcp, INFO) << "Failed to add 0.0.0.0 listener, " + << "the environment may not support IPv4: " + << grpc_core::StatusToString(v4_err); } return absl::OkStatus(); } else { @@ -915,10 +914,8 @@ class ExternalConnectionHandler : public grpc_core::TcpServerFdHandler { LOG(ERROR) << "Invalid address: " << addr_uri.status(); return; } - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "SERVER_CONNECT: incoming external connection: " - << *addr_uri; - } + GRPC_TRACE_LOG(tcp, INFO) + << "SERVER_CONNECT: incoming external connection: " << *addr_uri; std::string name = absl::StrCat("tcp-server-connection:", addr_uri.value()); grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true); read_notifier_pollset = diff --git a/src/core/lib/iomgr/tcp_server_windows.cc b/src/core/lib/iomgr/tcp_server_windows.cc index 92b8a1f9a09d8..1e0bb260c46a3 100644 --- a/src/core/lib/iomgr/tcp_server_windows.cc +++ b/src/core/lib/iomgr/tcp_server_windows.cc @@ -386,8 +386,8 @@ static void on_accept(void* arg, grpc_error_handle error) { // this is necessary in the read/write case, it's useless for the accept // case. We only need to adjust the pending callback count if (!error.ok()) { - LOG(INFO) << "Skipping on_accept due to error: " - << grpc_core::StatusToString(error); + VLOG(2) << "Skipping on_accept due to error: " + << grpc_core::StatusToString(error); gpr_mu_unlock(&sp->server->mu); return; diff --git a/src/core/lib/iomgr/tcp_windows.cc b/src/core/lib/iomgr/tcp_windows.cc index 0888f92ff19c3..b94ffcfe91275 100644 --- a/src/core/lib/iomgr/tcp_windows.cc +++ b/src/core/lib/iomgr/tcp_windows.cc @@ -176,9 +176,7 @@ static void on_read(void* tcpp, grpc_error_handle error) { grpc_winsocket* socket = tcp->socket; grpc_winsocket_callback_info* info = &socket->read_info; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " on_read"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " on_read"; if (error.ok()) { if (info->wsa_error != 0 && !tcp->shutting_down) { @@ -208,9 +206,7 @@ static void on_read(void* tcpp, grpc_error_handle error) { } } } else { - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " unref read_slice"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " unref read_slice"; grpc_slice_buffer_reset_and_unref(tcp->read_slices); error = grpc_error_set_int( tcp->shutting_down ? GRPC_ERROR_CREATE("TCP stream shutting down") @@ -239,9 +235,7 @@ static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices, WSABUF buffers[MAX_WSABUF_COUNT]; size_t i; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " win_read"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " win_read"; if (tcp->shutting_down) { grpc_core::ExecCtx::Run( @@ -310,9 +304,7 @@ static void on_write(void* tcpp, grpc_error_handle error) { grpc_winsocket_callback_info* info = &handle->write_info; grpc_closure* cb; - if (GRPC_TRACE_FLAG_ENABLED(tcp)) { - LOG(INFO) << "TCP:" << tcp << " on_write"; - } + GRPC_TRACE_LOG(tcp, INFO) << "TCP:" << tcp << " on_write"; gpr_mu_lock(&tcp->mu); cb = tcp->write_cb; diff --git a/src/core/lib/iomgr/timer_manager.cc b/src/core/lib/iomgr/timer_manager.cc index 5136ad35d1a39..312ed68a025b3 100644 --- a/src/core/lib/iomgr/timer_manager.cc +++ b/src/core/lib/iomgr/timer_manager.cc @@ -195,11 +195,10 @@ static bool wait_until(grpc_core::Timestamp next) { gpr_cv_wait(&g_cv_wait, &g_mu, next.as_timespec(GPR_CLOCK_MONOTONIC)); - if (GRPC_TRACE_FLAG_ENABLED(timer_check)) { - LOG(INFO) << "wait ended: was_timed:" - << (my_timed_waiter_generation == g_timed_waiter_generation) - << " kicked:" << g_kicked; - } + GRPC_TRACE_LOG(timer_check, INFO) + << "wait ended: was_timed:" + << (my_timed_waiter_generation == g_timed_waiter_generation) + << " kicked:" << g_kicked; // if this was the timed waiter, then we need to check timers, and flag // that there's now no timed waiter... we'll look for a replacement if // there's work to do after checking timers (code above) diff --git a/src/core/lib/promise/detail/join_state.h b/src/core/lib/promise/detail/join_state.h index 7dffa8b255de1..d6ce8782bfa4e 100644 --- a/src/core/lib/promise/detail/join_state.h +++ b/src/core/lib/promise/detail/join_state.h @@ -65,18 +65,10 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -180,23 +172,11 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -337,28 +317,12 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -535,33 +499,13 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } - if (ready.is_set(4)) { - Construct(&result4, std::move(other.result4)); - } else { - Construct(&promise4, std::move(other.promise4)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); + Construct(&promise4, std::move(other.promise4)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -774,38 +718,14 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } - if (ready.is_set(4)) { - Construct(&result4, std::move(other.result4)); - } else { - Construct(&promise4, std::move(other.promise4)); - } - if (ready.is_set(5)) { - Construct(&result5, std::move(other.result5)); - } else { - Construct(&promise5, std::move(other.promise5)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); + Construct(&promise4, std::move(other.promise4)); + Construct(&promise5, std::move(other.promise5)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -1054,43 +974,15 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } - if (ready.is_set(4)) { - Construct(&result4, std::move(other.result4)); - } else { - Construct(&promise4, std::move(other.promise4)); - } - if (ready.is_set(5)) { - Construct(&result5, std::move(other.result5)); - } else { - Construct(&promise5, std::move(other.promise5)); - } - if (ready.is_set(6)) { - Construct(&result6, std::move(other.result6)); - } else { - Construct(&promise6, std::move(other.promise6)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); + Construct(&promise4, std::move(other.promise4)); + Construct(&promise5, std::move(other.promise5)); + Construct(&promise6, std::move(other.promise6)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -1375,48 +1267,16 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } - if (ready.is_set(4)) { - Construct(&result4, std::move(other.result4)); - } else { - Construct(&promise4, std::move(other.promise4)); - } - if (ready.is_set(5)) { - Construct(&result5, std::move(other.result5)); - } else { - Construct(&promise5, std::move(other.promise5)); - } - if (ready.is_set(6)) { - Construct(&result6, std::move(other.result6)); - } else { - Construct(&promise6, std::move(other.promise6)); - } - if (ready.is_set(7)) { - Construct(&result7, std::move(other.result7)); - } else { - Construct(&promise7, std::move(other.promise7)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); + Construct(&promise4, std::move(other.promise4)); + Construct(&promise5, std::move(other.promise5)); + Construct(&promise6, std::move(other.promise6)); + Construct(&promise7, std::move(other.promise7)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { @@ -1736,53 +1596,17 @@ struct JoinState { } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept - : ready(other.ready) { - if (ready.is_set(0)) { - Construct(&result0, std::move(other.result0)); - } else { - Construct(&promise0, std::move(other.promise0)); - } - if (ready.is_set(1)) { - Construct(&result1, std::move(other.result1)); - } else { - Construct(&promise1, std::move(other.promise1)); - } - if (ready.is_set(2)) { - Construct(&result2, std::move(other.result2)); - } else { - Construct(&promise2, std::move(other.promise2)); - } - if (ready.is_set(3)) { - Construct(&result3, std::move(other.result3)); - } else { - Construct(&promise3, std::move(other.promise3)); - } - if (ready.is_set(4)) { - Construct(&result4, std::move(other.result4)); - } else { - Construct(&promise4, std::move(other.promise4)); - } - if (ready.is_set(5)) { - Construct(&result5, std::move(other.result5)); - } else { - Construct(&promise5, std::move(other.promise5)); - } - if (ready.is_set(6)) { - Construct(&result6, std::move(other.result6)); - } else { - Construct(&promise6, std::move(other.promise6)); - } - if (ready.is_set(7)) { - Construct(&result7, std::move(other.result7)); - } else { - Construct(&promise7, std::move(other.promise7)); - } - if (ready.is_set(8)) { - Construct(&result8, std::move(other.result8)); - } else { - Construct(&promise8, std::move(other.promise8)); - } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); + Construct(&promise0, std::move(other.promise0)); + Construct(&promise1, std::move(other.promise1)); + Construct(&promise2, std::move(other.promise2)); + Construct(&promise3, std::move(other.promise3)); + Construct(&promise4, std::move(other.promise4)); + Construct(&promise5, std::move(other.promise5)); + Construct(&promise6, std::move(other.promise6)); + Construct(&promise7, std::move(other.promise7)); + Construct(&promise8, std::move(other.promise8)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { if (ready.is_set(0)) { diff --git a/src/core/lib/promise/detail/seq_state.h b/src/core/lib/promise/detail/seq_state.h index a4dac2445b9bc..b2b635f98bcec 100644 --- a/src/core/lib/promise/detail/seq_state.h +++ b/src/core/lib/promise/detail/seq_state.h @@ -122,23 +122,15 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); + DCHECK(state == State::kState0); Construct(&prior.current_promise, other.prior.current_promise); Construct(&prior.next_factory, other.prior.next_factory); } SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.current_promise, std::move(other.prior.current_promise)); Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -259,31 +251,19 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.current_promise, other.prior.prior.current_promise); Construct(&prior.prior.next_factory, other.prior.prior.next_factory); Construct(&prior.next_factory, other.prior.next_factory); } SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.current_promise, + std::move(other.prior.prior.current_promise)); Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail1: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -455,8 +435,9 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.current_promise, + other.prior.prior.prior.current_promise); Construct(&prior.prior.prior.next_factory, other.prior.prior.prior.next_factory); Construct(&prior.prior.next_factory, other.prior.prior.next_factory); @@ -465,30 +446,13 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.current_promise)); Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail2: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -710,8 +674,9 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.current_promise); Construct(&prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.next_factory); Construct(&prior.prior.prior.next_factory, @@ -722,37 +687,15 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail3; - case State::kState4: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.prior.current_promise)); Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail2: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail3: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -1033,8 +976,9 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.prior.current_promise); Construct(&prior.prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.prior.next_factory); Construct(&prior.prior.prior.prior.next_factory, @@ -1047,45 +991,17 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail4; - case State::kState5: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.prior.prior.current_promise)); Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail2: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail3: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail4: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -1420,8 +1336,9 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.prior.prior.current_promise); Construct(&prior.prior.prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.prior.prior.next_factory); Construct(&prior.prior.prior.prior.prior.next_factory, @@ -1436,55 +1353,21 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail4; - case State::kState5: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail5; - case State::kState6: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct( + &prior.prior.prior.prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.current_promise)); Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail2: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail3: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail4: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail5: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -1873,8 +1756,9 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.prior.prior.prior.current_promise); Construct(&prior.prior.prior.prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.prior.prior.prior.next_factory); Construct(&prior.prior.prior.prior.prior.prior.next_factory, @@ -1891,65 +1775,26 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail0; - case State::kState1: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail4; - case State::kState5: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail5; - case State::kState6: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail6; - case State::kState7: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct( + &prior.prior.prior.prior.prior.prior.prior.current_promise, + std::move( + other.prior.prior.prior.prior.prior.prior.prior.current_promise)); Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail1: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail2: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail3: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail4: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail5: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail6: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -2394,8 +2239,10 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct( + &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.prior.prior.prior.prior.current_promise); Construct( &prior.prior.prior.prior.prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.prior.prior.prior.prior.next_factory); @@ -2415,75 +2262,28 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail1; - case State::kState2: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail4; - case State::kState5: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail5; - case State::kState6: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail6; - case State::kState7: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail7; - case State::kState8: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise)); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail1: Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail2: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail3: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail4: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail5: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail6: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail7: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -2989,8 +2789,11 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct( + &prior.prior.prior.prior.prior.prior.prior.prior.prior.current_promise, + other.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise); Construct( &prior.prior.prior.prior.prior.prior.prior.prior.prior.next_factory, other.prior.prior.prior.prior.prior.prior.prior.prior.prior @@ -3014,86 +2817,33 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail2; - case State::kState3: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail4; - case State::kState5: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail5; - case State::kState6: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail6; - case State::kState7: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail7; - case State::kState8: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail8; - case State::kState9: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct( + &prior.prior.prior.prior.prior.prior.prior.prior.prior.current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise)); Construct( &prior.prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail1: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail2: Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail3: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail4: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail5: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail6: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail7: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail8: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -3660,8 +3410,11 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise, + other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior @@ -3689,97 +3442,37 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail3; - case State::kState4: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail4; - case State::kState5: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail5; - case State::kState6: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail6; - case State::kState7: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail7; - case State::kState8: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail8; - case State::kState9: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail9; - case State::kState10: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.prior.prior + .prior.prior.current_promise)); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.next_factory)); - tail1: Construct( &prior.prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail2: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail3: Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail4: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail5: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail6: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail7: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail8: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail9: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -4408,8 +4101,11 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise, + other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .prior.current_promise); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior @@ -4441,108 +4137,41 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail3; - case State::kState4: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail4; - case State::kState5: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail5; - case State::kState6: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail6; - case State::kState7: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail7; - case State::kState8: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail8; - case State::kState9: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail9; - case State::kState10: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail10; - case State::kState11: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.prior.prior + .prior.prior.prior.current_promise)); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.next_factory)); - tail2: Construct( &prior.prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail3: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail4: Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail5: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail6: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail7: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail8: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail9: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail10: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = @@ -5235,8 +4864,11 @@ struct SeqState { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&prior.current_promise, other.prior.current_promise); + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .prior.current_promise, + other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .prior.prior.current_promise); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .prior.next_factory, other.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior @@ -5272,120 +4904,45 @@ struct SeqState { SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { - case State::kState0: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.prior.current_promise)); - goto tail0; - case State::kState1: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.prior.current_promise)); - goto tail1; - case State::kState2: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.prior.current_promise)); - goto tail2; - case State::kState3: - Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .prior.prior.current_promise)); - goto tail3; - case State::kState4: - Construct( - &prior.prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail4; - case State::kState5: - Construct(&prior.prior.prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.prior.prior - .current_promise)); - goto tail5; - case State::kState6: - Construct( - &prior.prior.prior.prior.prior.prior.current_promise, - std::move( - other.prior.prior.prior.prior.prior.prior.current_promise)); - goto tail6; - case State::kState7: - Construct( - &prior.prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.prior.current_promise)); - goto tail7; - case State::kState8: - Construct(&prior.prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.prior.current_promise)); - goto tail8; - case State::kState9: - Construct(&prior.prior.prior.current_promise, - std::move(other.prior.prior.prior.current_promise)); - goto tail9; - case State::kState10: - Construct(&prior.prior.current_promise, - std::move(other.prior.prior.current_promise)); - goto tail10; - case State::kState11: - Construct(&prior.current_promise, - std::move(other.prior.current_promise)); - goto tail11; - case State::kState12: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } - tail0: + DCHECK(state == State::kState0); + Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior + .prior.current_promise, + std::move(other.prior.prior.prior.prior.prior.prior.prior.prior + .prior.prior.prior.prior.current_promise)); Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.prior.prior.next_factory)); - tail1: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.prior.next_factory)); - tail2: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .prior.prior.next_factory)); - tail3: Construct( &prior.prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail4: Construct(&prior.prior.prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.prior.prior .next_factory)); - tail5: Construct( &prior.prior.prior.prior.prior.prior.prior.next_factory, std::move( other.prior.prior.prior.prior.prior.prior.prior.next_factory)); - tail6: Construct( &prior.prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.prior.next_factory)); - tail7: Construct(&prior.prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.prior.next_factory)); - tail8: Construct(&prior.prior.prior.prior.next_factory, std::move(other.prior.prior.prior.prior.next_factory)); - tail9: Construct(&prior.prior.prior.next_factory, std::move(other.prior.prior.prior.next_factory)); - tail10: Construct(&prior.prior.next_factory, std::move(other.prior.prior.next_factory)); - tail11: Construct(&prior.next_factory, std::move(other.prior.next_factory)); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState& operator=(SeqState&& other) = diff --git a/src/core/lib/promise/for_each.h b/src/core/lib/promise/for_each.h index 62a4c8de561a6..60eb19b713ada 100644 --- a/src/core/lib/promise/for_each.h +++ b/src/core/lib/promise/for_each.h @@ -172,16 +172,13 @@ class ForEach { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Poll PollReaderNext() { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << " PollReaderNext"; - } + GRPC_TRACE_LOG(promise_primitives, INFO) << DebugTag() << " PollReaderNext"; auto r = reader_next_(); if (auto* p = r.value_if_ready()) { switch (NextValueTraits::Type(*p)) { case NextValueType::kValue: { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << " PollReaderNext: got value"; - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << " PollReaderNext: got value"; Destruct(&reader_next_); auto action = action_factory_.Make( std::move(NextValueTraits::MutableValue(*p))); @@ -190,15 +187,13 @@ class ForEach { return PollAction(); } case NextValueType::kEndOfStream: { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << " PollReaderNext: got end of stream"; - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << " PollReaderNext: got end of stream"; return Done::Make(false); } case NextValueType::kError: { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << " PollReaderNext: got error"; - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << " PollReaderNext: got error"; return Done::Make(true); } } @@ -207,9 +202,7 @@ class ForEach { } Poll PollAction() { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << " PollAction"; - } + GRPC_TRACE_LOG(promise_primitives, INFO) << DebugTag() << " PollAction"; auto r = in_action_.promise(); if (auto* p = r.value_if_ready()) { if (IsStatusOk(*p)) { diff --git a/src/core/lib/promise/inter_activity_latch.h b/src/core/lib/promise/inter_activity_latch.h index 79f68316b7115..38ef2a0aa4e81 100644 --- a/src/core/lib/promise/inter_activity_latch.h +++ b/src/core/lib/promise/inter_activity_latch.h @@ -45,9 +45,8 @@ class InterActivityLatch { auto Wait() { return [this]() -> Poll { MutexLock lock(&mu_); - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "PollWait " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "PollWait " << StateString(); if (is_set_) { return std::move(value_); } else { @@ -60,9 +59,8 @@ class InterActivityLatch { // Set the latch. void Set(T value) { MutexLock lock(&mu_); - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Set " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Set " << StateString(); is_set_ = true; value_ = std::move(value); waiters_.WakeupAsync(); @@ -102,9 +100,8 @@ class InterActivityLatch { auto Wait() { return [this]() -> Poll { MutexLock lock(&mu_); - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "PollWait " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "PollWait " << StateString(); if (is_set_) { return Empty{}; } else { @@ -117,9 +114,8 @@ class InterActivityLatch { // Set the latch. void Set() { MutexLock lock(&mu_); - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Set " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Set " << StateString(); is_set_ = true; waiters_.WakeupAsync(); } diff --git a/src/core/lib/promise/latch.h b/src/core/lib/promise/latch.h index e946cd739d525..10f4776117f93 100644 --- a/src/core/lib/promise/latch.h +++ b/src/core/lib/promise/latch.h @@ -67,9 +67,8 @@ class Latch { has_had_waiters_ = true; #endif return [this]() -> Poll { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Wait " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Wait " << StateString(); if (has_value_) { return std::move(value_); } else { @@ -85,9 +84,8 @@ class Latch { has_had_waiters_ = true; #endif return [this]() -> Poll { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "WaitAndCopy " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "WaitAndCopy " << StateString(); if (has_value_) { return value_; } else { @@ -98,9 +96,8 @@ class Latch { // Set the value of the latch. Can only be called once. void Set(T value) { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Set " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Set " << StateString(); DCHECK(!has_value_); value_ = std::move(value); has_value_ = true; @@ -161,9 +158,8 @@ class Latch { has_had_waiters_ = true; #endif return [this]() -> Poll { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "PollWait " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "PollWait " << StateString(); if (is_set_) { return Empty{}; } else { @@ -174,9 +170,8 @@ class Latch { // Set the latch. Can only be called once. void Set() { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Set " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Set " << StateString(); DCHECK(!is_set_); is_set_ = true; waiter_.Wake(); @@ -223,9 +218,8 @@ class ExternallyObservableLatch { // Produce a promise to wait for this latch. auto Wait() { return [this]() -> Poll { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "PollWait " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "PollWait " << StateString(); if (IsSet()) { return Empty{}; } else { @@ -236,9 +230,8 @@ class ExternallyObservableLatch { // Set the latch. void Set() { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Set " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Set " << StateString(); is_set_.store(true, std::memory_order_relaxed); waiter_.Wake(); } @@ -246,9 +239,8 @@ class ExternallyObservableLatch { bool IsSet() const { return is_set_.load(std::memory_order_relaxed); } void Reset() { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "Reset " << StateString(); - } + GRPC_TRACE_LOG(promise_primitives, INFO) + << DebugTag() << "Reset " << StateString(); is_set_.store(false, std::memory_order_relaxed); } diff --git a/src/core/lib/promise/party.cc b/src/core/lib/promise/party.cc index aed03da625d14..c8bde2d198f79 100644 --- a/src/core/lib/promise/party.cc +++ b/src/core/lib/promise/party.cc @@ -15,6 +15,7 @@ #include "src/core/lib/promise/party.h" #include +#include #include "absl/base/thread_annotations.h" #include "absl/log/check.h" @@ -39,7 +40,7 @@ namespace grpc_core { /////////////////////////////////////////////////////////////////////////////// // PartySyncUsingAtomics -GRPC_MUST_USE_RESULT bool PartySyncUsingAtomics::RefIfNonZero() { +GRPC_MUST_USE_RESULT bool Party::RefIfNonZero() { auto count = state_.load(std::memory_order_relaxed); do { // If zero, we are done (without an increment). If not, we must do a CAS @@ -55,33 +56,6 @@ GRPC_MUST_USE_RESULT bool PartySyncUsingAtomics::RefIfNonZero() { return true; } -bool PartySyncUsingAtomics::UnreffedLast() { - uint64_t prev_state = - state_.fetch_or(kDestroying | kLocked, std::memory_order_acq_rel); - LogStateChange("UnreffedLast", prev_state, - prev_state | kDestroying | kLocked); - return (prev_state & kLocked) == 0; -} - -bool PartySyncUsingAtomics::ScheduleWakeup(WakeupMask mask) { - // Or in the wakeup bit for the participant, AND the locked bit. - uint64_t prev_state = state_.fetch_or((mask & kWakeupMask) | kLocked, - std::memory_order_acq_rel); - LogStateChange("ScheduleWakeup", prev_state, - prev_state | (mask & kWakeupMask) | kLocked); - // If the lock was not held now we hold it, so we need to run. - return ((prev_state & kLocked) == 0); -} - -/////////////////////////////////////////////////////////////////////////////// -// PartySyncUsingMutex - -bool PartySyncUsingMutex::ScheduleWakeup(WakeupMask mask) { - MutexLock lock(&mu_); - wakeups_ |= mask; - return !std::exchange(locked_, true); -} - /////////////////////////////////////////////////////////////////////////////// // Party::Handle @@ -175,7 +149,7 @@ Party::Participant::~Participant() { Party::~Party() {} void Party::CancelRemainingParticipants() { - if (!sync_.has_participants()) return; + if ((state_.load(std::memory_order_relaxed) & kAllocatedMask) == 0) return; ScopedActivity activity(this); promise_detail::Context arena_ctx(arena_.get()); for (size_t i = 0; i < party_detail::kMaxParticipants; i++) { @@ -206,37 +180,42 @@ Waker Party::MakeNonOwningWaker() { void Party::ForceImmediateRepoll(WakeupMask mask) { DCHECK(is_current()); - sync_.ForceImmediateRepoll(mask); + wakeup_mask_ |= mask; } -void Party::RunLocked(Party* party) { +void Party::RunLockedAndUnref(Party* party, uint64_t prev_state) { GRPC_LATENT_SEE_PARENT_SCOPE("Party::RunLocked"); #ifdef GRPC_MAXIMIZE_THREADYNESS Thread thd( "RunParty", - [party]() { + [party, prev_state]() { ApplicationCallbackExecCtx app_exec_ctx; ExecCtx exec_ctx; - if (party->RunParty()) party->PartyIsOver(); + party->RunPartyAndUnref(prev_state); }, nullptr, Thread::Options().set_joinable(false)); thd.Start(); #else struct RunState; static thread_local RunState* g_run_state = nullptr; + struct PartyWakeup { + PartyWakeup() : party{nullptr} {} + PartyWakeup(Party* party, uint64_t prev_state) + : party{party}, prev_state{prev_state} {} + Party* party; + uint64_t prev_state; + }; struct RunState { - explicit RunState(Party* party) : running(party), next(nullptr) {} - Party* running; - Party* next; - void Run() { + explicit RunState(PartyWakeup first) : first{first}, next{} {} + PartyWakeup first; + PartyWakeup next; + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Run() { g_run_state = this; do { GRPC_LATENT_SEE_INNER_SCOPE("run_one_party"); - if (running->RunParty()) { - running->PartyIsOver(); - } - running = std::exchange(next, nullptr); - } while (running != nullptr); + first.party->RunPartyAndUnref(first.prev_state); + first = std::exchange(next, PartyWakeup{}); + } while (first.party != nullptr); DCHECK(g_run_state == this); g_run_state = nullptr; } @@ -245,118 +224,258 @@ void Party::RunLocked(Party* party) { // but instead add it to the end of the list of parties to run. // This enables a fairly straightforward batching of work from a // call to a transport (or back again). - if (g_run_state != nullptr) { - if (g_run_state->running == party || g_run_state->next == party) { - // Already running or already queued. + if (GPR_UNLIKELY(g_run_state != nullptr)) { + if (g_run_state->first.party == party) { + g_run_state->first.prev_state = prev_state; + party->Unref(); return; } - if (g_run_state->next != nullptr) { + if (g_run_state->next.party == party) { + g_run_state->next.prev_state = prev_state; + party->Unref(); + return; + } + if (g_run_state->next.party != nullptr) { // If there's already a different party queued, we're better off asking // event engine to run it so we can spread load. // We swap the oldest party to run on the event engine so that we don't // accidentally end up with a tail latency problem whereby one party // gets held for a really long time. - std::swap(g_run_state->next, party); + auto wakeup = + std::exchange(g_run_state->next, PartyWakeup{party, prev_state}); party->arena_->GetContext() - ->Run([party]() { + ->Run([wakeup]() { GRPC_LATENT_SEE_PARENT_SCOPE("Party::RunLocked offload"); ApplicationCallbackExecCtx app_exec_ctx; ExecCtx exec_ctx; - RunState{party}.Run(); + RunState{wakeup}.Run(); }); return; } - g_run_state->next = party; + g_run_state->next = PartyWakeup{party, prev_state}; return; } - RunState{party}.Run(); + RunState{{party, prev_state}}.Run(); #endif } -bool Party::RunParty() { +void Party::RunPartyAndUnref(uint64_t prev_state) { ScopedActivity activity(this); promise_detail::Context arena_ctx(arena_.get()); - return sync_.RunParty([this](int i) { return RunOneParticipant(i); }); -} - -bool Party::RunOneParticipant(int i) { - GRPC_LATENT_SEE_INNER_SCOPE("Party::RunOneParticipant"); - // If the participant is null, skip. - // This allows participants to complete whilst wakers still exist - // somewhere. - auto* participant = participants_[i].load(std::memory_order_acquire); - if (participant == nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - LOG(INFO) << DebugTag() << "[party] wakeup " << i << " already complete"; + DCHECK_EQ(prev_state & kLocked, 0u) + << "Party should be unlocked prior to first wakeup"; + DCHECK_GE(prev_state & kRefMask, kOneRef); + // Now update prev_state to be what we want the CAS to see below. + DCHECK_EQ(prev_state & ~(kRefMask | kAllocatedMask), 0u) + << "Party should have contained no wakeups on lock"; + prev_state |= kLocked; + for (;;) { + uint64_t keep_allocated_mask = kAllocatedMask; + // For each wakeup bit... + while (wakeup_mask_ != 0) { + auto wakeup_mask = std::exchange(wakeup_mask_, 0); + while (wakeup_mask != 0) { + const uint64_t t = LowestOneBit(wakeup_mask); + const int i = absl::countr_zero(t); + wakeup_mask ^= t; + // If the participant is null, skip. + // This allows participants to complete whilst wakers still exist + // somewhere. + auto* participant = participants_[i].load(std::memory_order_acquire); + if (GPR_UNLIKELY(participant == nullptr)) { + GRPC_TRACE_LOG(promise_primitives, INFO) + << "Party " << this << " Run:Wakeup " << i + << " already complete"; + continue; + } + GRPC_TRACE_LOG(promise_primitives, INFO) + << "Party " << this << " Run:Wakeup " << i; + // Poll the participant. + currently_polling_ = i; + if (participant->PollParticipantPromise()) { + participants_[i].store(nullptr, std::memory_order_relaxed); + const uint64_t allocated_bit = (1u << i << kAllocatedShift); + keep_allocated_mask &= ~allocated_bit; + } + } } - return false; - } - absl::string_view name; - if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) { - name = participant->name(); - LOG(INFO) << DebugTag() << "[" << name << "] begin job " << i; - } - // Poll the participant. - currently_polling_ = i; - bool done = participant->PollParticipantPromise(); - currently_polling_ = kNotPolling; - if (done) { - if (!name.empty()) { - LOG(INFO) << DebugTag() << "[" << name << "] end poll and finish job " - << i; + currently_polling_ = kNotPolling; + // Try to CAS the state we expected to have (with no wakeups or adds) + // back to unlocked (by masking in only the ref mask - sans locked bit). + // If this succeeds then no wakeups were added, no adds were added, and we + // have successfully unlocked. + // Otherwise, we need to loop again. + // Note that if an owning waker is created or the weak cas spuriously + // fails we will also loop again, but in that case see no wakeups or adds + // and so will get back here fairly quickly. + // TODO(ctiller): consider mitigations for the accidental wakeup on owning + // waker creation case -- I currently expect this will be more expensive + // than this quick loop. + if (state_.compare_exchange_weak( + prev_state, + (prev_state & (kRefMask | keep_allocated_mask)) - kOneRef, + std::memory_order_acq_rel, std::memory_order_acquire)) { + LogStateChange("Run:End", prev_state, + prev_state & (kRefMask | kAllocatedMask) - kOneRef); + if ((prev_state & kRefMask) == kOneRef) { + // We're done with the party. + PartyIsOver(); + } + return; } - participants_[i].store(nullptr, std::memory_order_relaxed); - } else if (!name.empty()) { - LOG(INFO) << DebugTag() << "[" << name << "] end poll"; + // CAS out (but retrieve) any allocations and wakeups that occurred during + // the run. + while (!state_.compare_exchange_weak( + prev_state, prev_state & (kRefMask | kLocked | keep_allocated_mask))) { + // Nothing to do here. + } + LogStateChange("Run:Continue", prev_state, + prev_state & (kRefMask | kLocked | keep_allocated_mask)); + DCHECK(prev_state & kLocked) + << "Party should be locked; prev_state=" << prev_state; + DCHECK_GE(prev_state & kRefMask, kOneRef); + // From the previous state, extract which participants we're to wakeup. + wakeup_mask_ |= prev_state & kWakeupMask; + // Now update prev_state to be what we want the CAS to see once wakeups + // complete next iteration. + prev_state &= kRefMask | kLocked | keep_allocated_mask; } - return done; } void Party::AddParticipants(Participant** participants, size_t count) { - bool run_party = sync_.AddParticipantsAndRef(count, [this, participants, - count](size_t* slots) { + uint64_t state = state_.load(std::memory_order_acquire); + uint64_t allocated; + + size_t slots[party_detail::kMaxParticipants]; + + // Find slots for each new participant, ordering them from lowest available + // slot upwards to ensure the same poll ordering as presentation ordering to + // this function. + WakeupMask wakeup_mask; + uint64_t new_state; + do { + wakeup_mask = 0; + allocated = (state & kAllocatedMask) >> kAllocatedShift; for (size_t i = 0; i < count; i++) { - if (GRPC_TRACE_FLAG_ENABLED(party_state)) { - LOG(INFO) << "Party " << &sync_ << " AddParticipant: " - << participants[i]->name() << " @ " << slots[i] - << " [participant=" << participants[i] << "]"; + auto new_mask = LowestOneBit(~allocated); + if (GPR_UNLIKELY((new_mask & kWakeupMask) == 0)) { + DelayAddParticipants(participants, count); + return; } - participants_[slots[i]].store(participants[i], std::memory_order_release); + wakeup_mask |= new_mask; + allocated |= new_mask; + slots[i] = absl::countr_zero(new_mask); } - }); - if (run_party) RunLocked(this); - Unref(); + // Try to allocate this slot and take a ref (atomically). + // Ref needs to be taken because once we store the participant it could be + // spuriously woken up and unref the party. + new_state = (state | (allocated << kAllocatedShift)) + kOneRef; + } while (!state_.compare_exchange_weak( + state, new_state, std::memory_order_acq_rel, std::memory_order_acquire)); + LogStateChange("AddParticipantsAndRef", state, new_state); + + for (size_t i = 0; i < count; i++) { + GRPC_TRACE_LOG(party_state, INFO) + << "Party " << this << " AddParticipant: " << slots[i] + << " " << participants[i]; + participants_[slots[i]].store(participants[i], std::memory_order_release); + } + + // Now we need to wake up the party. + WakeupFromState(new_state, wakeup_mask); } -void Party::Wakeup(WakeupMask wakeup_mask) { - if (sync_.ScheduleWakeup(wakeup_mask)) RunLocked(this); - Unref(); +void Party::AddParticipant(Participant* participant) { + uint64_t state = state_.load(std::memory_order_acquire); + uint64_t allocated; + size_t slot; + + // Find slots for each new participant, ordering them from lowest available + // slot upwards to ensure the same poll ordering as presentation ordering to + // this function. + uint64_t wakeup_mask; + uint64_t new_state; + do { + allocated = (state & kAllocatedMask) >> kAllocatedShift; + wakeup_mask = LowestOneBit(~allocated); + if (GPR_UNLIKELY((wakeup_mask & kWakeupMask) == 0)) { + DelayAddParticipants(&participant, 1); + return; + } + DCHECK_NE(wakeup_mask & kWakeupMask, 0u) + << "No available slots for new participant; allocated=" << allocated + << " state=" << state << " wakeup_mask=" << wakeup_mask; + allocated |= wakeup_mask; + slot = absl::countr_zero(wakeup_mask); + // Try to allocate this slot and take a ref (atomically). + // Ref needs to be taken because once we store the participant it could be + // spuriously woken up and unref the party. + new_state = (state | (allocated << kAllocatedShift)) + kOneRef; + } while (!state_.compare_exchange_weak( + state, new_state, std::memory_order_acq_rel, std::memory_order_acquire)); + LogStateChange("AddParticipantsAndRef", state, new_state); + GRPC_TRACE_LOG(party_state, INFO) + << "Party " << this << " AddParticipant: " << slot + << " [participant=" << participant << "]"; + participants_[slot].store(participant, std::memory_order_release); + // Now we need to wake up the party. + WakeupFromState(new_state, wakeup_mask); +} + +void Party::DelayAddParticipants(Participant** participants, size_t count) { + // We need to delay the addition of participants. + IncrementRefCount(); + VLOG_EVERY_N_SEC(2, 10) << "Delaying addition of " << count + << " participants to party " << this + << " because it is full."; + std::vector delayed_participants{participants, + participants + count}; + arena_->GetContext()->Run( + [this, delayed_participants = std::move(delayed_participants)]() mutable { + ApplicationCallbackExecCtx app_exec_ctx; + ExecCtx exec_ctx; + AddParticipants(delayed_participants.data(), + delayed_participants.size()); + Unref(); + }); } void Party::WakeupAsync(WakeupMask wakeup_mask) { - if (sync_.ScheduleWakeup(wakeup_mask)) { - arena_->GetContext()->Run( - [this]() { - ApplicationCallbackExecCtx app_exec_ctx; - ExecCtx exec_ctx; - RunLocked(this); - Unref(); - }); - } else { - Unref(); + // Or in the wakeup bit for the participant, AND the locked bit. + uint64_t prev_state = state_.load(std::memory_order_relaxed); + LogStateChange("ScheduleWakeup", prev_state, + prev_state | (wakeup_mask & kWakeupMask) | kLocked); + while (true) { + if ((prev_state & kLocked) == 0) { + if (state_.compare_exchange_weak(prev_state, prev_state | kLocked, + std::memory_order_acq_rel, + std::memory_order_acquire)) { + LogStateChange("WakeupAsync", prev_state, prev_state | kLocked); + wakeup_mask_ |= wakeup_mask; + arena_->GetContext()->Run( + [this, prev_state]() { + ApplicationCallbackExecCtx app_exec_ctx; + ExecCtx exec_ctx; + RunLockedAndUnref(this, prev_state); + }); + return; + } + } else { + if (state_.compare_exchange_weak( + prev_state, (prev_state | wakeup_mask) - kOneRef, + std::memory_order_acq_rel, std::memory_order_acquire)) { + LogStateChange("WakeupAsync", prev_state, prev_state | wakeup_mask); + return; + } + } } } void Party::Drop(WakeupMask) { Unref(); } void Party::PartyIsOver() { - auto arena = arena_; - { - ScopedActivity activity(this); - promise_detail::Context arena_ctx(arena_.get()); - CancelRemainingParticipants(); - arena->DestroyManagedNewObjects(); - } + CancelRemainingParticipants(); + auto arena = std::move(arena_); this->~Party(); } diff --git a/src/core/lib/promise/party.h b/src/core/lib/promise/party.h index 36544c601cd33..b42c392d51f12 100644 --- a/src/core/lib/promise/party.h +++ b/src/core/lib/promise/party.h @@ -44,25 +44,6 @@ #include "src/core/lib/resource_quota/arena.h" #include "src/core/util/useful.h" -// Two implementations of party synchronization are provided: one using a single -// atomic, the other using a mutex and a set of state variables. -// Originally the atomic implementation was implemented, but we found some race -// conditions on Arm that were not reported by our default TSAN implementation. -// The mutex implementation was added to see if it would fix the problem, and -// it did. Later we found the race condition, so there's no known reason to use -// the mutex version - however we keep it around as a just in case measure. -// There's a thought of fuzzing the two implementations against each other as -// a correctness check of both, but that's not implemented yet. - -#define GRPC_PARTY_SYNC_USING_ATOMICS -// #define GRPC_PARTY_SYNC_USING_MUTEX - -#if defined(GRPC_PARTY_SYNC_USING_ATOMICS) + \ - defined(GRPC_PARTY_SYNC_USING_MUTEX) != \ - 1 -#error Must define a party sync mechanism -#endif - namespace grpc_core { namespace party_detail { @@ -73,264 +54,6 @@ static constexpr size_t kMaxParticipants = 16; } // namespace party_detail -class PartySyncUsingAtomics { - public: - explicit PartySyncUsingAtomics(size_t initial_refs) - : state_(kOneRef * initial_refs) {} - - void IncrementRefCount() { - const uint64_t prev_state = - state_.fetch_add(kOneRef, std::memory_order_relaxed); - LogStateChange("IncrementRefCount", prev_state, prev_state + kOneRef); - } - GRPC_MUST_USE_RESULT bool RefIfNonZero(); - // Returns true if the ref count is now zero and the caller should call - // PartyIsOver - GRPC_MUST_USE_RESULT bool Unref() { - const uint64_t prev_state = - state_.fetch_sub(kOneRef, std::memory_order_acq_rel); - LogStateChange("Unref", prev_state, prev_state - kOneRef); - if ((prev_state & kRefMask) == kOneRef) { - return UnreffedLast(); - } - return false; - } - void ForceImmediateRepoll(WakeupMask mask) { - // Or in the bit for the currently polling participant. - // Will be grabbed next round to force a repoll of this promise. - const uint64_t prev_state = - state_.fetch_or(mask, std::memory_order_relaxed); - LogStateChange("ForceImmediateRepoll", prev_state, prev_state | mask); - } - - // Run the update loop: poll_one_participant is called with an integral index - // for the participant that should be polled. It should return true if the - // participant completed and should be removed from the allocated set. - template - GRPC_MUST_USE_RESULT bool RunParty(F poll_one_participant) { - // Grab the current state, and clear the wakeup bits & add flag. - uint64_t prev_state = state_.fetch_and(kRefMask | kLocked | kAllocatedMask, - std::memory_order_acquire); - LogStateChange("Run", prev_state, - prev_state & (kRefMask | kLocked | kAllocatedMask)); - CHECK(prev_state & kLocked); - if (prev_state & kDestroying) return true; - // From the previous state, extract which participants we're to wakeup. - uint64_t wakeups = prev_state & kWakeupMask; - // Now update prev_state to be what we want the CAS to see below. - prev_state &= kRefMask | kLocked | kAllocatedMask; - for (;;) { - uint64_t keep_allocated_mask = kAllocatedMask; - // For each wakeup bit... - while (wakeups != 0) { - uint64_t t = LowestOneBit(wakeups); - const int i = CountTrailingZeros(t); - wakeups ^= t; - // If the bit is not set, skip. - if (poll_one_participant(i)) { - const uint64_t allocated_bit = (1u << i << kAllocatedShift); - keep_allocated_mask &= ~allocated_bit; - } - } - // Try to CAS the state we expected to have (with no wakeups or adds) - // back to unlocked (by masking in only the ref mask - sans locked bit). - // If this succeeds then no wakeups were added, no adds were added, and we - // have successfully unlocked. - // Otherwise, we need to loop again. - // Note that if an owning waker is created or the weak cas spuriously - // fails we will also loop again, but in that case see no wakeups or adds - // and so will get back here fairly quickly. - // TODO(ctiller): consider mitigations for the accidental wakeup on owning - // waker creation case -- I currently expect this will be more expensive - // than this quick loop. - if (state_.compare_exchange_weak( - prev_state, (prev_state & (kRefMask | keep_allocated_mask)), - std::memory_order_acq_rel, std::memory_order_acquire)) { - LogStateChange("Run:End", prev_state, - prev_state & (kRefMask | kAllocatedMask)); - return false; - } - while (!state_.compare_exchange_weak( - prev_state, - prev_state & (kRefMask | kLocked | keep_allocated_mask))) { - // Nothing to do here. - } - LogStateChange("Run:Continue", prev_state, - prev_state & (kRefMask | kLocked | keep_allocated_mask)); - CHECK(prev_state & kLocked); - if (prev_state & kDestroying) return true; - // From the previous state, extract which participants we're to wakeup. - wakeups = prev_state & kWakeupMask; - // Now update prev_state to be what we want the CAS to see once wakeups - // complete next iteration. - prev_state &= kRefMask | kLocked | keep_allocated_mask; - } - return false; - } - - // Add new participants to the party. Returns true if the caller should run - // the party. store is called with an array of indices of the new - // participants. Adds a ref that should be dropped by the caller after - // RunParty has been called (if that was required). - template - GRPC_MUST_USE_RESULT bool AddParticipantsAndRef(size_t count, F store) { - uint64_t state = state_.load(std::memory_order_acquire); - uint64_t allocated; - - size_t slots[party_detail::kMaxParticipants]; - - // Find slots for each new participant, ordering them from lowest available - // slot upwards to ensure the same poll ordering as presentation ordering to - // this function. - WakeupMask wakeup_mask; - do { - wakeup_mask = 0; - allocated = (state & kAllocatedMask) >> kAllocatedShift; - for (size_t i = 0; i < count; i++) { - auto new_mask = LowestOneBit(~allocated); - wakeup_mask |= new_mask; - allocated |= new_mask; - slots[i] = CountTrailingZeros(new_mask); - } - // Try to allocate this slot and take a ref (atomically). - // Ref needs to be taken because once we store the participant it could be - // spuriously woken up and unref the party. - } while (!state_.compare_exchange_weak( - state, (state | (allocated << kAllocatedShift)) + kOneRef, - std::memory_order_acq_rel, std::memory_order_acquire)); - LogStateChange("AddParticipantsAndRef", state, - (state | (allocated << kAllocatedShift)) + kOneRef); - - store(slots); - - // Now we need to wake up the party. - state = state_.fetch_or(wakeup_mask | kLocked, std::memory_order_release); - LogStateChange("AddParticipantsAndRef:Wakeup", state, - state | wakeup_mask | kLocked); - - // If the party was already locked, we're done. - return ((state & kLocked) == 0); - } - - // Schedule a wakeup for the given participant. - // Returns true if the caller should run the party. - GRPC_MUST_USE_RESULT bool ScheduleWakeup(WakeupMask mask); - - bool has_participants() const { - return (state_.load(std::memory_order_relaxed) & kAllocatedMask) != 0; - } - - private: - bool UnreffedLast(); - - void LogStateChange(const char* op, uint64_t prev_state, uint64_t new_state, - DebugLocation loc = {}) { - if (GRPC_TRACE_FLAG_ENABLED(party_state)) { - LOG(INFO).AtLocation(loc.file(), loc.line()) - << absl::StrFormat("Party %p %30s: %016" PRIx64 " -> %016" PRIx64, - this, op, prev_state, new_state); - } - } - - // State bits: - // The atomic state_ field is composed of the following: - // - 24 bits for ref counts - // 1 is owned by the party prior to Orphan() - // All others are owned by owning wakers - // - 1 bit to indicate whether the party is locked - // The first thread to set this owns the party until it is unlocked - // That thread will run the main loop until no further work needs to - // be done. - // - 1 bit to indicate whether there are participants waiting to be - // added - // - 16 bits, one per participant, indicating which participants have - // been - // woken up and should be polled next time the main loop runs. - - // clang-format off - // Bits used to store 16 bits of wakeups - static constexpr uint64_t kWakeupMask = 0x0000'0000'0000'ffff; - // Bits used to store 16 bits of allocated participant slots. - static constexpr uint64_t kAllocatedMask = 0x0000'0000'ffff'0000; - // Bit indicating destruction has begun (refs went to zero) - static constexpr uint64_t kDestroying = 0x0000'0001'0000'0000; - // Bit indicating locked or not - static constexpr uint64_t kLocked = 0x0000'0008'0000'0000; - // Bits used to store 24 bits of ref counts - static constexpr uint64_t kRefMask = 0xffff'ff00'0000'0000; - // clang-format on - - // Shift to get from a participant mask to an allocated mask. - static constexpr size_t kAllocatedShift = 16; - // How far to shift to get the refcount - static constexpr size_t kRefShift = 40; - // One ref count - static constexpr uint64_t kOneRef = 1ull << kRefShift; - - std::atomic state_; -}; - -class PartySyncUsingMutex { - public: - explicit PartySyncUsingMutex(size_t initial_refs) : refs_(initial_refs) {} - - void IncrementRefCount() { refs_.Ref(); } - GRPC_MUST_USE_RESULT bool RefIfNonZero() { return refs_.RefIfNonZero(); } - GRPC_MUST_USE_RESULT bool Unref() { return refs_.Unref(); } - void ForceImmediateRepoll(WakeupMask mask) { - MutexLock lock(&mu_); - wakeups_ |= mask; - } - template - GRPC_MUST_USE_RESULT bool RunParty(F poll_one_participant) { - WakeupMask freed = 0; - while (true) { - ReleasableMutexLock lock(&mu_); - CHECK(locked_); - allocated_ &= ~std::exchange(freed, 0); - auto wakeup = std::exchange(wakeups_, 0); - if (wakeup == 0) { - locked_ = false; - return false; - } - lock.Release(); - for (size_t i = 0; wakeup != 0; i++, wakeup >>= 1) { - if ((wakeup & 1) == 0) continue; - if (poll_one_participant(i)) freed |= 1 << i; - } - } - } - - template - GRPC_MUST_USE_RESULT bool AddParticipantsAndRef(size_t count, F store) { - IncrementRefCount(); - MutexLock lock(&mu_); - size_t slots[party_detail::kMaxParticipants]; - WakeupMask wakeup_mask = 0; - size_t n = 0; - for (size_t bit = 0; n < count && bit < party_detail::kMaxParticipants; - bit++) { - if (allocated_ & (1 << bit)) continue; - slots[n++] = bit; - wakeup_mask |= 1 << bit; - allocated_ |= 1 << bit; - } - CHECK(n == count); - store(slots); - wakeups_ |= wakeup_mask; - return !std::exchange(locked_, true); - } - - GRPC_MUST_USE_RESULT bool ScheduleWakeup(WakeupMask mask); - - private: - RefCount refs_; - Mutex mu_; - WakeupMask allocated_ ABSL_GUARDED_BY(mu_) = 0; - WakeupMask wakeups_ ABSL_GUARDED_BY(mu_) = 0; - bool locked_ ABSL_GUARDED_BY(mu_) = false; -}; - // A Party is an Activity with multiple participant promises. class Party : public Activity, private Wakeable { private: @@ -340,7 +63,6 @@ class Party : public Activity, private Wakeable { // One participant in the party. class Participant { public: - explicit Participant(absl::string_view name) : name_(name) {} // Poll the participant. Return true if complete. // Participant should take care of its own deallocation in this case. virtual bool PollParticipantPromise() = 0; @@ -351,14 +73,11 @@ class Party : public Activity, private Wakeable { // Return a Handle instance for this participant. Wakeable* MakeNonOwningWakeable(Party* party); - absl::string_view name() const { return name_; } - protected: ~Participant(); private: Handle* handle_ = nullptr; - absl::string_view name_; }; public: @@ -400,10 +119,17 @@ class Party : public Activity, private Wakeable { Waker MakeNonOwningWaker() final; std::string ActivityDebugTag(WakeupMask wakeup_mask) const final; - void IncrementRefCount() { sync_.IncrementRefCount(); } - void Unref() { - if (sync_.Unref()) PartyIsOver(); + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void IncrementRefCount() { + const uint64_t prev_state = + state_.fetch_add(kOneRef, std::memory_order_relaxed); + LogStateChange("IncrementRefCount", prev_state, prev_state + kOneRef); + } + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Unref() { + uint64_t prev_state = state_.fetch_sub(kOneRef, std::memory_order_acq_rel); + LogStateChange("Unref", prev_state, prev_state - kOneRef); + if ((prev_state & kRefMask) == kOneRef) PartyIsOver(); } + RefCountedPtr Ref() { IncrementRefCount(); return RefCountedPtr(this); @@ -432,17 +158,15 @@ class Party : public Activity, private Wakeable { friend class Arena; // Derived types should be constructed upon `arena`. - explicit Party(RefCountedPtr arena) - : sync_(1), arena_(std::move(arena)) {} + explicit Party(RefCountedPtr arena) : arena_(std::move(arena)) {} ~Party() override; // Main run loop. Must be locked. // Polls participants and drains the add queue until there is no work left to // be done. - // Returns true if the party is over. - GRPC_MUST_USE_RESULT bool RunParty(); + void RunPartyAndUnref(uint64_t prev_state); - bool RefIfNonZero() { return sync_.RefIfNonZero(); } + bool RefIfNonZero(); private: // Concrete implementation of a participant for some promise & oncomplete @@ -453,9 +177,9 @@ class Party : public Activity, private Wakeable { using Promise = typename Factory::Promise; public: - ParticipantImpl(absl::string_view name, SuppliedFactory promise_factory, + ParticipantImpl(absl::string_view, SuppliedFactory promise_factory, OnComplete on_complete) - : Participant(name), on_complete_(std::move(on_complete)) { + : on_complete_(std::move(on_complete)) { Construct(&factory_, std::move(promise_factory)); } ~ParticipantImpl() { @@ -503,9 +227,7 @@ class Party : public Activity, private Wakeable { using Result = typename Promise::Result; public: - PromiseParticipantImpl(absl::string_view name, - SuppliedFactory promise_factory) - : Participant(name) { + PromiseParticipantImpl(absl::string_view, SuppliedFactory promise_factory) { Construct(&factory_, std::move(promise_factory)); } @@ -576,38 +298,113 @@ class Party : public Activity, private Wakeable { std::atomic state_{State::kFactory}; }; + // State bits: + // The atomic state_ field is composed of the following: + // - 24 bits for ref counts + // 1 is owned by the party prior to Orphan() + // All others are owned by owning wakers + // - 1 bit to indicate whether the party is locked + // The first thread to set this owns the party until it is unlocked + // That thread will run the main loop until no further work needs to + // be done. + // - 1 bit to indicate whether there are participants waiting to be + // added + // - 16 bits, one per participant, indicating which participants have + // been + // woken up and should be polled next time the main loop runs. + + // clang-format off + // Bits used to store 16 bits of wakeups + static constexpr uint64_t kWakeupMask = 0x0000'0000'0000'ffff; + // Bits used to store 16 bits of allocated participant slots. + static constexpr uint64_t kAllocatedMask = 0x0000'0000'ffff'0000; + // Bit indicating locked or not + static constexpr uint64_t kLocked = 0x0000'0008'0000'0000; + // Bits used to store 24 bits of ref counts + static constexpr uint64_t kRefMask = 0xffff'ff00'0000'0000; + // clang-format on + + // Shift to get from a participant mask to an allocated mask. + static constexpr size_t kAllocatedShift = 16; + // How far to shift to get the refcount + static constexpr size_t kRefShift = 40; + // One ref count + static constexpr uint64_t kOneRef = 1ull << kRefShift; + // Destroy any remaining participants. // Needs to have normal context setup before calling. void CancelRemainingParticipants(); // Run the locked part of the party until it is unlocked. - static void RunLocked(Party* party); + static void RunLockedAndUnref(Party* party, uint64_t prev_state); // Called in response to Unref() hitting zero - ultimately calls PartyOver, // but needs to set some stuff up. // Here so it gets compiled out of line. void PartyIsOver(); // Wakeable implementation - void Wakeup(WakeupMask wakeup_mask) final; + void Wakeup(WakeupMask wakeup_mask) final { + if (Activity::current() == this) { + wakeup_mask_ |= wakeup_mask; + Unref(); + return; + } + WakeupFromState(state_.load(std::memory_order_relaxed), wakeup_mask); + } + + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void WakeupFromState( + uint64_t cur_state, WakeupMask wakeup_mask) { + DCHECK_NE(wakeup_mask & kWakeupMask, 0u) + << "Wakeup mask must be non-zero: " << wakeup_mask; + while (true) { + if (cur_state & kLocked) { + // If the party is locked, we need to set the wakeup bits, and then + // we'll immediately unref. Since something is running this should never + // bring the refcount to zero. + DCHECK_GT(cur_state & kRefMask, kOneRef); + auto new_state = (cur_state | wakeup_mask) - kOneRef; + if (state_.compare_exchange_weak(cur_state, new_state, + std::memory_order_release)) { + LogStateChange("Wakeup", cur_state, cur_state | wakeup_mask); + return; + } + } else { + // If the party is not locked, we need to lock it and run. + DCHECK_EQ(cur_state & kWakeupMask, 0u); + if (state_.compare_exchange_weak(cur_state, cur_state | kLocked, + std::memory_order_acq_rel)) { + LogStateChange("WakeupAndRun", cur_state, cur_state | kLocked); + wakeup_mask_ |= wakeup_mask; + RunLockedAndUnref(this, cur_state); + return; + } + } + } + } + void WakeupAsync(WakeupMask wakeup_mask) final; void Drop(WakeupMask wakeup_mask) final; // Add a participant (backs Spawn, after type erasure to ParticipantFactory). void AddParticipants(Participant** participant, size_t count); - bool RunOneParticipant(int i); + void AddParticipant(Participant* participant); + void DelayAddParticipants(Participant** participant, size_t count); + + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void LogStateChange( + const char* op, uint64_t prev_state, uint64_t new_state, + DebugLocation loc = {}) { + GRPC_TRACE_LOG(party_state, INFO).AtLocation(loc.file(), loc.line()) + << DebugTag() << " " << op << " " + << absl::StrFormat("%016" PRIx64 " -> %016" PRIx64, prev_state, + new_state); + } // Sentinal value for currently_polling_ when no participant is being polled. static constexpr uint8_t kNotPolling = 255; -#ifdef GRPC_PARTY_SYNC_USING_ATOMICS - PartySyncUsingAtomics sync_; -#elif defined(GRPC_PARTY_SYNC_USING_MUTEX) - PartySyncUsingMutex sync_; -#else -#error No synchronization method defined -#endif - + std::atomic state_{kOneRef}; uint8_t currently_polling_ = kNotPolling; + WakeupMask wakeup_mask_ = 0; // All current participants, using a tagged format. // If the lower bit is unset, then this is a Participant*. // If the lower bit is set, then this is a ParticipantFactory*. @@ -633,8 +430,8 @@ void Party::BulkSpawner::Spawn(absl::string_view name, Factory promise_factory, template void Party::Spawn(absl::string_view name, Factory promise_factory, OnComplete on_complete) { - BulkSpawner(this).Spawn(name, std::move(promise_factory), - std::move(on_complete)); + AddParticipant(new ParticipantImpl( + name, std::move(promise_factory), std::move(on_complete))); } template @@ -642,7 +439,7 @@ auto Party::SpawnWaitable(absl::string_view name, Factory promise_factory) { auto participant = MakeRefCounted>( name, std::move(promise_factory)); Participant* p = participant->Ref().release(); - AddParticipants(&p, 1); + AddParticipant(p); return [participant = std::move(participant)]() mutable { return participant->PollCompletion(); }; diff --git a/src/core/lib/resource_quota/arena.h b/src/core/lib/resource_quota/arena.h index ab68f84f4822b..c80528fa39f3c 100644 --- a/src/core/lib/resource_quota/arena.h +++ b/src/core/lib/resource_quota/arena.h @@ -247,6 +247,11 @@ class Arena final : public RefCounted(new T(std::forward(args)...), PooledDeleter()); } + template + static PoolPtr MakePooledForOverwrite() { + return PoolPtr(new T, PooledDeleter()); + } + // Make a unique_ptr to an array of T that is allocated from the arena. // When the pointer is released, the memory may be reused for other // MakePooled(.*) calls. diff --git a/src/core/lib/resource_quota/memory_quota.cc b/src/core/lib/resource_quota/memory_quota.cc index a4841a2542c70..29b3a581a92b8 100644 --- a/src/core/lib/resource_quota/memory_quota.cc +++ b/src/core/lib/resource_quota/memory_quota.cc @@ -355,9 +355,8 @@ void GrpcMemoryAllocatorImpl::MaybeDonateBack() { if (free_bytes_.compare_exchange_weak(free, new_free, std::memory_order_acq_rel, std::memory_order_acquire)) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "[" << this << "] Early return " << ret << " bytes"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "[" << this << "] Early return " << ret << " bytes"; CHECK(taken_bytes_.fetch_sub(ret, std::memory_order_relaxed) >= ret); memory_quota_->Return(ret); return; @@ -548,9 +547,7 @@ void BasicMemoryQuota::Return(size_t amount) { } void BasicMemoryQuota::AddNewAllocator(GrpcMemoryAllocatorImpl* allocator) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "Adding allocator " << allocator; - } + GRPC_TRACE_LOG(resource_quota, INFO) << "Adding allocator " << allocator; AllocatorBucket::Shard& shard = small_allocators_.SelectShard(allocator); @@ -561,9 +558,7 @@ void BasicMemoryQuota::AddNewAllocator(GrpcMemoryAllocatorImpl* allocator) { } void BasicMemoryQuota::RemoveAllocator(GrpcMemoryAllocatorImpl* allocator) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "Removing allocator " << allocator; - } + GRPC_TRACE_LOG(resource_quota, INFO) << "Removing allocator " << allocator; AllocatorBucket::Shard& small_shard = small_allocators_.SelectShard(allocator); @@ -608,9 +603,8 @@ void BasicMemoryQuota::MaybeMoveAllocator(GrpcMemoryAllocatorImpl* allocator, void BasicMemoryQuota::MaybeMoveAllocatorBigToSmall( GrpcMemoryAllocatorImpl* allocator) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "Moving allocator " << allocator << " to small"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "Moving allocator " << allocator << " to small"; AllocatorBucket::Shard& old_shard = big_allocators_.SelectShard(allocator); @@ -629,9 +623,8 @@ void BasicMemoryQuota::MaybeMoveAllocatorBigToSmall( void BasicMemoryQuota::MaybeMoveAllocatorSmallToBig( GrpcMemoryAllocatorImpl* allocator) { - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "Moving allocator " << allocator << " to big"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "Moving allocator " << allocator << " to big"; AllocatorBucket::Shard& old_shard = small_allocators_.SelectShard(allocator); @@ -766,10 +759,9 @@ double PressureTracker::AddSampleAndGetControlValue(double sample) { } else { report = controller_.Update(current_estimate - kSetPoint); } - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "RQ: pressure:" << current_estimate << " report:" << report - << " controller:" << controller_.DebugString(); - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "RQ: pressure:" << current_estimate << " report:" << report + << " controller:" << controller_.DebugString(); report_.store(report, std::memory_order_relaxed); }); return report_.load(std::memory_order_relaxed); diff --git a/src/core/lib/resource_quota/memory_quota.h b/src/core/lib/resource_quota/memory_quota.h index ac06ae9eb8fe0..f1281cc5bac68 100644 --- a/src/core/lib/resource_quota/memory_quota.h +++ b/src/core/lib/resource_quota/memory_quota.h @@ -425,10 +425,8 @@ class GrpcMemoryAllocatorImpl final : public EventEngineMemoryAllocatorImpl { void ReturnFree() { size_t ret = free_bytes_.exchange(0, std::memory_order_acq_rel); if (ret == 0) return; - if (GRPC_TRACE_FLAG_ENABLED(resource_quota)) { - LOG(INFO) << "Allocator " << this << " returning " << ret - << " bytes to quota"; - } + GRPC_TRACE_LOG(resource_quota, INFO) + << "Allocator " << this << " returning " << ret << " bytes to quota"; taken_bytes_.fetch_sub(ret, std::memory_order_relaxed); memory_quota_->Return(ret); memory_quota_->MaybeMoveAllocator(this, /*old_free_bytes=*/ret, diff --git a/src/core/lib/resource_quota/periodic_update.cc b/src/core/lib/resource_quota/periodic_update.cc index a722f2c568fd0..b4874fea1da32 100644 --- a/src/core/lib/resource_quota/periodic_update.cc +++ b/src/core/lib/resource_quota/periodic_update.cc @@ -56,9 +56,8 @@ bool PeriodicUpdate::MaybeEndPeriod(absl::FunctionRef f) { // Store the remainder left. Note that updates_remaining_ may have been // decremented by another thread whilst we performed the above calculations: // we simply discard those decrements. - auto remaining = better_guess - expected_updates_per_period_; - expected_updates_per_period_ = better_guess; - updates_remaining_.store(remaining, std::memory_order_release); + updates_remaining_.store(better_guess - expected_updates_per_period_, + std::memory_order_release); // Not quite done, return, try for longer. return false; } diff --git a/src/core/lib/security/authorization/grpc_authorization_policy_provider.cc b/src/core/lib/security/authorization/grpc_authorization_policy_provider.cc index cefe2d6db374a..4380e09086a3d 100644 --- a/src/core/lib/security/authorization/grpc_authorization_policy_provider.cc +++ b/src/core/lib/security/authorization/grpc_authorization_policy_provider.cc @@ -167,11 +167,10 @@ absl::Status FileWatcherAuthorizationPolicyProvider::ForceUpdate() { if (cb_ != nullptr) { cb_(contents_changed, absl::OkStatus()); } - if (GRPC_TRACE_FLAG_ENABLED(grpc_authz_api)) { - LOG(INFO) << "authorization policy reload status: successfully loaded new " - "policy\n" - << file_contents_; - } + GRPC_TRACE_LOG(grpc_authz_api, INFO) + << "authorization policy reload status: successfully loaded new " + "policy\n" + << file_contents_; return absl::OkStatus(); } diff --git a/src/core/lib/security/authorization/grpc_server_authz_filter.cc b/src/core/lib/security/authorization/grpc_server_authz_filter.cc index 938bce2f40814..c83d1cc50a7fd 100644 --- a/src/core/lib/security/authorization/grpc_server_authz_filter.cc +++ b/src/core/lib/security/authorization/grpc_server_authz_filter.cc @@ -77,10 +77,9 @@ bool GrpcServerAuthzFilter::IsAuthorized(ClientMetadata& initial_metadata) { AuthorizationEngine::Decision decision = engines.deny_engine->Evaluate(args); if (decision.type == AuthorizationEngine::Decision::Type::kDeny) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_authz_api)) { - LOG(INFO) << "chand=" << this << ": request denied by policy " - << decision.matching_policy_name; - } + GRPC_TRACE_LOG(grpc_authz_api, INFO) + << "chand=" << this << ": request denied by policy " + << decision.matching_policy_name; return false; } } @@ -95,10 +94,8 @@ bool GrpcServerAuthzFilter::IsAuthorized(ClientMetadata& initial_metadata) { return true; } } - if (GRPC_TRACE_FLAG_ENABLED(grpc_authz_api)) { - LOG(INFO) << "chand=" << this - << ": request denied, no matching policy found."; - } + GRPC_TRACE_LOG(grpc_authz_api, INFO) + << "chand=" << this << ": request denied, no matching policy found."; return false; } diff --git a/src/core/lib/security/context/security_context.cc b/src/core/lib/security/context/security_context.cc index 4355427b1448f..feade8cd9ddc1 100644 --- a/src/core/lib/security/context/security_context.cc +++ b/src/core/lib/security/context/security_context.cc @@ -37,7 +37,6 @@ #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" // --- grpc_call --- @@ -46,8 +45,8 @@ grpc_call_error grpc_call_set_credentials(grpc_call* call, grpc_call_credentials* creds) { grpc_core::ExecCtx exec_ctx; grpc_client_security_context* ctx = nullptr; - GRPC_API_TRACE("grpc_call_set_credentials(call=%p, creds=%p)", 2, - (call, creds)); + GRPC_TRACE_LOG(api, INFO) << "grpc_call_set_credentials(call=" << call + << ", creds=" << creds << ")"; if (!grpc_call_is_client(call)) { LOG(ERROR) << "Method is client-side only."; return GRPC_CALL_ERROR_NOT_ON_SERVER; @@ -68,7 +67,7 @@ grpc_call_error grpc_call_set_credentials(grpc_call* call, grpc_auth_context* grpc_call_auth_context(grpc_call* call) { auto* sec_ctx = grpc_call_get_arena(call)->GetContext(); - GRPC_API_TRACE("grpc_call_auth_context(call=%p)", 1, (call)); + GRPC_TRACE_LOG(api, INFO) << "grpc_call_auth_context(call=" << call << ")"; if (sec_ctx == nullptr) return nullptr; if (grpc_call_is_client(call)) { auto* sc = grpc_core::DownCast(sec_ctx); @@ -92,7 +91,8 @@ grpc_auth_context* grpc_call_auth_context(grpc_call* call) { } void grpc_auth_context_release(grpc_auth_context* context) { - GRPC_API_TRACE("grpc_auth_context_release(context=%p)", 1, (context)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_release(context=" << context << ")"; if (context == nullptr) return; context->Unref(DEBUG_LOCATION, "grpc_auth_context_unref"); } @@ -142,8 +142,8 @@ static grpc_auth_property_iterator empty_iterator = {nullptr, 0, nullptr}; const char* grpc_auth_context_peer_identity_property_name( const grpc_auth_context* ctx) { - GRPC_API_TRACE("grpc_auth_context_peer_identity_property_name(ctx=%p)", 1, - (ctx)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_peer_identity_property_name(ctx=" << ctx << ")"; return ctx->peer_identity_property_name(); } @@ -152,9 +152,9 @@ int grpc_auth_context_set_peer_identity_property_name(grpc_auth_context* ctx, grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(ctx, name); const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it); - GRPC_API_TRACE( - "grpc_auth_context_set_peer_identity_property_name(ctx=%p, name=%s)", 2, - (ctx, name)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_set_peer_identity_property_name(ctx=" << ctx + << ", name=" << name << ")"; if (prop == nullptr) { LOG(ERROR) << "Property name " << (name != nullptr ? name : "NULL") << " not found in auth context."; @@ -165,14 +165,16 @@ int grpc_auth_context_set_peer_identity_property_name(grpc_auth_context* ctx, } int grpc_auth_context_peer_is_authenticated(const grpc_auth_context* ctx) { - GRPC_API_TRACE("grpc_auth_context_peer_is_authenticated(ctx=%p)", 1, (ctx)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_peer_is_authenticated(ctx=" << ctx << ")"; return ctx->is_authenticated(); } grpc_auth_property_iterator grpc_auth_context_property_iterator( const grpc_auth_context* ctx) { grpc_auth_property_iterator it = empty_iterator; - GRPC_API_TRACE("grpc_auth_context_property_iterator(ctx=%p)", 1, (ctx)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_property_iterator(ctx=" << ctx << ")"; if (ctx == nullptr) return it; it.ctx = ctx; return it; @@ -180,7 +182,8 @@ grpc_auth_property_iterator grpc_auth_context_property_iterator( const grpc_auth_property* grpc_auth_property_iterator_next( grpc_auth_property_iterator* it) { - GRPC_API_TRACE("grpc_auth_property_iterator_next(it=%p)", 1, (it)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_property_iterator_next(it=" << it << ")"; if (it == nullptr || it->ctx == nullptr) return nullptr; while (it->index == it->ctx->properties().count) { if (it->ctx->chained() == nullptr) return nullptr; @@ -206,8 +209,9 @@ const grpc_auth_property* grpc_auth_property_iterator_next( grpc_auth_property_iterator grpc_auth_context_find_properties_by_name( const grpc_auth_context* ctx, const char* name) { grpc_auth_property_iterator it = empty_iterator; - GRPC_API_TRACE("grpc_auth_context_find_properties_by_name(ctx=%p, name=%s)", - 2, (ctx, name)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_find_properties_by_name(ctx=" << ctx + << ", name=" << name << ")"; if (ctx == nullptr || name == nullptr) return empty_iterator; it.ctx = ctx; it.name = name; @@ -216,7 +220,8 @@ grpc_auth_property_iterator grpc_auth_context_find_properties_by_name( grpc_auth_property_iterator grpc_auth_context_peer_identity( const grpc_auth_context* ctx) { - GRPC_API_TRACE("grpc_auth_context_peer_identity(ctx=%p)", 1, (ctx)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_peer_identity(ctx=" << ctx << ")"; if (ctx == nullptr) return empty_iterator; return grpc_auth_context_find_properties_by_name( ctx, ctx->peer_identity_property_name()); @@ -246,12 +251,11 @@ void grpc_auth_context::add_property(const char* name, const char* value, void grpc_auth_context_add_property(grpc_auth_context* ctx, const char* name, const char* value, size_t value_length) { - GRPC_API_TRACE( + GRPC_TRACE_LOG(api, INFO) << absl::StrFormat( "grpc_auth_context_add_property(ctx=%p, name=%s, value=%*.*s, " "value_length=%lu)", - 6, - (ctx, name, (int)value_length, (int)value_length, value, - (unsigned long)value_length)); + ctx, name, (int)value_length, (int)value_length, value, + (unsigned long)value_length); ctx->add_property(name, value, value_length); } @@ -267,9 +271,9 @@ void grpc_auth_context::add_cstring_property(const char* name, void grpc_auth_context_add_cstring_property(grpc_auth_context* ctx, const char* name, const char* value) { - GRPC_API_TRACE( - "grpc_auth_context_add_cstring_property(ctx=%p, name=%s, value=%s)", 3, - (ctx, name, value)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_auth_context_add_cstring_property(ctx=" << ctx + << ", name=" << name << ", value=" << value << ")"; ctx->add_cstring_property(name, value); } diff --git a/src/core/lib/security/credentials/alts/check_gcp_environment.cc b/src/core/lib/security/credentials/alts/check_gcp_environment.cc index ff7ce1e33bf2c..50406fb8a54d3 100644 --- a/src/core/lib/security/credentials/alts/check_gcp_environment.cc +++ b/src/core/lib/security/credentials/alts/check_gcp_environment.cc @@ -58,7 +58,7 @@ namespace internal { char* read_bios_file(const char* bios_file) { FILE* fp = fopen(bios_file, "r"); if (!fp) { - LOG(INFO) << "BIOS data file does not exist or cannot be opened."; + VLOG(2) << "BIOS data file does not exist or cannot be opened."; return nullptr; } char buf[kBiosDataBufferSize + 1]; diff --git a/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc b/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc index 9174d3017995a..d9078a4c81a43 100644 --- a/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +++ b/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc @@ -26,7 +26,7 @@ #include "src/core/lib/security/credentials/alts/check_gcp_environment.h" bool grpc_alts_is_running_on_gcp() { - LOG(INFO) << "ALTS: Platforms other than Linux and Windows are not supported"; + VLOG(2) << "ALTS: Platforms other than Linux and Windows are not supported"; return false; } diff --git a/src/core/lib/security/credentials/composite/composite_credentials.cc b/src/core/lib/security/credentials/composite/composite_credentials.cc index 0684012e7968d..016565ceaa7be 100644 --- a/src/core/lib/security/credentials/composite/composite_credentials.cc +++ b/src/core/lib/security/credentials/composite/composite_credentials.cc @@ -32,7 +32,6 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/promise/try_seq.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/metadata_batch.h" // @@ -127,10 +126,9 @@ composite_call_credentials_create( grpc_call_credentials* grpc_composite_call_credentials_create( grpc_call_credentials* creds1, grpc_call_credentials* creds2, void* reserved) { - GRPC_API_TRACE( - "grpc_composite_call_credentials_create(creds1=%p, creds2=%p, " - "reserved=%p)", - 3, (creds1, creds2, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_composite_call_credentials_create(creds1=" << creds1 + << ", creds2=" << creds2 << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); CHECK_NE(creds1, nullptr); CHECK_NE(creds2, nullptr); @@ -163,10 +161,10 @@ grpc_channel_credentials* grpc_composite_channel_credentials_create( void* reserved) { CHECK(channel_creds != nullptr && call_creds != nullptr && reserved == nullptr); - GRPC_API_TRACE( - "grpc_composite_channel_credentials_create(channel_creds=%p, " - "call_creds=%p, reserved=%p)", - 3, (channel_creds, call_creds, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_composite_channel_credentials_create(channel_creds=" + << channel_creds << ", call_creds=" << call_creds + << ", reserved=" << reserved << ")"; return new grpc_composite_channel_credentials(channel_creds->Ref(), call_creds->Ref()); } diff --git a/src/core/lib/security/credentials/credentials.cc b/src/core/lib/security/credentials/credentials.cc index 1152cfe68df28..6cdb1399ce55a 100644 --- a/src/core/lib/security/credentials/credentials.cc +++ b/src/core/lib/security/credentials/credentials.cc @@ -30,19 +30,20 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/util/useful.h" // -- Common. -- void grpc_channel_credentials_release(grpc_channel_credentials* creds) { - GRPC_API_TRACE("grpc_channel_credentials_release(creds=%p)", 1, (creds)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_credentials_release(creds=" << creds << ")"; grpc_core::ExecCtx exec_ctx; if (creds) creds->Unref(); } void grpc_call_credentials_release(grpc_call_credentials* creds) { - GRPC_API_TRACE("grpc_call_credentials_release(creds=%p)", 1, (creds)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_credentials_release(creds=" << creds << ")"; grpc_core::ExecCtx exec_ctx; if (creds) creds->Unref(); } @@ -95,18 +96,19 @@ grpc_channel_credentials* grpc_channel_credentials_find_in_args( } void grpc_server_credentials_release(grpc_server_credentials* creds) { - GRPC_API_TRACE("grpc_server_credentials_release(creds=%p)", 1, (creds)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_credentials_release(creds=" << creds << ")"; grpc_core::ExecCtx exec_ctx; if (creds) creds->Unref(); } void grpc_server_credentials::set_auth_metadata_processor( const grpc_auth_metadata_processor& processor) { - GRPC_API_TRACE( - "grpc_server_credentials_set_auth_metadata_processor(" - "creds=%p, " - "processor=grpc_auth_metadata_processor { process: %p, state: %p })", - 3, (this, (void*)(intptr_t)processor.process, processor.state)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_credentials_set_auth_metadata_processor(creds=" << this + << ", processor=grpc_auth_metadata_processor { process: " + << (void*)(intptr_t)processor.process << ", state: " << processor.state + << " })"; DestroyProcessor(); processor_ = processor; } diff --git a/src/core/lib/security/credentials/google_default/google_default_credentials.cc b/src/core/lib/security/credentials/google_default/google_default_credentials.cc index a7e6070e78835..3fa306cae56bd 100644 --- a/src/core/lib/security/credentials/google_default/google_default_credentials.cc +++ b/src/core/lib/security/credentials/google_default/google_default_credentials.cc @@ -63,7 +63,6 @@ #include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h" #include "src/core/lib/slice/slice.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/error_utils.h" #include "src/core/lib/uri/uri_parser.h" #include "src/core/load_balancing/grpclb/grpclb.h" @@ -385,8 +384,8 @@ grpc_channel_credentials* grpc_google_default_credentials_create( grpc_error_handle error; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_google_default_credentials_create(%p)", 1, - (call_credentials)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_google_default_credentials_create(" << call_credentials << ")"; if (call_creds == nullptr) { call_creds = make_default_call_creds(&error); diff --git a/src/core/lib/security/credentials/iam/iam_credentials.cc b/src/core/lib/security/credentials/iam/iam_credentials.cc index c6be5fe88651c..76e54d3dd80b0 100644 --- a/src/core/lib/security/credentials/iam/iam_credentials.cc +++ b/src/core/lib/security/credentials/iam/iam_credentials.cc @@ -34,7 +34,6 @@ #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/promise/promise.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/metadata_batch.h" grpc_core::ArenaPromise> @@ -70,10 +69,9 @@ grpc_core::UniqueTypeName grpc_google_iam_credentials::Type() { grpc_call_credentials* grpc_google_iam_credentials_create( const char* token, const char* authority_selector, void* reserved) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_iam_credentials_create(token=%s, authority_selector=%s, " - "reserved=%p)", - 3, (token, authority_selector, reserved)); + GRPC_TRACE_LOG(api, INFO) << "grpc_iam_credentials_create(token=" << token + << ", authority_selector=" << authority_selector + << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); CHECK_NE(token, nullptr); CHECK_NE(authority_selector, nullptr); diff --git a/src/core/lib/security/credentials/jwt/json_token.cc b/src/core/lib/security/credentials/jwt/json_token.cc index 0c81efb669034..64c0f425985fd 100644 --- a/src/core/lib/security/credentials/jwt/json_token.cc +++ b/src/core/lib/security/credentials/jwt/json_token.cc @@ -190,7 +190,7 @@ static char* encoded_jwt_claim(const grpc_auth_json_key* json_key, gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); gpr_timespec expiration = gpr_time_add(now, token_lifetime); if (gpr_time_cmp(token_lifetime, grpc_max_auth_token_lifetime()) > 0) { - LOG(INFO) << "Cropping token lifetime to maximum allowed value."; + VLOG(2) << "Cropping token lifetime to maximum allowed value."; expiration = gpr_time_add(now, grpc_max_auth_token_lifetime()); } diff --git a/src/core/lib/security/credentials/jwt/jwt_credentials.cc b/src/core/lib/security/credentials/jwt/jwt_credentials.cc index 9757034dd63ee..33636819c4f35 100644 --- a/src/core/lib/security/credentials/jwt/jwt_credentials.cc +++ b/src/core/lib/security/credentials/jwt/jwt_credentials.cc @@ -41,7 +41,6 @@ #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/promise/promise.h" #include "src/core/lib/security/credentials/call_creds_util.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/uri/uri_parser.h" #include "src/core/util/json/json.h" @@ -116,8 +115,8 @@ grpc_service_account_jwt_access_credentials:: : key_(key) { gpr_timespec max_token_lifetime = grpc_max_auth_token_lifetime(); if (gpr_time_cmp(token_lifetime, max_token_lifetime) > 0) { - LOG(INFO) << "Cropping token lifetime to maximum allowed value (" - << max_token_lifetime.tv_sec << " secs)."; + VLOG(2) << "Cropping token lifetime to maximum allowed value (" + << max_token_lifetime.tv_sec << " secs)."; token_lifetime = grpc_max_auth_token_lifetime(); } jwt_lifetime_ = token_lifetime; @@ -156,13 +155,12 @@ grpc_call_credentials* grpc_service_account_jwt_access_credentials_create( const char* json_key, gpr_timespec token_lifetime, void* reserved) { if (GRPC_TRACE_FLAG_ENABLED(api)) { char* clean_json = redact_private_key(json_key); - LOG(INFO) << "grpc_service_account_jwt_access_credentials_create(" - << "json_key=" << clean_json - << ", token_lifetime=gpr_timespec { tv_sec: " - << token_lifetime.tv_sec - << ", tv_nsec: " << token_lifetime.tv_nsec - << ", clock_type: " << token_lifetime.clock_type - << " }, reserved=" << reserved << ")"; + VLOG(2) << "grpc_service_account_jwt_access_credentials_create(" + << "json_key=" << clean_json + << ", token_lifetime=gpr_timespec { tv_sec: " + << token_lifetime.tv_sec << ", tv_nsec: " << token_lifetime.tv_nsec + << ", clock_type: " << token_lifetime.clock_type + << " }, reserved=" << reserved << ")"; gpr_free(clean_json); } CHECK_EQ(reserved, nullptr); diff --git a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc index 7c8236b385057..a0738bce008f1 100644 --- a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +++ b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc @@ -56,7 +56,6 @@ #include "src/core/lib/promise/poll.h" #include "src/core/lib/promise/promise.h" #include "src/core/lib/security/util/json_util.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/error_utils.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/uri/uri_parser.h" @@ -423,8 +422,8 @@ class grpc_compute_engine_token_fetcher_credentials grpc_call_credentials* grpc_google_compute_engine_credentials_create( void* reserved) { - GRPC_API_TRACE("grpc_compute_engine_credentials_create(reserved=%p)", 1, - (reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_compute_engine_credentials_create(reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); return grpc_core::MakeRefCounted< grpc_compute_engine_token_fetcher_credentials>() @@ -512,11 +511,10 @@ grpc_call_credentials* grpc_google_refresh_token_credentials_create( const char* json_refresh_token, void* reserved) { grpc_auth_refresh_token token = grpc_auth_refresh_token_create_from_string(json_refresh_token); - if (GRPC_TRACE_FLAG_ENABLED(api)) { - LOG(INFO) << "grpc_refresh_token_credentials_create(json_refresh_token=" - << create_loggable_refresh_token(&token) - << ", reserved=" << reserved << ")"; - } + GRPC_TRACE_LOG(api, INFO) + << "grpc_refresh_token_credentials_create(json_refresh_token=" + << create_loggable_refresh_token(&token) << ", reserved=" << reserved + << ")"; CHECK_EQ(reserved, nullptr); return grpc_refresh_token_credentials_create_from_auth_refresh_token(token) .release(); @@ -743,10 +741,9 @@ std::string grpc_access_token_credentials::debug_string() { grpc_call_credentials* grpc_access_token_credentials_create( const char* access_token, void* reserved) { - GRPC_API_TRACE( - "grpc_access_token_credentials_create(access_token=, " - "reserved=%p)", - 1, (reserved)); + GRPC_TRACE_LOG(api, INFO) << "grpc_access_token_credentials_create(access_" + "token=, reserved=" + << reserved << ")"; CHECK_EQ(reserved, nullptr); return grpc_core::MakeRefCounted(access_token) .release(); diff --git a/src/core/lib/security/credentials/plugin/plugin_credentials.cc b/src/core/lib/security/credentials/plugin/plugin_credentials.cc index 1095e56ead055..8fa2bcc65750a 100644 --- a/src/core/lib/security/credentials/plugin/plugin_credentials.cc +++ b/src/core/lib/security/credentials/plugin/plugin_credentials.cc @@ -35,7 +35,6 @@ #include "src/core/lib/promise/promise.h" #include "src/core/lib/slice/slice.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/validate_metadata.h" #include "src/core/lib/transport/metadata_batch.h" @@ -122,10 +121,9 @@ void grpc_plugin_credentials::PendingRequest::RequestMetadataReady( GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP); grpc_core::RefCountedPtr r( static_cast(request)); - if (GRPC_TRACE_FLAG_ENABLED(plugin_credentials)) { - LOG(INFO) << "plugin_credentials[" << r->creds() << "]: request " << r.get() - << ": plugin returned asynchronously"; - } + GRPC_TRACE_LOG(plugin_credentials, INFO) + << "plugin_credentials[" << r->creds() << "]: request " << r.get() + << ": plugin returned asynchronously"; for (size_t i = 0; i < num_md; ++i) { grpc_metadata p; p.key = grpc_core::CSliceRef(md[i].key); @@ -151,10 +149,9 @@ grpc_plugin_credentials::GetRequestMetadata( RefAsSubclass(), std::move(initial_metadata), args); // Invoke the plugin. The callback holds a ref to us. - if (GRPC_TRACE_FLAG_ENABLED(plugin_credentials)) { - LOG(INFO) << "plugin_credentials[" << this << "]: request " << request.get() - << ": invoking plugin"; - } + GRPC_TRACE_LOG(plugin_credentials, INFO) + << "plugin_credentials[" << this << "]: request " << request.get() + << ": invoking plugin"; grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX]; size_t num_creds_md = 0; grpc_status_code status = GRPC_STATUS_OK; @@ -169,17 +166,15 @@ grpc_plugin_credentials::GetRequestMetadata( child_request.get(), creds_md, &num_creds_md, &status, &error_details)) { child_request.release(); - if (GRPC_TRACE_FLAG_ENABLED(plugin_credentials)) { - LOG(INFO) << "plugin_credentials[" << this << "]: request " - << request.get() << ": plugin will return asynchronously"; - } + GRPC_TRACE_LOG(plugin_credentials, INFO) + << "plugin_credentials[" << this << "]: request " << request.get() + << ": plugin will return asynchronously"; return [request] { return request->PollAsyncResult(); }; } // Synchronous return. - if (GRPC_TRACE_FLAG_ENABLED(plugin_credentials)) { - LOG(INFO) << "plugin_credentials[" << this << "]: request " << request.get() - << ": plugin returned synchronously"; - } + GRPC_TRACE_LOG(plugin_credentials, INFO) + << "plugin_credentials[" << this << "]: request " << request.get() + << ": plugin returned synchronously"; auto result = request->ProcessPluginResult(creds_md, num_creds_md, status, error_details); // Clean up. @@ -200,8 +195,9 @@ grpc_plugin_credentials::grpc_plugin_credentials( grpc_call_credentials* grpc_metadata_credentials_create_from_plugin( grpc_metadata_credentials_plugin plugin, grpc_security_level min_security_level, void* reserved) { - GRPC_API_TRACE("grpc_metadata_credentials_create_from_plugin(reserved=%p)", 1, - (reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_metadata_credentials_create_from_plugin(reserved=" << reserved + << ")"; CHECK_EQ(reserved, nullptr); return new grpc_plugin_credentials(plugin, min_security_level); } diff --git a/src/core/lib/security/credentials/ssl/ssl_credentials.cc b/src/core/lib/security/credentials/ssl/ssl_credentials.cc index b7ab059264187..86eb4518c8e3d 100644 --- a/src/core/lib/security/credentials/ssl/ssl_credentials.cc +++ b/src/core/lib/security/credentials/ssl/ssl_credentials.cc @@ -35,7 +35,6 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/security/security_connector/ssl_utils.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/tsi/ssl/session_cache/ssl_session_cache.h" #include "src/core/tsi/ssl_transport_security.h" #include "src/core/tsi/transport_security_interface.h" @@ -225,12 +224,11 @@ grpc_security_status grpc_ssl_credentials::InitializeClientHandshakerFactory( grpc_channel_credentials* grpc_ssl_credentials_create( const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, const verify_peer_options* verify_options, void* reserved) { - GRPC_API_TRACE( - "grpc_ssl_credentials_create(pem_root_certs=%s, " - "pem_key_cert_pair=%p, " - "verify_options=%p, " - "reserved=%p)", - 4, (pem_root_certs, pem_key_cert_pair, verify_options, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_ssl_credentials_create(pem_root_certs=" << pem_root_certs + << ", pem_key_cert_pair=" << pem_key_cert_pair + << ", verify_options=" << verify_options << ", reserved=" << reserved + << ")"; CHECK_EQ(reserved, nullptr); return new grpc_ssl_credentials( @@ -241,12 +239,11 @@ grpc_channel_credentials* grpc_ssl_credentials_create( grpc_channel_credentials* grpc_ssl_credentials_create_ex( const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, const grpc_ssl_verify_peer_options* verify_options, void* reserved) { - GRPC_API_TRACE( - "grpc_ssl_credentials_create(pem_root_certs=%s, " - "pem_key_cert_pair=%p, " - "verify_options=%p, " - "reserved=%p)", - 4, (pem_root_certs, pem_key_cert_pair, verify_options, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_ssl_credentials_create(pem_root_certs=" << pem_root_certs + << ", pem_key_cert_pair=" << pem_key_cert_pair + << ", verify_options=" << verify_options << ", reserved=" << reserved + << ")"; CHECK_EQ(reserved, nullptr); return new grpc_ssl_credentials(pem_root_certs, pem_key_cert_pair, @@ -425,13 +422,12 @@ grpc_server_credentials* grpc_ssl_server_credentials_create_ex( size_t num_key_cert_pairs, grpc_ssl_client_certificate_request_type client_certificate_request, void* reserved) { - GRPC_API_TRACE( - "grpc_ssl_server_credentials_create_ex(" - "pem_root_certs=%s, pem_key_cert_pairs=%p, num_key_cert_pairs=%lu, " - "client_certificate_request=%d, reserved=%p)", - 5, - (pem_root_certs, pem_key_cert_pairs, (unsigned long)num_key_cert_pairs, - client_certificate_request, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_ssl_server_credentials_create_ex(pem_root_certs=" + << pem_root_certs << ", pem_key_cert_pairs=" << pem_key_cert_pairs + << ", num_key_cert_pairs=" << (unsigned long)num_key_cert_pairs + << ", client_certificate_request=" << client_certificate_request + << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); grpc_ssl_server_certificate_config* cert_config = diff --git a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc index 8b3913856fd9e..82a56f43ebc0f 100644 --- a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +++ b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc @@ -40,7 +40,6 @@ #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" namespace grpc_core { @@ -123,9 +122,9 @@ FileWatcherCertificateProvider::FileWatcherCertificateProvider( refresh_interval_sec_(refresh_interval_sec), distributor_(MakeRefCounted()) { if (refresh_interval_sec_ < kMinimumFileWatcherRefreshIntervalSeconds) { - LOG(INFO) << "FileWatcherCertificateProvider refresh_interval_sec_ set to " - "value less than minimum. Overriding configured value to " - "minimum."; + VLOG(2) << "FileWatcherCertificateProvider refresh_interval_sec_ set to " + "value less than minimum. Overriding configured value to " + "minimum."; refresh_interval_sec_ = kMinimumFileWatcherRefreshIntervalSeconds; } // Private key and identity cert files must be both set or both unset. @@ -406,8 +405,8 @@ grpc_tls_certificate_provider_file_watcher_create( void grpc_tls_certificate_provider_release( grpc_tls_certificate_provider* provider) { - GRPC_API_TRACE("grpc_tls_certificate_provider_release(provider=%p)", 1, - (provider)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_tls_certificate_provider_release(provider=" << provider << ")"; grpc_core::ExecCtx exec_ctx; if (provider != nullptr) provider->Unref(); } diff --git a/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc b/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc index b34005d0a896e..a3bd89996fad8 100644 --- a/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +++ b/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc @@ -33,7 +33,6 @@ #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/security/credentials/tls/tls_utils.h" -#include "src/core/lib/surface/api_trace.h" namespace grpc_core { @@ -234,8 +233,8 @@ grpc_tls_certificate_verifier_host_name_create() { void grpc_tls_certificate_verifier_release( grpc_tls_certificate_verifier* verifier) { - GRPC_API_TRACE("grpc_tls_certificate_verifier_release(verifier=%p)", 1, - (verifier)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_tls_certificate_verifier_release(verifier=" << verifier << ")"; grpc_core::ExecCtx exec_ctx; if (verifier != nullptr) verifier->Unref(); } diff --git a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc index bb078cc807968..82a6dd55620e8 100644 --- a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +++ b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc @@ -29,7 +29,6 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/tsi/ssl_transport_security.h" /// -- Wrapper APIs declared in grpc_security.h -- * @@ -122,16 +121,15 @@ void grpc_tls_credentials_options_set_tls_session_key_log_file_path( if (!tsi_tls_session_key_logging_supported() || options == nullptr) { return; } - GRPC_API_TRACE( - "grpc_tls_credentials_options_set_tls_session_key_log_config(options=%p)", - 1, (options)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_tls_credentials_options_set_tls_session_key_log_config(options=" + << options << ")"; // Tls session key logging is assumed to be enabled if the specified log // file is non-empty. if (path != nullptr) { - LOG(INFO) << "Enabling TLS session key logging with keys stored at: " - << path; + VLOG(2) << "Enabling TLS session key logging with keys stored at: " << path; } else { - LOG(INFO) << "Disabling TLS session key logging"; + VLOG(2) << "Disabling TLS session key logging"; } options->set_tls_session_key_log_file_path(path != nullptr ? path : ""); } diff --git a/src/core/lib/security/credentials/tls/tls_credentials.cc b/src/core/lib/security/credentials/tls/tls_credentials.cc index d825b365cb719..765f669e5ce93 100644 --- a/src/core/lib/security/credentials/tls/tls_credentials.cc +++ b/src/core/lib/security/credentials/tls/tls_credentials.cc @@ -84,8 +84,8 @@ bool CredentialOptionSanityCheck(grpc_tls_credentials_options* options, // If no verifier is specified on the client side, use the hostname verifier // as default. Users who want to bypass all the verifier check should // implement an external verifier instead. - LOG(INFO) << "No verifier specified on the client side. Using default " - "hostname verifier"; + VLOG(2) << "No verifier specified on the client side. Using default " + "hostname verifier"; options->set_certificate_verifier( grpc_core::MakeRefCounted()); } diff --git a/src/core/lib/security/credentials/xds/xds_credentials.cc b/src/core/lib/security/credentials/xds/xds_credentials.cc index 7de65edb35622..c2e5b925e6d03 100644 --- a/src/core/lib/security/credentials/xds/xds_credentials.cc +++ b/src/core/lib/security/credentials/xds/xds_credentials.cc @@ -142,18 +142,22 @@ XdsCredentials::create_security_connector( auto xds_certificate_provider = args->GetObjectRef(); if (xds_certificate_provider != nullptr) { const bool watch_root = xds_certificate_provider->ProvidesRootCerts(); + const bool use_system_root_certs = + xds_certificate_provider->UseSystemRootCerts(); const bool watch_identity = xds_certificate_provider->ProvidesIdentityCerts(); - if (watch_root || watch_identity) { + if (watch_root || use_system_root_certs || watch_identity) { auto tls_credentials_options = MakeRefCounted(); - tls_credentials_options->set_certificate_provider( - xds_certificate_provider); - if (watch_root) { - tls_credentials_options->set_watch_root_cert(true); - } - if (watch_identity) { - tls_credentials_options->set_watch_identity_pair(true); + if (watch_root || watch_identity) { + tls_credentials_options->set_certificate_provider( + xds_certificate_provider); + if (watch_root) { + tls_credentials_options->set_watch_root_cert(true); + } + if (watch_identity) { + tls_credentials_options->set_watch_identity_pair(true); + } } tls_credentials_options->set_verify_server_cert(true); tls_credentials_options->set_certificate_verifier( diff --git a/src/core/lib/security/security_connector/ssl_utils.cc b/src/core/lib/security/security_connector/ssl_utils.cc index 840602eec4ed4..a251ccdf86cb7 100644 --- a/src/core/lib/security/security_connector/ssl_utils.cc +++ b/src/core/lib/security/security_connector/ssl_utils.cc @@ -232,16 +232,18 @@ static bool IsSpiffeId(absl::string_view uri) { return false; }; if (uri.size() > 2048) { - LOG(INFO) << "Invalid SPIFFE ID: ID longer than 2048 bytes."; + GRPC_TRACE_LOG(tsi, INFO) + << "Invalid SPIFFE ID: ID longer than 2048 bytes."; return false; } std::vector splits = absl::StrSplit(uri, '/'); if (splits.size() < 4 || splits[3].empty()) { - LOG(INFO) << "Invalid SPIFFE ID: workload id is empty."; + GRPC_TRACE_LOG(tsi, INFO) << "Invalid SPIFFE ID: workload id is empty."; return false; } if (splits[2].size() > 255) { - LOG(INFO) << "Invalid SPIFFE ID: domain longer than 255 characters."; + GRPC_TRACE_LOG(tsi, INFO) + << "Invalid SPIFFE ID: domain longer than 255 characters."; return false; } return true; @@ -332,7 +334,7 @@ grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( GRPC_PEER_SPIFFE_ID_PROPERTY_NAME, spiffe_data, spiffe_length); } else { - LOG(INFO) << "Invalid SPIFFE ID: multiple URI SANs."; + GRPC_TRACE_LOG(tsi, INFO) << "Invalid SPIFFE ID: multiple URI SANs."; } } return ctx; @@ -419,8 +421,9 @@ grpc_security_status grpc_ssl_tsi_client_handshaker_factory_init( const char* root_certs; const tsi_ssl_root_certs_store* root_store; if (pem_root_certs == nullptr && !skip_server_certificate_verification) { - LOG(INFO) << "No root certificates specified; use ones stored in system " - "default locations instead"; + GRPC_TRACE_LOG(tsi, INFO) + << "No root certificates specified; use ones stored in system " + "default locations instead"; // Use default root certificates. root_certs = grpc_core::DefaultSslRootStore::GetPemRootCerts(); if (root_certs == nullptr) { diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.cc b/src/core/lib/security/security_connector/tls/tls_security_connector.cc index ca1098fe78d4e..3707955d4bf59 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.cc +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.cc @@ -397,8 +397,8 @@ void TlsChannelSecurityConnector::cancel_check_peer( if (it != pending_verifier_requests_.end()) { pending_verifier_request = it->second->request(); } else { - LOG(INFO) << "TlsChannelSecurityConnector::cancel_check_peer: no " - "corresponding pending request found"; + VLOG(2) << "TlsChannelSecurityConnector::cancel_check_peer: no " + "corresponding pending request found"; } } if (pending_verifier_request != nullptr) { diff --git a/src/core/lib/slice/slice_refcount.h b/src/core/lib/slice/slice_refcount.h index 7a60d8a322632..71a6e85abe52a 100644 --- a/src/core/lib/slice/slice_refcount.h +++ b/src/core/lib/slice/slice_refcount.h @@ -46,17 +46,15 @@ struct grpc_slice_refcount { void Ref(grpc_core::DebugLocation location) { auto prev_refs = ref_.fetch_add(1, std::memory_order_relaxed); - if (GRPC_TRACE_FLAG_ENABLED(slice_refcount)) { - LOG(INFO).AtLocation(location.file(), location.line()) - << "REF " << this << " " << prev_refs << "->" << prev_refs + 1; - } + GRPC_TRACE_LOG(slice_refcount, INFO) + .AtLocation(location.file(), location.line()) + << "REF " << this << " " << prev_refs << "->" << prev_refs + 1; } void Unref(grpc_core::DebugLocation location) { auto prev_refs = ref_.fetch_sub(1, std::memory_order_acq_rel); - if (GRPC_TRACE_FLAG_ENABLED(slice_refcount)) { - LOG(INFO).AtLocation(location.file(), location.line()) - << "UNREF " << this << " " << prev_refs << "->" << prev_refs - 1; - } + GRPC_TRACE_LOG(slice_refcount, INFO) + .AtLocation(location.file(), location.line()) + << "UNREF " << this << " " << prev_refs << "->" << prev_refs - 1; if (prev_refs == 1) { destroyer_fn_(this); } diff --git a/src/core/lib/surface/api_trace.h b/src/core/lib/surface/api_trace.h deleted file mode 100644 index 1ea6a8a41565a..0000000000000 --- a/src/core/lib/surface/api_trace.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// -// Copyright 2015 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// - -#ifndef GRPC_SRC_CORE_LIB_SURFACE_API_TRACE_H -#define GRPC_SRC_CORE_LIB_SURFACE_API_TRACE_H - -#include -#include - -#include "src/core/lib/debug/trace.h" - -// Provide unwrapping macros because we're in C89 and variadic macros weren't -// introduced until C99... -#define GRPC_API_TRACE_UNWRAP0() -#define GRPC_API_TRACE_UNWRAP1(a) , a -#define GRPC_API_TRACE_UNWRAP2(a, b) , a, b -#define GRPC_API_TRACE_UNWRAP3(a, b, c) , a, b, c -#define GRPC_API_TRACE_UNWRAP4(a, b, c, d) , a, b, c, d -#define GRPC_API_TRACE_UNWRAP5(a, b, c, d, e) , a, b, c, d, e -#define GRPC_API_TRACE_UNWRAP6(a, b, c, d, e, f) , a, b, c, d, e, f -#define GRPC_API_TRACE_UNWRAP7(a, b, c, d, e, f, g) , a, b, c, d, e, f, g -#define GRPC_API_TRACE_UNWRAP8(a, b, c, d, e, f, g, h) , a, b, c, d, e, f, g, h -#define GRPC_API_TRACE_UNWRAP9(a, b, c, d, e, f, g, h, i) \ - , a, b, c, d, e, f, g, h, i -#define GRPC_API_TRACE_UNWRAP10(a, b, c, d, e, f, g, h, i, j) \ - , a, b, c, d, e, f, g, h, i, j - -// Due to the limitations of C89's preprocessor, the arity of the var-arg list -// 'nargs' must be specified. -#define GRPC_API_TRACE(fmt, nargs, args) \ - if (GRPC_TRACE_FLAG_ENABLED(api)) { \ - gpr_log(GPR_INFO, fmt GRPC_API_TRACE_UNWRAP##nargs args); \ - } - -#endif // GRPC_SRC_CORE_LIB_SURFACE_API_TRACE_H diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 08f2a314413c6..d7a359db68ed0 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -92,7 +92,6 @@ #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice_buffer.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call_test_only.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/completion_queue.h" @@ -338,9 +337,9 @@ void Call::HandleCompressionAlgorithmDisabled( void Call::UpdateDeadline(Timestamp deadline) { ReleasableMutexLock lock(&deadline_mu_); if (GRPC_TRACE_FLAG_ENABLED(call)) { - VLOG(2) << "[call " << this - << "] UpdateDeadline from=" << deadline_.ToString() - << " to=" << deadline.ToString(); + LOG(INFO) << "[call " << this + << "] UpdateDeadline from=" << deadline_.ToString() + << " to=" << deadline.ToString(); } if (deadline >= deadline_) return; if (deadline < Timestamp::Now()) { @@ -413,7 +412,8 @@ char* grpc_call_get_peer(grpc_call* call) { } grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved) { - GRPC_API_TRACE("grpc_call_cancel(call=%p, reserved=%p)", 2, (call, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_cancel(call=" << call << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); if (call == nullptr) { return GRPC_CALL_ERROR; @@ -428,10 +428,9 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call* c, grpc_status_code status, const char* description, void* reserved) { - GRPC_API_TRACE( - "grpc_call_cancel_with_status(" - "c=%p, status=%d, description=%s, reserved=%p)", - 4, (c, (int)status, description, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_cancel_with_status(c=" << c << ", status=" << (int)status + << ", description=" << description << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); if (c == nullptr) { return GRPC_CALL_ERROR; @@ -471,10 +470,10 @@ grpc_call_stack* grpc_call_get_call_stack(grpc_call* call) { grpc_call_error grpc_call_start_batch(grpc_call* call, const grpc_op* ops, size_t nops, void* tag, void* reserved) { - GRPC_API_TRACE( - "grpc_call_start_batch(call=%p, ops=%p, nops=%lu, tag=%p, " - "reserved=%p)", - 5, (call, ops, (unsigned long)nops, tag, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_start_batch(call=" << call << ", ops=" << ops + << ", nops=" << (unsigned long)nops << ", tag=" << tag + << ", reserved=" << reserved << ")"; if (reserved != nullptr || call == nullptr) { return GRPC_CALL_ERROR; diff --git a/src/core/lib/surface/call.h b/src/core/lib/surface/call.h index 4edd48043a245..6da95634d5bf2 100644 --- a/src/core/lib/surface/call.h +++ b/src/core/lib/surface/call.h @@ -45,7 +45,6 @@ #include "src/core/lib/promise/context.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/transport/transport.h" #include "src/core/server/server_interface.h" diff --git a/src/core/lib/surface/call_details.cc b/src/core/lib/surface/call_details.cc index a8644c0b236bb..bbea4e41fc78d 100644 --- a/src/core/lib/surface/call_details.cc +++ b/src/core/lib/surface/call_details.cc @@ -23,16 +23,17 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice.h" -#include "src/core/lib/surface/api_trace.h" void grpc_call_details_init(grpc_call_details* details) { - GRPC_API_TRACE("grpc_call_details_init(details=%p)", 1, (details)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_details_init(details=" << details << ")"; details->method = grpc_empty_slice(); details->host = grpc_empty_slice(); } void grpc_call_details_destroy(grpc_call_details* details) { - GRPC_API_TRACE("grpc_call_details_destroy(details=%p)", 1, (details)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_call_details_destroy(details=" << details << ")"; grpc_core::ExecCtx exec_ctx; grpc_core::CSliceUnref(details->method); grpc_core::CSliceUnref(details->host); diff --git a/src/core/lib/surface/channel.cc b/src/core/lib/surface/channel.cc index 3d2deba0698fb..3e19723838f07 100644 --- a/src/core/lib/surface/channel.cc +++ b/src/core/lib/surface/channel.cc @@ -31,7 +31,6 @@ #include "src/core/lib/compression/compression_internal.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/telemetry/stats.h" #include "src/core/telemetry/stats_data.h" @@ -95,7 +94,8 @@ Channel::RegisteredCall* Channel::RegisterCall(const char* method, void grpc_channel_destroy(grpc_channel* channel) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_channel_destroy(channel=%p)", 1, (channel)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_destroy(channel=" << channel << ")"; grpc_channel_destroy_internal(channel); } @@ -120,9 +120,9 @@ grpc_call* grpc_channel_create_call(grpc_channel* channel, void* grpc_channel_register_call(grpc_channel* channel, const char* method, const char* host, void* reserved) { - GRPC_API_TRACE( - "grpc_channel_register_call(channel=%p, method=%s, host=%s, reserved=%p)", - 4, (channel, method, host, reserved)); + GRPC_TRACE_LOG(api, INFO) << "grpc_channel_register_call(channel=" << channel + << ", method=" << method << ", host=" << host + << ", reserved=" << reserved << ")"; CHECK(!reserved); grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; @@ -135,18 +135,16 @@ grpc_call* grpc_channel_create_registered_call( gpr_timespec deadline, void* reserved) { auto* rc = static_cast(registered_call_handle); - GRPC_API_TRACE( - "grpc_channel_create_registered_call(" - "channel=%p, parent_call=%p, propagation_mask=%x, completion_queue=%p, " - "registered_call_handle=%p, " - "deadline=gpr_timespec { tv_sec: %" PRId64 - ", tv_nsec: %d, clock_type: %d }, " - "reserved=%p)", - 9, - (channel, parent_call, (unsigned)propagation_mask, completion_queue, - registered_call_handle, deadline.tv_sec, deadline.tv_nsec, - (int)deadline.clock_type, reserved)); - CHECK(!reserved); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_create_registered_call(channel=" << channel + << ", parent_call=" << parent_call + << ", propagation_mask=" << (unsigned)propagation_mask + << ", completion_queue=" << completion_queue + << ", registered_call_handle=" << registered_call_handle + << ", deadline=gpr_timespec { tv_sec: " << deadline.tv_sec + << ", tv_nsec: " << deadline.tv_nsec + << ", clock_type: " << (int)deadline.clock_type + << " }, reserved=" << reserved << ")"; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; return grpc_core::Channel::FromC(channel)->CreateCall( @@ -159,7 +157,8 @@ grpc_call* grpc_channel_create_registered_call( } char* grpc_channel_get_target(grpc_channel* channel) { - GRPC_API_TRACE("grpc_channel_get_target(channel=%p)", 1, (channel)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_get_target(channel=" << channel << ")"; auto target = grpc_core::Channel::FromC(channel)->target(); char* buffer = static_cast(gpr_zalloc(target.size() + 1)); memcpy(buffer, target.data(), target.size()); @@ -176,8 +175,8 @@ void grpc_channel_get_info(grpc_channel* channel, void grpc_channel_reset_connect_backoff(grpc_channel* channel) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_channel_reset_connect_backoff(channel=%p)", 1, - (channel)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_reset_connect_backoff(channel=" << channel << ")"; grpc_core::Channel::FromC(channel)->ResetConnectionBackoff(); } @@ -189,9 +188,9 @@ grpc_connectivity_state grpc_channel_check_connectivity_state( grpc_channel* channel, int try_to_connect) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_channel_check_connectivity_state(channel=%p, try_to_connect=%d)", 2, - (channel, try_to_connect)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_check_connectivity_state(channel=" << channel + << ", try_to_connect=" << try_to_connect << ")"; return grpc_core::Channel::FromC(channel)->CheckConnectivityState( try_to_connect); } @@ -201,15 +200,13 @@ void grpc_channel_watch_connectivity_state( gpr_timespec deadline, grpc_completion_queue* cq, void* tag) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_channel_watch_connectivity_state(" - "channel=%p, last_observed_state=%d, " - "deadline=gpr_timespec { tv_sec: %" PRId64 - ", tv_nsec: %d, clock_type: %d }, " - "cq=%p, tag=%p)", - 7, - (channel, (int)last_observed_state, deadline.tv_sec, deadline.tv_nsec, - (int)deadline.clock_type, cq, tag)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_watch_connectivity_state(channel=" << channel + << ", last_observed_state=" << (int)last_observed_state + << ", deadline=gpr_timespec { tv_sec: " << deadline.tv_sec + << ", tv_nsec: " << deadline.tv_nsec + << ", clock_type: " << (int)deadline.clock_type << " }, cq=" << cq + << ", tag=" << tag << ")"; return grpc_core::Channel::FromC(channel)->WatchConnectivityState( last_observed_state, grpc_core::Timestamp::FromTimespecRoundUp(deadline), cq, tag); @@ -218,8 +215,9 @@ void grpc_channel_watch_connectivity_state( void grpc_channel_ping(grpc_channel* channel, grpc_completion_queue* cq, void* tag, void* reserved) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_channel_ping(channel=%p, cq=%p, tag=%p, reserved=%p)", 4, - (channel, cq, tag, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_channel_ping(channel=" << channel << ", cq=" << cq + << ", tag=" << tag << ", reserved=" << reserved << ")"; CHECK_EQ(reserved, nullptr); grpc_core::Channel::FromC(channel)->Ping(cq, tag); } diff --git a/src/core/lib/surface/channel_create.cc b/src/core/lib/surface/channel_create.cc index d95dc9c553e42..4f9eb9ad9edf9 100644 --- a/src/core/lib/surface/channel_create.cc +++ b/src/core/lib/surface/channel_create.cc @@ -105,10 +105,10 @@ grpc_channel* grpc_lame_client_channel_create(const char* target, grpc_status_code error_code, const char* error_message) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_lame_client_channel_create(target=%s, error_code=%d, " - "error_message=%s)", - 3, (target, (int)error_code, error_message)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_lame_client_channel_create(target=" << target + << ", error_code=" << (int)error_code + << ", error_message=" << error_message << ")"; if (error_code == GRPC_STATUS_OK) error_code = GRPC_STATUS_UNKNOWN; grpc_core::ChannelArgs args = grpc_core::CoreConfiguration::Get() diff --git a/src/core/lib/surface/client_call.cc b/src/core/lib/surface/client_call.cc index 83bf4cfb42aba..42c40174b4999 100644 --- a/src/core/lib/surface/client_call.cc +++ b/src/core/lib/surface/client_call.cc @@ -312,7 +312,7 @@ void ClientCall::CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag, ServerMetadataHandle metadata; if (!md.ok() || !md->has_value()) { is_trailers_only_ = true; - metadata = Arena::MakePooled(); + metadata = Arena::MakePooledForOverwrite(); } else { metadata = std::move(md->value()); is_trailers_only_ = diff --git a/src/core/lib/surface/client_call.h b/src/core/lib/surface/client_call.h index 438d3bf8e3aa5..53c5487eabdc6 100644 --- a/src/core/lib/surface/client_call.h +++ b/src/core/lib/surface/client_call.h @@ -150,7 +150,7 @@ class ClientCall final }; std::atomic call_state_{kUnstarted}; ClientMetadataHandle send_initial_metadata_{ - Arena::MakePooled()}; + Arena::MakePooledForOverwrite()}; CallInitiator started_call_initiator_; // Status passed to CancelWithError; // if call_state_ == kCancelled then this is the authoritative status, diff --git a/src/core/lib/surface/completion_queue.cc b/src/core/lib/surface/completion_queue.cc index 9710c4dd37f9b..253a234265372 100644 --- a/src/core/lib/surface/completion_queue.cc +++ b/src/core/lib/surface/completion_queue.cc @@ -50,7 +50,6 @@ #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/pollset.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/event_string.h" #include "src/core/telemetry/stats.h" #include "src/core/telemetry/stats_data.h" @@ -508,10 +507,9 @@ grpc_completion_queue* grpc_completion_queue_create_internal( grpc_completion_queue_functor* shutdown_callback) { grpc_completion_queue* cq; - GRPC_API_TRACE( - "grpc_completion_queue_create_internal(completion_type=%d, " - "polling_type=%d)", - 2, (completion_type, polling_type)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_completion_queue_create_internal(completion_type=" + << completion_type << ", polling_type=" << polling_type << ")"; switch (completion_type) { case GRPC_CQ_NEXT: @@ -697,10 +695,10 @@ static void cq_end_op_for_next( if (GRPC_TRACE_FLAG_ENABLED(api) || (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok())) { std::string errmsg = grpc_core::StatusToString(error); - GRPC_API_TRACE( - "cq_end_op_for_next(cq=%p, tag=%p, error=%s, " - "done=%p, done_arg=%p, storage=%p)", - 6, (cq, tag, errmsg.c_str(), done, done_arg, storage)); + GRPC_TRACE_LOG(api, INFO) + << "cq_end_op_for_next(cq=" << cq << ", tag=" << tag + << ", error=" << errmsg.c_str() << ", done=" << done + << ", done_arg=" << done_arg << ", storage=" << storage << ")"; if (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok()) { LOG(INFO) << "Operation failed: tag=" << tag << ", error=" << errmsg; } @@ -770,10 +768,10 @@ static void cq_end_op_for_pluck( if (GRPC_TRACE_FLAG_ENABLED(api) || (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok())) { std::string errmsg = grpc_core::StatusToString(error); - GRPC_API_TRACE( - "cq_end_op_for_pluck(cq=%p, tag=%p, error=%s, " - "done=%p, done_arg=%p, storage=%p)", - 6, (cq, tag, errmsg.c_str(), done, done_arg, storage)); + GRPC_TRACE_LOG(api, INFO) + << "cq_end_op_for_pluck(cq=" << cq << ", tag=" << tag + << ", error=" << errmsg.c_str() << ", done=" << done + << ", done_arg=" << done_arg << ", storage=" << storage << ")"; if (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok()) { LOG(ERROR) << "Operation failed: tag=" << tag << ", error=" << errmsg; } @@ -830,10 +828,10 @@ static void cq_end_op_for_callback( if (GRPC_TRACE_FLAG_ENABLED(api) || (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok())) { std::string errmsg = grpc_core::StatusToString(error); - GRPC_API_TRACE( - "cq_end_op_for_callback(cq=%p, tag=%p, error=%s, " - "done=%p, done_arg=%p, storage=%p)", - 6, (cq, tag, errmsg.c_str(), done, done_arg, storage)); + GRPC_TRACE_LOG(api, INFO) + << "cq_end_op_for_callback(cq=" << cq << ", tag=" << tag + << ", error=" << errmsg.c_str() << ", done=" << done + << ", done_arg=" << done_arg << ", storage=" << storage << ")"; if (GRPC_TRACE_FLAG_ENABLED(op_failure) && !error.ok()) { LOG(ERROR) << "Operation failed: tag=" << tag << ", error=" << errmsg; } @@ -888,7 +886,8 @@ struct cq_is_finished_arg { class ExecCtxNext : public grpc_core::ExecCtx { public: explicit ExecCtxNext(void* arg) - : ExecCtx(0), check_ready_to_finish_arg_(arg) {} + : ExecCtx(0, GRPC_LATENT_SEE_METADATA("ExecCtx for CqNext")), + check_ready_to_finish_arg_(arg) {} bool CheckReadyToFinish() override { cq_is_finished_arg* a = @@ -943,15 +942,12 @@ static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline, grpc_event ret; cq_next_data* cqd = static_cast DATA_FROM_CQ(cq); - GRPC_API_TRACE( - "grpc_completion_queue_next(" - "cq=%p, " - "deadline=gpr_timespec { tv_sec: %" PRId64 - ", tv_nsec: %d, clock_type: %d }, " - "reserved=%p)", - 5, - (cq, deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type, - reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_completion_queue_next(cq=" << cq + << ", deadline=gpr_timespec { tv_sec: " << deadline.tv_sec + << ", tv_nsec: " << deadline.tv_nsec + << ", clock_type: " << (int)deadline.clock_type + << " }, reserved=" << reserved << ")"; CHECK(!reserved); dump_pending_tags(cq); @@ -1138,7 +1134,8 @@ static void del_plucker(grpc_completion_queue* cq, void* tag, class ExecCtxPluck : public grpc_core::ExecCtx { public: explicit ExecCtxPluck(void* arg) - : ExecCtx(0), check_ready_to_finish_arg_(arg) {} + : ExecCtx(0, GRPC_LATENT_SEE_METADATA("ExecCtx for CqPluck")), + check_ready_to_finish_arg_(arg) {} bool CheckReadyToFinish() override { cq_is_finished_arg* a = @@ -1187,15 +1184,12 @@ static grpc_event cq_pluck(grpc_completion_queue* cq, void* tag, cq_pluck_data* cqd = static_cast DATA_FROM_CQ(cq); if (GRPC_TRACE_FLAG_ENABLED(queue_pluck)) { - GRPC_API_TRACE( - "grpc_completion_queue_pluck(" - "cq=%p, tag=%p, " - "deadline=gpr_timespec { tv_sec: %" PRId64 - ", tv_nsec: %d, clock_type: %d }, " - "reserved=%p)", - 6, - (cq, tag, deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type, - reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_completion_queue_pluck(cq=" << cq << ", tag=" << tag + << ", deadline=gpr_timespec { tv_sec: " << deadline.tv_sec + << ", tv_nsec: " << deadline.tv_nsec + << ", clock_type: " << (int)deadline.clock_type + << " }, reserved=" << reserved << ")"; } CHECK(!reserved); @@ -1383,12 +1377,13 @@ static void cq_shutdown_callback(grpc_completion_queue* cq) { void grpc_completion_queue_shutdown(grpc_completion_queue* cq) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_completion_queue_shutdown(cq=%p)", 1, (cq)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_completion_queue_shutdown(cq=" << cq << ")"; cq->vtable->shutdown(cq); } void grpc_completion_queue_destroy(grpc_completion_queue* cq) { - GRPC_API_TRACE("grpc_completion_queue_destroy(cq=%p)", 1, (cq)); + GRPC_TRACE_LOG(api, INFO) << "grpc_completion_queue_destroy(cq=" << cq << ")"; grpc_completion_queue_shutdown(cq); grpc_core::ExecCtx exec_ctx; diff --git a/src/core/lib/surface/filter_stack_call.cc b/src/core/lib/surface/filter_stack_call.cc index a7f4e699d9053..17d8fe216673f 100644 --- a/src/core/lib/surface/filter_stack_call.cc +++ b/src/core/lib/surface/filter_stack_call.cc @@ -59,7 +59,6 @@ #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice_buffer.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call_utils.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/completion_queue.h" @@ -269,7 +268,7 @@ void FilterStackCall::ExternalUnref() { ApplicationCallbackExecCtx callback_exec_ctx; ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_call_unref(c=%p)", 1, (this)); + GRPC_TRACE_LOG(api, INFO) << "grpc_call_unref(c=" << this << ")"; MaybeUnpublishFromParent(); @@ -731,6 +730,8 @@ void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) { grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops, void* notify_tag, bool is_notify_tag_closure) { + GRPC_LATENT_SEE_INNER_SCOPE("FilterStackCall::StartBatch"); + size_t i; const grpc_op* op; BatchControl* bctl; diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index d0bf3e2ecdb05..0adcbb399954a 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -45,7 +45,6 @@ #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/security_connector.h" #include "src/core/lib/security/transport/auth_filters.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel_stack_type.h" #include "src/core/lib/surface/init_internally.h" @@ -128,7 +127,7 @@ void grpc_init(void) { grpc_iomgr_start(); } - GRPC_API_TRACE("grpc_init(void)", 0, ()); + GRPC_TRACE_LOG(api, INFO) << "grpc_init(void)"; } void grpc_shutdown_internal_locked(void) @@ -149,7 +148,7 @@ void grpc_shutdown_internal_locked(void) } void grpc_shutdown_from_cleanup_thread(void* /*ignored*/) { - GRPC_API_TRACE("grpc_shutdown_from_cleanup_thread", 0, ()); + GRPC_TRACE_LOG(api, INFO) << "grpc_shutdown_from_cleanup_thread"; grpc_core::MutexLock lock(g_init_mu); // We have released lock from the shutdown thread and it is possible that // another grpc_init has been called, and do nothing if that is the case. @@ -161,7 +160,7 @@ void grpc_shutdown_from_cleanup_thread(void* /*ignored*/) { } void grpc_shutdown(void) { - GRPC_API_TRACE("grpc_shutdown(void)", 0, ()); + GRPC_TRACE_LOG(api, INFO) << "grpc_shutdown(void)"; grpc_core::MutexLock lock(g_init_mu); if (--g_initializations == 0) { @@ -194,7 +193,7 @@ void grpc_shutdown(void) { } void grpc_shutdown_blocking(void) { - GRPC_API_TRACE("grpc_shutdown_blocking(void)", 0, ()); + GRPC_TRACE_LOG(api, INFO) << "grpc_shutdown_blocking(void)"; grpc_core::MutexLock lock(g_init_mu); if (--g_initializations == 0) { g_shutting_down = true; diff --git a/src/core/lib/surface/lame_client.cc b/src/core/lib/surface/lame_client.cc index 5eaa6dc754704..e431024446ba6 100644 --- a/src/core/lib/surface/lame_client.cc +++ b/src/core/lib/surface/lame_client.cc @@ -42,7 +42,6 @@ #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/promise/pipe.h" #include "src/core/lib/promise/promise.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_stack_type.h" #include "src/core/lib/transport/connectivity_state.h" diff --git a/src/core/lib/surface/metadata_array.cc b/src/core/lib/surface/metadata_array.cc index 13d9a7b8981cc..666459e6e0a96 100644 --- a/src/core/lib/surface/metadata_array.cc +++ b/src/core/lib/surface/metadata_array.cc @@ -23,14 +23,15 @@ #include #include "src/core/lib/debug/trace.h" -#include "src/core/lib/surface/api_trace.h" void grpc_metadata_array_init(grpc_metadata_array* array) { - GRPC_API_TRACE("grpc_metadata_array_init(array=%p)", 1, (array)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_metadata_array_init(array=" << array << ")"; memset(array, 0, sizeof(*array)); } void grpc_metadata_array_destroy(grpc_metadata_array* array) { - GRPC_API_TRACE("grpc_metadata_array_destroy(array=%p)", 1, (array)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_metadata_array_destroy(array=" << array << ")"; gpr_free(array->metadata); } diff --git a/src/core/lib/surface/version.cc b/src/core/lib/surface/version.cc index a24a26ba4bf34..a347400b9815a 100644 --- a/src/core/lib/surface/version.cc +++ b/src/core/lib/surface/version.cc @@ -22,6 +22,6 @@ #include #include -const char* grpc_version_string(void) { return "42.0.0"; } +const char* grpc_version_string(void) { return "43.0.0"; } -const char* grpc_g_stands_for(void) { return "gladiator"; } +const char* grpc_g_stands_for(void) { return "gesundheit"; } diff --git a/src/core/lib/transport/bdp_estimator.cc b/src/core/lib/transport/bdp_estimator.cc index 29f9188a24279..ed2176bea61e1 100644 --- a/src/core/lib/transport/bdp_estimator.cc +++ b/src/core/lib/transport/bdp_estimator.cc @@ -47,18 +47,16 @@ Timestamp BdpEstimator::CompletePing() { 1e-9 * static_cast(dt_ts.tv_nsec); double bw = dt > 0 ? (static_cast(accumulator_) / dt) : 0; Duration start_inter_ping_delay = inter_ping_delay_; - if (GRPC_TRACE_FLAG_ENABLED(bdp_estimator)) { - LOG(INFO) << "bdp[" << name_ << "]:complete acc=" << accumulator_ - << " est=" << estimate_ << " dt=" << dt << " bw=" << bw / 125000.0 - << "Mbs bw_est=" << bw_est_ / 125000.0 << "Mbs"; - } + GRPC_TRACE_LOG(bdp_estimator, INFO) + << "bdp[" << name_ << "]:complete acc=" << accumulator_ + << " est=" << estimate_ << " dt=" << dt << " bw=" << bw / 125000.0 + << "Mbs bw_est=" << bw_est_ / 125000.0 << "Mbs"; CHECK(ping_state_ == PingState::STARTED); if (accumulator_ > 2 * estimate_ / 3 && bw > bw_est_) { estimate_ = std::max(accumulator_, estimate_ * 2); bw_est_ = bw; - if (GRPC_TRACE_FLAG_ENABLED(bdp_estimator)) { - LOG(INFO) << "bdp[" << name_ << "]: estimate increased to " << estimate_; - } + GRPC_TRACE_LOG(bdp_estimator, INFO) + << "bdp[" << name_ << "]: estimate increased to " << estimate_; inter_ping_delay_ /= 2; // if the ping estimate changes, // exponentially get faster at probing } else if (inter_ping_delay_ < Duration::Seconds(10)) { @@ -71,10 +69,9 @@ Timestamp BdpEstimator::CompletePing() { } if (start_inter_ping_delay != inter_ping_delay_) { stable_estimate_count_ = 0; - if (GRPC_TRACE_FLAG_ENABLED(bdp_estimator)) { - LOG(INFO) << "bdp[" << name_ << "]:update_inter_time to " - << inter_ping_delay_.millis() << "ms"; - } + GRPC_TRACE_LOG(bdp_estimator, INFO) + << "bdp[" << name_ << "]:update_inter_time to " + << inter_ping_delay_.millis() << "ms"; } ping_state_ = PingState::UNSCHEDULED; accumulator_ = 0; diff --git a/src/core/lib/transport/bdp_estimator.h b/src/core/lib/transport/bdp_estimator.h index d219a90900ce9..e9fb28cceef71 100644 --- a/src/core/lib/transport/bdp_estimator.h +++ b/src/core/lib/transport/bdp_estimator.h @@ -49,10 +49,9 @@ class BdpEstimator { // grpc_bdp_estimator_add_incoming_bytes once a ping has been scheduled by a // transport (but not necessarily started) void SchedulePing() { - if (GRPC_TRACE_FLAG_ENABLED(bdp_estimator)) { - LOG(INFO) << "bdp[" << name_ << "]:sched acc=" << accumulator_ - << " est=" << estimate_; - } + GRPC_TRACE_LOG(bdp_estimator, INFO) + << "bdp[" << name_ << "]:sched acc=" << accumulator_ + << " est=" << estimate_; CHECK(ping_state_ == PingState::UNSCHEDULED); ping_state_ = PingState::SCHEDULED; accumulator_ = 0; @@ -62,10 +61,9 @@ class BdpEstimator { // once // the ping is on the wire void StartPing() { - if (GRPC_TRACE_FLAG_ENABLED(bdp_estimator)) { - LOG(INFO) << "bdp[" << name_ << "]:start acc=" << accumulator_ - << " est=" << estimate_; - } + GRPC_TRACE_LOG(bdp_estimator, INFO) + << "bdp[" << name_ << "]:start acc=" << accumulator_ + << " est=" << estimate_; CHECK(ping_state_ == PingState::SCHEDULED); ping_state_ = PingState::STARTED; ping_start_time_ = gpr_now(GPR_CLOCK_MONOTONIC); diff --git a/src/core/lib/transport/call_arena_allocator.cc b/src/core/lib/transport/call_arena_allocator.cc index a0bae7cd14648..729b9fe51bbfb 100644 --- a/src/core/lib/transport/call_arena_allocator.cc +++ b/src/core/lib/transport/call_arena_allocator.cc @@ -20,22 +20,8 @@ namespace grpc_core { -void CallSizeEstimator::UpdateCallSizeEstimate(size_t size) { - size_t cur = call_size_estimate_.load(std::memory_order_relaxed); - if (cur < size) { - // size grew: update estimate - call_size_estimate_.compare_exchange_weak( - cur, size, std::memory_order_relaxed, std::memory_order_relaxed); - // if we lose: never mind, something else will likely update soon enough - } else if (cur == size) { - // no change: holding pattern - } else if (cur > 0) { - // size shrank: decrease estimate - call_size_estimate_.compare_exchange_weak( - cur, std::min(cur - 1, (255 * cur + size) / 256), - std::memory_order_relaxed, std::memory_order_relaxed); - // if we lose: never mind, something else will likely update soon enough - } +void CallArenaAllocator::FinalizeArena(Arena* arena) { + call_size_estimator_.UpdateCallSizeEstimate(arena->TotalUsedBytes()); } } // namespace grpc_core diff --git a/src/core/lib/transport/call_arena_allocator.h b/src/core/lib/transport/call_arena_allocator.h index fa9eeae224322..4f63e0ae3ea3b 100644 --- a/src/core/lib/transport/call_arena_allocator.h +++ b/src/core/lib/transport/call_arena_allocator.h @@ -33,7 +33,7 @@ class CallSizeEstimator final { explicit CallSizeEstimator(size_t initial_estimate) : call_size_estimate_(initial_estimate) {} - size_t CallSizeEstimate() { + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION size_t CallSizeEstimate() { // We round up our current estimate to the NEXT value of kRoundUpSize. // This ensures: // 1. a consistent size allocation when our estimate is drifting slowly @@ -46,7 +46,24 @@ class CallSizeEstimator final { ~(kRoundUpSize - 1); } - void UpdateCallSizeEstimate(size_t size); + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void UpdateCallSizeEstimate( + size_t size) { + size_t cur = call_size_estimate_.load(std::memory_order_relaxed); + if (cur < size) { + // size grew: update estimate + call_size_estimate_.compare_exchange_weak( + cur, size, std::memory_order_relaxed, std::memory_order_relaxed); + // if we lose: never mind, something else will likely update soon enough + } else if (cur == size) { + // no change: holding pattern + } else if (cur > 0) { + // size shrank: decrease estimate + call_size_estimate_.compare_exchange_weak( + cur, std::min(cur - 1, (255 * cur + size) / 256), + std::memory_order_relaxed, std::memory_order_relaxed); + // if we lose: never mind, something else will likely update soon enough + } + } private: std::atomic call_size_estimate_; @@ -62,9 +79,7 @@ class CallArenaAllocator final : public ArenaFactory { return Arena::Create(call_size_estimator_.CallSizeEstimate(), Ref()); } - void FinalizeArena(Arena* arena) override { - call_size_estimator_.UpdateCallSizeEstimate(arena->TotalUsedBytes()); - } + void FinalizeArena(Arena* arena) override; size_t CallSizeEstimate() { return call_size_estimator_.CallSizeEstimate(); } diff --git a/src/core/lib/transport/call_filters.cc b/src/core/lib/transport/call_filters.cc index f19c100a75d33..28619c214a702 100644 --- a/src/core/lib/transport/call_filters.cc +++ b/src/core/lib/transport/call_filters.cc @@ -193,18 +193,16 @@ void CallFilters::CancelDueToFailedPipeOperation(SourceLocation but_where) { << "Cancelling due to failed pipe operation: " << DebugString(); } auto status = - ServerMetadataFromStatus(absl::CancelledError("Failed pipe operation")); + ServerMetadataFromStatus(GRPC_STATUS_CANCELLED, "Failed pipe operation"); status->Set(GrpcCallWasCancelled(), true); PushServerTrailingMetadata(std::move(status)); } void CallFilters::PushServerTrailingMetadata(ServerMetadataHandle md) { CHECK(md != nullptr); - if (GRPC_TRACE_FLAG_ENABLED(call)) { - LOG(INFO) << GetContext()->DebugTag() - << " PushServerTrailingMetadata[" << this - << "]: " << md->DebugString() << " into " << DebugString(); - } + GRPC_TRACE_LOG(call, INFO) + << GetContext()->DebugTag() << " PushServerTrailingMetadata[" + << this << "]: " << md->DebugString() << " into " << DebugString(); CHECK(md != nullptr); if (call_state_.PushServerTrailingMetadata( md->get(GrpcCallWasCancelled()).value_or(false))) { diff --git a/src/core/lib/transport/call_spine.h b/src/core/lib/transport/call_spine.h index 4b3d9c6993ef6..580d94067b968 100644 --- a/src/core/lib/transport/call_spine.h +++ b/src/core/lib/transport/call_spine.h @@ -51,23 +51,24 @@ class CallSpine final : public Party { std::move(client_initial_metadata), std::move(arena))); } - ~CallSpine() override {} + ~CallSpine() override { CallOnDone(true); } CallFilters& call_filters() { return call_filters_; } // Add a callback to be called when server trailing metadata is received. - void OnDone(absl::AnyInvocable fn) { + void OnDone(absl::AnyInvocable fn) { if (on_done_ == nullptr) { on_done_ = std::move(fn); return; } - on_done_ = [first = std::move(fn), next = std::move(on_done_)]() mutable { - first(); - next(); + on_done_ = [first = std::move(fn), + next = std::move(on_done_)](bool cancelled) mutable { + first(cancelled); + next(cancelled); }; } - void CallOnDone() { - if (on_done_ != nullptr) std::exchange(on_done_, nullptr)(); + void CallOnDone(bool cancelled) { + if (on_done_ != nullptr) std::exchange(on_done_, nullptr)(cancelled); } auto PullServerInitialMetadata() { @@ -75,7 +76,12 @@ class CallSpine final : public Party { } auto PullServerTrailingMetadata() { - return call_filters().PullServerTrailingMetadata(); + return Map( + call_filters().PullServerTrailingMetadata(), + [this](ServerMetadataHandle result) { + CallOnDone(result->get(GrpcCallWasCancelled()).value_or(false)); + return result; + }); } auto PushClientToServerMessage(MessageHandle message) { @@ -190,7 +196,7 @@ class CallSpine final : public Party { // Call filters/pipes part of the spine CallFilters call_filters_; - absl::AnyInvocable on_done_{nullptr}; + absl::AnyInvocable on_done_{nullptr}; }; class CallInitiator { @@ -227,7 +233,9 @@ class CallInitiator { spine_->PushServerTrailingMetadata(std::move(status)); } - void OnDone(absl::AnyInvocable fn) { spine_->OnDone(std::move(fn)); } + void OnDone(absl::AnyInvocable fn) { + spine_->OnDone(std::move(fn)); + } template void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) { @@ -274,7 +282,9 @@ class CallHandler { spine_->PushServerTrailingMetadata(std::move(status)); } - void OnDone(absl::AnyInvocable fn) { spine_->OnDone(std::move(fn)); } + void OnDone(absl::AnyInvocable fn) { + spine_->OnDone(std::move(fn)); + } template auto CancelIfFails(Promise promise) { @@ -327,7 +337,9 @@ class UnstartedCallHandler { spine_->PushServerTrailingMetadata(std::move(status)); } - void OnDone(absl::AnyInvocable fn) { spine_->OnDone(std::move(fn)); } + void OnDone(absl::AnyInvocable fn) { + spine_->OnDone(std::move(fn)); + } template auto CancelIfFails(Promise promise) { diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index 8e4bb0be0825d..5e9ff808bbe8a 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -117,10 +117,9 @@ ConnectivityStateTracker::~ConnectivityStateTracker() { void ConnectivityStateTracker::AddWatcher( grpc_connectivity_state initial_state, OrphanablePtr watcher) { - if (GRPC_TRACE_FLAG_ENABLED(connectivity_state)) { - LOG(INFO) << "ConnectivityStateTracker " << name_ << "[" << this - << "]: add watcher " << watcher.get(); - } + GRPC_TRACE_LOG(connectivity_state, INFO) + << "ConnectivityStateTracker " << name_ << "[" << this + << "]: add watcher " << watcher.get(); grpc_connectivity_state current_state = state_.load(std::memory_order_relaxed); if (initial_state != current_state) { @@ -141,10 +140,9 @@ void ConnectivityStateTracker::AddWatcher( void ConnectivityStateTracker::RemoveWatcher( ConnectivityStateWatcherInterface* watcher) { - if (GRPC_TRACE_FLAG_ENABLED(connectivity_state)) { - LOG(INFO) << "ConnectivityStateTracker " << name_ << "[" << this - << "]: remove watcher " << watcher; - } + GRPC_TRACE_LOG(connectivity_state, INFO) + << "ConnectivityStateTracker " << name_ << "[" << this + << "]: remove watcher " << watcher; watchers_.erase(watcher); } @@ -178,10 +176,9 @@ void ConnectivityStateTracker::SetState(grpc_connectivity_state state, grpc_connectivity_state ConnectivityStateTracker::state() const { grpc_connectivity_state state = state_.load(std::memory_order_relaxed); - if (GRPC_TRACE_FLAG_ENABLED(connectivity_state)) { - LOG(INFO) << "ConnectivityStateTracker " << name_ << "[" << this - << "]: get current state: " << ConnectivityStateName(state); - } + GRPC_TRACE_LOG(connectivity_state, INFO) + << "ConnectivityStateTracker " << name_ << "[" << this + << "]: get current state: " << ConnectivityStateName(state); return state; } diff --git a/src/core/lib/transport/interception_chain.cc b/src/core/lib/transport/interception_chain.cc index f3a8a924139d3..d042f5d1f6c43 100644 --- a/src/core/lib/transport/interception_chain.cc +++ b/src/core/lib/transport/interception_chain.cc @@ -32,7 +32,7 @@ std::atomic InterceptionChainBuilder::next_filter_id_{0}; // HijackedCall CallInitiator HijackedCall::MakeCall() { - auto metadata = Arena::MakePooled(); + auto metadata = Arena::MakePooledForOverwrite(); *metadata = metadata_->Copy(); return MakeCallWithMetadata(std::move(metadata)); } diff --git a/src/core/lib/transport/metadata.cc b/src/core/lib/transport/metadata.cc index db4b35c1e10a2..44722b98c6120 100644 --- a/src/core/lib/transport/metadata.cc +++ b/src/core/lib/transport/metadata.cc @@ -22,7 +22,7 @@ namespace grpc_core { ServerMetadataHandle ServerMetadataFromStatus(const absl::Status& status) { - auto hdl = Arena::MakePooled(); + auto hdl = Arena::MakePooledForOverwrite(); grpc_status_code code; std::string message; grpc_error_get_status(status, Timestamp::InfFuture(), &code, &message, @@ -41,4 +41,21 @@ ServerMetadataHandle CancelledServerMetadataFromStatus( return hdl; } +ServerMetadataHandle ServerMetadataFromStatus(grpc_status_code code, + absl::string_view message) { + auto hdl = Arena::MakePooledForOverwrite(); + hdl->Set(GrpcStatusMetadata(), code); + hdl->Set(GrpcMessageMetadata(), Slice::FromCopiedString(message)); + return hdl; +} + +ServerMetadataHandle CancelledServerMetadataFromStatus( + grpc_status_code code, absl::string_view message) { + auto hdl = Arena::MakePooledForOverwrite(); + hdl->Set(GrpcStatusMetadata(), code); + hdl->Set(GrpcMessageMetadata(), Slice::FromCopiedString(message)); + hdl->Set(GrpcCallWasCancelled(), true); + return hdl; +} + } // namespace grpc_core diff --git a/src/core/lib/transport/metadata.h b/src/core/lib/transport/metadata.h index b6b69017d1822..602616eb06bc4 100644 --- a/src/core/lib/transport/metadata.h +++ b/src/core/lib/transport/metadata.h @@ -51,9 +51,30 @@ inline bool IsStatusOk(const ServerMetadataHandle& m) { GRPC_STATUS_OK; } +// Convert absl::Status to ServerMetadata ServerMetadataHandle ServerMetadataFromStatus(const absl::Status& status); +// Convert absl::Status to ServerMetadata, and set GrpcCallWasCancelled() to +// true ServerMetadataHandle CancelledServerMetadataFromStatus( const absl::Status& status); +// Server metadata with status code set +inline ServerMetadataHandle ServerMetadataFromStatus(grpc_status_code code) { + auto hdl = Arena::MakePooledForOverwrite(); + hdl->Set(GrpcStatusMetadata(), code); + return hdl; +} +inline ServerMetadataHandle CancelledServerMetadataFromStatus( + grpc_status_code code) { + auto hdl = Arena::MakePooledForOverwrite(); + hdl->Set(GrpcStatusMetadata(), code); + hdl->Set(GrpcCallWasCancelled(), true); + return hdl; +} +// The same, but with an error string +ServerMetadataHandle ServerMetadataFromStatus(grpc_status_code code, + absl::string_view message); +ServerMetadataHandle CancelledServerMetadataFromStatus( + grpc_status_code code, absl::string_view message); template <> struct StatusCastImpl { diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h index 3d7779113ab1c..fab1325b95c75 100644 --- a/src/core/lib/transport/metadata_batch.h +++ b/src/core/lib/transport/metadata_batch.h @@ -1052,6 +1052,26 @@ struct LogWrapper { } }; +// Callable for the table FilterIn -- for each value, call the +// appropriate filter method to determine of the value should be kept or +// removed. +template +struct FilterWrapper { + Filterer filter_fn; + + template ::value, bool> = true> + bool operator()(const Value& /*which*/) { + return filter_fn(Which()); + } + + template ::value, bool> = true> + bool operator()(const Value& /*which*/) { + return true; + } +}; + // Encoder to compute TransportSize class TransportSizeEncoder { public: @@ -1094,6 +1114,16 @@ class UnknownMap { BackingType::const_iterator begin() const { return unknown_.cbegin(); } BackingType::const_iterator end() const { return unknown_.cend(); } + template + void Filter(Filterer* filter_fn) { + unknown_.erase( + std::remove_if(unknown_.begin(), unknown_.end(), + [&](auto& pair) { + return !(*filter_fn)(pair.first.as_string_view()); + }), + unknown_.end()); + } + bool empty() const { return unknown_.empty(); } size_t size() const { return unknown_.size(); } void Clear() { unknown_.clear(); } @@ -1314,6 +1344,17 @@ class MetadataMap { } } + // Filter the metadata map. + // Iterates over all encodable and unknown headers and calls the filter_fn + // for each of them. If the function returns true, the header is kept. + template + void Filter(Filterer filter_fn) { + table_.template FilterIn, + Value...>( + metadata_detail::FilterWrapper{filter_fn}); + unknown_.Filter(&filter_fn); + } + std::string DebugString() const { metadata_detail::DebugStringBuilder builder; Log([&builder](absl::string_view key, absl::string_view value) { diff --git a/src/core/load_balancing/grpclb/grpclb.cc b/src/core/load_balancing/grpclb/grpclb.cc index a39aa2d8c3328..c71e8fc364ee8 100644 --- a/src/core/load_balancing/grpclb/grpclb.cc +++ b/src/core/load_balancing/grpclb/grpclb.cc @@ -496,9 +496,10 @@ class GrpcLb final : public LoadBalancingPolicy { new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) { // In TRANSIENT_FAILURE. Cancel the fallback timer and go into // fallback mode immediately. - LOG(INFO) << "[grpclb " << parent_.get() - << "] balancer channel in state:TRANSIENT_FAILURE (" - << status.ToString() << "); entering fallback mode"; + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << parent_.get() + << "] balancer channel in state:TRANSIENT_FAILURE (" + << status.ToString() << "); entering fallback mode"; parent_->fallback_at_startup_checks_pending_ = false; parent_->channel_control_helper()->GetEventEngine()->Cancel( *parent_->lb_fallback_timer_handle_); @@ -673,9 +674,10 @@ class GrpcLb::Serverlist::AddressIterator final server.load_balance_token, lb_token_length); if (lb_token.empty()) { auto addr_uri = grpc_sockaddr_to_uri(&addr); - LOG(INFO) << "Missing LB token for backend address '" - << (addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()) - << "'. The empty token will be used instead"; + GRPC_TRACE_LOG(glb, INFO) + << "Missing LB token for backend address '" + << (addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()) + << "'. The empty token will be used instead"; } // Return address with a channel arg containing LB token and stats object. callback(EndpointAddresses( @@ -850,11 +852,12 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state, client_stats = parent()->lb_calld_->client_stats()->Ref(); } if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << parent() << " helper " << this - << "] state=" << ConnectivityStateName(state) << " (" - << status.ToString() << ") wrapping child picker " << picker.get() - << " (serverlist=" << serverlist.get() - << ", client_stats=" << client_stats.get() << ")"; + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << parent() << " helper " << this + << "] state=" << ConnectivityStateName(state) << " (" + << status.ToString() << ") wrapping child picker " << picker.get() + << " (serverlist=" << serverlist.get() + << ", client_stats=" << client_stats.get() << ")"; } parent()->channel_control_helper()->UpdateState( state, status, @@ -945,10 +948,9 @@ void GrpcLb::BalancerCallState::Orphan() { void GrpcLb::BalancerCallState::StartQuery() { CHECK_NE(lb_call_, nullptr); - if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << grpclb_policy_.get() << "] lb_calld=" << this - << ": Starting LB call " << lb_call_; - } + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << grpclb_policy_.get() << "] lb_calld=" << this + << ": Starting LB call " << lb_call_; // Create the ops. grpc_call_error call_error; grpc_op ops[3]; @@ -1524,10 +1526,9 @@ class GrpcLb::NullLbTokenEndpointIterator final void ForEach(absl::FunctionRef callback) const override { parent_it_->ForEach([&](const EndpointAddresses& endpoint) { - if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << this - << "] fallback address: " << endpoint.ToString(); - } + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << this + << "] fallback address: " << endpoint.ToString(); callback(EndpointAddresses(endpoint.addresses(), endpoint.args().SetObject(empty_token_))); }); @@ -1762,10 +1763,9 @@ OrphanablePtr GrpcLb::CreateChildPolicyLocked( std::make_unique(RefAsSubclass(DEBUG_LOCATION, "Helper")); OrphanablePtr lb_policy = MakeOrphanable(std::move(lb_policy_args), &glb_trace); - if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << this << "] Created new child policy handler (" - << lb_policy.get() << ")"; - } + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << this << "] Created new child policy handler (" + << lb_policy.get() << ")"; // Add the gRPC LB's interested_parties pollset_set to that of the newly // created child policy. This will make the child policy progress upon // activity on gRPC LB, which in turn is tied to the application's call. @@ -1816,10 +1816,9 @@ void GrpcLb::CreateOrUpdateChildPolicyLocked() { child_policy_ = CreateChildPolicyLocked(update_args.args); } // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << this << "] Updating child policy handler " - << child_policy_.get(); - } + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << this << "] Updating child policy handler " + << child_policy_.get(); // TODO(roth): If we're in fallback mode and the child policy rejects the // update, we should propagate that failure back to the resolver somehow. (void)child_policy_->UpdateLocked(std::move(update_args)); @@ -1861,10 +1860,9 @@ void GrpcLb::OnSubchannelCacheTimerLocked() { subchannel_cache_timer_handle_.reset(); auto it = cached_subchannels_.begin(); if (it != cached_subchannels_.end()) { - if (GRPC_TRACE_FLAG_ENABLED(glb)) { - LOG(INFO) << "[grpclb " << this << "] removing " << it->second.size() - << " subchannels from cache"; - } + GRPC_TRACE_LOG(glb, INFO) + << "[grpclb " << this << "] removing " << it->second.size() + << " subchannels from cache"; cached_subchannels_.erase(it); } if (!cached_subchannels_.empty()) { diff --git a/src/core/load_balancing/health_check_client.cc b/src/core/load_balancing/health_check_client.cc index 66e1676fe8a40..6ea6a8745c9c2 100644 --- a/src/core/load_balancing/health_check_client.cc +++ b/src/core/load_balancing/health_check_client.cc @@ -144,18 +144,6 @@ void HealthProducer::HealthChecker::OnConnectivityStateChangeLocked( } } -void HealthProducer::HealthChecker::StartHealthStreamLocked() { - if (GRPC_TRACE_FLAG_ENABLED(health_check_client)) { - LOG(INFO) << "HealthProducer " << producer_.get() << " HealthChecker " - << this << ": creating HealthClient for \"" - << health_check_service_name_ << "\""; - } - stream_client_ = MakeOrphanable( - producer_->connected_subchannel_, producer_->subchannel_->pollset_set(), - std::make_unique(Ref()), - GRPC_TRACE_FLAG_ENABLED(health_check_client) ? "HealthClient" : nullptr); -} - void HealthProducer::HealthChecker::NotifyWatchersLocked( grpc_connectivity_state state, absl::Status status) { if (GRPC_TRACE_FLAG_ENABLED(health_check_client)) { @@ -311,6 +299,18 @@ class HealthProducer::HealthChecker::HealthStreamEventHandler final RefCountedPtr health_checker_; }; +void HealthProducer::HealthChecker::StartHealthStreamLocked() { + if (GRPC_TRACE_FLAG_ENABLED(health_check_client)) { + LOG(INFO) << "HealthProducer " << producer_.get() << " HealthChecker " + << this << ": creating HealthClient for \"" + << health_check_service_name_ << "\""; + } + stream_client_ = MakeOrphanable( + producer_->connected_subchannel_, producer_->subchannel_->pollset_set(), + std::make_unique(Ref()), + GRPC_TRACE_FLAG_ENABLED(health_check_client) ? "HealthClient" : nullptr); +} + // // HealthProducer::ConnectivityWatcher // @@ -341,10 +341,9 @@ class HealthProducer::ConnectivityWatcher final // void HealthProducer::Start(RefCountedPtr subchannel) { - if (GRPC_TRACE_FLAG_ENABLED(health_check_client)) { - LOG(INFO) << "HealthProducer " << this << ": starting with subchannel " - << subchannel.get(); - } + GRPC_TRACE_LOG(health_check_client, INFO) + << "HealthProducer " << this << ": starting with subchannel " + << subchannel.get(); subchannel_ = std::move(subchannel); { MutexLock lock(&mu_); @@ -498,10 +497,9 @@ MakeHealthCheckWatcher( health_check_service_name = args.GetOwnedString(GRPC_ARG_HEALTH_CHECK_SERVICE_NAME); } - if (GRPC_TRACE_FLAG_ENABLED(health_check_client)) { - LOG(INFO) << "creating HealthWatcher -- health_check_service_name=\"" - << health_check_service_name.value_or("N/A") << "\""; - } + GRPC_TRACE_LOG(health_check_client, INFO) + << "creating HealthWatcher -- health_check_service_name=\"" + << health_check_service_name.value_or("N/A") << "\""; return std::make_unique(std::move(work_serializer), std::move(health_check_service_name), std::move(watcher)); diff --git a/src/core/load_balancing/oob_backend_metric.cc b/src/core/load_balancing/oob_backend_metric.cc index e3c44fe335f39..1073e74340078 100644 --- a/src/core/load_balancing/oob_backend_metric.cc +++ b/src/core/load_balancing/oob_backend_metric.cc @@ -274,10 +274,8 @@ void OrcaProducer::MaybeStartStreamLocked() { void OrcaProducer::NotifyWatchers( const BackendMetricData& backend_metric_data) { - if (GRPC_TRACE_FLAG_ENABLED(orca_client)) { - LOG(INFO) << "OrcaProducer " << this - << ": reporting backend metrics to watchers"; - } + GRPC_TRACE_LOG(orca_client, INFO) + << "OrcaProducer " << this << ": reporting backend metrics to watchers"; MutexLock lock(&mu_); for (OrcaWatcher* watcher : watchers_) { watcher->watcher()->OnBackendMetricReport(backend_metric_data); diff --git a/src/core/load_balancing/outlier_detection/outlier_detection.cc b/src/core/load_balancing/outlier_detection/outlier_detection.cc index 28fa5dd01c5d3..5c20847a5a5b8 100644 --- a/src/core/load_balancing/outlier_detection/outlier_detection.cc +++ b/src/core/load_balancing/outlier_detection/outlier_detection.cc @@ -580,10 +580,9 @@ OutlierDetectionLb::OutlierDetectionLb(Args args) } OutlierDetectionLb::~OutlierDetectionLb() { - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] destroying outlier_detection LB policy"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] destroying outlier_detection LB policy"; } void OutlierDetectionLb::ShutdownLocked() { @@ -622,10 +621,9 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) { // Update outlier detection timer. if (!config_->CountingEnabled()) { // No need for timer. Cancel the current timer, if any. - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] counting disabled, cancelling timer"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] counting disabled, cancelling timer"; ejection_timer_.reset(); } else if (ejection_timer_ == nullptr) { // No timer running. Start it now. @@ -643,10 +641,9 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) { // with the same start time. // Note that if the new deadline is in the past, the timer will fire // immediately. - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] interval changed, replacing timer"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] interval changed, replacing timer"; ejection_timer_ = MakeOrphanable( RefAsSubclass(), ejection_timer_->StartTime()); } @@ -663,10 +660,9 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) { // Find the entry in the endpoint map. auto it = endpoint_state_map_.find(key); if (it == endpoint_state_map_.end()) { - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] adding endpoint entry for " << key.ToString(); - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] adding endpoint entry for " << key.ToString(); // The endpoint is not present in the map, so we'll need to add it. // Start by getting a pointer to the entry for each address in the // subchannel map, creating the entry if needed. @@ -722,10 +718,9 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) { for (auto it = endpoint_state_map_.begin(); it != endpoint_state_map_.end();) { if (current_endpoints.find(it->first) == current_endpoints.end()) { - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] removing endpoint map entry " << it->first.ToString(); - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] removing endpoint map entry " << it->first.ToString(); it = endpoint_state_map_.erase(it); } else { ++it; @@ -742,10 +737,9 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) { update_args.resolution_note = std::move(args.resolution_note); update_args.config = config_->child_policy(); update_args.args = std::move(args.args); - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] Updating child policy handler " << child_policy_.get(); - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this << "] Updating child policy handler " + << child_policy_.get(); return child_policy_->UpdateLocked(std::move(update_args)); } @@ -774,10 +768,9 @@ OrphanablePtr OutlierDetectionLb::CreateChildPolicyLocked( OrphanablePtr lb_policy = MakeOrphanable(std::move(lb_policy_args), &outlier_detection_lb_trace); - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << this - << "] Created new child policy handler " << lb_policy.get(); - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << this + << "] Created new child policy handler " << lb_policy.get(); // Add our interested_parties pollset_set to that of the newly created // child policy. This will make the child policy progress upon activity on // this policy, which in turn is tied to the application's call. @@ -842,10 +835,9 @@ OutlierDetectionLb::EjectionTimer::EjectionTimer( RefCountedPtr parent, Timestamp start_time) : parent_(std::move(parent)), start_time_(start_time) { auto interval = parent_->config_->outlier_detection_config().interval; - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << parent_.get() - << "] ejection timer will run in " << interval.ToString(); - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << parent_.get() + << "] ejection timer will run in " << interval.ToString(); timer_handle_ = parent_->channel_control_helper()->GetEventEngine()->RunAfter( interval, [self = Ref(DEBUG_LOCATION, "EjectionTimer")]() mutable { ApplicationCallbackExecCtx callback_exec_ctx; @@ -868,10 +860,9 @@ void OutlierDetectionLb::EjectionTimer::Orphan() { void OutlierDetectionLb::EjectionTimer::OnTimerLocked() { if (!timer_handle_.has_value()) return; timer_handle_.reset(); - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << parent_.get() - << "] ejection timer running"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << parent_.get() + << "] ejection timer running"; std::map success_rate_ejection_candidates; std::map failure_percentage_ejection_candidates; size_t ejected_host_count = 0; @@ -967,10 +958,9 @@ void OutlierDetectionLb::EjectionTimer::OnTimerLocked() { (current_percent < config.max_ejection_percent))) { // Eject and record the timestamp for use when ejecting addresses in // this iteration. - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << parent_.get() - << "] ejecting candidate"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << parent_.get() + << "] ejecting candidate"; candidate.first->Eject(time_now); ++ejected_host_count; } @@ -1014,10 +1004,9 @@ void OutlierDetectionLb::EjectionTimer::OnTimerLocked() { (current_percent < config.max_ejection_percent))) { // Eject and record the timestamp for use when ejecting addresses in // this iteration. - if (GRPC_TRACE_FLAG_ENABLED(outlier_detection_lb)) { - LOG(INFO) << "[outlier_detection_lb " << parent_.get() - << "] ejecting candidate"; - } + GRPC_TRACE_LOG(outlier_detection_lb, INFO) + << "[outlier_detection_lb " << parent_.get() + << "] ejecting candidate"; candidate.first->Eject(time_now); ++ejected_host_count; } diff --git a/src/core/load_balancing/pick_first/pick_first.cc b/src/core/load_balancing/pick_first/pick_first.cc index 45a3b3245768e..9fbd79ef836b4 100644 --- a/src/core/load_balancing/pick_first/pick_first.cc +++ b/src/core/load_balancing/pick_first/pick_first.cc @@ -631,10 +631,10 @@ void PickFirst::GoIdle() { void PickFirst::HealthWatcher::OnConnectivityStateChange( grpc_connectivity_state new_state, absl::Status status) { if (policy_->health_watcher_ != this) return; - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] health watch state update: " - << ConnectivityStateName(new_state) << " (" << status << ")"; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() + << "] health watch state update: " << ConnectivityStateName(new_state) + << " (" << status << ")"; switch (new_state) { case GRPC_CHANNEL_READY: policy_->channel_control_helper()->UpdateState( @@ -672,10 +672,9 @@ PickFirst::SubchannelList::SubchannelData::SubchannelState::SubchannelState( : subchannel_data_(subchannel_data), pick_first_(subchannel_data_->subchannel_list_->policy_), subchannel_(std::move(subchannel)) { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << pick_first_.get() << "] subchannel state " << this - << " (subchannel " << subchannel_.get() << "): starting watch"; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << pick_first_.get() << "] subchannel state " << this + << " (subchannel " << subchannel_.get() << "): starting watch"; auto watcher = std::make_unique(Ref(DEBUG_LOCATION, "Watcher")); watcher_ = watcher.get(); subchannel_->WatchConnectivityState(std::move(watcher)); @@ -696,10 +695,9 @@ void PickFirst::SubchannelList::SubchannelData::SubchannelState::Orphan() { } void PickFirst::SubchannelList::SubchannelData::SubchannelState::Select() { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "Pick First " << pick_first_.get() << " selected subchannel " - << subchannel_.get(); - } + GRPC_TRACE_LOG(pick_first, INFO) + << "Pick First " << pick_first_.get() << " selected subchannel " + << subchannel_.get(); CHECK_NE(subchannel_data_, nullptr); pick_first_->UnsetSelectedSubchannel(); // Cancel health watch, if any. pick_first_->selected_ = std::move(subchannel_data_->subchannel_state_); @@ -1006,10 +1004,9 @@ PickFirst::SubchannelList::SubchannelList(RefCountedPtr policy, args_(args.Remove(GRPC_ARG_INTERNAL_PICK_FIRST_ENABLE_HEALTH_CHECKING) .Remove( GRPC_ARG_INTERNAL_PICK_FIRST_OMIT_STATUS_MESSAGE_PREFIX)) { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Creating subchannel list " - << this << " - channel args: " << args_.ToString(); - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Creating subchannel list " << this + << " - channel args: " << args_.ToString(); if (addresses == nullptr) return; // Create a subchannel for each address. addresses->ForEach([&](const EndpointAddresses& address) { @@ -1037,17 +1034,13 @@ PickFirst::SubchannelList::SubchannelList(RefCountedPtr policy, } PickFirst::SubchannelList::~SubchannelList() { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Destroying subchannel_list " - << this; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Destroying subchannel_list " << this; } void PickFirst::SubchannelList::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Shutting down subchannel_list " - << this; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Shutting down subchannel_list " << this; CHECK(!shutting_down_); shutting_down_ = true; // Cancel Happy Eyeballs timer, if any. @@ -1089,10 +1082,9 @@ void PickFirst::SubchannelList::MaybeFinishHappyEyeballsPass() { // We didn't find another subchannel not in state TRANSIENT_FAILURE, // so report TRANSIENT_FAILURE and switch to a mode in which we try to // connect to all addresses in parallel. - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "Pick First " << policy_.get() << " subchannel list " << this - << " failed to connect to all subchannels"; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "Pick First " << policy_.get() << " subchannel list " << this + << " failed to connect to all subchannels"; // Re-resolve and report TRANSIENT_FAILURE. policy_->channel_control_helper()->RequestReresolution(); absl::Status status = absl::UnavailableError( @@ -1564,10 +1556,10 @@ void OldPickFirst::UnsetSelectedSubchannel() { void OldPickFirst::HealthWatcher::OnConnectivityStateChange( grpc_connectivity_state new_state, absl::Status status) { if (policy_->health_watcher_ != this) return; - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] health watch state update: " - << ConnectivityStateName(new_state) << " (" << status << ")"; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() + << "] health watch state update: " << ConnectivityStateName(new_state) + << " (" << status << ")"; switch (new_state) { case GRPC_CHANNEL_READY: policy_->channel_control_helper()->UpdateState( @@ -1912,10 +1904,8 @@ void OldPickFirst::SubchannelList::SubchannelData:: p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_); } // Cases 1 and 2. - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "Pick First " << p << " selected subchannel " - << subchannel_.get(); - } + GRPC_TRACE_LOG(pick_first, INFO) + << "Pick First " << p << " selected subchannel " << subchannel_.get(); p->selected_ = this; // If health checking is enabled, start the health watch, but don't // report a new picker -- we want to stay in CONNECTING while we wait @@ -1957,10 +1947,9 @@ OldPickFirst::SubchannelList::SubchannelList( args_(args.Remove(GRPC_ARG_INTERNAL_PICK_FIRST_ENABLE_HEALTH_CHECKING) .Remove( GRPC_ARG_INTERNAL_PICK_FIRST_OMIT_STATUS_MESSAGE_PREFIX)) { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Creating subchannel list " - << this << " - channel args: " << args_.ToString(); - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Creating subchannel list " << this + << " - channel args: " << args_.ToString(); if (addresses == nullptr) return; // Create a subchannel for each address. addresses->ForEach([&](const EndpointAddresses& address) { @@ -1987,17 +1976,13 @@ OldPickFirst::SubchannelList::SubchannelList( } OldPickFirst::SubchannelList::~SubchannelList() { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Destroying subchannel_list " - << this; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Destroying subchannel_list " << this; } void OldPickFirst::SubchannelList::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "[PF " << policy_.get() << "] Shutting down subchannel_list " - << this; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "[PF " << policy_.get() << "] Shutting down subchannel_list " << this; CHECK(!shutting_down_); shutting_down_ = true; for (auto& sd : subchannels_) { @@ -2041,10 +2026,9 @@ void OldPickFirst::SubchannelList::MaybeFinishHappyEyeballsPass() { // We didn't find another subchannel not in state TRANSIENT_FAILURE, // so report TRANSIENT_FAILURE and switch to a mode in which we try to // connect to all addresses in parallel. - if (GRPC_TRACE_FLAG_ENABLED(pick_first)) { - LOG(INFO) << "Pick First " << policy_.get() << " subchannel list " << this - << " failed to connect to all subchannels"; - } + GRPC_TRACE_LOG(pick_first, INFO) + << "Pick First " << policy_.get() << " subchannel list " << this + << " failed to connect to all subchannels"; // In case 2, swap to the new subchannel list. This means reporting // TRANSIENT_FAILURE and dropping the existing (working) connection, // but we can't ignore what the control plane has told us. diff --git a/src/core/load_balancing/priority/priority.cc b/src/core/load_balancing/priority/priority.cc index bd421022f78a7..1a49bc649a6a7 100644 --- a/src/core/load_balancing/priority/priority.cc +++ b/src/core/load_balancing/priority/priority.cc @@ -402,10 +402,9 @@ void PriorityLb::ChoosePriorityLocked() { ++priority) { // If the child for the priority does not exist yet, create it. const std::string& child_name = config_->priorities()[priority]; - if (GRPC_TRACE_FLAG_ENABLED(priority_lb)) { - LOG(INFO) << "[priority_lb " << this << "] trying priority " << priority - << ", child " << child_name; - } + GRPC_TRACE_LOG(priority_lb, INFO) + << "[priority_lb " << this << "] trying priority " << priority + << ", child " << child_name; auto& child = children_[child_name]; // Create child if needed. if (child == nullptr) { @@ -461,10 +460,9 @@ void PriorityLb::ChoosePriorityLocked() { ++priority) { // If the child for the priority does not exist yet, create it. const std::string& child_name = config_->priorities()[priority]; - if (GRPC_TRACE_FLAG_ENABLED(priority_lb)) { - LOG(INFO) << "[priority_lb " << this << "] trying priority " << priority - << ", child " << child_name; - } + GRPC_TRACE_LOG(priority_lb, INFO) + << "[priority_lb " << this << "] trying priority " << priority + << ", child " << child_name; auto& child = children_[child_name]; CHECK(child != nullptr); if (child->connectivity_state() == GRPC_CHANNEL_CONNECTING) { @@ -626,19 +624,17 @@ void PriorityLb::ChildPriority::FailoverTimer::OnTimerLocked() { PriorityLb::ChildPriority::ChildPriority( RefCountedPtr priority_policy, std::string name) : priority_policy_(std::move(priority_policy)), name_(std::move(name)) { - if (GRPC_TRACE_FLAG_ENABLED(priority_lb)) { - LOG(INFO) << "[priority_lb " << priority_policy_.get() - << "] creating child " << name_ << " (" << this << ")"; - } + GRPC_TRACE_LOG(priority_lb, INFO) + << "[priority_lb " << priority_policy_.get() << "] creating child " + << name_ << " (" << this << ")"; // Start the failover timer. failover_timer_ = MakeOrphanable(Ref()); } void PriorityLb::ChildPriority::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(priority_lb)) { - LOG(INFO) << "[priority_lb " << priority_policy_.get() << "] child " - << name_ << " (" << this << "): orphaned"; - } + GRPC_TRACE_LOG(priority_lb, INFO) + << "[priority_lb " << priority_policy_.get() << "] child " << name_ + << " (" << this << "): orphaned"; failover_timer_.reset(); deactivation_timer_.reset(); // Remove the child policy's interested_parties pollset_set from the @@ -665,10 +661,9 @@ absl::Status PriorityLb::ChildPriority::UpdateLocked( RefCountedPtr config, bool ignore_reresolution_requests) { if (priority_policy_->shutting_down_) return absl::OkStatus(); - if (GRPC_TRACE_FLAG_ENABLED(priority_lb)) { - LOG(INFO) << "[priority_lb " << priority_policy_.get() << "] child " - << name_ << " (" << this << "): start update"; - } + GRPC_TRACE_LOG(priority_lb, INFO) + << "[priority_lb " << priority_policy_.get() << "] child " << name_ + << " (" << this << "): start update"; ignore_reresolution_requests_ = ignore_reresolution_requests; // Create policy if needed. if (child_policy_ == nullptr) { diff --git a/src/core/load_balancing/ring_hash/ring_hash.cc b/src/core/load_balancing/ring_hash/ring_hash.cc index 215e41d84d1c1..834d0d4a30a93 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.cc +++ b/src/core/load_balancing/ring_hash/ring_hash.cc @@ -655,10 +655,9 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) { } }); } else { - if (GRPC_TRACE_FLAG_ENABLED(ring_hash_lb)) { - LOG(INFO) << "[RH " << this << "] received update with addresses error: " - << args.addresses.status(); - } + GRPC_TRACE_LOG(ring_hash_lb, INFO) + << "[RH " << this << "] received update with addresses error: " + << args.addresses.status(); // If we already have an endpoint list, then keep using the existing // list, but still report back that the update was not accepted. if (!endpoints_.empty()) return args.addresses.status(); diff --git a/src/core/load_balancing/rls/rls.cc b/src/core/load_balancing/rls/rls.cc index 9b532bccf0ebe..b2485c1dbcc01 100644 --- a/src/core/load_balancing/rls/rls.cc +++ b/src/core/load_balancing/rls/rls.cc @@ -1039,10 +1039,9 @@ LoadBalancingPolicy::PickResult RlsLb::Picker::Pick(PickArgs args) { BuildKeyMap(config_->key_builder_map(), args.path, lb_policy_->channel_control_helper()->GetAuthority(), args.initial_metadata)}; - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] picker=" << this - << ": request keys: " << key.ToString(); - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] picker=" << this + << ": request keys: " << key.ToString(); Timestamp now = Timestamp::Now(); MutexLock lock(&lb_policy_->mu_); if (lb_policy_->is_shutdown_) { @@ -1077,10 +1076,9 @@ LoadBalancingPolicy::PickResult RlsLb::Picker::Pick(PickArgs args) { if (entry != nullptr) { // If the entry has non-expired data, use it. if (entry->data_expiration_time() >= now) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] picker=" << this - << ": using cache entry " << entry; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] picker=" << this + << ": using cache entry " << entry; return entry->Pick(args); } // If the entry is in backoff, then use the default target if set, @@ -1093,29 +1091,26 @@ LoadBalancingPolicy::PickResult RlsLb::Picker::Pick(PickArgs args) { } } // RLS call pending. Queue the pick. - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] picker=" << this - << ": RLS request pending; queuing pick"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] picker=" << this + << ": RLS request pending; queuing pick"; return PickResult::Queue(); } LoadBalancingPolicy::PickResult RlsLb::Picker::PickFromDefaultTargetOrFail( const char* reason, PickArgs args, absl::Status status) { if (default_child_policy_ != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] picker=" << this << ": " - << reason << "; using default target"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] picker=" << this << ": " + << reason << "; using default target"; auto pick_result = default_child_policy_->Pick(args); lb_policy_->MaybeExportPickCount(kMetricDefaultTargetPicks, config_->default_target(), pick_result); return pick_result; } - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] picker=" << this << ": " - << reason << "; failing pick"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] picker=" << this << ": " << reason + << "; failing pick"; auto& stats_plugins = lb_policy_->channel_control_helper()->GetStatsPluginGroup(); stats_plugins.AddCounter(kMetricFailedPicks, 1, @@ -1204,10 +1199,9 @@ RlsLb::Cache::Entry::Entry(RefCountedPtr lb_policy, lb_policy_->cache_.lru_list_.end(), key)) {} void RlsLb::Cache::Entry::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] cache entry=" << this - << " " << lru_iterator_->ToString() << ": cache entry evicted"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] cache entry=" << this << " " + << lru_iterator_->ToString() << ": cache entry evicted"; is_shutdown_ = true; lb_policy_->cache_.lru_list_.erase(lru_iterator_); lru_iterator_ = lb_policy_->cache_.lru_list_.end(); // Just in case. @@ -1403,26 +1397,22 @@ RlsLb::Cache::Entry* RlsLb::Cache::FindOrInsert(const RequestKey& key) { lb_policy_->RefAsSubclass(DEBUG_LOCATION, "CacheEntry"), key); map_.emplace(key, OrphanablePtr(entry)); size_ += entry_size; - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_ << "] key=" << key.ToString() - << ": cache entry added, entry=" << entry; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_ << "] key=" << key.ToString() + << ": cache entry added, entry=" << entry; return entry; } // Entry found, so use it. - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_ << "] key=" << key.ToString() - << ": found cache entry " << it->second.get(); - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_ << "] key=" << key.ToString() + << ": found cache entry " << it->second.get(); it->second->MarkUsed(); return it->second.get(); } void RlsLb::Cache::Resize(size_t bytes) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_ << "] resizing cache to " << bytes - << " bytes"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_ << "] resizing cache to " << bytes << " bytes"; size_limit_ = bytes; MaybeShrinkSize(size_limit_); } @@ -1507,10 +1497,9 @@ void RlsLb::Cache::MaybeShrinkSize(size_t bytes) { auto map_it = map_.find(*lru_it); CHECK(map_it != map_.end()); if (!map_it->second->CanEvict()) break; - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_ << "] LRU eviction: removing entry " - << map_it->second.get() << " " << lru_it->ToString(); - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_ << "] LRU eviction: removing entry " + << map_it->second.get() << " " << lru_it->ToString(); size_ -= map_it->second->Size(); map_.erase(map_it); } @@ -1648,10 +1637,9 @@ RlsLb::RlsChannel::RlsChannel(RefCountedPtr lb_policy) } void RlsLb::RlsChannel::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] RlsChannel=" << this - << ", channel=" << channel_.get() << ": shutdown"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] RlsChannel=" << this + << ", channel=" << channel_.get() << ": shutdown"; is_shutdown_ = true; if (channel_ != nullptr) { // Remove channelz linkage. @@ -1715,10 +1703,9 @@ RlsLb::RlsRequest::RlsRequest( backoff_state_(std::move(backoff_state)), reason_(reason), stale_header_data_(std::move(stale_header_data)) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] rls_request=" << this - << ": RLS request created for key " << key_.ToString(); - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] rls_request=" << this + << ": RLS request created for key " << key_.ToString(); GRPC_CLOSURE_INIT(&call_complete_cb_, OnRlsCallComplete, this, nullptr); ExecCtx::Run( DEBUG_LOCATION, @@ -1731,10 +1718,9 @@ RlsLb::RlsRequest::~RlsRequest() { CHECK_EQ(call_, nullptr); } void RlsLb::RlsRequest::Orphan() { if (call_ != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << lb_policy_.get() << "] rls_request=" << this - << " " << key_.ToString() << ": cancelling RLS call"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << lb_policy_.get() << "] rls_request=" << this << " " + << key_.ToString() << ": cancelling RLS call"; grpc_call_cancel_internal(call_); } Unref(DEBUG_LOCATION, "Orphan"); @@ -2031,10 +2017,8 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) { config_->default_target()); created_default_child = true; } else { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << this - << "] using existing child for default target"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << this << "] using existing child for default target"; default_child_policy_ = it->second->Ref(DEBUG_LOCATION, "DefaultChildPolicy"); } @@ -2063,10 +2047,8 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) { p.second->StartUpdate(); } } else if (created_default_child) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << this - << "] starting default child policy update"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << this << "] starting default child policy update"; default_child_policy_->StartUpdate(); } } @@ -2084,10 +2066,8 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) { } } } else if (created_default_child) { - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << this - << "] finishing default child policy update"; - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << this << "] finishing default child policy update"; absl::Status status = default_child_policy_->MaybeFinishUpdate(); if (!status.ok()) { errors.emplace_back(absl::StrCat("target ", config_->default_target(), @@ -2186,10 +2166,9 @@ void RlsLb::UpdatePickerLocked() { if (is_shutdown_) return; for (auto& p : child_policy_map_) { grpc_connectivity_state child_state = p.second->connectivity_state(); - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << this << "] target " << p.second->target() - << " in state " << ConnectivityStateName(child_state); - } + GRPC_TRACE_LOG(rls_lb, INFO) + << "[rlslb " << this << "] target " << p.second->target() + << " in state " << ConnectivityStateName(child_state); if (child_state == GRPC_CHANNEL_READY) { state = GRPC_CHANNEL_READY; break; @@ -2208,10 +2187,8 @@ void RlsLb::UpdatePickerLocked() { } } } - if (GRPC_TRACE_FLAG_ENABLED(rls_lb)) { - LOG(INFO) << "[rlslb " << this << "] reporting state " - << ConnectivityStateName(state); - } + GRPC_TRACE_LOG(rls_lb, INFO) << "[rlslb " << this << "] reporting state " + << ConnectivityStateName(state); absl::Status status; if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) { status = absl::UnavailableError("no children available"); diff --git a/src/core/load_balancing/round_robin/round_robin.cc b/src/core/load_balancing/round_robin/round_robin.cc index 0aa66889ad10b..087d3a02a95c2 100644 --- a/src/core/load_balancing/round_robin/round_robin.cc +++ b/src/core/load_balancing/round_robin/round_robin.cc @@ -246,10 +246,9 @@ absl::Status RoundRobin::UpdateLocked(UpdateArgs args) { } addresses = args.addresses->get(); } else { - if (GRPC_TRACE_FLAG_ENABLED(round_robin)) { - LOG(INFO) << "[RR " << this << "] received update with address error: " - << args.addresses.status(); - } + GRPC_TRACE_LOG(round_robin, INFO) + << "[RR " << this + << "] received update with address error: " << args.addresses.status(); // If we already have a child list, then keep using the existing // list, but still report back that the update was not accepted. if (endpoint_list_ != nullptr) return args.addresses.status(); @@ -313,10 +312,9 @@ void RoundRobin::RoundRobinEndpointList::RoundRobinEndpoint::OnStateUpdate( << status << ")"; } if (new_state == GRPC_CHANNEL_IDLE) { - if (GRPC_TRACE_FLAG_ENABLED(round_robin)) { - LOG(INFO) << "[RR " << round_robin << "] child " << this - << " reported IDLE; requesting connection"; - } + GRPC_TRACE_LOG(round_robin, INFO) + << "[RR " << round_robin << "] child " << this + << " reported IDLE; requesting connection"; ExitIdleLocked(); } // If state changed, update state counters. @@ -396,10 +394,9 @@ void RoundRobin::RoundRobinEndpointList:: // 2) ANY child is CONNECTING => policy is CONNECTING. // 3) ALL children are TRANSIENT_FAILURE => policy is TRANSIENT_FAILURE. if (num_ready_ > 0) { - if (GRPC_TRACE_FLAG_ENABLED(round_robin)) { - LOG(INFO) << "[RR " << round_robin << "] reporting READY with child list " - << this; - } + GRPC_TRACE_LOG(round_robin, INFO) + << "[RR " << round_robin << "] reporting READY with child list " + << this; std::vector> pickers; for (const auto& endpoint : endpoints()) { auto state = endpoint->connectivity_state(); @@ -412,10 +409,9 @@ void RoundRobin::RoundRobinEndpointList:: GRPC_CHANNEL_READY, absl::OkStatus(), MakeRefCounted(round_robin, std::move(pickers))); } else if (num_connecting_ > 0) { - if (GRPC_TRACE_FLAG_ENABLED(round_robin)) { - LOG(INFO) << "[RR " << round_robin - << "] reporting CONNECTING with child list " << this; - } + GRPC_TRACE_LOG(round_robin, INFO) + << "[RR " << round_robin << "] reporting CONNECTING with child list " + << this; round_robin->channel_control_helper()->UpdateState( GRPC_CHANNEL_CONNECTING, absl::Status(), MakeRefCounted(nullptr)); diff --git a/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc b/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc index 8e551372fbfd2..39cce7c2c1862 100644 --- a/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +++ b/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc @@ -560,22 +560,21 @@ WeightedRoundRobin::Picker::Picker(RefCountedPtr wrr, << "] created picker from endpoint_list=" << endpoint_list << " with " << endpoints_.size() << " subchannels"; } + // Note: BuildSchedulerAndStartTimerLocked() passes out pointers to `this`, + // so we need to ensure that we really hold timer_mu_. + MutexLock lock(&timer_mu_); BuildSchedulerAndStartTimerLocked(); } WeightedRoundRobin::Picker::~Picker() { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr_.get() << " picker " << this - << "] destroying picker"; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr_.get() << " picker " << this << "] destroying picker"; } void WeightedRoundRobin::Picker::Orphaned() { MutexLock lock(&timer_mu_); - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr_.get() << " picker " << this - << "] cancelling timer"; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr_.get() << " picker " << this << "] cancelling timer"; wrr_->channel_control_helper()->GetEventEngine()->Cancel(*timer_handle_); timer_handle_.reset(); wrr_.reset(); @@ -641,25 +640,22 @@ void WeightedRoundRobin::Picker::BuildSchedulerAndStartTimerLocked() { stats_plugins.AddCounter(kMetricEndpointWeightStale, num_stale, {wrr_->channel_control_helper()->GetTarget()}, {wrr_->locality_name_}); - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr_.get() << " picker " << this - << "] new weights: " << absl::StrJoin(weights, " "); - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr_.get() << " picker " << this + << "] new weights: " << absl::StrJoin(weights, " "); auto scheduler_or = StaticStrideScheduler::Make( weights, [this]() { return wrr_->scheduler_state_.fetch_add(1); }); std::shared_ptr scheduler; if (scheduler_or.has_value()) { scheduler = std::make_shared(std::move(*scheduler_or)); - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr_.get() << " picker " << this - << "] new scheduler: " << scheduler.get(); - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr_.get() << " picker " << this + << "] new scheduler: " << scheduler.get(); } else { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr_.get() << " picker " << this - << "] no scheduler, falling back to RR"; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr_.get() << " picker " << this + << "] no scheduler, falling back to RR"; stats_plugins.AddCounter(kMetricRrFallback, 1, {wrr_->channel_control_helper()->GetTarget()}, {wrr_->locality_name_}); @@ -674,6 +670,10 @@ void WeightedRoundRobin::Picker::BuildSchedulerAndStartTimerLocked() { << "] scheduling timer for " << config_->weight_update_period().ToString(); } + // It's insufficient to hold the implicit constructor lock here, a real lock + // over timer_mu_ is needed: we update timer_handle_ after the timer is + // scheduled, but it may run on another thread before that occurs, causing a + // race. timer_handle_ = wrr_->channel_control_helper()->GetEventEngine()->RunAfter( config_->weight_update_period(), [self = WeakRefAsSubclass(), @@ -683,10 +683,9 @@ void WeightedRoundRobin::Picker::BuildSchedulerAndStartTimerLocked() { { MutexLock lock(&self->timer_mu_); if (self->timer_handle_.has_value()) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << self->wrr_.get() << " picker " - << self.get() << "] timer fired"; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << self->wrr_.get() << " picker " << self.get() + << "] timer fired"; self->BuildSchedulerAndStartTimerLocked(); } } @@ -708,10 +707,9 @@ WeightedRoundRobin::WeightedRoundRobin(Args args) locality_name_(channel_args() .GetString(GRPC_ARG_LB_WEIGHTED_TARGET_CHILD) .value_or("")) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << this << "] Created -- locality_name=\"" - << std::string(locality_name_) << "\""; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << this << "] Created -- locality_name=\"" + << std::string(locality_name_) << "\""; } WeightedRoundRobin::~WeightedRoundRobin() { @@ -771,10 +769,9 @@ absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) { std::make_shared(EndpointAddressesList( ordered_addresses.begin(), ordered_addresses.end())); } else { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << this << "] received update with address error: " - << args.addresses.status().ToString(); - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << this << "] received update with address error: " + << args.addresses.status().ToString(); // If we already have an endpoint list, then keep using the existing // list, but still report back that the update was not accepted. if (endpoint_list_ != nullptr) return args.addresses.status(); @@ -886,10 +883,9 @@ void WeightedRoundRobin::WrrEndpointList::WrrEndpoint::OnStateUpdate( << status << ")"; } if (new_state == GRPC_CHANNEL_IDLE) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr << "] child " << this - << " reported IDLE; requesting connection"; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr << "] child " << this + << " reported IDLE; requesting connection"; ExitIdleLocked(); } else if (new_state == GRPC_CHANNEL_READY) { // If we transition back to READY state, restart the blackout period. @@ -983,18 +979,15 @@ void WeightedRoundRobin::WrrEndpointList:: // 2) ANY child is CONNECTING => policy is CONNECTING. // 3) ALL children are TRANSIENT_FAILURE => policy is TRANSIENT_FAILURE. if (num_ready_ > 0) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr << "] reporting READY with endpoint list " - << this; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr << "] reporting READY with endpoint list " << this; wrr->channel_control_helper()->UpdateState( GRPC_CHANNEL_READY, absl::Status(), MakeRefCounted(wrr->RefAsSubclass(), this)); } else if (num_connecting_ > 0) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_round_robin_lb)) { - LOG(INFO) << "[WRR " << wrr - << "] reporting CONNECTING with endpoint list " << this; - } + GRPC_TRACE_LOG(weighted_round_robin_lb, INFO) + << "[WRR " << wrr << "] reporting CONNECTING with endpoint list " + << this; wrr->channel_control_helper()->UpdateState( GRPC_CHANNEL_CONNECTING, absl::Status(), MakeRefCounted(nullptr)); diff --git a/src/core/load_balancing/weighted_target/weighted_target.cc b/src/core/load_balancing/weighted_target/weighted_target.cc index ab73a11772374..5a492306c8889 100644 --- a/src/core/load_balancing/weighted_target/weighted_target.cc +++ b/src/core/load_balancing/weighted_target/weighted_target.cc @@ -290,10 +290,9 @@ WeightedTargetLb::WeightedTargetLb(Args args) } WeightedTargetLb::~WeightedTargetLb() { - if (GRPC_TRACE_FLAG_ENABLED(weighted_target_lb)) { - LOG(INFO) << "[weighted_target_lb " << this - << "] destroying weighted_target LB policy"; - } + GRPC_TRACE_LOG(weighted_target_lb, INFO) + << "[weighted_target_lb " << this + << "] destroying weighted_target LB policy"; } void WeightedTargetLb::ShutdownLocked() { @@ -382,10 +381,9 @@ void WeightedTargetLb::UpdateStateLocked() { // all children. This avoids unnecessary picker churn while an update // is being propagated to our children. if (update_in_progress_) return; - if (GRPC_TRACE_FLAG_ENABLED(weighted_target_lb)) { - LOG(INFO) << "[weighted_target_lb " << this - << "] scanning children to determine connectivity state"; - } + GRPC_TRACE_LOG(weighted_target_lb, INFO) + << "[weighted_target_lb " << this + << "] scanning children to determine connectivity state"; // Construct lists of child pickers with associated weights, one for // children that are in state READY and another for children that are // in state TRANSIENT_FAILURE. Each child is represented by a portion of @@ -450,10 +448,9 @@ void WeightedTargetLb::UpdateStateLocked() { } else { connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE; } - if (GRPC_TRACE_FLAG_ENABLED(weighted_target_lb)) { - LOG(INFO) << "[weighted_target_lb " << this << "] connectivity changed to " - << ConnectivityStateName(connectivity_state); - } + GRPC_TRACE_LOG(weighted_target_lb, INFO) + << "[weighted_target_lb " << this << "] connectivity changed to " + << ConnectivityStateName(connectivity_state); RefCountedPtr picker; absl::Status status; switch (connectivity_state) { @@ -525,10 +522,9 @@ WeightedTargetLb::WeightedChild::WeightedChild( : weighted_target_policy_(std::move(weighted_target_policy)), name_(name), picker_(MakeRefCounted(nullptr)) { - if (GRPC_TRACE_FLAG_ENABLED(weighted_target_lb)) { - LOG(INFO) << "[weighted_target_lb " << weighted_target_policy_.get() - << "] created WeightedChild " << this << " for " << name_; - } + GRPC_TRACE_LOG(weighted_target_lb, INFO) + << "[weighted_target_lb " << weighted_target_policy_.get() + << "] created WeightedChild " << this << " for " << name_; } WeightedTargetLb::WeightedChild::~WeightedChild() { @@ -657,10 +653,9 @@ void WeightedTargetLb::WeightedChild::OnConnectivityStateUpdateLocked( void WeightedTargetLb::WeightedChild::DeactivateLocked() { // If already deactivated, don't do that again. if (weight_ == 0) return; - if (GRPC_TRACE_FLAG_ENABLED(weighted_target_lb)) { - LOG(INFO) << "[weighted_target_lb " << weighted_target_policy_.get() - << "] WeightedChild " << this << " " << name_ << ": deactivating"; - } + GRPC_TRACE_LOG(weighted_target_lb, INFO) + << "[weighted_target_lb " << weighted_target_policy_.get() + << "] WeightedChild " << this << " " << name_ << ": deactivating"; // Set the child weight to 0 so that future picker won't contain this child. weight_ = 0; // Start a timer to delete the child. diff --git a/src/core/load_balancing/xds/cds.cc b/src/core/load_balancing/xds/cds.cc index 249e327f62849..353f36433ed56 100644 --- a/src/core/load_balancing/xds/cds.cc +++ b/src/core/load_balancing/xds/cds.cc @@ -662,10 +662,9 @@ Json CdsLb::CreateChildPolicyConfigForLeafCluster( {"outlier_detection_experimental", Json::FromObject(std::move(outlier_detection_config))}, })}); - if (GRPC_TRACE_FLAG_ENABLED(cds_lb)) { - LOG(INFO) << "[cdslb " << this << "] generated config for child policy: " - << JsonDump(outlier_detection_policy, /*indent=*/1); - } + GRPC_TRACE_LOG(cds_lb, INFO) + << "[cdslb " << this << "] generated config for child policy: " + << JsonDump(outlier_detection_policy, /*indent=*/1); return outlier_detection_policy; } @@ -695,10 +694,9 @@ Json CdsLb::CreateChildPolicyConfigForAggregateCluster( {"priorities", Json::FromArray(std::move(priority_priorities))}, })}, })}); - if (GRPC_TRACE_FLAG_ENABLED(cds_lb)) { - LOG(INFO) << "[cdslb " << this << "] generated config for child policy: " - << JsonDump(json, /*indent=*/1); - } + GRPC_TRACE_LOG(cds_lb, INFO) + << "[cdslb " << this << "] generated config for child policy: " + << JsonDump(json, /*indent=*/1); return json; } @@ -714,10 +712,8 @@ void CdsLb::ResetState() { } void CdsLb::ReportTransientFailure(absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(cds_lb)) { - LOG(INFO) << "[cdslb " << this - << "] reporting TRANSIENT_FAILURE: " << status; - } + GRPC_TRACE_LOG(cds_lb, INFO) + << "[cdslb " << this << "] reporting TRANSIENT_FAILURE: " << status; ResetState(); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, status, diff --git a/src/core/load_balancing/xds/xds_cluster_impl.cc b/src/core/load_balancing/xds/xds_cluster_impl.cc index 0a04f73a5a05f..1c720efe92991 100644 --- a/src/core/load_balancing/xds/xds_cluster_impl.cc +++ b/src/core/load_balancing/xds/xds_cluster_impl.cc @@ -404,10 +404,9 @@ XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb, drop_config_(xds_cluster_impl_lb->drop_config_), drop_stats_(xds_cluster_impl_lb->drop_stats_), picker_(std::move(picker)) { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << xds_cluster_impl_lb - << "] constructed new picker " << this; - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << xds_cluster_impl_lb + << "] constructed new picker " << this; } LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick( @@ -500,17 +499,15 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick( XdsClusterImplLb::XdsClusterImplLb(RefCountedPtr xds_client, Args args) : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << this - << "] created -- using xds client " << xds_client_.get(); - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << this << "] created -- using xds client " + << xds_client_.get(); } XdsClusterImplLb::~XdsClusterImplLb() { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << this - << "] destroying xds_cluster_impl LB policy"; - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << this + << "] destroying xds_cluster_impl LB policy"; } void XdsClusterImplLb::ShutdownLocked() { @@ -537,10 +534,9 @@ void XdsClusterImplLb::ResetState() { } void XdsClusterImplLb::ReportTransientFailure(absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << this - << "] reporting TRANSIENT_FAILURE: " << status; - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << this + << "] reporting TRANSIENT_FAILURE: " << status; ResetState(); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, status, @@ -674,23 +670,35 @@ XdsClusterImplLb::MaybeCreateCertificateProviderLocked( return nullptr; } // Configure root cert. - absl::string_view root_provider_instance_name = - cluster_resource.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.instance_name; - absl::string_view root_cert_name = - cluster_resource.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.certificate_name; + absl::string_view root_cert_name; RefCountedPtr root_cert_provider; - if (!root_provider_instance_name.empty()) { - root_cert_provider = - xds_client_->certificate_provider_store() - .CreateOrGetCertificateProvider(root_provider_instance_name); - if (root_cert_provider == nullptr) { - return absl::InternalError( - absl::StrCat("Certificate provider instance name: \"", - root_provider_instance_name, "\" not recognized.")); - } - } + bool use_system_root_certs = false; + absl::Status status = Match( + cluster_resource.common_tls_context.certificate_validation_context + .ca_certs, + [](const absl::monostate&) { + // No root cert configured. + return absl::OkStatus(); + }, + [&](const CommonTlsContext::CertificateProviderPluginInstance& + cert_provider) { + root_cert_name = cert_provider.certificate_name; + root_cert_provider = + xds_client_->certificate_provider_store() + .CreateOrGetCertificateProvider(cert_provider.instance_name); + if (root_cert_provider == nullptr) { + return absl::InternalError( + absl::StrCat("Certificate provider instance name: \"", + cert_provider.instance_name, "\" not recognized.")); + } + return absl::OkStatus(); + }, + [&](const CommonTlsContext::CertificateValidationContext:: + SystemRootCerts&) { + use_system_root_certs = true; + return absl::OkStatus(); + }); + if (!status.ok()) return status; // Configure identity cert. absl::string_view identity_provider_instance_name = cluster_resource.common_tls_context.tls_certificate_provider_instance @@ -715,8 +723,8 @@ XdsClusterImplLb::MaybeCreateCertificateProviderLocked( .match_subject_alt_names; // Create xds cert provider. return MakeRefCounted( - root_cert_provider, root_cert_name, identity_cert_provider, - identity_cert_name, san_matchers); + std::move(root_cert_provider), root_cert_name, use_system_root_certs, + std::move(identity_cert_provider), identity_cert_name, san_matchers); } void XdsClusterImplLb::MaybeUpdatePickerLocked() { @@ -757,10 +765,9 @@ OrphanablePtr XdsClusterImplLb::CreateChildPolicyLocked( OrphanablePtr lb_policy = MakeOrphanable(std::move(lb_policy_args), &xds_cluster_impl_lb_trace); - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << this - << "] Created new child policy handler " << lb_policy.get(); - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << this + << "] Created new child policy handler " << lb_policy.get(); // Add our interested_parties pollset_set to that of the newly created // child policy. This will make the child policy progress upon activity on // this policy, which in turn is tied to the application's call. @@ -784,10 +791,9 @@ absl::Status XdsClusterImplLb::UpdateChildPolicyLocked( update_args.args = args.Set(GRPC_ARG_XDS_CLUSTER_NAME, config_->cluster_name()); // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_impl_lb)) { - LOG(INFO) << "[xds_cluster_impl_lb " << this - << "] Updating child policy handler " << child_policy_.get(); - } + GRPC_TRACE_LOG(xds_cluster_impl_lb, INFO) + << "[xds_cluster_impl_lb " << this << "] Updating child policy handler " + << child_policy_.get(); return child_policy_->UpdateLocked(std::move(update_args)); } diff --git a/src/core/load_balancing/xds/xds_cluster_manager.cc b/src/core/load_balancing/xds/xds_cluster_manager.cc index 67560f523f766..94d34422907d4 100644 --- a/src/core/load_balancing/xds/xds_cluster_manager.cc +++ b/src/core/load_balancing/xds/xds_cluster_manager.cc @@ -249,10 +249,9 @@ XdsClusterManagerLb::XdsClusterManagerLb(Args args) : LoadBalancingPolicy(std::move(args)) {} XdsClusterManagerLb::~XdsClusterManagerLb() { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_manager_lb)) { - LOG(INFO) << "[xds_cluster_manager_lb " << this - << "] destroying xds_cluster_manager LB policy"; - } + GRPC_TRACE_LOG(xds_cluster_manager_lb, INFO) + << "[xds_cluster_manager_lb " << this + << "] destroying xds_cluster_manager LB policy"; } void XdsClusterManagerLb::ShutdownLocked() { @@ -406,17 +405,15 @@ XdsClusterManagerLb::ClusterChild::ClusterChild( : xds_cluster_manager_policy_(std::move(xds_cluster_manager_policy)), name_(name), picker_(MakeRefCounted(nullptr)) { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_manager_lb)) { - LOG(INFO) << "[xds_cluster_manager_lb " << xds_cluster_manager_policy_.get() - << "] created ClusterChild " << this << " for " << name_; - } + GRPC_TRACE_LOG(xds_cluster_manager_lb, INFO) + << "[xds_cluster_manager_lb " << xds_cluster_manager_policy_.get() + << "] created ClusterChild " << this << " for " << name_; } XdsClusterManagerLb::ClusterChild::~ClusterChild() { - if (GRPC_TRACE_FLAG_ENABLED(xds_cluster_manager_lb)) { - LOG(INFO) << "[xds_cluster_manager_lb " << xds_cluster_manager_policy_.get() - << "] ClusterChild " << this << ": destroying child"; - } + GRPC_TRACE_LOG(xds_cluster_manager_lb, INFO) + << "[xds_cluster_manager_lb " << xds_cluster_manager_policy_.get() + << "] ClusterChild " << this << ": destroying child"; xds_cluster_manager_policy_.reset(DEBUG_LOCATION, "ClusterChild"); } diff --git a/src/core/load_balancing/xds/xds_override_host.cc b/src/core/load_balancing/xds/xds_override_host.cc index 1514e55277418..a32ac6cc4fd27 100644 --- a/src/core/load_balancing/xds/xds_override_host.cc +++ b/src/core/load_balancing/xds/xds_override_host.cc @@ -464,10 +464,9 @@ XdsOverrideHostLb::Picker::Picker( : policy_(std::move(xds_override_host_lb)), picker_(std::move(picker)), override_host_health_status_set_(override_host_health_status_set) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << policy_.get() - << "] constructed new picker " << this; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << policy_.get() + << "] constructed new picker " << this; } absl::optional @@ -605,10 +604,9 @@ XdsOverrideHostLb::IdleTimer::IdleTimer(RefCountedPtr policy, // Min time between timer runs is 5s so that we don't kill ourselves // with lock contention and CPU usage due to sweeps over the map. duration = std::max(duration, Duration::Seconds(5)); - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << policy_.get() << "] idle timer " - << this << ": subchannel cleanup pass will run in " << duration; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << policy_.get() << "] idle timer " << this + << ": subchannel cleanup pass will run in " << duration; timer_handle_ = policy_->channel_control_helper()->GetEventEngine()->RunAfter( duration, [self = RefAsSubclass()]() mutable { ApplicationCallbackExecCtx callback_exec_ctx; @@ -622,10 +620,9 @@ XdsOverrideHostLb::IdleTimer::IdleTimer(RefCountedPtr policy, void XdsOverrideHostLb::IdleTimer::Orphan() { if (timer_handle_.has_value()) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << policy_.get() << "] idle timer " - << this << ": cancelling"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << policy_.get() << "] idle timer " << this + << ": cancelling"; policy_->channel_control_helper()->GetEventEngine()->Cancel(*timer_handle_); timer_handle_.reset(); } @@ -635,10 +632,9 @@ void XdsOverrideHostLb::IdleTimer::Orphan() { void XdsOverrideHostLb::IdleTimer::OnTimerLocked() { if (timer_handle_.has_value()) { timer_handle_.reset(); - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << policy_.get() << "] idle timer " - << this << ": timer fired"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << policy_.get() << "] idle timer " << this + << ": timer fired"; policy_->CleanupSubchannels(); } } @@ -655,10 +651,9 @@ XdsOverrideHostLb::XdsOverrideHostLb(Args args) } XdsOverrideHostLb::~XdsOverrideHostLb() { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] destroying xds_override_host LB policy"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] destroying xds_override_host LB policy"; } void XdsOverrideHostLb::ShutdownLocked() { @@ -695,10 +690,9 @@ void XdsOverrideHostLb::ResetState() { } void XdsOverrideHostLb::ReportTransientFailure(absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] reporting TRANSIENT_FAILURE: " << status; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] reporting TRANSIENT_FAILURE: " << status; ResetState(); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, status, @@ -790,10 +784,9 @@ absl::Status XdsOverrideHostLb::UpdateLocked(UpdateArgs args) { args.addresses = std::make_shared(std::move(*args.addresses)); } else { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] address error: " << args.addresses.status(); - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] address error: " << args.addresses.status(); } // Create child policy if needed. if (child_policy_ == nullptr) { @@ -805,10 +798,9 @@ absl::Status XdsOverrideHostLb::UpdateLocked(UpdateArgs args) { update_args.resolution_note = std::move(args.resolution_note); update_args.config = new_config->child_config(); update_args.args = args_; - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] Updating child policy handler " << child_policy_.get(); - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this << "] Updating child policy handler " + << child_policy_.get(); return child_policy_->UpdateLocked(std::move(update_args)); } @@ -837,10 +829,9 @@ OrphanablePtr XdsOverrideHostLb::CreateChildPolicyLocked( OrphanablePtr lb_policy = MakeOrphanable(std::move(lb_policy_args), &xds_override_host_lb_trace); - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] Created new child policy handler " << lb_policy.get(); - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] Created new child policy handler " << lb_policy.get(); // Add our interested_parties pollset_set to that of the newly created // child policy. This will make the child policy progress upon activity on // this policy, which in turn is tied to the application's call. @@ -877,10 +868,9 @@ void XdsOverrideHostLb::UpdateAddressMap( for (const auto& address : endpoint.addresses()) { auto key = grpc_sockaddr_to_string(&address, /*normalize=*/false); if (!key.ok()) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] no key for endpoint address; not adding to map"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] no key for endpoint address; not adding to map"; } else { addresses.push_back(*std::move(key)); } @@ -907,10 +897,9 @@ void XdsOverrideHostLb::UpdateAddressMap( MutexLock lock(&mu_); for (auto it = subchannel_map_.begin(); it != subchannel_map_.end();) { if (addresses_for_map.find(it->first) == addresses_for_map.end()) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this << "] removing map key " - << it->first; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this << "] removing map key " + << it->first; it->second->UnsetSubchannel(&subchannel_refs_to_drop); it = subchannel_map_.erase(it); } else { @@ -922,10 +911,9 @@ void XdsOverrideHostLb::UpdateAddressMap( auto& address_info = p.second; auto it = subchannel_map_.find(address); if (it == subchannel_map_.end()) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this << "] adding map key " - << address; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this << "] adding map key " + << address; it = subchannel_map_.emplace(address, MakeRefCounted()) .first; } @@ -973,10 +961,9 @@ XdsOverrideHostLb::AdoptSubchannel( } void XdsOverrideHostLb::CreateSubchannelForAddress(absl::string_view address) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] creating owned subchannel for " << address; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this << "] creating owned subchannel for " + << address; auto addr = StringToSockaddr(address); CHECK(addr.ok()); // Note: We don't currently have any cases where per_address_args need to @@ -1016,10 +1003,9 @@ void XdsOverrideHostLb::CleanupSubchannels() { if (p.second->last_used_time() <= idle_threshold) { auto subchannel = p.second->TakeOwnedSubchannel(); if (subchannel != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << this - << "] dropping subchannel for " << p.first; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << this + << "] dropping subchannel for " << p.first; subchannel_refs_to_drop.push_back(std::move(subchannel)); } } else { @@ -1093,10 +1079,9 @@ void XdsOverrideHostLb::SubchannelWrapper::CancelConnectivityStateWatch( } void XdsOverrideHostLb::SubchannelWrapper::Orphaned() { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb " << policy_.get() - << "] subchannel wrapper " << this << " orphaned"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb " << policy_.get() << "] subchannel wrapper " + << this << " orphaned"; if (!IsWorkSerializerDispatchEnabled()) { wrapped_subchannel()->CancelConnectivityStateWatch(watcher_); if (subchannel_entry_ != nullptr) { @@ -1206,20 +1191,19 @@ void XdsOverrideHostLb::SubchannelEntry::OnSubchannelWrapperOrphan( auto* subchannel = GetSubchannel(); if (subchannel != wrapper) return; if (last_used_time_ < (Timestamp::Now() - connection_idle_timeout)) { - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb] removing unowned subchannel wrapper " - << subchannel; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb] removing unowned subchannel " + "wrapper " + << subchannel; subchannel_ = nullptr; } else { // The subchannel is being released by the child policy, but it // is still within its idle timeout, so we make a new copy of // the wrapper with the same underlying subchannel, and we hold // our own ref to it. - if (GRPC_TRACE_FLAG_ENABLED(xds_override_host_lb)) { - LOG(INFO) << "[xds_override_host_lb] subchannel wrapper " << subchannel - << ": cloning to gain ownership"; - } + GRPC_TRACE_LOG(xds_override_host_lb, INFO) + << "[xds_override_host_lb] subchannel wrapper " << subchannel + << ": cloning to gain ownership"; subchannel_ = wrapper->Clone(); } } diff --git a/src/core/load_balancing/xds/xds_wrr_locality.cc b/src/core/load_balancing/xds/xds_wrr_locality.cc index 25b1b4f0a9570..83f646dc22dcd 100644 --- a/src/core/load_balancing/xds/xds_wrr_locality.cc +++ b/src/core/load_balancing/xds/xds_wrr_locality.cc @@ -239,10 +239,9 @@ absl::Status XdsWrrLocalityLb::UpdateLocked(UpdateArgs args) { update_args.resolution_note = std::move(args.resolution_note); update_args.args = std::move(args.args); // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(xds_wrr_locality_lb)) { - LOG(INFO) << "[xds_wrr_locality_lb " << this << "] updating child policy " - << child_policy_.get(); - } + GRPC_TRACE_LOG(xds_wrr_locality_lb, INFO) + << "[xds_wrr_locality_lb " << this << "] updating child policy " + << child_policy_.get(); return child_policy_->UpdateLocked(std::move(update_args)); } @@ -256,10 +255,9 @@ OrphanablePtr XdsWrrLocalityLb::CreateChildPolicyLocked( auto lb_policy = CoreConfiguration::Get().lb_policy_registry().CreateLoadBalancingPolicy( "weighted_target_experimental", std::move(lb_policy_args)); - if (GRPC_TRACE_FLAG_ENABLED(xds_wrr_locality_lb)) { - LOG(INFO) << "[xds_wrr_locality_lb " << this - << "] created new child policy " << lb_policy.get(); - } + GRPC_TRACE_LOG(xds_wrr_locality_lb, INFO) + << "[xds_wrr_locality_lb " << this << "] created new child policy " + << lb_policy.get(); // Add our interested_parties pollset_set to that of the newly created // child policy. This will make the child policy progress upon activity on // this LB policy, which in turn is tied to the application's call. diff --git a/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc index 373727a9902ea..0dcd1667d1e2a 100644 --- a/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -181,6 +181,22 @@ class GrpcAresQuery final { const std::string name_; }; +static absl::Status AresStatusToAbslStatus(int status, + absl::string_view error_msg) { + switch (status) { + case ARES_ECANCELLED: + return absl::CancelledError(error_msg); + case ARES_ENOTIMP: + return absl::UnimplementedError(error_msg); + case ARES_ENOTFOUND: + return absl::NotFoundError(error_msg); + case ARES_ECONNREFUSED: + return absl::UnavailableError(error_msg); + default: + return absl::UnknownError(error_msg); + } +} + static grpc_ares_ev_driver* grpc_ares_ev_driver_ref( grpc_ares_ev_driver* ev_driver) ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) { @@ -715,8 +731,8 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, hr->qtype, hr->host, hr->is_balancer, ares_strerror(status)); GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked: %s", r, error_msg.c_str()); - grpc_error_handle error = GRPC_ERROR_CREATE(error_msg); - r->error = grpc_error_add_child(error, r->error); + r->error = grpc_error_add_child(AresStatusToAbslStatus(status, error_msg), + r->error); } destroy_hostbyname_request_locked(hr); } @@ -761,8 +777,8 @@ static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/, ares_strerror(status)); GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked: %s", r, error_msg.c_str()); - grpc_error_handle error = GRPC_ERROR_CREATE(error_msg); - r->error = grpc_error_add_child(error, r->error); + r->error = grpc_error_add_child(AresStatusToAbslStatus(status, error_msg), + r->error); } delete q; } @@ -780,7 +796,6 @@ static void on_txt_done_locked(void* arg, int status, int /*timeouts*/, const size_t prefix_len = sizeof(g_service_config_attribute_prefix) - 1; struct ares_txt_ext* result = nullptr; struct ares_txt_ext* reply = nullptr; - grpc_error_handle error; if (status != ARES_SUCCESS) goto fail; GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked name=%s ARES_SUCCESS", r, q->name().c_str()); @@ -824,8 +839,8 @@ static void on_txt_done_locked(void* arg, int status, int /*timeouts*/, q->name(), ares_strerror(status)); GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked %s", r, error_msg.c_str()); - error = GRPC_ERROR_CREATE(error_msg); - r->error = grpc_error_add_child(error, r->error); + r->error = + grpc_error_add_child(AresStatusToAbslStatus(status, error_msg), r->error); } grpc_error_handle set_request_dns_server(grpc_ares_request* r, diff --git a/src/core/resolver/xds/xds_dependency_manager.cc b/src/core/resolver/xds/xds_dependency_manager.cc index 0abc189d4bd1d..332bc4a12ea9e 100644 --- a/src/core/resolver/xds/xds_dependency_manager.cc +++ b/src/core/resolver/xds/xds_dependency_manager.cc @@ -364,10 +364,9 @@ XdsDependencyManager::XdsDependencyManager( listener_resource_name_(std::move(listener_resource_name)), args_(std::move(args)), interested_parties_(interested_parties) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] starting watch for listener " << listener_resource_name_; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this << "] starting watch for listener " + << listener_resource_name_; auto listener_watcher = MakeRefCounted(Ref()); listener_watcher_ = listener_watcher.get(); XdsListenerResourceType::StartWatch( @@ -406,12 +405,22 @@ void XdsDependencyManager::Orphan() { Unref(); } +void XdsDependencyManager::RequestReresolution() { + for (const auto& p : dns_resolvers_) { + p.second.resolver->RequestReresolutionLocked(); + } +} + +void XdsDependencyManager::ResetBackoff() { + for (const auto& p : dns_resolvers_) { + p.second.resolver->ResetBackoffLocked(); + } +} + void XdsDependencyManager::OnListenerUpdate( std::shared_ptr listener) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received Listener update"; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this << "] received Listener update"; if (xds_client_ == nullptr) return; const auto* hcm = absl::get_if( &listener->listener); @@ -585,10 +594,8 @@ void XdsDependencyManager::OnResourceDoesNotExist(std::string context) { void XdsDependencyManager::OnClusterUpdate( const std::string& name, std::shared_ptr cluster) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received Cluster update: " << name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[XdsDependencyManager " << this + << "] received Cluster update: " << name; if (xds_client_ == nullptr) return; auto it = cluster_watchers_.find(name); if (it == cluster_watchers_.end()) return; @@ -598,10 +605,9 @@ void XdsDependencyManager::OnClusterUpdate( void XdsDependencyManager::OnClusterError(const std::string& name, absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received Cluster error: " << name << " " << status; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] received Cluster error: " << name << " " << status; if (xds_client_ == nullptr) return; auto it = cluster_watchers_.find(name); if (it == cluster_watchers_.end()) return; @@ -613,10 +619,8 @@ void XdsDependencyManager::OnClusterError(const std::string& name, } void XdsDependencyManager::OnClusterDoesNotExist(const std::string& name) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] Cluster does not exist: " << name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[XdsDependencyManager " << this + << "] Cluster does not exist: " << name; if (xds_client_ == nullptr) return; auto it = cluster_watchers_.find(name); if (it == cluster_watchers_.end()) return; @@ -628,10 +632,8 @@ void XdsDependencyManager::OnClusterDoesNotExist(const std::string& name) { void XdsDependencyManager::OnEndpointUpdate( const std::string& name, std::shared_ptr endpoint) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received Endpoint update: " << name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[XdsDependencyManager " << this + << "] received Endpoint update: " << name; if (xds_client_ == nullptr) return; auto it = endpoint_watchers_.find(name); if (it == endpoint_watchers_.end()) return; @@ -660,10 +662,9 @@ void XdsDependencyManager::OnEndpointUpdate( void XdsDependencyManager::OnEndpointError(const std::string& name, absl::Status status) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received Endpoint error: " << name << " " << status; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] received Endpoint error: " << name << " " << status; if (xds_client_ == nullptr) return; auto it = endpoint_watchers_.find(name); if (it == endpoint_watchers_.end()) return; @@ -675,10 +676,8 @@ void XdsDependencyManager::OnEndpointError(const std::string& name, } void XdsDependencyManager::OnEndpointDoesNotExist(const std::string& name) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] Endpoint does not exist: " << name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[XdsDependencyManager " << this + << "] Endpoint does not exist: " << name; if (xds_client_ == nullptr) return; auto it = endpoint_watchers_.find(name); if (it == endpoint_watchers_.end()) return; @@ -690,10 +689,8 @@ void XdsDependencyManager::OnEndpointDoesNotExist(const std::string& name) { void XdsDependencyManager::OnDnsResult(const std::string& dns_name, Resolver::Result result) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] received DNS update: " << dns_name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[XdsDependencyManager " << this + << "] received DNS update: " << dns_name; if (xds_client_ == nullptr) return; auto it = dns_resolvers_.find(dns_name); if (it == dns_resolvers_.end()) return; @@ -753,10 +750,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap( // Create a new watcher if needed. if (state.watcher == nullptr) { auto watcher = MakeRefCounted(Ref(), name); - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] starting watch for cluster " << name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this << "] starting watch for cluster " + << name; state.watcher = watcher.get(); XdsClusterResourceType::StartWatch(xds_client_.get(), name, std::move(watcher)); @@ -780,10 +776,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap( // Start EDS watch if needed. auto& eds_state = endpoint_watchers_[eds_resource_name]; if (eds_state.watcher == nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] starting watch for endpoint " << eds_resource_name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] starting watch for endpoint " << eds_resource_name; auto watcher = MakeRefCounted(Ref(), eds_resource_name); eds_state.watcher = watcher.get(); @@ -808,10 +803,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap( // Start DNS resolver if needed. auto& dns_state = dns_resolvers_[logical_dns.hostname]; if (dns_state.resolver == nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] starting DNS resolver for " << logical_dns.hostname; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] starting DNS resolver for " << logical_dns.hostname; auto* fake_resolver_response_generator = args_.GetPointer< FakeResolverResponseGenerator>( GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR); @@ -975,10 +969,9 @@ void XdsDependencyManager::MaybeReportUpdate() { ++it; continue; } - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] cancelling watch for cluster " << cluster_name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this << "] cancelling watch for cluster " + << cluster_name; XdsClusterResourceType::CancelWatch(xds_client_.get(), cluster_name, it->second.watcher, /*delay_unsubscription=*/false); @@ -993,10 +986,9 @@ void XdsDependencyManager::MaybeReportUpdate() { ++it; continue; } - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] cancelling watch for EDS resource " << eds_resource_name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] cancelling watch for EDS resource " << eds_resource_name; XdsEndpointResourceType::CancelWatch(xds_client_.get(), eds_resource_name, it->second.watcher, /*delay_unsubscription=*/false); @@ -1010,24 +1002,21 @@ void XdsDependencyManager::MaybeReportUpdate() { ++it; continue; } - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] shutting down DNS resolver for " << dns_name; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] shutting down DNS resolver for " << dns_name; dns_resolvers_.erase(it++); } // If we have all the data we need, then send an update. if (!have_all_resources) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] missing data -- NOT returning config"; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] missing data -- NOT returning config"; return; } - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[XdsDependencyManager " << this - << "] returning config: " << config->ToString(); - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[XdsDependencyManager " << this + << "] returning config: " << config->ToString(); watcher_->OnUpdate(std::move(config)); } diff --git a/src/core/resolver/xds/xds_dependency_manager.h b/src/core/resolver/xds/xds_dependency_manager.h index 9b2a5580601df..959ee7f2a7650 100644 --- a/src/core/resolver/xds/xds_dependency_manager.h +++ b/src/core/resolver/xds/xds_dependency_manager.h @@ -149,6 +149,10 @@ class XdsDependencyManager final : public RefCounted, RefCountedPtr GetClusterSubscription( absl::string_view cluster_name); + void RequestReresolution(); + + void ResetBackoff(); + static absl::string_view ChannelArgName() { return GRPC_ARG_NO_SUBCHANNEL_PREFIX "xds_dependency_manager"; } diff --git a/src/core/resolver/xds/xds_resolver.cc b/src/core/resolver/xds/xds_resolver.cc index 20ea00874e68a..44a3cf1898201 100644 --- a/src/core/resolver/xds/xds_resolver.cc +++ b/src/core/resolver/xds/xds_resolver.cc @@ -127,8 +127,13 @@ class XdsResolver final : public Resolver { void ShutdownLocked() override; + void RequestReresolutionLocked() override { + if (dependency_mgr_ != nullptr) dependency_mgr_->RequestReresolution(); + } + void ResetBackoffLocked() override { if (xds_client_ != nullptr) xds_client_->ResetBackoff(); + if (dependency_mgr_ != nullptr) dependency_mgr_->ResetBackoff(); } private: @@ -540,10 +545,9 @@ XdsResolver::RouteConfigData::CreateMethodConfig( absl::Status XdsResolver::RouteConfigData::AddRouteEntry( XdsResolver* resolver, const XdsRouteConfigResource::Route& route, const Duration& default_max_stream_duration) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[xds_resolver " << resolver << "] XdsConfigSelector " << this - << ": route: " << route.ToString(); - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[xds_resolver " << resolver << "] XdsConfigSelector " << this + << ": route: " << route.ToString(); routes_.emplace_back(route); auto* route_entry = &routes_.back(); auto maybe_add_cluster = [&](absl::string_view cluster_key, @@ -632,10 +636,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( RefCountedPtr route_config_data) : resolver_(std::move(resolver)), route_config_data_(std::move(route_config_data)) { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[xds_resolver " << resolver_.get() - << "] creating XdsConfigSelector " << this; - } + GRPC_TRACE_LOG(xds_resolver, INFO) << "[xds_resolver " << resolver_.get() + << "] creating XdsConfigSelector " << this; // Populate filter list. const auto& http_filter_registry = static_cast(resolver_->xds_client_->bootstrap()) @@ -655,10 +657,9 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( } XdsResolver::XdsConfigSelector::~XdsConfigSelector() { - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[xds_resolver " << resolver_.get() - << "] destroying XdsConfigSelector " << this; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[xds_resolver " << resolver_.get() + << "] destroying XdsConfigSelector " << this; route_config_data_.reset(); if (!IsWorkSerializerDispatchEnabled()) { resolver_->MaybeRemoveUnusedClusters(); @@ -957,10 +958,9 @@ void XdsResolver::StartLocked() { lds_resource_name_ = absl::StrReplaceAll(name_template, {{"%s", resource_name_fragment}}); } - if (GRPC_TRACE_FLAG_ENABLED(xds_resolver)) { - LOG(INFO) << "[xds_resolver " << this << "] Started with lds_resource_name " - << lds_resource_name_; - } + GRPC_TRACE_LOG(xds_resolver, INFO) + << "[xds_resolver " << this << "] Started with lds_resource_name " + << lds_resource_name_; // Start watch for xDS config. dependency_mgr_ = MakeOrphanable( xds_client_, work_serializer_, diff --git a/src/core/server/server.cc b/src/core/server/server.cc index 8e7ce0475628e..c957fac6ae23f 100644 --- a/src/core/server/server.cc +++ b/src/core/server/server.cc @@ -71,7 +71,6 @@ #include "src/core/lib/promise/try_seq.h" #include "src/core/lib/slice/slice_buffer.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/call_utils.h" #include "src/core/lib/surface/channel.h" @@ -87,30 +86,6 @@ namespace grpc_core { -// -// Server::RegisteredMethod -// - -struct Server::RegisteredMethod { - RegisteredMethod( - const char* method_arg, const char* host_arg, - grpc_server_register_method_payload_handling payload_handling_arg, - uint32_t flags_arg) - : method(method_arg == nullptr ? "" : method_arg), - host(host_arg == nullptr ? "" : host_arg), - payload_handling(payload_handling_arg), - flags(flags_arg) {} - - ~RegisteredMethod() = default; - - const std::string method; - const std::string host; - const grpc_server_register_method_payload_handling payload_handling; - const uint32_t flags; - // One request matcher per method. - std::unique_ptr matcher; -}; - // // Server::RequestMatcherInterface // @@ -202,6 +177,30 @@ class Server::RequestMatcherInterface { virtual Server* server() const = 0; }; +// +// Server::RegisteredMethod +// + +struct Server::RegisteredMethod { + RegisteredMethod( + const char* method_arg, const char* host_arg, + grpc_server_register_method_payload_handling payload_handling_arg, + uint32_t flags_arg) + : method(method_arg == nullptr ? "" : method_arg), + host(host_arg == nullptr ? "" : host_arg), + payload_handling(payload_handling_arg), + flags(flags_arg) {} + + ~RegisteredMethod() = default; + + const std::string method; + const std::string host; + const grpc_server_register_method_payload_handling payload_handling; + const uint32_t flags; + // One request matcher per method. + std::unique_ptr matcher; +}; + // // Server::RequestedCall // @@ -975,7 +974,7 @@ grpc_error_handle Server::SetupTransport( } t->StartConnectivityWatch(MakeOrphanable( t->RefAsSubclass(), Ref())); - LOG(INFO) << "Adding connection"; + GRPC_TRACE_LOG(server_channel, INFO) << "Adding connection"; connections_.emplace(std::move(t)); ++connections_open_; } else { @@ -1777,7 +1776,8 @@ void Server::CallData::StartTransportStreamOpBatch( grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_create(" << args << ", " << reserved << ")"; grpc_core::Server* server = new grpc_core::Server(grpc_core::CoreConfiguration::Get() .channel_args_preconditioning() @@ -1788,9 +1788,9 @@ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) { void grpc_server_register_completion_queue(grpc_server* server, grpc_completion_queue* cq, void* reserved) { - GRPC_API_TRACE( - "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3, - (server, cq, reserved)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_register_completion_queue(server=" << server + << ", cq=" << cq << ", reserved=" << reserved << ")"; CHECK(!reserved); auto cq_type = grpc_get_cq_completion_type(cq); if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) { @@ -1806,17 +1806,16 @@ void* grpc_server_register_method( grpc_server* server, const char* method, const char* host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags) { - GRPC_API_TRACE( - "grpc_server_register_method(server=%p, method=%s, host=%s, " - "flags=0x%08x)", - 4, (server, method, host, flags)); + GRPC_TRACE_LOG(api, INFO) << "grpc_server_register_method(server=" << server + << ", method=" << method << ", host=" << host + << ", flags=" << absl::StrFormat("0x%08x", flags); return grpc_core::Server::FromC(server)->RegisterMethod( method, host, payload_handling, flags); } void grpc_server_start(grpc_server* server) { grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server)); + GRPC_TRACE_LOG(api, INFO) << "grpc_server_start(server=" << server << ")"; grpc_core::Server::FromC(server)->Start(); } @@ -1824,22 +1823,24 @@ void grpc_server_shutdown_and_notify(grpc_server* server, grpc_completion_queue* cq, void* tag) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3, - (server, cq, tag)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_shutdown_and_notify(server=" << server << ", cq=" << cq + << ", tag=" << tag << ")"; grpc_core::Server::FromC(server)->ShutdownAndNotify(cq, tag); } void grpc_server_cancel_all_calls(grpc_server* server) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_cancel_all_calls(server=" << server << ")"; grpc_core::Server::FromC(server)->CancelAllCalls(); } void grpc_server_destroy(grpc_server* server) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server)); + GRPC_TRACE_LOG(api, INFO) << "grpc_server_destroy(server=" << server << ")"; grpc_core::Server::FromC(server)->Orphan(); } @@ -1850,13 +1851,12 @@ grpc_call_error grpc_server_request_call( grpc_completion_queue* cq_for_notification, void* tag) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE( - "grpc_server_request_call(" - "server=%p, call=%p, details=%p, initial_metadata=%p, " - "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)", - 7, - (server, call, details, request_metadata, cq_bound_to_call, - cq_for_notification, tag)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_request_call(" + << "server=" << server << ", call=" << call << ", details=" << details + << ", initial_metadata=" << request_metadata + << ", cq_bound_to_call=" << cq_bound_to_call + << ", cq_for_notification=" << cq_for_notification << ", tag=" << tag; return grpc_core::Server::FromC(server)->RequestCall( call, details, request_metadata, cq_bound_to_call, cq_for_notification, tag); @@ -1872,15 +1872,15 @@ grpc_call_error grpc_server_request_registered_call( grpc_core::ExecCtx exec_ctx; auto* rm = static_cast(registered_method); - GRPC_API_TRACE( - "grpc_server_request_registered_call(" - "server=%p, registered_method=%p, call=%p, deadline=%p, " - "request_metadata=%p, " - "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, " - "tag=%p)", - 9, - (server, registered_method, call, deadline, request_metadata, - optional_payload, cq_bound_to_call, cq_for_notification, tag_new)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_request_registered_call(" + << "server=" << server << ", registered_method=" << registered_method + << ", call=" << call << ", deadline=" << deadline + << ", request_metadata=" << request_metadata + << ", optional_payload=" << optional_payload + << ", cq_bound_to_call=" << cq_bound_to_call + << ", cq_for_notification=" << cq_for_notification << ", tag=" << tag_new + << ")"; return grpc_core::Server::FromC(server)->RequestRegisteredCall( rm, call, deadline, request_metadata, optional_payload, cq_bound_to_call, cq_for_notification, tag_new); @@ -1890,8 +1890,9 @@ void grpc_server_set_config_fetcher( grpc_server* server, grpc_server_config_fetcher* server_config_fetcher) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_set_config_fetcher(server=%p, config_fetcher=%p)", - 2, (server, server_config_fetcher)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_set_config_fetcher(server=" << server + << ", config_fetcher=" << server_config_fetcher << ")"; grpc_core::Server::FromC(server)->set_config_fetcher( std::unique_ptr(server_config_fetcher)); } @@ -1900,7 +1901,8 @@ void grpc_server_config_fetcher_destroy( grpc_server_config_fetcher* server_config_fetcher) { grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - GRPC_API_TRACE("grpc_server_config_fetcher_destroy(config_fetcher=%p)", 1, - (server_config_fetcher)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_config_fetcher_destroy(config_fetcher=" + << server_config_fetcher << ")"; delete server_config_fetcher; } diff --git a/src/core/server/xds_server_config_fetcher.cc b/src/core/server/xds_server_config_fetcher.cc index 3592baba1769a..037e54470c3da 100644 --- a/src/core/server/xds_server_config_fetcher.cc +++ b/src/core/server/xds_server_config_fetcher.cc @@ -70,7 +70,6 @@ #include "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h" #include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h" #include "src/core/lib/security/credentials/xds/xds_credentials.h" -#include "src/core/lib/surface/api_trace.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/uri/uri_parser.h" #include "src/core/server/server.h" @@ -801,23 +800,21 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager:: auto it = certificate_providers_map_.find(filter_chain); if (it != certificate_providers_map_.end()) return it->second; // Configure root cert. - absl::string_view root_provider_instance_name = - filter_chain->downstream_tls_context.common_tls_context - .certificate_validation_context.ca_certificate_provider_instance - .instance_name; - absl::string_view root_provider_cert_name = - filter_chain->downstream_tls_context.common_tls_context - .certificate_validation_context.ca_certificate_provider_instance - .certificate_name; + auto* ca_cert_provider = + absl::get_if( + &filter_chain->downstream_tls_context.common_tls_context + .certificate_validation_context.ca_certs); + absl::string_view root_provider_cert_name; RefCountedPtr root_cert_provider; - if (!root_provider_instance_name.empty()) { + if (ca_cert_provider != nullptr) { + root_provider_cert_name = ca_cert_provider->certificate_name; root_cert_provider = xds_client_->certificate_provider_store() - .CreateOrGetCertificateProvider(root_provider_instance_name); + .CreateOrGetCertificateProvider(ca_cert_provider->instance_name); if (root_cert_provider == nullptr) { return absl::NotFoundError( absl::StrCat("Certificate provider instance name: \"", - root_provider_instance_name, "\" not recognized.")); + ca_cert_provider->instance_name, "\" not recognized.")); } } // Configure identity cert. @@ -1365,10 +1362,11 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create( grpc_core::ChannelArgs channel_args = grpc_core::CoreConfiguration::Get() .channel_args_preconditioning() .PreconditionChannelArgs(args); - GRPC_API_TRACE( - "grpc_server_config_fetcher_xds_create(notifier={on_serving_status_" - "update=%p, user_data=%p}, args=%p)", - 3, (notifier.on_serving_status_update, notifier.user_data, args)); + GRPC_TRACE_LOG(api, INFO) + << "grpc_server_config_fetcher_xds_create(notifier={on_serving_status_" + "update=" + << notifier.on_serving_status_update + << ", user_data=" << notifier.user_data << "}, args=" << args << ")"; auto xds_client = grpc_core::GrpcXdsClient::GetOrCreate( grpc_core::GrpcXdsClient::kServerKey, channel_args, "XdsServerConfigFetcher"); diff --git a/src/core/telemetry/metrics.h b/src/core/telemetry/metrics.h index 40db0350bf24b..589aa7964ec83 100644 --- a/src/core/telemetry/metrics.h +++ b/src/core/telemetry/metrics.h @@ -461,14 +461,7 @@ class GlobalStatsPluginRegistry { template GRPC_MUST_USE_RESULT std::unique_ptr RegisterCallback(absl::AnyInvocable callback, - Duration min_interval, Args... args) { - AssertIsCallbackGaugeHandle(args...); - return std::make_unique( - *this, std::move(callback), - std::vector{ - args...}, - min_interval); - } + Duration min_interval, Args... args); // Adds all available client call tracers associated with the stats plugins // within the group to \a call_context. @@ -557,6 +550,18 @@ class RegisteredMetricCallback { Duration min_interval_; }; +template +inline std::unique_ptr +GlobalStatsPluginRegistry::StatsPluginGroup::RegisterCallback( + absl::AnyInvocable callback, + Duration min_interval, Args... args) { + AssertIsCallbackGaugeHandle(args...); + return std::make_unique( + *this, std::move(callback), + std::vector{args...}, + min_interval); +} + } // namespace grpc_core #endif // GRPC_SRC_CORE_TELEMETRY_METRICS_H diff --git a/src/core/telemetry/stats_data.cc b/src/core/telemetry/stats_data.cc index 4a317b7fcf01f..b39702f47626b 100644 --- a/src/core/telemetry/stats_data.cc +++ b/src/core/telemetry/stats_data.cc @@ -106,6 +106,20 @@ Histogram_10000_20 operator-(const Histogram_10000_20& left, } return result; } +void HistogramCollector_1800000_40::Collect( + Histogram_1800000_40* result) const { + for (int i = 0; i < 40; i++) { + result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed); + } +} +Histogram_1800000_40 operator-(const Histogram_1800000_40& left, + const Histogram_1800000_40& right) { + Histogram_1800000_40 result; + for (int i = 0; i < 40; i++) { + result.buckets_[i] = left.buckets_[i] - right.buckets_[i]; + } + return result; +} const absl::string_view GlobalStats::counter_name[static_cast(Counter::COUNT)] = { "client_calls_created", @@ -123,6 +137,8 @@ const absl::string_view "http2_writes_begun", "http2_transport_stalls", "http2_stream_stalls", + "http2_hpack_hits", + "http2_hpack_misses", "cq_pluck_creates", "cq_next_creates", "cq_callback_creates", @@ -161,6 +177,8 @@ const absl::string_view GlobalStats::counter_doc[static_cast( "control window", "Number of times sending was completely stalled by the stream flow control " "window", + "Number of HPACK cache hits", + "Number of HPACK cache misses (entries added but never used)", "Number of completion queues created for cq_pluck (indicates sync api " "usage)", "Number of completion queues created for cq_next (indicates cq async api " @@ -192,6 +210,7 @@ const absl::string_view "tcp_read_offer_iov_size", "http2_send_message_size", "http2_metadata_size", + "http2_hpack_entry_lifetime", "wrr_subchannel_list_size", "wrr_subchannel_ready_size", "work_serializer_run_time_ms", @@ -223,6 +242,7 @@ const absl::string_view GlobalStats::histogram_doc[static_cast( "Number of byte segments offered to each syscall_read", "Size of messages received by HTTP2 transport", "Number of bytes consumed by metadata, according to HPACK accounting rules", + "Lifetime of HPACK entries in the cache (in milliseconds)", "Number of subchannels in a subchannel list at picker creation time", "Number of READY subchannels in a subchannel list at picker creation time", "Number of milliseconds work serializers run for", @@ -278,6 +298,15 @@ const int kStatsTable10[21] = {0, 1, 2, 4, 7, 12, 19, const uint8_t kStatsTable11[23] = {3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19}; +const int kStatsTable12[41] = { + 0, 1, 2, 3, 5, 8, 12, 18, 26, + 37, 53, 76, 108, 153, 217, 308, 436, 617, + 873, 1235, 1748, 2473, 3499, 4950, 7003, 9907, 14015, + 19825, 28044, 39670, 56116, 79379, 112286, 158835, 224680, 317821, + 449574, 635945, 899575, 1272492, 1800000}; +const uint8_t kStatsTable13[37] = { + 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}; } // namespace int Histogram_100000_20::BucketFor(int value) { if (value < 3) { @@ -405,6 +434,29 @@ int Histogram_10000_20::BucketFor(int value) { } } } +int Histogram_1800000_40::BucketFor(int value) { + if (value < 4) { + if (value < 0) { + return 0; + } else { + return value; + } + } else { + if (value < 1048577) { + DblUint val; + val.dbl = value; + const int bucket = + kStatsTable13[((val.uint - 4616189618054758400ull) >> 51)]; + return bucket - (value < kStatsTable12[bucket]); + } else { + if (value < 1272492) { + return 38; + } else { + return 39; + } + } + } +} GlobalStats::GlobalStats() : client_calls_created{0}, server_calls_created{0}, @@ -421,6 +473,8 @@ GlobalStats::GlobalStats() http2_writes_begun{0}, http2_transport_stalls{0}, http2_stream_stalls{0}, + http2_hpack_hits{0}, + http2_hpack_misses{0}, cq_pluck_creates{0}, cq_next_creates{0}, cq_callback_creates{0}, @@ -466,6 +520,9 @@ HistogramView GlobalStats::histogram(Histogram which) const { case Histogram::kHttp2MetadataSize: return HistogramView{&Histogram_65536_26::BucketFor, kStatsTable2, 26, http2_metadata_size.buckets()}; + case Histogram::kHttp2HpackEntryLifetime: + return HistogramView{&Histogram_1800000_40::BucketFor, kStatsTable12, 40, + http2_hpack_entry_lifetime.buckets()}; case Histogram::kWrrSubchannelListSize: return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20, wrr_subchannel_list_size.buckets()}; @@ -560,6 +617,10 @@ std::unique_ptr GlobalStatsCollector::Collect() const { data.http2_transport_stalls.load(std::memory_order_relaxed); result->http2_stream_stalls += data.http2_stream_stalls.load(std::memory_order_relaxed); + result->http2_hpack_hits += + data.http2_hpack_hits.load(std::memory_order_relaxed); + result->http2_hpack_misses += + data.http2_hpack_misses.load(std::memory_order_relaxed); result->cq_pluck_creates += data.cq_pluck_creates.load(std::memory_order_relaxed); result->cq_next_creates += @@ -598,6 +659,8 @@ std::unique_ptr GlobalStatsCollector::Collect() const { data.tcp_read_offer_iov_size.Collect(&result->tcp_read_offer_iov_size); data.http2_send_message_size.Collect(&result->http2_send_message_size); data.http2_metadata_size.Collect(&result->http2_metadata_size); + data.http2_hpack_entry_lifetime.Collect( + &result->http2_hpack_entry_lifetime); data.wrr_subchannel_list_size.Collect(&result->wrr_subchannel_list_size); data.wrr_subchannel_ready_size.Collect(&result->wrr_subchannel_ready_size); data.work_serializer_run_time_ms.Collect( @@ -664,6 +727,8 @@ std::unique_ptr GlobalStats::Diff(const GlobalStats& other) const { result->http2_transport_stalls = http2_transport_stalls - other.http2_transport_stalls; result->http2_stream_stalls = http2_stream_stalls - other.http2_stream_stalls; + result->http2_hpack_hits = http2_hpack_hits - other.http2_hpack_hits; + result->http2_hpack_misses = http2_hpack_misses - other.http2_hpack_misses; result->cq_pluck_creates = cq_pluck_creates - other.cq_pluck_creates; result->cq_next_creates = cq_next_creates - other.cq_next_creates; result->cq_callback_creates = cq_callback_creates - other.cq_callback_creates; @@ -695,6 +760,8 @@ std::unique_ptr GlobalStats::Diff(const GlobalStats& other) const { result->http2_send_message_size = http2_send_message_size - other.http2_send_message_size; result->http2_metadata_size = http2_metadata_size - other.http2_metadata_size; + result->http2_hpack_entry_lifetime = + http2_hpack_entry_lifetime - other.http2_hpack_entry_lifetime; result->wrr_subchannel_list_size = wrr_subchannel_list_size - other.wrr_subchannel_list_size; result->wrr_subchannel_ready_size = diff --git a/src/core/telemetry/stats_data.h b/src/core/telemetry/stats_data.h index 6220a118f2079..89f360e2686c7 100644 --- a/src/core/telemetry/stats_data.h +++ b/src/core/telemetry/stats_data.h @@ -35,6 +35,7 @@ class Histogram_100000_20 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 20; } friend Histogram_100000_20 operator-(const Histogram_100000_20& left, const Histogram_100000_20& right); @@ -58,6 +59,7 @@ class Histogram_65536_26 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 26; } friend Histogram_65536_26 operator-(const Histogram_65536_26& left, const Histogram_65536_26& right); @@ -81,6 +83,7 @@ class Histogram_100_20 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 20; } friend Histogram_100_20 operator-(const Histogram_100_20& left, const Histogram_100_20& right); @@ -104,6 +107,7 @@ class Histogram_16777216_20 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 20; } friend Histogram_16777216_20 operator-(const Histogram_16777216_20& left, const Histogram_16777216_20& right); @@ -127,6 +131,7 @@ class Histogram_80_10 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 10; } friend Histogram_80_10 operator-(const Histogram_80_10& left, const Histogram_80_10& right); @@ -150,6 +155,7 @@ class Histogram_10000_20 { public: static int BucketFor(int value); const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 20; } friend Histogram_10000_20 operator-(const Histogram_10000_20& left, const Histogram_10000_20& right); @@ -168,6 +174,30 @@ class HistogramCollector_10000_20 { private: std::atomic buckets_[20]{}; }; +class HistogramCollector_1800000_40; +class Histogram_1800000_40 { + public: + static int BucketFor(int value); + const uint64_t* buckets() const { return buckets_; } + size_t bucket_count() const { return 40; } + friend Histogram_1800000_40 operator-(const Histogram_1800000_40& left, + const Histogram_1800000_40& right); + + private: + friend class HistogramCollector_1800000_40; + uint64_t buckets_[40]{}; +}; +class HistogramCollector_1800000_40 { + public: + void Increment(int value) { + buckets_[Histogram_1800000_40::BucketFor(value)].fetch_add( + 1, std::memory_order_relaxed); + } + void Collect(Histogram_1800000_40* result) const; + + private: + std::atomic buckets_[40]{}; +}; struct GlobalStats { enum class Counter { kClientCallsCreated, @@ -185,6 +215,8 @@ struct GlobalStats { kHttp2WritesBegun, kHttp2TransportStalls, kHttp2StreamStalls, + kHttp2HpackHits, + kHttp2HpackMisses, kCqPluckCreates, kCqNextCreates, kCqCallbackCreates, @@ -213,6 +245,7 @@ struct GlobalStats { kTcpReadOfferIovSize, kHttp2SendMessageSize, kHttp2MetadataSize, + kHttp2HpackEntryLifetime, kWrrSubchannelListSize, kWrrSubchannelReadySize, kWorkSerializerRunTimeMs, @@ -259,6 +292,8 @@ struct GlobalStats { uint64_t http2_writes_begun; uint64_t http2_transport_stalls; uint64_t http2_stream_stalls; + uint64_t http2_hpack_hits; + uint64_t http2_hpack_misses; uint64_t cq_pluck_creates; uint64_t cq_next_creates; uint64_t cq_callback_creates; @@ -287,6 +322,7 @@ struct GlobalStats { Histogram_80_10 tcp_read_offer_iov_size; Histogram_16777216_20 http2_send_message_size; Histogram_65536_26 http2_metadata_size; + Histogram_1800000_40 http2_hpack_entry_lifetime; Histogram_10000_20 wrr_subchannel_list_size; Histogram_10000_20 wrr_subchannel_ready_size; Histogram_100000_20 work_serializer_run_time_ms; @@ -367,6 +403,12 @@ class GlobalStatsCollector { data_.this_cpu().http2_stream_stalls.fetch_add(1, std::memory_order_relaxed); } + void IncrementHttp2HpackHits() { + data_.this_cpu().http2_hpack_hits.fetch_add(1, std::memory_order_relaxed); + } + void IncrementHttp2HpackMisses() { + data_.this_cpu().http2_hpack_misses.fetch_add(1, std::memory_order_relaxed); + } void IncrementCqPluckCreates() { data_.this_cpu().cq_pluck_creates.fetch_add(1, std::memory_order_relaxed); } @@ -447,6 +489,9 @@ class GlobalStatsCollector { void IncrementHttp2MetadataSize(int value) { data_.this_cpu().http2_metadata_size.Increment(value); } + void IncrementHttp2HpackEntryLifetime(int value) { + data_.this_cpu().http2_hpack_entry_lifetime.Increment(value); + } void IncrementWrrSubchannelListSize(int value) { data_.this_cpu().wrr_subchannel_list_size.Increment(value); } @@ -526,6 +571,8 @@ class GlobalStatsCollector { std::atomic http2_writes_begun{0}; std::atomic http2_transport_stalls{0}; std::atomic http2_stream_stalls{0}; + std::atomic http2_hpack_hits{0}; + std::atomic http2_hpack_misses{0}; std::atomic cq_pluck_creates{0}; std::atomic cq_next_creates{0}; std::atomic cq_callback_creates{0}; @@ -551,6 +598,7 @@ class GlobalStatsCollector { HistogramCollector_80_10 tcp_read_offer_iov_size; HistogramCollector_16777216_20 http2_send_message_size; HistogramCollector_65536_26 http2_metadata_size; + HistogramCollector_1800000_40 http2_hpack_entry_lifetime; HistogramCollector_10000_20 wrr_subchannel_list_size; HistogramCollector_10000_20 wrr_subchannel_ready_size; HistogramCollector_100000_20 work_serializer_run_time_ms; diff --git a/src/core/telemetry/stats_data.yaml b/src/core/telemetry/stats_data.yaml index 3d96ddfff6c49..6b1f04878d0c0 100644 --- a/src/core/telemetry/stats_data.yaml +++ b/src/core/telemetry/stats_data.yaml @@ -80,6 +80,14 @@ max: 65536 buckets: 26 doc: Number of bytes consumed by metadata, according to HPACK accounting rules +- counter: http2_hpack_hits + doc: Number of HPACK cache hits +- counter: http2_hpack_misses + doc: Number of HPACK cache misses (entries added but never used) +- histogram: http2_hpack_entry_lifetime + doc: Lifetime of HPACK entries in the cache (in milliseconds) + max: 1800000 + buckets: 40 # completion queues - counter: cq_pluck_creates doc: Number of completion queues created for cq_pluck (indicates sync api usage) diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc index 871b3515dc29b..5f402f8c8eb3d 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc @@ -220,14 +220,14 @@ void alts_handshaker_client_handle_response(alts_handshaker_client* c, } // TSI handshake has been shutdown. if (alts_tsi_handshaker_has_shutdown(handshaker)) { - LOG(INFO) << "TSI handshake shutdown"; + VLOG(2) << "TSI handshake shutdown"; handle_response_done(client, TSI_HANDSHAKE_SHUTDOWN, "TSI handshake shutdown", nullptr, 0, nullptr); return; } // Check for failed grpc read. if (!is_ok || client->inject_read_failure) { - LOG(INFO) << "read failed on grpc call to handshaker service"; + VLOG(2) << "read failed on grpc call to handshaker service"; handle_response_done(client, TSI_INTERNAL_ERROR, "read failed on grpc call to handshaker service", nullptr, 0, nullptr); @@ -470,10 +470,10 @@ static void on_status_received(void* arg, grpc_error_handle error) { // status from the final ALTS message with the status here. char* status_details = grpc_slice_to_c_string(client->handshake_status_details); - LOG(INFO) << "alts_grpc_handshaker_client:" << client - << " on_status_received status:" << client->handshake_status_code - << " details:|" << status_details << "| error:|" - << grpc_core::StatusToString(error) << "|"; + VLOG(2) << "alts_grpc_handshaker_client:" << client + << " on_status_received status:" << client->handshake_status_code + << " details:|" << status_details << "| error:|" + << grpc_core::StatusToString(error) << "|"; gpr_free(status_details); } maybe_complete_tsi_next(client, true /* receive_status_finished */, diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc index ef91dec20878f..16d86e278567b 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc @@ -390,8 +390,8 @@ static void on_handshaker_service_resp_recv(void* arg, } bool success = true; if (!error.ok()) { - LOG(INFO) << "ALTS handshaker on_handshaker_service_resp_recv error: " - << grpc_core::StatusToString(error); + VLOG(2) << "ALTS handshaker on_handshaker_service_resp_recv error: " + << grpc_core::StatusToString(error); success = false; } alts_handshaker_client_handle_response(client, success); @@ -445,7 +445,7 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next( CHECK_EQ(handshaker->client, nullptr); handshaker->client = client; if (handshaker->shutdown) { - LOG(INFO) << "TSI handshake shutdown"; + VLOG(2) << "TSI handshake shutdown"; if (error != nullptr) *error = "TSI handshaker shutdown"; return TSI_HANDSHAKE_SHUTDOWN; } diff --git a/src/core/tsi/fake_transport_security.cc b/src/core/tsi/fake_transport_security.cc index d32faac9e2794..7d80dc5e3f66d 100644 --- a/src/core/tsi/fake_transport_security.cc +++ b/src/core/tsi/fake_transport_security.cc @@ -28,6 +28,7 @@ #include #include "src/core/lib/gprpp/crash.h" +#include "src/core/lib/gprpp/dump_args.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/tsi/transport_security_grpc.h" @@ -210,6 +211,8 @@ static tsi_result tsi_fake_frame_decode(const unsigned char* incoming_bytes, frame->offset += to_read_size; available_size -= to_read_size; frame->size = load32_little_endian(frame->data); + if (frame->size < 4) return TSI_DATA_CORRUPTED; + if (frame->size > 16 * 1024 * 1024) return TSI_DATA_CORRUPTED; tsi_fake_frame_ensure_size(frame); } diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index b468ea0e1d1da..3149eb283fedb 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -206,7 +206,7 @@ static void init_openssl(void) { CRYPTO_set_locking_callback(openssl_locking_cb); CRYPTO_set_id_callback(openssl_thread_id_cb); } else { - LOG(INFO) << "OpenSSL callback has already been set."; + GRPC_TRACE_LOG(tsi, INFO) << "OpenSSL callback has already been set."; } #endif g_ssl_ctx_ex_factory_index = @@ -228,7 +228,7 @@ static void init_openssl(void) { static void ssl_log_where_info(const SSL* ssl, int where, int flag, const char* msg) { if ((where & flag) && GRPC_TRACE_FLAG_ENABLED(tsi)) { - LOG(INFO) << absl::StrFormat("%20.20s - %30.30s - %5.10s", msg, + LOG(INFO) << absl::StrFormat("%20.20s - %s - %s", msg, SSL_state_string_long(ssl), SSL_state_string(ssl)); } @@ -337,7 +337,7 @@ static tsi_result peer_property_from_x509_subject(X509* cert, bool is_verified_root_cert) { X509_NAME* subject_name = X509_get_subject_name(cert); if (subject_name == nullptr) { - LOG(INFO) << "Could not get subject name from certificate."; + GRPC_TRACE_LOG(tsi, INFO) << "Could not get subject name from certificate."; return TSI_NOT_FOUND; } BIO* bio = BIO_new(BIO_s_mem()); @@ -893,8 +893,9 @@ static tsi_result build_alpn_protocol_name_list( static int verify_cb(int ok, X509_STORE_CTX* ctx) { int cert_error = X509_STORE_CTX_get_error(ctx); if (cert_error == X509_V_ERR_UNABLE_TO_GET_CRL) { - LOG(INFO) << "Certificate verification failed to find relevant CRL file. " - "Ignoring error."; + GRPC_TRACE_LOG(tsi, INFO) + << "Certificate verification failed to find relevant CRL file. " + "Ignoring error."; return 1; } if (cert_error != 0) { @@ -961,7 +962,8 @@ static int RootCertExtractCallback(X509_STORE_CTX* ctx, void* /*arg*/) { int success = SSL_set_ex_data(ssl, g_ssl_ex_verified_root_cert_index, root_cert); if (success == 0) { - LOG(INFO) << "Could not set verified root cert in SSL's ex_data"; + GRPC_TRACE_LOG(tsi, INFO) + << "Could not set verified root cert in SSL's ex_data"; } else { #if OPENSSL_VERSION_NUMBER >= 0x10100000L X509_up_ref(root_cert); @@ -979,7 +981,7 @@ static grpc_core::experimental::CrlProvider* GetCrlProvider( if (ssl_index < 0) { char err_str[256]; ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str)); - LOG(INFO) + GRPC_TRACE_LOG(tsi, INFO) << "error getting the SSL index from the X509_STORE_CTX while looking " "up Crl: " << err_str; @@ -987,7 +989,8 @@ static grpc_core::experimental::CrlProvider* GetCrlProvider( } SSL* ssl = static_cast(X509_STORE_CTX_get_ex_data(ctx, ssl_index)); if (ssl == nullptr) { - LOG(INFO) << "error while fetching from CrlProvider. SSL object is null"; + GRPC_TRACE_LOG(tsi, INFO) + << "error while fetching from CrlProvider. SSL object is null"; return nullptr; } SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl); @@ -1005,13 +1008,14 @@ static absl::StatusOr GetCrlFromProvider( } absl::StatusOr issuer_name = grpc_core::IssuerFromCert(cert); if (!issuer_name.ok()) { - LOG(INFO) << "Could not get certificate issuer name"; + GRPC_TRACE_LOG(tsi, INFO) << "Could not get certificate issuer name"; return absl::InvalidArgumentError(issuer_name.status().message()); } absl::StatusOr akid = grpc_core::AkidFromCertificate(cert); std::string akid_to_use; if (!akid.ok()) { - LOG(INFO) << "Could not get certificate authority key identifier."; + GRPC_TRACE_LOG(tsi, INFO) + << "Could not get certificate authority key identifier."; } else { akid_to_use = *akid; } @@ -1174,8 +1178,8 @@ static tsi_result tsi_set_min_and_max_tls_versions( SSL_CTX* ssl_context, tsi_tls_version min_tls_version, tsi_tls_version max_tls_version) { if (ssl_context == nullptr) { - LOG(INFO) << "Invalid nullptr argument to " - "|tsi_set_min_and_max_tls_versions|."; + GRPC_TRACE_LOG(tsi, INFO) << "Invalid nullptr argument to " + "|tsi_set_min_and_max_tls_versions|."; return TSI_INVALID_ARGUMENT; } #if OPENSSL_VERSION_NUMBER >= 0x10100000 @@ -1196,7 +1200,7 @@ static tsi_result tsi_set_min_and_max_tls_versions( break; #endif default: - LOG(INFO) << "TLS version is not supported."; + GRPC_TRACE_LOG(tsi, INFO) << "TLS version is not supported."; return TSI_FAILED_PRECONDITION; } @@ -1215,7 +1219,7 @@ static tsi_result tsi_set_min_and_max_tls_versions( #endif break; default: - LOG(INFO) << "TLS version is not supported."; + GRPC_TRACE_LOG(tsi, INFO) << "TLS version is not supported."; return TSI_FAILED_PRECONDITION; } #endif @@ -1830,6 +1834,17 @@ static tsi_result ssl_handshaker_next(tsi_handshaker* self, // Indicates that the handshake has completed and that a // handshaker_result has been created. self->handshaker_result_created = true; + // Output Cipher information + if (GRPC_TRACE_FLAG_ENABLED(tsi)) { + tsi_ssl_handshaker_result* result = + reinterpret_cast(*handshaker_result); + auto cipher = SSL_get_current_cipher(result->ssl); + if (cipher != nullptr) { + GRPC_TRACE_LOG(tsi, INFO) << absl::StrFormat( + "SSL Cipher Version: %s Name: %s", SSL_CIPHER_get_version(cipher), + SSL_CIPHER_get_name(cipher)); + } + } } } return status; diff --git a/src/core/util/android/log.cc b/src/core/util/android/log.cc index aeb2dc4b26ccb..942ac4bd2ffb5 100644 --- a/src/core/util/android/log.cc +++ b/src/core/util/android/log.cc @@ -30,6 +30,9 @@ #include "src/core/lib/gprpp/crash.h" +extern void gpr_log_message(const char* file, int line, + gpr_log_severity severity, const char* message); + void gpr_log(const char* file, int line, gpr_log_severity severity, const char* format, ...) { // Avoid message construction if gpr_log_message won't log diff --git a/src/core/util/latent_see.cc b/src/core/util/latent_see.cc index cdfaf51b50900..585a072c5b3ea 100644 --- a/src/core/util/latent_see.cc +++ b/src/core/util/latent_see.cc @@ -15,24 +15,36 @@ #include "src/core/util/latent_see.h" #ifdef GRPC_ENABLE_LATENT_SEE +#include #include #include +#include +#include #include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" #include "absl/types/optional.h" +#include "src/core/lib/gprpp/sync.h" +#include "src/core/util/ring_buffer.h" + namespace grpc_core { namespace latent_see { -thread_local std::vector Log::thread_events_; thread_local uint64_t Log::thread_id_ = Log::Get().next_thread_id_.fetch_add(1); +thread_local Bin* Log::bin_ = nullptr; +thread_local void* Log::bin_owner_ = nullptr; std::atomic Flow::next_flow_id_{1}; +std::atomic Log::free_bins_; std::string Log::GenerateJson() { std::vector events; for (auto& fragment : fragments_) { MutexLock lock(&fragment.mu); - events.insert(events.end(), fragment.events.begin(), fragment.events.end()); + for (auto it = fragment.events.begin(); it != fragment.events.end(); ++it) { + events.push_back(*it); + } + fragment.events.Clear(); } absl::optional start_time; for (auto& event : events) { @@ -91,9 +103,8 @@ std::string Log::GenerateJson() { return json; } -void Log::FlushThreadLog() { - auto& thread_events = thread_events_; - if (thread_events.empty()) return; +void Log::FlushBin(Bin* bin) { + if (bin->events.empty()) return; auto& log = Get(); const auto batch_id = log.next_batch_id_.fetch_add(1, std::memory_order_relaxed); @@ -101,11 +112,11 @@ void Log::FlushThreadLog() { const auto thread_id = thread_id_; { MutexLock lock(&fragment.mu); - for (auto event : thread_events) { - fragment.events.push_back(RecordedEvent{thread_id, batch_id, event}); + for (auto event : bin->events) { + fragment.events.Append(RecordedEvent{thread_id, batch_id, event}); } } - thread_events.clear(); + bin->events.clear(); } } // namespace latent_see diff --git a/src/core/util/latent_see.h b/src/core/util/latent_see.h index c8e6686690da4..b4f11d2960b20 100644 --- a/src/core/util/latent_see.h +++ b/src/core/util/latent_see.h @@ -18,8 +18,12 @@ #include #ifdef GRPC_ENABLE_LATENT_SEE +#include #include #include +#include +#include +#include #include #include @@ -27,6 +31,7 @@ #include "src/core/lib/gprpp/per_cpu.h" #include "src/core/lib/gprpp/sync.h" +#include "src/core/util/ring_buffer.h" namespace grpc_core { namespace latent_see { @@ -39,19 +44,59 @@ struct Metadata { enum class EventType : uint8_t { kBegin, kEnd, kFlowStart, kFlowEnd, kMark }; +// A bin collects all events that occur within a parent scope. +struct Bin { + struct Event { + const Metadata* metadata; + std::chrono::steady_clock::time_point timestamp; + uint64_t id; + EventType type; + }; + + void Append(const Metadata* metadata, EventType type, uint64_t id) { + events.push_back( + Event{metadata, std::chrono::steady_clock::now(), id, type}); + } + + std::vector events; + Bin* next_free; +}; + class Log { public: - static void FlushThreadLog(); + static constexpr int kMaxEventsPerCpu = 50000; + static Bin* MaybeStartBin(void* owner) { + if (bin_ != nullptr) return bin_; + Bin* bin = free_bins_.load(std::memory_order_acquire); + do { + if (bin == nullptr) { + bin = new Bin(); + break; + } + } while (!free_bins_.compare_exchange_weak(bin, bin->next_free, + std::memory_order_acq_rel)); + bin_ = bin; + bin_owner_ = owner; + return bin; + } - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static void Append( - const Metadata* metadata, EventType type, uint64_t id) { - thread_events_.push_back( - Event{metadata, std::chrono::steady_clock::now(), id, type}); + static void EndBin(void* owner) { + if (bin_owner_ != owner) return; + FlushBin(bin_); + bin_->next_free = free_bins_.load(std::memory_order_acquire); + while (!free_bins_.compare_exchange_weak(bin_->next_free, bin_, + std::memory_order_acq_rel)) { + } + bin_ = nullptr; } + static Bin* CurrentThreadBin() { return bin_; } + private: Log() = default; + static void FlushBin(Bin* bin); + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static Log& Get() { static Log* log = []() { atexit([] { @@ -68,38 +113,34 @@ class Log { std::string GenerateJson(); - struct Event { - const Metadata* metadata; - std::chrono::steady_clock::time_point timestamp; - uint64_t id; - EventType type; - }; struct RecordedEvent { uint64_t thread_id; uint64_t batch_id; - Event event; + Bin::Event event; }; std::atomic next_thread_id_{1}; std::atomic next_batch_id_{1}; - static thread_local std::vector thread_events_; static thread_local uint64_t thread_id_; + static thread_local Bin* bin_; + static thread_local void* bin_owner_; + static std::atomic free_bins_; struct Fragment { Mutex mu; - std::vector events ABSL_GUARDED_BY(mu); + RingBuffer events ABSL_GUARDED_BY(mu); }; PerCpu fragments_{PerCpuOptions()}; }; -template +template class Scope { public: GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Scope(const Metadata* metadata) : metadata_(metadata) { - Log::Append(metadata_, EventType::kBegin, 0); + bin_->Append(metadata_, EventType::kBegin, 0); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~Scope() { - Log::Append(metadata_, EventType::kEnd, 0); - if (kFlush) Log::FlushThreadLog(); + bin_->Append(metadata_, EventType::kEnd, 0); + if (kParent) Log::EndBin(this); } Scope(const Scope&) = delete; @@ -107,6 +148,8 @@ class Scope { private: const Metadata* const metadata_; + Bin* const bin_ = + kParent ? Log::MaybeStartBin(this) : Log::CurrentThreadBin(); }; using ParentScope = Scope; @@ -118,11 +161,11 @@ class Flow { GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Flow(const Metadata* metadata) : metadata_(metadata), id_(next_flow_id_.fetch_add(1, std::memory_order_relaxed)) { - Log::Append(metadata_, EventType::kFlowStart, id_); + Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowStart, id_); } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~Flow() { if (metadata_ != nullptr) { - Log::Append(metadata_, EventType::kFlowEnd, id_); + Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_); } } @@ -131,7 +174,9 @@ class Flow { Flow(Flow&& other) noexcept : metadata_(std::exchange(other.metadata_, nullptr)), id_(other.id_) {} Flow& operator=(Flow&& other) noexcept { - if (metadata_ != nullptr) Log::Append(metadata_, EventType::kFlowEnd, id_); + if (metadata_ != nullptr) { + Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_); + } metadata_ = std::exchange(other.metadata_, nullptr); id_ = other.id_; return *this; @@ -142,15 +187,18 @@ class Flow { } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void End() { if (metadata_ == nullptr) return; - Log::Append(metadata_, EventType::kFlowEnd, id_); + Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_); metadata_ = nullptr; } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Begin(const Metadata* metadata) { - if (metadata_ != nullptr) Log::Append(metadata_, EventType::kFlowEnd, id_); + auto* bin = Log::CurrentThreadBin(); + if (metadata_ != nullptr) { + bin->Append(metadata_, EventType::kFlowEnd, id_); + } metadata_ = metadata; if (metadata_ == nullptr) return; id_ = next_flow_id_.fetch_add(1, std::memory_order_relaxed); - Log::Append(metadata_, EventType::kFlowStart, id_); + bin->Append(metadata_, EventType::kFlowStart, id_); } private: @@ -160,7 +208,7 @@ class Flow { }; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline void Mark(const Metadata* md) { - Log::Append(md, EventType::kMark, 0); + Log::CurrentThreadBin()->Append(md, EventType::kMark, 0); } } // namespace latent_see @@ -197,6 +245,12 @@ struct Flow { GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void End() {} GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Begin(Metadata*) {} }; +struct ParentScope { + explicit ParentScope(Metadata*) {} +}; +struct InnerScope { + explicit InnerScope(Metadata*) {} +}; } // namespace latent_see } // namespace grpc_core #define GRPC_LATENT_SEE_METADATA(name) nullptr diff --git a/src/core/util/linux/log.cc b/src/core/util/linux/log.cc index f09ecb2dbbc05..bede7c8c21931 100644 --- a/src/core/util/linux/log.cc +++ b/src/core/util/linux/log.cc @@ -47,6 +47,9 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/gprpp/examine_stack.h" +extern void gpr_log_message(const char* file, int line, + gpr_log_severity severity, const char* message); + void gpr_log(const char* file, int line, gpr_log_severity severity, const char* format, ...) { // Avoid message construction if gpr_log_message won't log diff --git a/src/core/util/log.cc b/src/core/util/log.cc index 20a584b976c43..411f76a14cd54 100644 --- a/src/core/util/log.cc +++ b/src/core/util/log.cc @@ -35,10 +35,6 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/util/string.h" -void gpr_default_log(gpr_log_func_args* args); -void gpr_platform_log(gpr_log_func_args* args); -static gpr_atm g_log_func = reinterpret_cast(gpr_default_log); - void gpr_unreachable_code(const char* reason, const char* file, int line) { grpc_core::Crash(absl::StrCat("UNREACHABLE CODE: ", reason), grpc_core::SourceLocation(file, line)); @@ -63,46 +59,29 @@ int gpr_should_log(gpr_log_severity severity) { } } -void gpr_default_log(gpr_log_func_args* args) { - switch (args->severity) { +void gpr_log_message(const char* file, int line, gpr_log_severity severity, + const char* message) { + if (gpr_should_log(severity) == 0) { + return; + } + switch (severity) { case GPR_LOG_SEVERITY_DEBUG: // Log DEBUG messages as VLOG(2). - VLOG(2).AtLocation(args->file, args->line) << args->message; + VLOG(2).AtLocation(file, line) << message; return; case GPR_LOG_SEVERITY_INFO: - LOG(INFO).AtLocation(args->file, args->line) << args->message; + LOG(INFO).AtLocation(file, line) << message; return; case GPR_LOG_SEVERITY_ERROR: - LOG(ERROR).AtLocation(args->file, args->line) << args->message; + LOG(ERROR).AtLocation(file, line) << message; return; default: - LOG(ERROR) << __func__ << ": unknown gpr log severity(" << args->severity + LOG(ERROR) << __func__ << ": unknown gpr log severity(" << severity << "), using ERROR"; - LOG(ERROR).AtLocation(args->file, args->line) << args->message; + LOG(ERROR).AtLocation(file, line) << message; } } -void gpr_log_message(const char* file, int line, gpr_log_severity severity, - const char* message) { - if (gpr_should_log(severity) == 0) { - return; - } - - gpr_log_func_args lfargs; - memset(&lfargs, 0, sizeof(lfargs)); - lfargs.file = file; - lfargs.line = line; - lfargs.severity = severity; - lfargs.message = message; - reinterpret_cast(gpr_atm_no_barrier_load(&g_log_func))(&lfargs); -} - -void gpr_set_log_verbosity( - [[maybe_unused]] gpr_log_severity deprecated_setting) { - LOG(ERROR) - << "This will not be set. Please set this via absl log level settings."; -} - void gpr_log_verbosity_init(void) { // This is enabled in Github only. // This ifndef is converted to ifdef internally by copybara. @@ -113,17 +92,18 @@ void gpr_log_verbosity_init(void) { // This setting will change things for other libraries/code that is unrelated // to grpc. absl::string_view verbosity = grpc_core::ConfigVars::Get().Verbosity(); - DVLOG(2) << "Log verbosity: " << verbosity; if (absl::EqualsIgnoreCase(verbosity, "INFO")) { - LOG(WARNING) << "Not suitable for production. Prefer WARNING or ERROR. " - "However if you see this message in a debug environmenmt " - "or test environmenmt it is safe to ignore this message."; + LOG_FIRST_N(WARNING, 1) + << "Log level INFO is not suitable for production. Prefer WARNING or " + "ERROR. However if you see this message in a debug environmenmt or " + "test environmenmt it is safe to ignore this message."; absl::SetVLogLevel("*grpc*/*", -1); absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); } else if (absl::EqualsIgnoreCase(verbosity, "DEBUG")) { - LOG(WARNING) << "Not suitable for production. Prefer WARNING or ERROR. " - "However if you see this message in a debug environmenmt " - "or test environmenmt it is safe to ignore this message."; + LOG_FIRST_N(WARNING, 1) + << "Log level DEBUG is not suitable for production. Prefer WARNING or " + "ERROR. However if you see this message in a debug environmenmt or " + "test environmenmt it is safe to ignore this message."; absl::SetVLogLevel("*grpc*/*", 2); absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); } else if (absl::EqualsIgnoreCase(verbosity, "ERROR")) { @@ -139,10 +119,3 @@ void gpr_log_verbosity_init(void) { } #endif // GRPC_VERBOSITY_MACRO } - -void gpr_set_log_function([[maybe_unused]] gpr_log_func deprecated_setting) { - LOG(ERROR) - << "This function is deprecated. This function will be deleted in the " - "next gRPC release. You may create a new absl LogSink with similar " - "functionality. gRFC: https://github.com/grpc/proposal/pull/425 "; -} diff --git a/src/core/util/posix/log.cc b/src/core/util/posix/log.cc index 09791014ef863..2d1fe2ebb65f6 100644 --- a/src/core/util/posix/log.cc +++ b/src/core/util/posix/log.cc @@ -38,6 +38,9 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/gprpp/examine_stack.h" +extern void gpr_log_message(const char* file, int line, + gpr_log_severity severity, const char* message); + void gpr_log(const char* file, int line, gpr_log_severity severity, const char* format, ...) { // Avoid message construction if gpr_log_message won't log diff --git a/src/core/util/subprocess_windows.cc b/src/core/util/subprocess_windows.cc index de45381f1fc81..2824cb6107184 100644 --- a/src/core/util/subprocess_windows.cc +++ b/src/core/util/subprocess_windows.cc @@ -114,7 +114,7 @@ void gpr_subprocess_interrupt(gpr_subprocess* p) { DWORD dwExitCode; if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { if (dwExitCode == STILL_ACTIVE) { - LOG(INFO) << "sending ctrl-break"; + VLOG(2) << "sending ctrl-break"; GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, p->pi.dwProcessId); p->joined = 1; p->interrupted = 1; diff --git a/src/core/util/useful.h b/src/core/util/useful.h index cde97a2d449e2..8007c4ca334b0 100644 --- a/src/core/util/useful.h +++ b/src/core/util/useful.h @@ -57,77 +57,6 @@ bool GetBit(T i, size_t n) { return (i & (T(1) << n)) != 0; } -namespace useful_detail { -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t HexdigitBitcount( - uint32_t x) { - return (x - ((x >> 1) & 0x77777777) - ((x >> 2) & 0x33333333) - - ((x >> 3) & 0x11111111)); -} -} // namespace useful_detail - -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - uint32_t i) { - return (((useful_detail::HexdigitBitcount(i) + - (useful_detail::HexdigitBitcount(i) >> 4)) & - 0x0f0f0f0f) % - 255); -} - -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - uint64_t i) { - return BitCount(static_cast(i)) + - BitCount(static_cast(i >> 32)); -} - -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - uint16_t i) { - return BitCount(static_cast(i)); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - uint8_t i) { - return BitCount(static_cast(i)); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - int64_t i) { - return BitCount(static_cast(i)); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - int32_t i) { - return BitCount(static_cast(i)); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - int16_t i) { - return BitCount(static_cast(i)); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline constexpr uint32_t BitCount( - int8_t i) { - return BitCount(static_cast(i)); -} - -#if GRPC_HAS_BUILTIN(__builtin_ctz) -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline uint32_t CountTrailingZeros( - uint32_t i) { - DCHECK_NE(i, 0u); // __builtin_ctz returns undefined behavior for 0 - return __builtin_ctz(i); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline uint32_t CountTrailingZeros( - uint64_t i) { - DCHECK_NE(i, 0u); // __builtin_ctz returns undefined behavior for 0 - return __builtin_ctzll(i); -} -#else -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline uint32_t CountTrailingZeros( - uint32_t i) { - DCHECK_NE(i, 0); // __builtin_ctz returns undefined behavior for 0 - return BitCount((i & -i) - 1); -} -GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline uint32_t CountTrailingZeros( - uint64_t i) { - DCHECK_NE(i, 0); // __builtin_ctz returns undefined behavior for 0 - return BitCount((i & -i) - 1); -} -#endif - // This function uses operator< to implement a qsort-style comparison, whereby: // if a is smaller than b, a number smaller than 0 is returned. // if a is bigger than b, a number greater than 0 is returned. diff --git a/src/core/util/windows/log.cc b/src/core/util/windows/log.cc index 722e4bd9a83e8..e3c7b1179fe4f 100644 --- a/src/core/util/windows/log.cc +++ b/src/core/util/windows/log.cc @@ -33,6 +33,9 @@ #include "src/core/lib/gprpp/examine_stack.h" #include "src/core/util/string.h" +extern void gpr_log_message(const char* file, int line, + gpr_log_severity severity, const char* message); + void gpr_log(const char* file, int line, gpr_log_severity severity, const char* format, ...) { // Avoid message construction if gpr_log_message won't log diff --git a/src/core/xds/grpc/xds_certificate_provider.cc b/src/core/xds/grpc/xds_certificate_provider.cc index 58ce2da4446f5..35c537bf36241 100644 --- a/src/core/xds/grpc/xds_certificate_provider.cc +++ b/src/core/xds/grpc/xds_certificate_provider.cc @@ -108,13 +108,14 @@ class IdentityCertificatesWatcher final XdsCertificateProvider::XdsCertificateProvider( RefCountedPtr root_cert_provider, - absl::string_view root_cert_name, + absl::string_view root_cert_name, bool use_system_root_certs, RefCountedPtr identity_cert_provider, absl::string_view identity_cert_name, std::vector san_matchers) : distributor_(MakeRefCounted()), root_cert_provider_(std::move(root_cert_provider)), root_cert_name_(root_cert_name), + use_system_root_certs_(use_system_root_certs), identity_cert_provider_(std::move(identity_cert_provider)), identity_cert_name_(identity_cert_name), san_matchers_(std::move(san_matchers)), diff --git a/src/core/xds/grpc/xds_certificate_provider.h b/src/core/xds/grpc/xds_certificate_provider.h index 14747d99c14a9..6c64de04571ac 100644 --- a/src/core/xds/grpc/xds_certificate_provider.h +++ b/src/core/xds/grpc/xds_certificate_provider.h @@ -46,7 +46,7 @@ class XdsCertificateProvider final : public grpc_tls_certificate_provider { // ctor for client side XdsCertificateProvider( RefCountedPtr root_cert_provider, - absl::string_view root_cert_name, + absl::string_view root_cert_name, bool use_system_root_certs, RefCountedPtr identity_cert_provider, absl::string_view identity_cert_name, std::vector san_matchers); @@ -67,6 +67,7 @@ class XdsCertificateProvider final : public grpc_tls_certificate_provider { UniqueTypeName type() const override; bool ProvidesRootCerts() const { return root_cert_provider_ != nullptr; } + bool UseSystemRootCerts() const { return use_system_root_certs_; } bool ProvidesIdentityCerts() const { return identity_cert_provider_ != nullptr; } @@ -99,6 +100,7 @@ class XdsCertificateProvider final : public grpc_tls_certificate_provider { RefCountedPtr distributor_; RefCountedPtr root_cert_provider_; std::string root_cert_name_; + bool use_system_root_certs_ = false; RefCountedPtr identity_cert_provider_; std::string identity_cert_name_; std::vector san_matchers_; diff --git a/src/core/xds/grpc/xds_client_grpc.cc b/src/core/xds/grpc/xds_client_grpc.cc index 96492ff31ff3e..7a044d5da1fe7 100644 --- a/src/core/xds/grpc/xds_client_grpc.cc +++ b/src/core/xds/grpc/xds_client_grpc.cc @@ -210,10 +210,9 @@ absl::StatusOr GetBootstrapContents(const char* fallback_config) { // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var. auto env_config = GetEnv("GRPC_XDS_BOOTSTRAP_CONFIG"); if (env_config.has_value()) { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG " - "environment variable"; - } + GRPC_TRACE_LOG(xds_client, INFO) + << "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG " + << "environment variable"; return std::move(*env_config); } // Finally, try fallback config. @@ -270,10 +269,8 @@ absl::StatusOr> GrpcXdsClient::GetOrCreate( key, std::move(*bootstrap), channel_args, MakeOrphanable(channel_args)); g_xds_client_map->emplace(xds_client->key(), xds_client.get()); - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << xds_client.get() - << "] Created xDS client for key " << key; - } + GRPC_TRACE_LOG(xds_client, INFO) << "[xds_client " << xds_client.get() + << "] Created xDS client for key " << key; return xds_client; } diff --git a/src/core/xds/grpc/xds_cluster_parser.cc b/src/core/xds/grpc/xds_cluster_parser.cc index 50e3807b9b989..c26c62c458eb0 100644 --- a/src/core/xds/grpc/xds_cluster_parser.cc +++ b/src/core/xds/grpc/xds_cluster_parser.cc @@ -101,9 +101,9 @@ CommonTlsContext UpstreamTlsContextParse( common_tls_context = CommonTlsContextParse(context, common_tls_context_proto, errors); } - if (common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.instance_name.empty()) { - errors->AddError("no CA certificate provider instance configured"); + if (absl::holds_alternative( + common_tls_context.certificate_validation_context.ca_certs)) { + errors->AddError("no CA certs configured"); } return common_tls_context; } diff --git a/src/core/xds/grpc/xds_common_types.cc b/src/core/xds/grpc/xds_common_types.cc index 4617334dddbdc..bb169304c6858 100644 --- a/src/core/xds/grpc/xds_common_types.cc +++ b/src/core/xds/grpc/xds_common_types.cc @@ -20,25 +20,9 @@ #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" -namespace grpc_core { +#include "src/core/lib/gprpp/match.h" -// -// CommonTlsContext::CertificateValidationContext -// - -std::string CommonTlsContext::CertificateValidationContext::ToString() const { - std::vector contents; - contents.reserve(match_subject_alt_names.size()); - for (const auto& match : match_subject_alt_names) { - contents.push_back(match.ToString()); - } - return absl::StrFormat("{match_subject_alt_names=[%s]}", - absl::StrJoin(contents, ", ")); -} - -bool CommonTlsContext::CertificateValidationContext::Empty() const { - return match_subject_alt_names.empty(); -} +namespace grpc_core { // // CommonTlsContext::CertificateProviderPluginInstance @@ -61,6 +45,38 @@ bool CommonTlsContext::CertificateProviderPluginInstance::Empty() const { return instance_name.empty() && certificate_name.empty(); } +// +// CommonTlsContext::CertificateValidationContext +// + +std::string CommonTlsContext::CertificateValidationContext::ToString() const { + std::vector contents; + Match( + ca_certs, [](const absl::monostate&) {}, + [&](const CertificateProviderPluginInstance& cert_provider) { + contents.push_back( + absl::StrCat("ca_certs=cert_provider", cert_provider.ToString())); + }, + [&](const SystemRootCerts&) { + contents.push_back("ca_certs=system_root_certs{}"); + }); + if (!match_subject_alt_names.empty()) { + std::vector san_matchers; + san_matchers.reserve(match_subject_alt_names.size()); + for (const auto& match : match_subject_alt_names) { + san_matchers.push_back(match.ToString()); + } + contents.push_back(absl::StrCat("match_subject_alt_names=[", + absl::StrJoin(san_matchers, ", "), "]")); + } + return absl::StrCat("{", absl::StrJoin(contents, ", "), "}"); +} + +bool CommonTlsContext::CertificateValidationContext::Empty() const { + return absl::holds_alternative(ca_certs) && + match_subject_alt_names.empty(); +} + // // CommonTlsContext // diff --git a/src/core/xds/grpc/xds_common_types.h b/src/core/xds/grpc/xds_common_types.h index 250f81857b446..2b0c746a5d147 100644 --- a/src/core/xds/grpc/xds_common_types.h +++ b/src/core/xds/grpc/xds_common_types.h @@ -44,12 +44,16 @@ struct CommonTlsContext { }; struct CertificateValidationContext { - CertificateProviderPluginInstance ca_certificate_provider_instance; + struct SystemRootCerts { + bool operator==(const SystemRootCerts&) const { return true; } + }; + absl::variant + ca_certs; std::vector match_subject_alt_names; bool operator==(const CertificateValidationContext& other) const { - return ca_certificate_provider_instance == - other.ca_certificate_provider_instance && + return ca_certs == other.ca_certs && match_subject_alt_names == other.match_subject_alt_names; } diff --git a/src/core/xds/grpc/xds_common_types_parser.cc b/src/core/xds/grpc/xds_common_types_parser.cc index 24cf86fd0510b..3da948fe5039c 100644 --- a/src/core/xds/grpc/xds_common_types_parser.cc +++ b/src/core/xds/grpc/xds_common_types_parser.cc @@ -44,6 +44,7 @@ #include #include +#include "src/core/lib/gprpp/env.h" #include "src/core/util/json/json_reader.h" #include "src/core/util/upb_utils.h" #include "src/core/xds/grpc/xds_bootstrap_grpc.h" @@ -76,6 +77,14 @@ Duration ParseDuration(const google_protobuf_Duration* proto_duration, namespace { +bool XdsSystemRootCertsEnabled() { + auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + if (!value.has_value()) return false; + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); + return parse_succeeded && parsed_value; +} + // CertificateProviderInstance is deprecated but we are still supporting it for // backward compatibility reasons. Note that we still parse the data into the // same CertificateProviderPluginInstance struct since the fields are the same. @@ -202,9 +211,17 @@ CertificateValidationContextParse( if (ca_certificate_provider_instance != nullptr) { ValidationErrors::ScopedField field(errors, ".ca_certificate_provider_instance"); - certificate_validation_context.ca_certificate_provider_instance = + certificate_validation_context.ca_certs = CertificateProviderPluginInstanceParse( context, ca_certificate_provider_instance, errors); + } else if (XdsSystemRootCertsEnabled()) { + auto* system_root_certs = + envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_system_root_certs( + certificate_validation_context_proto); + if (system_root_certs != nullptr) { + certificate_validation_context.ca_certs = + CommonTlsContext::CertificateValidationContext::SystemRootCerts(); + } } if (envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki( certificate_validation_context_proto, nullptr) != nullptr) { @@ -263,23 +280,26 @@ CommonTlsContext CommonTlsContextParse( errors); } // If after parsing default_validation_context, - // common_tls_context->certificate_validation_context.ca_certificate_provider_instance - // is empty, fall back onto + // common_tls_context->certificate_validation_context.ca_certs does not + // contain a cert provider, fall back onto // 'validation_context_certificate_provider_instance' inside // 'combined_validation_context'. Note that this way of fetching root // certificates is deprecated and will be removed in the future. // TODO(yashykt): Remove this once it's no longer needed. - const auto* validation_context_certificate_provider_instance = - envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance( - combined_validation_context); - if (common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.Empty() && - validation_context_certificate_provider_instance != nullptr) { - ValidationErrors::ScopedField field( - errors, ".validation_context_certificate_provider_instance"); - common_tls_context.certificate_validation_context - .ca_certificate_provider_instance = CertificateProviderInstanceParse( - context, validation_context_certificate_provider_instance, errors); + if (!absl::holds_alternative< + CommonTlsContext::CertificateProviderPluginInstance>( + common_tls_context.certificate_validation_context.ca_certs)) { + const auto* validation_context_certificate_provider_instance = + envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance( + combined_validation_context); + if (validation_context_certificate_provider_instance != nullptr) { + ValidationErrors::ScopedField field( + errors, ".validation_context_certificate_provider_instance"); + common_tls_context.certificate_validation_context.ca_certs = + CertificateProviderInstanceParse( + context, validation_context_certificate_provider_instance, + errors); + } } } else { auto* validation_context = diff --git a/src/core/xds/grpc/xds_listener_parser.cc b/src/core/xds/grpc/xds_listener_parser.cc index d19b516e729bb..1c8ef65c5cfb9 100644 --- a/src/core/xds/grpc/xds_listener_parser.cc +++ b/src/core/xds/grpc/xds_listener_parser.cc @@ -403,10 +403,16 @@ XdsListenerResource::DownstreamTlsContext DownstreamTlsContextParse( ValidationErrors::ScopedField field(errors, ".common_tls_context"); downstream_tls_context.common_tls_context = CommonTlsContextParse(context, common_tls_context, errors); - // Note: We can't be more specific about the field name for this - // error, because we don't know which fields they were found in + // Note: We can't be more specific about the field names for these + // errors, because we don't know which fields they were found in // inside of CommonTlsContext, so we make the error message a bit // more verbose to compensate. + if (absl::holds_alternative< + CommonTlsContext::CertificateValidationContext::SystemRootCerts>( + downstream_tls_context.common_tls_context + .certificate_validation_context.ca_certs)) { + errors->AddError("system_root_certs not supported"); + } if (!downstream_tls_context.common_tls_context .certificate_validation_context.match_subject_alt_names.empty()) { errors->AddError("match_subject_alt_names not supported on servers"); @@ -428,14 +434,19 @@ XdsListenerResource::DownstreamTlsContext DownstreamTlsContextParse( if (require_client_certificate != nullptr) { downstream_tls_context.require_client_certificate = google_protobuf_BoolValue_value(require_client_certificate); - if (downstream_tls_context.require_client_certificate && - downstream_tls_context.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.instance_name.empty()) { - ValidationErrors::ScopedField field(errors, - ".require_client_certificate"); - errors->AddError( - "client certificate required but no certificate " - "provider instance specified for validation"); + if (downstream_tls_context.require_client_certificate) { + auto* ca_cert_provider = + absl::get_if( + &downstream_tls_context.common_tls_context + .certificate_validation_context.ca_certs); + if (ca_cert_provider == nullptr || + ca_cert_provider->instance_name.empty()) { + ValidationErrors::ScopedField field(errors, + ".require_client_certificate"); + errors->AddError( + "client certificate required but no certificate provider " + "instance specified for validation"); + } } } if (ParseBoolValue( diff --git a/src/core/xds/xds_client/xds_client.cc b/src/core/xds/xds_client/xds_client.cc index 8a9456cdad2f4..e9d1d071c0de5 100644 --- a/src/core/xds/xds_client/xds_client.cc +++ b/src/core/xds/xds_client/xds_client.cc @@ -457,10 +457,9 @@ XdsClient::XdsChannel::XdsChannel(WeakRefCountedPtr xds_client, : nullptr), xds_client_(std::move(xds_client)), server_(server) { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << xds_client_.get() << "] creating channel " - << this << " for server " << server.server_uri(); - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << xds_client_.get() << "] creating channel " << this + << " for server " << server.server_uri(); absl::Status status; transport_ = xds_client_->transport_factory_->Create( server, @@ -474,10 +473,9 @@ XdsClient::XdsChannel::XdsChannel(WeakRefCountedPtr xds_client, } XdsClient::XdsChannel::~XdsChannel() { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << xds_client() << "] destroying xds channel " - << this << " for server " << server_.server_uri(); - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << xds_client() << "] destroying xds channel " << this + << " for server " << server_.server_uri(); xds_client_.reset(DEBUG_LOCATION, "XdsChannel"); } @@ -486,10 +484,9 @@ XdsClient::XdsChannel::~XdsChannel() { // called from DualRefCounted::Unref, which cannot have a lock annotation for // a lock in this subclass. void XdsClient::XdsChannel::Orphaned() ABSL_NO_THREAD_SAFETY_ANALYSIS { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << xds_client() << "] orphaning xds channel " - << this << " for server " << server_.server_uri(); - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << xds_client() << "] orphaning xds channel " << this + << " for server " << server_.server_uri(); shutting_down_ = true; transport_.reset(); // At this time, all strong refs are removed, remove from channel map to @@ -583,10 +580,9 @@ bool XdsClient::XdsChannel::MaybeFallbackLocked( } if (authority_state.xds_channels.back()->status().ok()) return true; } - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << xds_client_.get() << "] authority " - << authority << ": No fallback server"; - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << xds_client_.get() << "] authority " << authority + << ": No fallback server"; return false; } @@ -1568,8 +1564,9 @@ XdsClient::XdsClient( } CHECK(bootstrap_ != nullptr); if (bootstrap_->node() != nullptr) { - LOG(INFO) << "[xds_client " << this - << "] xDS node ID: " << bootstrap_->node()->id(); + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << this + << "] xDS node ID: " << bootstrap_->node()->id(); } } @@ -1702,10 +1699,9 @@ void XdsClient::WatchResource(const XdsResourceType* type, // If we already have a cached value for the resource, notify the new // watcher immediately. if (resource_state.resource != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << this - << "] returning cached listener data for " << name; - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << this << "] returning cached listener data for " + << name; work_serializer_.Schedule( [watcher, value = resource_state.resource]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) { @@ -1715,10 +1711,9 @@ void XdsClient::WatchResource(const XdsResourceType* type, DEBUG_LOCATION); } else if (resource_state.meta.client_status == XdsApi::ResourceMetadata::DOES_NOT_EXIST) { - if (GRPC_TRACE_FLAG_ENABLED(xds_client)) { - LOG(INFO) << "[xds_client " << this - << "] reporting cached does-not-exist for " << name; - } + GRPC_TRACE_LOG(xds_client, INFO) + << "[xds_client " << this + << "] reporting cached does-not-exist for " << name; work_serializer_.Schedule( [watcher]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) { watcher->OnResourceDoesNotExist(ReadDelayHandle::NoWait()); diff --git a/src/cpp/ext/gcp/environment_autodetect.cc b/src/cpp/ext/gcp/environment_autodetect.cc index 0f61e24a01112..f9d121635cb43 100644 --- a/src/cpp/ext/gcp/environment_autodetect.cc +++ b/src/cpp/ext/gcp/environment_autodetect.cc @@ -268,10 +268,9 @@ class EnvironmentAutoDetectHelper // If fetching from the MetadataServer failed and we were // assuming a GCE environment, fallback to "global". else if (assuming_gce_) { - if (GRPC_TRACE_FLAG_ENABLED(environment_autodetect)) { - LOG(INFO) << "Environment Autodetect: Falling back to " - "global resource type"; - } + GRPC_TRACE_LOG(environment_autodetect, INFO) + << "Environment Autodetect: Falling back to " + << "global resource type"; assuming_gce_ = false; resource_.resource_type = "global"; } diff --git a/src/cpp/ext/otel/otel_plugin.cc b/src/cpp/ext/otel/otel_plugin.cc index 4b2f313f46684..6ae99378296d2 100644 --- a/src/cpp/ext/otel/otel_plugin.cc +++ b/src/cpp/ext/otel/otel_plugin.cc @@ -637,12 +637,18 @@ void OpenTelemetryPluginImpl::AddCounter( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Add(value, NPCMetricsKeyValueIterable( - descriptor.label_keys, label_values, - descriptor.optional_label_keys, optional_values, - instrument_data.optional_labels_bits)); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Add(value); + } else { + absl::get>>( + instrument_data.instrument) + ->Add(value, NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits)); + } } void OpenTelemetryPluginImpl::AddCounter( @@ -661,12 +667,18 @@ void OpenTelemetryPluginImpl::AddCounter( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Add(value, NPCMetricsKeyValueIterable( - descriptor.label_keys, label_values, - descriptor.optional_label_keys, optional_values, - instrument_data.optional_labels_bits)); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Add(value); + } else { + absl::get>>( + instrument_data.instrument) + ->Add(value, NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits)); + } } void OpenTelemetryPluginImpl::RecordHistogram( @@ -685,14 +697,20 @@ void OpenTelemetryPluginImpl::RecordHistogram( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Record(value, - NPCMetricsKeyValueIterable(descriptor.label_keys, label_values, - descriptor.optional_label_keys, - optional_values, - instrument_data.optional_labels_bits), - opentelemetry::context::Context{}); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Record(value, opentelemetry::context::Context{}); + } else { + absl::get>>( + instrument_data.instrument) + ->Record(value, + NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits), + opentelemetry::context::Context{}); + } } void OpenTelemetryPluginImpl::RecordHistogram( @@ -711,14 +729,20 @@ void OpenTelemetryPluginImpl::RecordHistogram( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Record(value, - NPCMetricsKeyValueIterable(descriptor.label_keys, label_values, - descriptor.optional_label_keys, - optional_values, - instrument_data.optional_labels_bits), - opentelemetry::context::Context{}); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Record(value, opentelemetry::context::Context{}); + } else { + absl::get>>( + instrument_data.instrument) + ->Record(value, + NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits), + opentelemetry::context::Context{}); + } } void OpenTelemetryPluginImpl::AddCallback( @@ -881,20 +905,27 @@ void OpenTelemetryPluginImpl::CallbackGaugeState::Observe( for (const auto& pair : cache) { CHECK(pair.first.size() <= (descriptor.label_keys.size() + descriptor.optional_label_keys.size())); - auto& instrument_data = ot_plugin->instruments_data_.at(id); - opentelemetry::nostd::get>>(result) - ->Observe(pair.second, - NPCMetricsKeyValueIterable( - descriptor.label_keys, - absl::FixedArray( - pair.first.begin(), - pair.first.begin() + descriptor.label_keys.size()), - descriptor.optional_label_keys, - absl::FixedArray( - pair.first.begin() + descriptor.label_keys.size(), - pair.first.end()), - instrument_data.optional_labels_bits)); + if (descriptor.label_keys.empty() && + descriptor.optional_label_keys.empty()) { + opentelemetry::nostd::get>>(result) + ->Observe(pair.second); + } else { + auto& instrument_data = ot_plugin->instruments_data_.at(id); + opentelemetry::nostd::get>>(result) + ->Observe(pair.second, + NPCMetricsKeyValueIterable( + descriptor.label_keys, + absl::FixedArray( + pair.first.begin(), + pair.first.begin() + descriptor.label_keys.size()), + descriptor.optional_label_keys, + absl::FixedArray( + pair.first.begin() + descriptor.label_keys.size(), + pair.first.end()), + instrument_data.optional_labels_bits)); + } } } diff --git a/src/cpp/server/backend_metric_recorder.cc b/src/cpp/server/backend_metric_recorder.cc index d92fac3db0a8b..1fdabbe97f245 100644 --- a/src/cpp/server/backend_metric_recorder.cc +++ b/src/cpp/server/backend_metric_recorder.cc @@ -98,10 +98,8 @@ void ServerMetricRecorder::SetMemoryUtilization(double value) { void ServerMetricRecorder::SetApplicationUtilization(double value) { if (!IsUtilizationWithSoftLimitsValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this - << "] Application utilization rejected: " << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Application utilization rejected: " << value; return; } UpdateBackendMetricDataState([value](BackendMetricData* data) { @@ -142,16 +140,14 @@ void ServerMetricRecorder::SetEps(double value) { void ServerMetricRecorder::SetNamedUtilization(string_ref name, double value) { if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Named utilization rejected: " << value - << " name: " << std::string(name.data(), name.size()); - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Named utilization rejected: " << value + << " name: " << std::string(name.data(), name.size()); return; } - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Named utilization set: " << value - << " name: " << std::string(name.data(), name.size()); - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Named utilization set: " << value + << " name: " << std::string(name.data(), name.size()); UpdateBackendMetricDataState([name, value](BackendMetricData* data) { data->utilization[absl::string_view(name.data(), name.size())] = value; }); @@ -159,10 +155,9 @@ void ServerMetricRecorder::SetNamedUtilization(string_ref name, double value) { void ServerMetricRecorder::SetAllNamedUtilization( std::map named_utilization) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] All named utilization updated. size: " - << named_utilization.size(); - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this + << "] All named utilization updated. size: " << named_utilization.size(); UpdateBackendMetricDataState( [utilization = std::move(named_utilization)](BackendMetricData* data) { data->utilization.clear(); @@ -212,10 +207,9 @@ void ServerMetricRecorder::ClearEps() { } void ServerMetricRecorder::ClearNamedUtilization(string_ref name) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Named utilization cleared. name: " - << std::string(name.data(), name.size()); - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Named utilization cleared. name: " + << std::string(name.data(), name.size()); UpdateBackendMetricDataState([name](BackendMetricData* data) { data->utilization.erase(absl::string_view(name.data(), name.size())); }); @@ -281,10 +275,8 @@ BackendMetricState::RecordMemoryUtilizationMetric(double value) { experimental::CallMetricRecorder& BackendMetricState::RecordApplicationUtilizationMetric(double value) { if (!IsUtilizationWithSoftLimitsValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this - << "] Application utilization value rejected: " << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Application utilization value rejected: " << value; return *this; } application_utilization_.store(value, std::memory_order_relaxed); @@ -327,19 +319,16 @@ experimental::CallMetricRecorder& BackendMetricState::RecordEpsMetric( experimental::CallMetricRecorder& BackendMetricState::RecordUtilizationMetric( string_ref name, double value) { if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Utilization value rejected: " - << std::string(name.data(), name.length()) << " " << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Utilization value rejected: " + << std::string(name.data(), name.length()) << " " << value; return *this; } internal::MutexLock lock(&mu_); absl::string_view name_sv(name.data(), name.length()); utilization_[name_sv] = value; - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Utilization recorded: " << name_sv << " " - << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Utilization recorded: " << name_sv << " " << value; return *this; } @@ -348,10 +337,8 @@ experimental::CallMetricRecorder& BackendMetricState::RecordRequestCostMetric( internal::MutexLock lock(&mu_); absl::string_view name_sv(name.data(), name.length()); request_cost_[name_sv] = value; - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Request cost recorded: " << name_sv << " " - << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Request cost recorded: " << name_sv << " " << value; return *this; } @@ -360,10 +347,8 @@ experimental::CallMetricRecorder& BackendMetricState::RecordNamedMetric( internal::MutexLock lock(&mu_); absl::string_view name_sv(name.data(), name.length()); named_metrics_[name_sv] = value; - if (GRPC_TRACE_FLAG_ENABLED(backend_metric)) { - LOG(INFO) << "[" << this << "] Named metric recorded: " << name_sv << " " - << value; - } + GRPC_TRACE_LOG(backend_metric, INFO) + << "[" << this << "] Named metric recorded: " << name_sv << " " << value; return *this; } diff --git a/src/cpp/server/server_builder.cc b/src/cpp/server/server_builder.cc index 708b23648979e..b20aa88113ce8 100644 --- a/src/cpp/server/server_builder.cc +++ b/src/cpp/server/server_builder.cc @@ -389,16 +389,14 @@ std::unique_ptr ServerBuilder::BuildAndStart() { if (has_sync_methods) { // This is a Sync server - LOG(INFO) << "Synchronous server. Num CQs: " - << sync_server_settings_.num_cqs - << ", Min pollers: " << sync_server_settings_.min_pollers - << ", Max Pollers: " << sync_server_settings_.max_pollers - << ", CQ timeout (msec): " - << sync_server_settings_.cq_timeout_msec; + VLOG(2) << "Synchronous server. Num CQs: " << sync_server_settings_.num_cqs + << ", Min pollers: " << sync_server_settings_.min_pollers + << ", Max Pollers: " << sync_server_settings_.max_pollers + << ", CQ timeout (msec): " << sync_server_settings_.cq_timeout_msec; } if (has_callback_methods) { - LOG(INFO) << "Callback server."; + VLOG(2) << "Callback server."; } std::unique_ptr server(new grpc::Server( diff --git a/src/csharp/build/dependencies.props b/src/csharp/build/dependencies.props index 60079038add0c..2a50deac3c103 100644 --- a/src/csharp/build/dependencies.props +++ b/src/csharp/build/dependencies.props @@ -1,7 +1,7 @@ - 2.66.0-dev + 2.67.0-dev 3.27.2 diff --git a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec index c550098a6b50b..b407eccc35f3a 100644 --- a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCCppPlugin' - v = '1.66.0-dev' + v = '1.67.0-dev' s.version = v s.summary = 'The gRPC ProtoC plugin generates C++ files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index e0adf67aaa1d9..221ef815cb2b4 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCPlugin' - v = '1.66.0-dev' + v = '1.67.0-dev' s.version = v s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index dff312bbdfafd..260f6c6b908c9 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -39,7 +39,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.35' + version = '0.0.36' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "b8a2bffc598f230484ff48a247526a9820facfc2", + :commit => "16c8d3db1af20fcc04b5190b25242aadcb1fbb30", } s.ios.deployment_target = '10.0' @@ -179,519 +179,520 @@ Pod::Spec.new do |s| base64 --decode $opts < src/include/openssl/boringssl_prefix_symbols.h H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oALS9XXPbuJaofT+/wnXm5kzVrpnY6WRn v3eKrXQ0cWxvSenpzA2LkiCLOxSpEJRj968/AEmJ+FgL5FrwW7VrpmPpeRYFgPgiCPzXf108ikJUaS02 - F6uX8z+SVVllxaOUeXKoxDZ7TnYi3YjqP+XuoiwuPjafLha3F+tyv8/q/+9i9SG9Wm2363f/+LC9evvm - tw+/bbe/qb/99vd3V+/Tf3y4erNN19v11b/923/918V1eXipssddffF/1/9xcfXm8sPfLn4vy8dcXMyK - 9X+qr+hvPYhqn0mZqXh1eXGU4m8q2uHlbxf7cpNt1f9Pi81/ldXFJpN1la2Otbiod5m8kOW2/pVW4mKr - PkyLF+06HKtDKcXFr6xWP6Bq/n95rC+2QlwoZCcqoX99lRYqIf52cajKp2yjkqTepbX6P+IiXZVPQpvW - 52svyjpbC30VbdxDf72njw4HkVYXWXGR5rkmMyFPv275eXqxuP+0/J/JfHoxW1w8zO//mN1Mby7+z2Sh - /v1/LiZ3N82XJt+Wn+/nFzezxfXtZPZ1cTG5vb1Q1Hxyt5xNF9r1P7Pl54v59PfJXCH3ilK+3n13ffvt - Znb3ewPOvj7czlSUXnBx/0k7vk7n15/VXyYfZ7ez5fcm/KfZ8m66WPynclzc3V9M/5jeLS8Wn7XHuLKP - 04vb2eTj7fTik/rX5O671i0eptezye3f1HXPp9fLvynF6b/Ul67v7xbTf35TOvWdi5vJ18nv+kIa+vTP - 5od9niwX9yruXP28xbfbpf4Zn+b3Xy9u7xf6yi++LaYqxmQ50bRKQ3XJi78pbqoucK6ve6L+d72c3d9p - nwJU6OV8oq/jbvr77ez36d31VLP3DbC8n6vvflt0zN8uJvPZQge9/7bU9L12NkX4/u5u2nynTX2dHupa - mquYzlVCfJ004k92bvxnU/4/3s+VU90+yeTmJnmYTz/N/rw4pLIW8qL+VV6oolfU2TYTlVSFRxX+shAq - E2pdxFSh3kv9By3Kan236hJXbi/26boqL8TzIS2aQqj+l9XyIq0ej3vlkxcroWDRBFJ373/+279v1J1d - CPBy/m/6t4vVf4AfJTP10+ftF4IO84sX6cW///tFov/P6t96anafbBNVy8DX0P+x/cPfeuA/LIcUNdXS - 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 - Z3sefaG76oIMd9UUfWydzAk4OHvSpsnQAdosYIGHOTpqtY+BzHipc3E6oQdqz5NI1+UnqHoiijW00Cc/ - EkZMeFHqJ3tS2/WK2oLn2oY6gng7m3cQFI9A7dBfvvz217PdD2rXAYxtpbJ7qhd7JBi+03Uptu15lWPn - Qifs9FYsH/PPYAK/st6b6SvblylO+7bX954hK5JAu1yXryJ7fRl5wO96c6ijXUxs5vihiNksIPCwC+UH - +8uRvgei+1KCa0xN6z18wtxJ6nPNrHhW53WHfL4DXUQcv7va7lB9glBXGnHtZ8tMy1aNqoGpe0Ye89tm - N84fnotB3wsbhPrIQT8VfHA1IY24p7Y9qvxUH6u8bJRNA4gnCH//2/8B6aN0mKHQBAA= + F6uX8z+SVVllxaOUeXKoxDZ7TnYi3YjqP+XuoiwuPjafLha3F+tyv8/q/+/i8v36w+btZnWZbq/ebNfr + N7+t3l3+483q6t3Vb1dpulmvLrer1ds3//Zv//VfF9fl4aXKHnf1xf9d/8fF1ZvLD3+7+L0sH3NxMSvW + /6m+or/1IKp9JmWm4tXlxVGKv6loh5e/XezLTbZV/z8tNv9VVhebTNZVtjrW4qLeZfJCltv6V1qJi636 + MC1etOtwrA6lFBe/slr9gKr5/+WxvtgKcaGQnaiE/vVVWqiE+NvFoSqfso1KknqX1ur/iIt0VT4JbVqf + r70o62wt9FW0cQ/99Z4+OhxEWl1kxUWa55rMhDz9uuXn6cXi/tPyfybz6cVscfEwv/9jdjO9ufg/k4X6 + 9/+5mNzdNF+afFt+vp9f3MwW17eT2dfFxeT29kJR88ndcjZdaNf/zJafL+bT3ydzhdwrSvl699317beb + 2d3vDTj7+nA7U1F6wcX9J+34Op1ff1Z/mXyc3c6W35vwn2bLu+li8Z/KcXF3fzH9Y3q3vFh81h7jyj5O + L25nk4+304tP6l+Tu+9at3iYXs8mt39T1z2fXi//phSn/1Jfur6/W0z/+U3p1HcubiZfJ7/rC2no0z+b + H/Z5slzcq7hz9fMW326X+md8mt9/vbi9X+grv/i2mKoYk+VE0yoN1SUv/qa4qbrAub7uifrf9XJ2f6d9 + ClChl/OJvo676e+3s9+nd9dTzd43wPJ+rr77bdExf7uYzGcLHfT+21LT99rZFOH7u7tp85029XV6qGtp + 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 EOF # PrivacyInfo.xcprivacy is not part of BoringSSL repo, inject it during pod installation diff --git a/src/objective-c/GRPCClient/version.h b/src/objective-c/GRPCClient/version.h index 0eb2c9b56235f..3817610281623 100644 --- a/src/objective-c/GRPCClient/version.h +++ b/src/objective-c/GRPCClient/version.h @@ -22,4 +22,4 @@ // instead. This file can be regenerated from the template by running // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.66.0-dev" +#define GRPC_OBJC_VERSION_STRING @"1.67.0-dev" diff --git a/src/objective-c/tests/version.h b/src/objective-c/tests/version.h index b79755fb41348..c277186d3d8b1 100644 --- a/src/objective-c/tests/version.h +++ b/src/objective-c/tests/version.h @@ -22,5 +22,5 @@ // instead. This file can be regenerated from the template by running // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.66.0-dev" -#define GRPC_C_VERSION_STRING @"42.0.0" +#define GRPC_OBJC_VERSION_STRING @"1.67.0-dev" +#define GRPC_C_VERSION_STRING @"43.0.0" diff --git a/src/php/composer.json b/src/php/composer.json index 4a2e463446dff..2dcb272f3670f 100644 --- a/src/php/composer.json +++ b/src/php/composer.json @@ -2,7 +2,7 @@ "name": "grpc/grpc-dev", "description": "gRPC library for PHP - for Development use only", "license": "Apache-2.0", - "version": "1.66.0", + "version": "1.67.0", "require": { "php": ">=7.0.0", "google/protobuf": "^v3.3.0" diff --git a/src/php/ext/grpc/version.h b/src/php/ext/grpc/version.h index d6707d14dd90d..be2549d1a74cf 100644 --- a/src/php/ext/grpc/version.h +++ b/src/php/ext/grpc/version.h @@ -20,6 +20,6 @@ #ifndef VERSION_H #define VERSION_H -#define PHP_GRPC_VERSION "1.66.0dev" +#define PHP_GRPC_VERSION "1.67.0dev" #endif /* VERSION_H */ diff --git a/src/proto/grpc/testing/xds/v3/tls.proto b/src/proto/grpc/testing/xds/v3/tls.proto index b2fc4532d8be1..e2648a2b089fb 100644 --- a/src/proto/grpc/testing/xds/v3/tls.proto +++ b/src/proto/grpc/testing/xds/v3/tls.proto @@ -45,12 +45,21 @@ message CertificateProviderPluginInstance { } message CertificateValidationContext { + message SystemRootCerts { + } + // Certificate provider instance for fetching TLS certificates. // // Only one of *trusted_ca* and *ca_certificate_provider_instance* may be specified. // [#not-implemented-hide:] CertificateProviderPluginInstance ca_certificate_provider_instance = 13; + // Use system root certs for validation. + // If present, system root certs are used only if neither of the ``trusted_ca`` + // or ``ca_certificate_provider_instance`` fields are set. + // [#not-implemented-hide:] + SystemRootCerts system_root_certs = 17; + // An optional list of base64-encoded SHA-256 hashes. If specified, Envoy will verify that the // SHA-256 of the DER-encoded Subject Public Key Information (SPKI) of the presented certificate // matches one of the specified values. diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi index 86a98b6803a70..ecefbd9ea8126 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi @@ -31,6 +31,7 @@ cdef class _CallState: cdef void maybe_save_registered_method(self, bytes method_name) except * cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except * cdef void maybe_delete_call_tracer(self) except * + cdef void delete_call(self) except * cdef class _ChannelState: diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi index 564877736c05a..d2e98250d5337 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi @@ -72,6 +72,12 @@ cdef class _CallState: def __cinit__(self): self.due = set() + cdef void delete_call(self) except *: + with nogil: + grpc_call_unref(self.c_call) + self.c_call = NULL + self.maybe_delete_call_tracer() + cdef void maybe_delete_call_tracer(self) except *: if not self.call_tracer_capsule: return @@ -291,9 +297,7 @@ cdef void _call( grpc_call_credentials_release(c_call_credentials) if c_call_error != GRPC_CALL_OK: #TODO(xuanwn): Expand the scope of nogil - with nogil: - grpc_call_unref(call_state.c_call) - call_state.c_call = NULL + call_state.delete_call() _raise_call_error_no_metadata(c_call_error) started_tags = set() for operations, user_tag in operationses_and_user_tags: @@ -303,9 +307,7 @@ cdef void _call( else: grpc_call_cancel(call_state.c_call, NULL) #TODO(xuanwn): Expand the scope of nogil - with nogil: - grpc_call_unref(call_state.c_call) - call_state.c_call = NULL + call_state.delete_call() _raise_call_error(c_call_error, metadata) else: call_state.due.update(started_tags) @@ -319,10 +321,7 @@ cdef void _process_integrated_call_tag( cdef _CallState call_state = state.integrated_call_states.pop(tag) call_state.due.remove(tag) if not call_state.due: - with nogil: - grpc_call_unref(call_state.c_call) - call_state.c_call = NULL - call_state.maybe_delete_call_tracer() + call_state.delete_call() cdef class IntegratedCall: @@ -362,10 +361,7 @@ cdef object _process_segregated_call_tag( call_state.due.remove(tag) if not call_state.due: #TODO(xuanwn): Expand the scope of nogil - with nogil: - grpc_call_unref(call_state.c_call) - call_state.c_call = NULL - call_state.maybe_delete_call_tracer() + call_state.delete_call() state.segregated_call_states.remove(call_state) _destroy_c_completion_queue(c_completion_queue) return True @@ -392,9 +388,7 @@ cdef class SegregatedCall: self._channel_state, self._call_state, self._c_completion_queue, tag) def on_failure(): self._call_state.due.clear() - with nogil: - grpc_call_unref(self._call_state.c_call) - self._call_state.c_call = NULL + self._call_state.delete_call() self._channel_state.segregated_call_states.remove(self._call_state) _destroy_c_completion_queue(self._c_completion_queue) return _next_call_event( diff --git a/src/python/grpcio/grpc/_grpcio_metadata.py b/src/python/grpcio/grpc/_grpcio_metadata.py index 346dc174f61f6..829c8f8a7d414 100644 --- a/src/python/grpcio/grpc/_grpcio_metadata.py +++ b/src/python/grpcio/grpc/_grpcio_metadata.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!! -__version__ = """1.66.0.dev0""" +__version__ = """1.67.0.dev0""" diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 75a21995f6f53..53b0c28a869e6 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -75,7 +75,6 @@ 'src/core/ext/transport/chttp2/transport/hpack_parser_table.cc', 'src/core/ext/transport/chttp2/transport/http2_settings.cc', 'src/core/ext/transport/chttp2/transport/huffsyms.cc', - 'src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc', 'src/core/ext/transport/chttp2/transport/parsing.cc', 'src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc', 'src/core/ext/transport/chttp2/transport/ping_callbacks.cc', diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py index 50f7b58af28b4..f9644d3042066 100644 --- a/src/python/grpcio/grpc_version.py +++ b/src/python/grpcio/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_admin/grpc_version.py b/src/python/grpcio_admin/grpc_version.py index b0944e4e43fdc..c4ae9dff5fc4b 100644 --- a/src/python/grpcio_admin/grpc_version.py +++ b/src/python/grpcio_admin/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_admin/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_channelz/grpc_version.py b/src/python/grpcio_channelz/grpc_version.py index e3293182f32eb..46b86e616bb35 100644 --- a/src/python/grpcio_channelz/grpc_version.py +++ b/src/python/grpcio_channelz/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_channelz/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_csds/grpc_version.py b/src/python/grpcio_csds/grpc_version.py index 8f0a7e79124af..5003869954a8e 100644 --- a/src/python/grpcio_csds/grpc_version.py +++ b/src/python/grpcio_csds/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_csds/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_csm_observability/grpc_version.py b/src/python/grpcio_csm_observability/grpc_version.py index cce1b57a9245d..5f4a5c4de8f58 100644 --- a/src/python/grpcio_csm_observability/grpc_version.py +++ b/src/python/grpcio_csm_observability/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_csm_observability/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py index 6a0fa81e98422..e85a13a2db13b 100644 --- a/src/python/grpcio_health_checking/grpc_version.py +++ b/src/python/grpcio_health_checking/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_observability/grpc_observability/client_call_tracer.cc b/src/python/grpcio_observability/grpc_observability/client_call_tracer.cc index 496f678f04eb3..21c6521f92298 100644 --- a/src/python/grpcio_observability/grpc_observability/client_call_tracer.cc +++ b/src/python/grpcio_observability/grpc_observability/client_call_tracer.cc @@ -88,7 +88,7 @@ void PythonOpenCensusCallTracer::RecordAnnotation( PythonOpenCensusCallTracer::~PythonOpenCensusCallTracer() { if (PythonCensusStatsEnabled()) { - context_.Labels().emplace_back(kClientMethod, std::string(method_)); + context_.Labels().emplace_back(kClientMethod, method_); RecordIntMetric(kRpcClientRetriesPerCallMeasureName, retries_ - 1, context_.Labels(), identifier_, registered_method_, /*include_exchange_labels=*/true); // exclude first attempt @@ -159,8 +159,8 @@ PythonOpenCensusCallTracer::PythonOpenCensusCallAttemptTracer:: if (!PythonCensusStatsEnabled()) { return; } - context_.Labels().emplace_back(kClientMethod, std::string(parent_->method_)); - context_.Labels().emplace_back(kClientTarget, std::string(parent_->target_)); + context_.Labels().emplace_back(kClientMethod, parent_->method_); + context_.Labels().emplace_back(kClientTarget, parent_->target_); RecordIntMetric(kRpcClientStartedRpcsMeasureName, 1, context_.Labels(), parent_->identifier_, parent_->registered_method_, /*include_exchange_labels=*/false); @@ -264,8 +264,8 @@ void PythonOpenCensusCallTracer::PythonOpenCensusCallAttemptTracer:: } std::string final_status = absl::StatusCodeToString(status_code_); - context_.Labels().emplace_back(kClientMethod, std::string(parent_->method_)); - context_.Labels().emplace_back(kClientTarget, std::string(parent_->target_)); + context_.Labels().emplace_back(kClientMethod, parent_->method_); + context_.Labels().emplace_back(kClientTarget, parent_->target_); context_.Labels().emplace_back(kClientStatus, final_status); if (parent_->add_csm_optional_labels_) { parent_->labels_injector_.AddXdsOptionalLabels( @@ -322,8 +322,7 @@ void PythonOpenCensusCallTracer::PythonOpenCensusCallAttemptTracer:: void PythonOpenCensusCallTracer::PythonOpenCensusCallAttemptTracer::RecordEnd( const gpr_timespec& /*latency*/) { if (PythonCensusStatsEnabled()) { - context_.Labels().emplace_back(kClientMethod, - std::string(parent_->method_)); + context_.Labels().emplace_back(kClientMethod, parent_->method_); context_.Labels().emplace_back(kClientStatus, StatusCodeToString(status_code_)); RecordIntMetric(kRpcClientSentMessagesPerRpcMeasureName, diff --git a/src/python/grpcio_observability/grpc_observability/client_call_tracer.h b/src/python/grpcio_observability/grpc_observability/client_call_tracer.h index 8c251268fb8a2..bb1b97813f5a8 100644 --- a/src/python/grpcio_observability/grpc_observability/client_call_tracer.h +++ b/src/python/grpcio_observability/grpc_observability/client_call_tracer.h @@ -140,9 +140,9 @@ class PythonOpenCensusCallTracer : public grpc_core::ClientCallTracer { PythonCensusContext CreateCensusContextForCallAttempt(); // Client method. - absl::string_view method_; + std::string method_; // Client target. - absl::string_view target_; + std::string target_; PythonCensusContext context_; bool tracing_enabled_; bool add_csm_optional_labels_; diff --git a/src/python/grpcio_observability/grpc_observability/python_observability_context.h b/src/python/grpcio_observability/grpc_observability/python_observability_context.h index 81bb39b775559..16b05d63128a7 100644 --- a/src/python/grpcio_observability/grpc_observability/python_observability_context.h +++ b/src/python/grpcio_observability/grpc_observability/python_observability_context.h @@ -272,17 +272,15 @@ void GenerateClientContext(absl::string_view method, absl::string_view trace_id, void GenerateServerContext(absl::string_view header, absl::string_view method, PythonCensusContext* context); -inline absl::string_view GetMethod(const char* method) { +inline std::string GetMethod(const char* method) { if (std::string(method).empty()) { return ""; } // Check for leading '/' and trim it if present. - return absl::StripPrefix(absl::string_view(method), "/"); + return std::string(absl::StripPrefix(method, "/")); } -inline absl::string_view GetTarget(const char* target) { - return absl::string_view(target); -} +inline std::string GetTarget(const char* target) { return std::string(target); } // Fills a pre-allocated buffer with the value for the grpc-trace-bin header. // The buffer must be at least kGrpcTraceBinHeaderLen bytes long. diff --git a/src/python/grpcio_observability/grpc_version.py b/src/python/grpcio_observability/grpc_version.py index 13cab2cde3542..94f6ed339cf43 100644 --- a/src/python/grpcio_observability/grpc_version.py +++ b/src/python/grpcio_observability/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_observability/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py index ef3a99abb3aef..88762b7d51928 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py @@ -32,22 +32,23 @@ async def ServerReflectionInfo( ) -> AsyncIterable[_reflection_pb2.ServerReflectionResponse]: async for request in request_iterator: if request.HasField("file_by_filename"): - yield self._file_by_filename(request.file_by_filename) + yield self._file_by_filename(request, request.file_by_filename) elif request.HasField("file_containing_symbol"): yield self._file_containing_symbol( - request.file_containing_symbol + request, request.file_containing_symbol ) elif request.HasField("file_containing_extension"): yield self._file_containing_extension( + request, request.file_containing_extension.containing_type, request.file_containing_extension.extension_number, ) elif request.HasField("all_extension_numbers_of_type"): yield self._all_extension_numbers_of_type( - request.all_extension_numbers_of_type + request, request.all_extension_numbers_of_type ) elif request.HasField("list_services"): - yield self._list_services() + yield self._list_services(request) else: yield _reflection_pb2.ServerReflectionResponse( error_response=_reflection_pb2.ErrorResponse( @@ -55,7 +56,8 @@ async def ServerReflectionInfo( error_message=grpc.StatusCode.INVALID_ARGUMENT.value[ 1 ].encode(), - ) + ), + original_request=request, ) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py index e73abc9346ee2..50d671a92d73f 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py @@ -22,12 +22,13 @@ _POOL = descriptor_pool.Default() -def _not_found_error(): +def _not_found_error(original_request): return _reflection_pb2.ServerReflectionResponse( error_response=_reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - ) + ), + original_request=original_request, ) @@ -39,7 +40,7 @@ def _collect_transitive_dependencies(descriptor, seen_files): _collect_transitive_dependencies(dependency, seen_files) -def _file_descriptor_response(descriptor): +def _file_descriptor_response(descriptor, original_request): # collect all dependencies descriptors = {} _collect_transitive_dependencies(descriptor, descriptors) @@ -55,6 +56,7 @@ def _file_descriptor_response(descriptor): file_descriptor_response=_reflection_pb2.FileDescriptorResponse( file_descriptor_proto=(serialized_proto_list) ), + original_request=original_request, ) @@ -71,25 +73,27 @@ def __init__(self, service_names, pool=None): self._service_names = tuple(sorted(service_names)) self._pool = _POOL if pool is None else pool - def _file_by_filename(self, filename): + def _file_by_filename(self, request, filename): try: descriptor = self._pool.FindFileByName(filename) except KeyError: - return _not_found_error() + return _not_found_error(request) else: - return _file_descriptor_response(descriptor) + return _file_descriptor_response(descriptor, request) - def _file_containing_symbol(self, fully_qualified_name): + def _file_containing_symbol(self, request, fully_qualified_name): try: descriptor = self._pool.FindFileContainingSymbol( fully_qualified_name ) except KeyError: - return _not_found_error() + return _not_found_error(request) else: - return _file_descriptor_response(descriptor) + return _file_descriptor_response(descriptor, request) - def _file_containing_extension(self, containing_type, extension_number): + def _file_containing_extension( + self, request, containing_type, extension_number + ): try: message_descriptor = self._pool.FindMessageTypeByName( containing_type @@ -101,11 +105,11 @@ def _file_containing_extension(self, containing_type, extension_number): extension_descriptor.full_name ) except KeyError: - return _not_found_error() + return _not_found_error(request) else: - return _file_descriptor_response(descriptor) + return _file_descriptor_response(descriptor, request) - def _all_extension_numbers_of_type(self, containing_type): + def _all_extension_numbers_of_type(self, request, containing_type): try: message_descriptor = self._pool.FindMessageTypeByName( containing_type @@ -119,23 +123,25 @@ def _all_extension_numbers_of_type(self, containing_type): ) ) except KeyError: - return _not_found_error() + return _not_found_error(request) else: return _reflection_pb2.ServerReflectionResponse( all_extension_numbers_response=_reflection_pb2.ExtensionNumberResponse( base_type_name=message_descriptor.full_name, extension_number=extension_numbers, - ) + ), + original_request=request, ) - def _list_services(self): + def _list_services(self, request): return _reflection_pb2.ServerReflectionResponse( list_services_response=_reflection_pb2.ListServiceResponse( service=[ _reflection_pb2.ServiceResponse(name=service_name) for service_name in self._service_names ] - ) + ), + original_request=request, ) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 1c1807f49aa2c..4315ac9fcbffe 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -32,22 +32,23 @@ def ServerReflectionInfo(self, request_iterator, context): # pylint: disable=unused-argument for request in request_iterator: if request.HasField("file_by_filename"): - yield self._file_by_filename(request.file_by_filename) + yield self._file_by_filename(request, request.file_by_filename) elif request.HasField("file_containing_symbol"): yield self._file_containing_symbol( - request.file_containing_symbol + request, request.file_containing_symbol ) elif request.HasField("file_containing_extension"): yield self._file_containing_extension( + request, request.file_containing_extension.containing_type, request.file_containing_extension.extension_number, ) elif request.HasField("all_extension_numbers_of_type"): yield self._all_extension_numbers_of_type( - request.all_extension_numbers_of_type + request, request.all_extension_numbers_of_type ) elif request.HasField("list_services"): - yield self._list_services() + yield self._list_services(request) else: yield _reflection_pb2.ServerReflectionResponse( error_response=_reflection_pb2.ErrorResponse( @@ -55,7 +56,8 @@ def ServerReflectionInfo(self, request_iterator, context): error_message=grpc.StatusCode.INVALID_ARGUMENT.value[ 1 ].encode(), - ) + ), + original_request=request, ) diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py index d4f5d1d484a16..3188e99131d34 100644 --- a/src/python/grpcio_reflection/grpc_version.py +++ b/src/python/grpcio_reflection/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_status/grpc_version.py b/src/python/grpcio_status/grpc_version.py index b1e7345028462..b8977a4bf0b68 100644 --- a/src/python/grpcio_status/grpc_version.py +++ b/src/python/grpcio_status/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_status/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_testing/grpc_version.py b/src/python/grpcio_testing/grpc_version.py index 34303c2934f33..289ca84aaa319 100644 --- a/src/python/grpcio_testing/grpc_version.py +++ b/src/python/grpcio_testing/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_testing/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py index 85effbb7a8cee..a5c243e7c90f6 100644 --- a/src/python/grpcio_tests/grpc_version.py +++ b/src/python/grpcio_tests/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/src/python/grpcio_tests/tests/fork/BUILD.bazel b/src/python/grpcio_tests/tests/fork/BUILD.bazel index 03ef926d508ee..5c7b24de9fe40 100644 --- a/src/python/grpcio_tests/tests/fork/BUILD.bazel +++ b/src/python/grpcio_tests/tests/fork/BUILD.bazel @@ -16,6 +16,10 @@ load("//bazel:cython_library.bzl", "pyx_library") pyx_library( name = "native_debug", srcs = ["native_debug.pyx"], + visibility = [ + "//src/python/grpcio_tests/tests/observability:__subpackages__", + "//src/python/grpcio_tests/tests_py3_only/interop:__subpackages__", + ], deps = ["@com_google_absl//absl/debugging:failure_signal_handler"], ) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index 7568abcd17811..810b56f20fba1 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -90,6 +90,7 @@ def testFileByName(self): _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -97,6 +98,7 @@ def testFileByName(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertEqual(expected_responses, responses) @@ -119,6 +121,7 @@ def testFileBySymbol(self): _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -126,6 +129,7 @@ def testFileBySymbol(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertEqual(expected_responses, responses) @@ -157,6 +161,7 @@ def testFileContainingExtension(self): _file_descriptor_to_proto(empty2_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -164,6 +169,7 @@ def testFileContainingExtension(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertEqual(expected_responses, responses) @@ -185,6 +191,7 @@ def testExtensionNumbersOfType(self): base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, extension_number=_EMPTY_EXTENSIONS_NUMBERS, ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -192,6 +199,7 @@ def testExtensionNumbersOfType(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertEqual(expected_responses, responses) @@ -212,6 +220,7 @@ def testListServices(self): for name in _SERVICE_NAMES ) ), + original_request=requests[0], ), ) self.assertEqual(expected_responses, responses) diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py index de89aca588285..d1cc2c7489173 100644 --- a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py @@ -89,6 +89,7 @@ async def test_file_by_name(self): _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -96,6 +97,7 @@ async def test_file_by_name(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertSequenceEqual(expected_responses, responses) @@ -120,6 +122,7 @@ async def test_file_by_symbol(self): _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -127,6 +130,7 @@ async def test_file_by_symbol(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertSequenceEqual(expected_responses, responses) @@ -160,6 +164,7 @@ async def test_file_containing_extension(self): _file_descriptor_to_proto(empty2_pb2.DESCRIPTOR), ) ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -167,6 +172,7 @@ async def test_file_containing_extension(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertSequenceEqual(expected_responses, responses) @@ -190,6 +196,7 @@ async def test_extension_numbers_of_type(self): base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, extension_number=_EMPTY_EXTENSIONS_NUMBERS, ), + original_request=requests[0], ), reflection_pb2.ServerReflectionResponse( valid_host="", @@ -197,6 +204,7 @@ async def test_extension_numbers_of_type(self): error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ), + original_request=requests[1], ), ) self.assertSequenceEqual(expected_responses, responses) @@ -219,6 +227,7 @@ async def test_list_services(self): for name in _SERVICE_NAMES ) ), + original_request=requests[0], ), ) self.assertSequenceEqual(expected_responses, responses) diff --git a/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel b/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel index bf7beef5e16ab..ef1320a70c7e5 100644 --- a/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel @@ -28,6 +28,7 @@ py_binary( "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_admin/grpc_admin", "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz", + "//src/python/grpcio_tests/tests/fork:native_debug", requirement("opentelemetry-exporter-prometheus"), ], ) @@ -46,6 +47,7 @@ py_binary( "//src/python/grpcio_csm_observability/grpc_csm_observability:csm_observability", "//src/python/grpcio_health_checking/grpc_health/v1:grpc_health", "//src/python/grpcio_reflection/grpc_reflection/v1alpha:grpc_reflection", + "//src/python/grpcio_tests/tests/fork:native_debug", requirement("opentelemetry-exporter-prometheus"), ], ) diff --git a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py index 44057ae0af0a5..b8e6dbfd81c22 100644 --- a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py +++ b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py @@ -45,6 +45,9 @@ from src.proto.grpc.testing import messages_pb2 from src.proto.grpc.testing import test_pb2 from src.proto.grpc.testing import test_pb2_grpc +from src.python.grpcio_tests.tests.fork import native_debug + +native_debug.install_failure_signal_handler() logger = logging.getLogger() console_handler = logging.StreamHandler() diff --git a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py index d2dd90a9b9c7a..f426bd001096d 100644 --- a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py +++ b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py @@ -39,6 +39,9 @@ from src.proto.grpc.testing import messages_pb2 from src.proto.grpc.testing import test_pb2 from src.proto.grpc.testing import test_pb2_grpc +from src.python.grpcio_tests.tests.fork import native_debug + +native_debug.install_failure_signal_handler() # NOTE: This interop server is not fully compatible with all xDS interop tests. # It currently only implements enough functionality to pass the xDS security diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.c b/src/ruby/ext/grpc/rb_grpc_imports.generated.c index 4bb5d2a91c9bf..b0cfa9ce6b052 100644 --- a/src/ruby/ext/grpc/rb_grpc_imports.generated.c +++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.c @@ -255,10 +255,7 @@ gpr_cpu_num_cores_type gpr_cpu_num_cores_import; gpr_cpu_current_cpu_type gpr_cpu_current_cpu_import; gpr_log_type gpr_log_import; gpr_should_log_type gpr_should_log_import; -gpr_log_message_type gpr_log_message_import; -gpr_set_log_verbosity_type gpr_set_log_verbosity_import; gpr_log_verbosity_init_type gpr_log_verbosity_init_import; -gpr_set_log_function_type gpr_set_log_function_import; gpr_format_message_type gpr_format_message_import; gpr_strdup_type gpr_strdup_import; gpr_asprintf_type gpr_asprintf_import; @@ -543,10 +540,7 @@ void grpc_rb_load_imports(HMODULE library) { gpr_cpu_current_cpu_import = (gpr_cpu_current_cpu_type) GetProcAddress(library, "gpr_cpu_current_cpu"); gpr_log_import = (gpr_log_type) GetProcAddress(library, "gpr_log"); gpr_should_log_import = (gpr_should_log_type) GetProcAddress(library, "gpr_should_log"); - gpr_log_message_import = (gpr_log_message_type) GetProcAddress(library, "gpr_log_message"); - gpr_set_log_verbosity_import = (gpr_set_log_verbosity_type) GetProcAddress(library, "gpr_set_log_verbosity"); gpr_log_verbosity_init_import = (gpr_log_verbosity_init_type) GetProcAddress(library, "gpr_log_verbosity_init"); - gpr_set_log_function_import = (gpr_set_log_function_type) GetProcAddress(library, "gpr_set_log_function"); gpr_format_message_import = (gpr_format_message_type) GetProcAddress(library, "gpr_format_message"); gpr_strdup_import = (gpr_strdup_type) GetProcAddress(library, "gpr_strdup"); gpr_asprintf_import = (gpr_asprintf_type) GetProcAddress(library, "gpr_asprintf"); diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h index 3607484125831..1b325a1a024d6 100644 --- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h +++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h @@ -741,18 +741,9 @@ extern gpr_log_type gpr_log_import; typedef int(*gpr_should_log_type)(gpr_log_severity severity); extern gpr_should_log_type gpr_should_log_import; #define gpr_should_log gpr_should_log_import -typedef void(*gpr_log_message_type)(const char* file, int line, gpr_log_severity severity, const char* message); -extern gpr_log_message_type gpr_log_message_import; -#define gpr_log_message gpr_log_message_import -typedef void(*gpr_set_log_verbosity_type)(gpr_log_severity deprecated_setting); -extern gpr_set_log_verbosity_type gpr_set_log_verbosity_import; -#define gpr_set_log_verbosity gpr_set_log_verbosity_import typedef void(*gpr_log_verbosity_init_type)(void); extern gpr_log_verbosity_init_type gpr_log_verbosity_init_import; #define gpr_log_verbosity_init gpr_log_verbosity_init_import -typedef void(*gpr_set_log_function_type)(gpr_log_func deprecated_setting); -extern gpr_set_log_function_type gpr_set_log_function_import; -#define gpr_set_log_function gpr_set_log_function_import typedef char*(*gpr_format_message_type)(int messageid); extern gpr_format_message_type gpr_format_message_import; #define gpr_format_message gpr_format_message_import diff --git a/src/ruby/lib/grpc/generic/active_call.rb b/src/ruby/lib/grpc/generic/active_call.rb index d1d5bc7cbbd9e..27c0ba8601f1f 100644 --- a/src/ruby/lib/grpc/generic/active_call.rb +++ b/src/ruby/lib/grpc/generic/active_call.rb @@ -44,8 +44,8 @@ class ActiveCall # rubocop:disable Metrics/ClassLength include Core::CallOps extend Forwardable attr_reader :deadline, :metadata_sent, :metadata_to_send, :peer, :peer_cert - def_delegators :@call, :cancel, :metadata, :write_flag, :write_flag=, - :trailing_metadata, :status + def_delegators :@call, :cancel, :cancel_with_status, :metadata, + :write_flag, :write_flag=, :trailing_metadata, :status # client_invoke begins a client invocation. # @@ -620,6 +620,8 @@ def maybe_finish_and_close_call_locked # @param metadata [Hash] metadata to be sent to the server. If a value is # a list, multiple metadata for its key are sent def start_call(metadata = {}) + # TODO(apolcyn): we should cancel and clean up the call in case this + # send initial MD op fails. merge_metadata_to_send(metadata) && send_initial_metadata end @@ -665,9 +667,10 @@ def initialize(wrapped) # Operation limits access to an ActiveCall's methods for use as # a Operation on the client. - Operation = view_class(:cancel, :cancelled?, :deadline, :execute, - :metadata, :status, :start_call, :wait, :write_flag, - :write_flag=, :trailing_metadata) + # TODO(apolcyn): expose peer getter + Operation = view_class(:cancel, :cancel_with_status, :cancelled?, :deadline, + :execute, :metadata, :status, :start_call, :wait, + :write_flag, :write_flag=, :trailing_metadata) # InterceptableView further limits access to an ActiveCall's methods # for use in interceptors on the client, exposing only the deadline diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index b44360856f2f6..a36b7ff6d2345 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -14,5 +14,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '1.66.0.dev' + VERSION = '1.67.0.dev' end diff --git a/src/ruby/nativedebug/version.rb b/src/ruby/nativedebug/version.rb index 73bd2ba09c219..bfd6738d99816 100644 --- a/src/ruby/nativedebug/version.rb +++ b/src/ruby/nativedebug/version.rb @@ -14,6 +14,6 @@ module GRPC module NativeDebug - VERSION = '1.66.0.dev' + VERSION = '1.67.0.dev' end end diff --git a/src/ruby/spec/call_spec.rb b/src/ruby/spec/call_spec.rb index c4296bb5ada74..880167515397b 100644 --- a/src/ruby/spec/call_spec.rb +++ b/src/ruby/spec/call_spec.rb @@ -90,88 +90,101 @@ describe '#status' do it 'can save the status and read it back' do - call = make_test_call - sts = Struct::Status.new(OK, 'OK') - expect { call.status = sts }.not_to raise_error - expect(call.status).to eq(sts) + make_test_call do |call| + sts = Struct::Status.new(OK, 'OK') + expect { call.status = sts }.not_to raise_error + expect(call.status).to eq(sts) + end end it 'must be set to a status' do - call = make_test_call - bad_sts = Object.new - expect { call.status = bad_sts }.to raise_error(TypeError) + make_test_call do |call| + bad_sts = Object.new + expect { call.status = bad_sts }.to raise_error(TypeError) + end end it 'can be set to nil' do - call = make_test_call - expect { call.status = nil }.not_to raise_error + make_test_call do |call| + expect { call.status = nil }.not_to raise_error + end end end describe '#metadata' do it 'can save the metadata hash and read it back' do - call = make_test_call - md = { 'k1' => 'v1', 'k2' => 'v2' } - expect { call.metadata = md }.not_to raise_error - expect(call.metadata).to be(md) + make_test_call do |call| + md = { 'k1' => 'v1', 'k2' => 'v2' } + expect { call.metadata = md }.not_to raise_error + expect(call.metadata).to be(md) + end end it 'must be set with a hash' do - call = make_test_call - bad_md = Object.new - expect { call.metadata = bad_md }.to raise_error(TypeError) + make_test_call do |call| + bad_md = Object.new + expect { call.metadata = bad_md }.to raise_error(TypeError) + end end it 'can be set to nil' do - call = make_test_call - expect { call.metadata = nil }.not_to raise_error + make_test_call do |call| + expect { call.metadata = nil }.not_to raise_error + end end end describe '#set_credentials!' do it 'can set a valid CallCredentials object' do - call = make_test_call - auth_proc = proc { { 'plugin_key' => 'plugin_value' } } - creds = GRPC::Core::CallCredentials.new auth_proc - expect { call.set_credentials! creds }.not_to raise_error + make_test_call do |call| + auth_proc = proc { { 'plugin_key' => 'plugin_value' } } + creds = GRPC::Core::CallCredentials.new auth_proc + expect { call.set_credentials! creds }.not_to raise_error + end end end describe '#cancel' do it 'completes ok' do - call = make_test_call - expect { call.cancel }.not_to raise_error + make_test_call do |call| + expect { call.cancel }.not_to raise_error + end end it 'completes ok when the call is closed' do - call = make_test_call - call.close - expect { call.cancel }.not_to raise_error + make_test_call do |call| + call.close + expect { call.cancel }.not_to raise_error + end end end describe '#cancel_with_status' do it 'completes ok' do - call = make_test_call - expect do - call.cancel_with_status(0, 'test status') - end.not_to raise_error - expect do - call.cancel_with_status(0, nil) - end.to raise_error(TypeError) + make_test_call do |call| + expect do + call.cancel_with_status(0, 'test status') + end.not_to raise_error + expect do + call.cancel_with_status(0, nil) + end.to raise_error(TypeError) + end end it 'completes ok when the call is closed' do - call = make_test_call - call.close - expect do - call.cancel_with_status(0, 'test status') - end.not_to raise_error + make_test_call do |call| + call.close + expect do + call.cancel_with_status(0, 'test status') + end.not_to raise_error + end end end def make_test_call - @ch.create_call(nil, nil, 'phony_method', nil, deadline) + call = @ch.create_call(nil, nil, 'phony_method', nil, deadline) + yield call + call.close end def deadline diff --git a/src/ruby/spec/channel_spec.rb b/src/ruby/spec/channel_spec.rb index 45f8c3a096a41..21a3a62386226 100644 --- a/src/ruby/spec/channel_spec.rb +++ b/src/ruby/spec/channel_spec.rb @@ -118,7 +118,8 @@ def construct_with_args(a) deadline = Time.now + 5 blk = proc do - ch.create_call(nil, nil, 'phony_method', nil, deadline) + call = ch.create_call(nil, nil, 'phony_method', nil, deadline) + call.close end expect(&blk).to_not raise_error end @@ -132,8 +133,9 @@ def construct_with_args(a) deadline = Time.now + 5 blk = proc do - ch.create_call(nil, nil, 'phony_method', nil, deadline) + call = ch.create_call(nil, nil, 'phony_method', nil, deadline) STDERR.puts "#{Time.now}: created call" + call.close end expect(&blk).to raise_error(RuntimeError) STDERR.puts "#{Time.now}: finished: raises an error if called on a closed channel" diff --git a/src/ruby/spec/client_server_spec.rb b/src/ruby/spec/client_server_spec.rb index c27262ec70cad..0f4710e9e6f66 100644 --- a/src/ruby/spec/client_server_spec.rb +++ b/src/ruby/spec/client_server_spec.rb @@ -16,36 +16,8 @@ include GRPC::Core -shared_context 'setup: tags' do - let(:sent_message) { 'sent message' } - let(:reply_text) { 'the reply' } - - def deadline - Time.now + 5 - end - - def server_allows_client_to_proceed(metadata = {}) - recvd_rpc = @server.request_call - expect(recvd_rpc).to_not eq nil - server_call = recvd_rpc.call - ops = { CallOps::SEND_INITIAL_METADATA => metadata } - server_batch = server_call.run_batch(ops) - expect(server_batch.send_metadata).to be true - server_call - end - - def new_client_call - @ch.create_call(nil, nil, '/method', nil, deadline) - end - - def ok_status - Struct::Status.new(StatusCodes::OK, 'OK') - end -end - shared_examples 'basic GRPC message delivery is OK' do include GRPC::Core - include_context 'setup: tags' context 'the test channel' do it 'should have a target' do @@ -53,272 +25,45 @@ def ok_status end end - context 'a client call' do - it 'should have a peer' do - expect(new_client_call.peer).to be_a(String) - end - end - - it 'calls have peer info' do - call = new_client_call - expect(call.peer).to be_a(String) - end - - it 'servers receive requests from clients and can respond' do - call = new_client_call - server_call = nil - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed - end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => {}, - CallOps::SEND_MESSAGE => sent_message, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_message).to be true - expect(client_batch.send_close).to be true - - # confirm the server can read the inbound message - server_thread.join - server_ops = { - CallOps::RECV_MESSAGE => nil - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.message).to eq(sent_message) - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_STATUS_FROM_SERVER => ok_status - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.send_close).to be true - expect(server_batch.send_status).to be true - - # finish the call - final_client_batch = call.run_batch( - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.status.code).to eq(0) - end - - it 'responses written by servers are received by the client' do - call = new_client_call - server_call = nil - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed - end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => {}, - CallOps::SEND_MESSAGE => sent_message, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_message).to be true - expect(client_batch.send_close).to be true - - # confirm the server can read the inbound message - server_thread.join - server_ops = { - CallOps::RECV_MESSAGE => nil - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.message).to eq(sent_message) - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_MESSAGE => reply_text, - CallOps::SEND_STATUS_FROM_SERVER => ok_status - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.send_close).to be true - expect(server_batch.send_message).to be true - expect(server_batch.send_status).to be true - - # finish the call - final_client_batch = call.run_batch( - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_MESSAGE => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.message).to eq(reply_text) - expect(final_client_batch.status.code).to eq(0) - end - - it 'compressed messages can be sent and received' do - call = new_client_call - server_call = nil - long_request_str = '0' * 2000 - long_response_str = '1' * 2000 - md = { 'grpc-internal-encoding-request' => 'gzip' } - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed(md) + it 'unary calls work' do + run_services_on_server(@server, services: [EchoService]) do + call = @stub.an_rpc(EchoMsg.new, return_op: true) + expect(call.execute).to be_a(EchoMsg) end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => md, - CallOps::SEND_MESSAGE => long_request_str, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_message).to be true - expect(client_batch.send_close).to be true - - # confirm the server can read the inbound message - server_thread.join - server_ops = { - CallOps::RECV_MESSAGE => nil - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.message).to eq(long_request_str) - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_MESSAGE => long_response_str, - CallOps::SEND_STATUS_FROM_SERVER => ok_status - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.send_close).to be true - expect(server_batch.send_message).to be true - expect(server_batch.send_status).to be true - - client_ops = { - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_MESSAGE => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil - } - final_client_batch = call.run_batch(client_ops) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.message).to eq long_response_str - expect(final_client_batch.status.code).to eq(0) end - it 'servers can ignore a client write and send a status' do - call = new_client_call - server_call = nil - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed + it 'unary calls work when enabling compression' do + run_services_on_server(@server, services: [EchoService]) do + long_request_str = '0' * 2000 + md = { 'grpc-internal-encoding-request' => 'gzip' } + call = @stub.an_rpc(EchoMsg.new(msg: long_request_str), + return_op: true, + metadata: md) + response = call.execute + expect(response).to be_a(EchoMsg) + expect(response.msg).to eq(long_request_str) end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => {}, - CallOps::SEND_MESSAGE => sent_message, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_message).to be true - expect(client_batch.send_close).to be true - - # confirm the server can read the inbound message - the_status = Struct::Status.new(StatusCodes::OK, 'OK') - server_thread.join - server_ops = { - CallOps::SEND_STATUS_FROM_SERVER => the_status - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.message).to eq nil - expect(server_batch.send_status).to be true - - final_client_batch = call.run_batch( - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.status.code).to eq(0) - end - - it 'completes calls by sending status to client and server' do - call = new_client_call - server_call = nil - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed - end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => {}, - CallOps::SEND_MESSAGE => sent_message - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_message).to be true - - # confirm the server can read the inbound message and respond - the_status = Struct::Status.new(StatusCodes::OK, 'OK', {}) - server_thread.join - server_ops = { - CallOps::RECV_MESSAGE => nil - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.message).to eq sent_message - server_ops = { - CallOps::SEND_MESSAGE => reply_text, - CallOps::SEND_STATUS_FROM_SERVER => the_status - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.send_status).to be true - expect(server_batch.send_message).to be true - - # confirm the client can receive the server response and status. - client_ops = { - CallOps::SEND_CLOSE_FROM_CLIENT => nil, - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_MESSAGE => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil - } - final_client_batch = call.run_batch(client_ops) - expect(final_client_batch.send_close).to be true - expect(final_client_batch.message).to eq reply_text - expect(final_client_batch.status).to eq the_status - - # confirm the server can receive the client close. - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil - } - final_server_batch = server_call.run_batch(server_ops) - expect(final_server_batch.send_close).to be true end def client_cancel_test(cancel_proc, expected_code, expected_details) - call = new_client_call - server_call = nil - - server_thread = Thread.new do - server_call = server_allows_client_to_proceed + call = @stub.an_rpc(EchoMsg.new, return_op: true) + run_services_on_server(@server, services: [EchoService]) do + # start the call, but don't send a message yet + call.start_call + # cancel the call + cancel_proc.call(call) + # check the client's status + failed = false + begin + call.execute + rescue GRPC::BadStatus => e + failed = true + expect(e.code).to be expected_code + expect(e.details).to eq expected_details + end + expect(failed).to be(true) end - - client_ops = { - CallOps::SEND_INITIAL_METADATA => {}, - CallOps::RECV_INITIAL_METADATA => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.metadata).to eq({}) - - cancel_proc.call(call) - - server_thread.join - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil - } - server_batch = server_call.run_batch(server_ops) - expect(server_batch.send_close).to be true - - client_ops = { - CallOps::RECV_STATUS_ON_CLIENT => {} - } - client_batch = call.run_batch(client_ops) - - expect(client_batch.status.code).to be expected_code - expect(client_batch.status.details).to eq expected_details end it 'clients can cancel a call on the server' do @@ -344,8 +89,6 @@ def client_cancel_test(cancel_proc, expected_code, end shared_examples 'GRPC metadata delivery works OK' do - include_context 'setup: tags' - describe 'from client => server' do before(:example) do n = 7 # arbitrary number of metadata @@ -364,53 +107,31 @@ def client_cancel_test(cancel_proc, expected_code, it 'raises an exception if a metadata key is invalid' do @bad_keys.each do |md| - call = new_client_call - client_ops = { - CallOps::SEND_INITIAL_METADATA => md - } - blk = proc do - call.run_batch(client_ops) + # NOTE: no need to run a server in this test b/c the failure + # happens while validating metadata to send. + failed = false + begin + @stub.an_rpc(EchoMsg.new, metadata: md) + rescue TypeError => e + failed = true + expect(e.message).to eq('grpc_rb_md_ary_fill_hash_cb: bad type for key parameter') end - expect(&blk).to raise_error + expect(failed).to be(true) end end it 'sends all the metadata pairs when keys and values are valid' do - @valid_metadata.each do |md| - recvd_rpc = nil - rcv_thread = Thread.new do - recvd_rpc = @server.request_call + service = EchoService.new + run_services_on_server(@server, services: [service]) do + @valid_metadata.each_with_index do |md, i| + expect(@stub.an_rpc(EchoMsg.new, metadata: md)).to be_a(EchoMsg) + # confirm the server can receive the client metadata + # finish the call + expect(service.received_md.length).to eq(i + 1) + md.each do |k, v| + expect(service.received_md[i][k.to_s]).to eq(v) + end end - - call = new_client_call - client_ops = { - CallOps::SEND_INITIAL_METADATA => md, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - - # confirm the server can receive the client metadata - rcv_thread.join - expect(recvd_rpc).to_not eq nil - recvd_md = recvd_rpc.metadata - replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }] - expect(recvd_md).to eq(recvd_md.merge(replace_symbols)) - - # finish the call - final_server_batch = recvd_rpc.call.run_batch( - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_INITIAL_METADATA => nil, - CallOps::SEND_STATUS_FROM_SERVER => ok_status) - expect(final_server_batch.send_close).to be(true) - expect(final_server_batch.send_metadata).to be(true) - expect(final_server_batch.send_status).to be(true) - - final_client_batch = call.run_batch( - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.status.code).to eq(0) end end end @@ -432,120 +153,61 @@ def client_cancel_test(cancel_proc, expected_code, end it 'raises an exception if a metadata key is invalid' do - @bad_keys.each do |md| - recvd_rpc = nil - rcv_thread = Thread.new do - recvd_rpc = @server.request_call - end - - call = new_client_call - # client signals that it's done sending metadata to allow server to - # respond - client_ops = { - CallOps::SEND_INITIAL_METADATA => nil - } - call.run_batch(client_ops) - - # server gets the invocation - rcv_thread.join - expect(recvd_rpc).to_not eq nil - server_ops = { - CallOps::SEND_INITIAL_METADATA => md - } - blk = proc do - recvd_rpc.call.run_batch(server_ops) + service = EchoService.new + run_services_on_server(@server, services: [service]) do + @bad_keys.each do |md| + proceed = Queue.new + server_exception = nil + service.on_call_started = proc do |call| + call.send_initial_metadata(md) + rescue TypeError => e + server_exception = e + ensure + proceed.push(1) + end + client_exception = nil + client_call = @stub.an_rpc(EchoMsg.new, return_op: true) + thr = Thread.new do + client_call.execute + rescue GRPC::BadStatus => e + client_exception = e + end + proceed.pop + # TODO(apolcyn): we shouldn't need this cancel here. It's + # only currently needed b/c the server does not seem to properly + # terminate the RPC if it fails to send initial metadata. That + # should be fixed, in which case this cancellation can be removed. + client_call.cancel + thr.join + p client_exception + expect(client_exception.nil?).to be(false) + expect(server_exception.nil?).to be(false) + expect(server_exception.message).to eq( + 'grpc_rb_md_ary_fill_hash_cb: bad type for key parameter') end - expect(&blk).to raise_error - - # cancel the call so the server can shut down immediately - call.cancel end end it 'sends an empty hash if no metadata is added' do - recvd_rpc = nil - rcv_thread = Thread.new do - recvd_rpc = @server.request_call + run_services_on_server(@server, services: [EchoService]) do + call = @stub.an_rpc(EchoMsg.new, return_op: true) + expect(call.execute).to be_a(EchoMsg) + expect(call.metadata).to eq({}) end - - call = new_client_call - # client signals that it's done sending metadata to allow server to - # respond - client_ops = { - CallOps::SEND_INITIAL_METADATA => nil, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_close).to be true - - # server gets the invocation but sends no metadata back - rcv_thread.join - expect(recvd_rpc).to_not eq nil - server_call = recvd_rpc.call - server_ops = { - # receive close and send status to finish the call - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_INITIAL_METADATA => nil, - CallOps::SEND_STATUS_FROM_SERVER => ok_status - } - srv_batch = server_call.run_batch(server_ops) - expect(srv_batch.send_close).to be true - expect(srv_batch.send_metadata).to be true - expect(srv_batch.send_status).to be true - - # client receives nothing as expected - client_ops = { - CallOps::RECV_INITIAL_METADATA => nil, - # receive status to finish the call - CallOps::RECV_STATUS_ON_CLIENT => nil - } - final_client_batch = call.run_batch(client_ops) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.status.code).to eq(0) end it 'sends all the pairs when keys and values are valid' do - @valid_metadata.each do |md| - recvd_rpc = nil - rcv_thread = Thread.new do - recvd_rpc = @server.request_call + service = EchoService.new + run_services_on_server(@server, services: [service]) do + @valid_metadata.each do |md| + service.on_call_started = proc do |call| + call.send_initial_metadata(md) + end + call = @stub.an_rpc(EchoMsg.new, return_op: true) + call.execute + replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }] + expect(call.metadata).to eq(replace_symbols) end - - call = new_client_call - # client signals that it's done sending metadata to allow server to - # respond - client_ops = { - CallOps::SEND_INITIAL_METADATA => nil, - CallOps::SEND_CLOSE_FROM_CLIENT => nil - } - client_batch = call.run_batch(client_ops) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_close).to be true - - # server gets the invocation but sends no metadata back - rcv_thread.join - expect(recvd_rpc).to_not eq nil - server_call = recvd_rpc.call - server_ops = { - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_INITIAL_METADATA => md, - CallOps::SEND_STATUS_FROM_SERVER => ok_status - } - srv_batch = server_call.run_batch(server_ops) - expect(srv_batch.send_close).to be true - expect(srv_batch.send_metadata).to be true - expect(srv_batch.send_status).to be true - - # client receives nothing as expected - client_ops = { - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil - } - final_client_batch = call.run_batch(client_ops) - replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }] - expect(final_client_batch.metadata).to eq(replace_symbols) - expect(final_client_batch.status.code).to eq(0) end end end @@ -554,16 +216,11 @@ def client_cancel_test(cancel_proc, expected_code, describe 'the http client/server' do before(:example) do server_host = '0.0.0.0:0' - @server = new_core_server_for_testing(nil) + @server = new_rpc_server_for_testing server_port = @server.add_http2_port(server_host, :this_port_is_insecure) - @server.start @ch = Channel.new("0.0.0.0:#{server_port}", nil, :this_channel_is_insecure) - end - - after(:example) do - @ch.close - @server.shutdown_and_notify(deadline) - @server.close + @stub = EchoStub.new( + "0.0.0.0:#{server_port}", nil, channel_override: @ch) end it_behaves_like 'basic GRPC message delivery is OK' do @@ -574,8 +231,6 @@ def client_cancel_test(cancel_proc, expected_code, end describe 'the secure http client/server' do - include_context 'setup: tags' - def load_test_certs test_root = File.join(File.dirname(__FILE__), 'testdata') files = ['ca.pem', 'server1.key', 'server1.pem'] @@ -587,17 +242,14 @@ def load_test_certs server_host = '0.0.0.0:0' server_creds = GRPC::Core::ServerCredentials.new( nil, [{ private_key: certs[1], cert_chain: certs[2] }], false) - @server = new_core_server_for_testing(nil) + @server = new_rpc_server_for_testing server_port = @server.add_http2_port(server_host, server_creds) - @server.start args = { Channel::SSL_TARGET => 'foo.test.google.fr' } - @ch = Channel.new("0.0.0.0:#{server_port}", args, - GRPC::Core::ChannelCredentials.new(certs[0], nil, nil)) - end - - after(:example) do - @server.shutdown_and_notify(deadline) - @server.close + @ch = Channel.new( + "0.0.0.0:#{server_port}", args, + GRPC::Core::ChannelCredentials.new(certs[0], nil, nil)) + @stub = EchoStub.new( + "0.0.0.0:#{server_port}", nil, channel_override: @ch) end it_behaves_like 'basic GRPC message delivery is OK' do @@ -606,59 +258,25 @@ def load_test_certs it_behaves_like 'GRPC metadata delivery works OK' do end - def credentials_update_test(creds_update_md) - auth_proc = proc { creds_update_md } + it 'modifies metadata with CallCredentials' do + # create call creds + auth_proc = proc { { 'k1' => 'v1' } } call_creds = GRPC::Core::CallCredentials.new(auth_proc) - - initial_md_key = 'k2' - initial_md_val = 'v2' - initial_md = { initial_md_key => initial_md_val } - expected_md = creds_update_md.clone - fail 'bad test param' unless expected_md[initial_md_key].nil? - expected_md[initial_md_key] = initial_md_val - - recvd_rpc = nil - rcv_thread = Thread.new do - recvd_rpc = @server.request_call + # create arbitrary custom metadata + custom_md = { 'k2' => 'v2' } + # perform an RPC + echo_service = EchoService.new + run_services_on_server(@server, services: [echo_service]) do + expect(@stub.an_rpc(EchoMsg.new, + credentials: call_creds, + metadata: custom_md)).to be_a(EchoMsg) + end + # call creds metadata should be merged with custom MD + expect(echo_service.received_md.length).to eq(1) + expected_md = { 'k1' => 'v1', 'k2' => 'v2' } + expected_md.each do |k, v| + expect(echo_service.received_md[0][k]).to eq(v) end - - call = new_client_call - call.set_credentials! call_creds - - client_batch = call.run_batch( - CallOps::SEND_INITIAL_METADATA => initial_md, - CallOps::SEND_CLOSE_FROM_CLIENT => nil) - expect(client_batch.send_metadata).to be true - expect(client_batch.send_close).to be true - - # confirm the server can receive the client metadata - rcv_thread.join - expect(recvd_rpc).to_not eq nil - recvd_md = recvd_rpc.metadata - replace_symbols = Hash[expected_md.each_pair.collect { |x, y| [x.to_s, y] }] - expect(recvd_md).to eq(recvd_md.merge(replace_symbols)) - - credentials_update_test_finish_call(call, recvd_rpc.call) - end - - def credentials_update_test_finish_call(client_call, server_call) - final_server_batch = server_call.run_batch( - CallOps::RECV_CLOSE_ON_SERVER => nil, - CallOps::SEND_INITIAL_METADATA => nil, - CallOps::SEND_STATUS_FROM_SERVER => ok_status) - expect(final_server_batch.send_close).to be(true) - expect(final_server_batch.send_metadata).to be(true) - expect(final_server_batch.send_status).to be(true) - - final_client_batch = client_call.run_batch( - CallOps::RECV_INITIAL_METADATA => nil, - CallOps::RECV_STATUS_ON_CLIENT => nil) - expect(final_client_batch.metadata).to eq({}) - expect(final_client_batch.status.code).to eq(0) - end - - it 'modifies metadata with CallCredentials' do - credentials_update_test('k1' => 'updated-v1') end it 'modifies large metadata with CallCredentials' do @@ -666,11 +284,34 @@ def credentials_update_test_finish_call(client_call, server_call) '00000000000000000000000000000000000000000000000000000000000000', '11111111111111111111111111111111111111111111111111111111111111', ) - md = { - k3: val_array, - k4: '0000000000000000000000000000000000000000000000000000000000', - keeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeey5: 'v1' + # create call creds + auth_proc = proc do + { + k2: val_array, + k3: '0000000000000000000000000000000000000000000000000000000000', + keeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeey4: 'v4' + } + end + call_creds = GRPC::Core::CallCredentials.new(auth_proc) + # create arbitrary custom metadata + custom_md = { k1: 'v1' } + # perform an RPC + echo_service = EchoService.new + run_services_on_server(@server, services: [echo_service]) do + expect(@stub.an_rpc(EchoMsg.new, + credentials: call_creds, + metadata: custom_md)).to be_a(EchoMsg) + end + # call creds metadata should be merged with custom MD + expect(echo_service.received_md.length).to eq(1) + expected_md = { + k1: 'v1', + k2: val_array, + k3: '0000000000000000000000000000000000000000000000000000000000', + keeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeey4: 'v4' } - credentials_update_test(md) + expected_md.each do |k, v| + expect(echo_service.received_md[0][k.to_s]).to eq(v) + end end end diff --git a/src/ruby/spec/generic/active_call_spec.rb b/src/ruby/spec/generic/active_call_spec.rb index 1a686bbe18534..5bd28d3c3631b 100644 --- a/src/ruby/spec/generic/active_call_spec.rb +++ b/src/ruby/spec/generic/active_call_spec.rb @@ -55,17 +55,20 @@ def inner_call_of_active_call(active_call) end @ch = GRPC::Core::Channel.new("0.0.0.0:#{server_port}", nil, :this_channel_is_insecure) + @call = make_test_call end after(:each) do @server.shutdown_and_notify(deadline) @server.close @server_thread.join + # Don't rely on GC to unref the call, since that can prevent + # the channel connectivity state polling thread from shutting down. + @call.close end describe 'restricted view methods' do before(:each) do - @call = make_test_call ActiveCall.client_invoke(@call) @client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) @@ -117,9 +120,8 @@ def inner_call_of_active_call(active_call) describe '#remote_send' do it 'allows a client to send a payload to the server', test: true do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -137,15 +139,14 @@ def inner_call_of_active_call(active_call) expect(server_call.remote_read).to eq(msg) # finish the call server_call.send_initial_metadata - call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) - send_and_receive_close_and_status(call, recvd_call) + @call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) + send_and_receive_close_and_status(@call, recvd_call) end it 'marshals the payload using the marshal func' do - call = make_test_call - ActiveCall.client_invoke(call) + ActiveCall.client_invoke(@call) marshal = proc { |x| 'marshalled:' + x } - client_call = ActiveCall.new(call, marshal, @pass_through, deadline) + client_call = ActiveCall.new(@call, marshal, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -161,23 +162,22 @@ def inner_call_of_active_call(active_call) metadata_received: true) expect(server_call.remote_read).to eq('marshalled:' + msg) # finish the call - call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) - send_and_receive_close_and_status(call, recvd_call) + @call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) + send_and_receive_close_and_status(@call, recvd_call) end TEST_WRITE_FLAGS = [WriteFlags::BUFFER_HINT, WriteFlags::NO_COMPRESS] TEST_WRITE_FLAGS.each do |f| it "successfully makes calls with write_flag set to #{f}" do - call = make_test_call - ActiveCall.client_invoke(call) + ActiveCall.client_invoke(@call) marshal = proc { |x| 'marshalled:' + x } - client_call = ActiveCall.new(call, marshal, + client_call = ActiveCall.new(@call, marshal, @pass_through, deadline) msg = 'message is a string' client_call.write_flag = f client_call.remote_send(msg) # flush the message in case writes are set to buffered - call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) if f == 1 + @call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) if f == 1 # confirm that the message was marshalled recvd_rpc = @received_rpcs_queue.pop @@ -199,9 +199,8 @@ def inner_call_of_active_call(active_call) describe 'sending initial metadata', send_initial_metadata: true do it 'sends metadata before sending a message if it hasnt been sent yet' do - call = make_test_call @client_call = ActiveCall.new( - call, + @call, @pass_through, @pass_through, deadline, @@ -213,13 +212,13 @@ def inner_call_of_active_call(active_call) message = 'phony message' - expect(call).to( + expect(@call).to( receive(:run_batch) .with( hash_including( CallOps::SEND_INITIAL_METADATA => metadata)).once) - expect(call).to( + expect(@call).to( receive(:run_batch).with(hash_including( CallOps::SEND_MESSAGE => message)).once) @client_call.remote_send(message) @@ -228,14 +227,12 @@ def inner_call_of_active_call(active_call) end it 'doesnt send metadata if it thinks its already been sent' do - call = make_test_call - - @client_call = ActiveCall.new(call, + @client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) expect(@client_call.metadata_sent).to eql(true) - expect(call).to( + expect(@call).to( receive(:run_batch).with(hash_including( CallOps::SEND_INITIAL_METADATA)).never) @@ -243,9 +240,7 @@ def inner_call_of_active_call(active_call) end it 'sends metadata if it is explicitly sent and ok to do so' do - call = make_test_call - - @client_call = ActiveCall.new(call, + @client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline, @@ -257,7 +252,7 @@ def inner_call_of_active_call(active_call) @client_call.merge_metadata_to_send(metadata) expect(@client_call.metadata_to_send).to eq(metadata) - expect(call).to( + expect(@call).to( receive(:run_batch).with(hash_including( CallOps::SEND_INITIAL_METADATA => metadata)).once) @@ -265,9 +260,7 @@ def inner_call_of_active_call(active_call) end it 'explicit sending does nothing if metadata has already been sent' do - call = make_test_call - - @client_call = ActiveCall.new(call, + @client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) @@ -284,7 +277,6 @@ def inner_call_of_active_call(active_call) describe '#merge_metadata_to_send', merge_metadata_to_send: true do it 'adds to existing metadata when there is existing metadata to send' do - call = make_test_call starting_metadata = { k1: 'key1_val', k2: 'key2_val', @@ -292,7 +284,7 @@ def inner_call_of_active_call(active_call) } @client_call = ActiveCall.new( - call, + @call, @pass_through, @pass_through, deadline, started: false, @@ -318,9 +310,8 @@ def inner_call_of_active_call(active_call) end it 'fails when initial metadata has already been sent' do - call = make_test_call @client_call = ActiveCall.new( - call, + @call, @pass_through, @pass_through, deadline, @@ -338,9 +329,8 @@ def inner_call_of_active_call(active_call) describe '#client_invoke' do it 'sends metadata to the server when present' do - call = make_test_call metadata = { k1: 'v1', k2: 'v2' } - ActiveCall.client_invoke(call, metadata) + ActiveCall.client_invoke(@call, metadata) recvd_rpc = @received_rpcs_queue.pop recvd_call = recvd_rpc.call expect(recvd_call).to_not be_nil @@ -349,15 +339,14 @@ def inner_call_of_active_call(active_call) expect(recvd_rpc.metadata['k2']).to eq('v2') # finish the call recvd_call.run_batch(CallOps::SEND_INITIAL_METADATA => {}) - call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) - send_and_receive_close_and_status(call, recvd_call) + @call.run_batch(CallOps::RECV_INITIAL_METADATA => nil) + send_and_receive_close_and_status(@call, recvd_call) end end describe '#send_status', send_status: true do it 'works when no metadata or messages have been sent yet' do - call = make_test_call - ActiveCall.client_invoke(call) + ActiveCall.client_invoke(@call) recvd_rpc = @received_rpcs_queue.pop server_call = ActiveCall.new( @@ -375,9 +364,8 @@ def inner_call_of_active_call(active_call) describe '#remote_read', remote_read: true do it 'reads the response sent by a server' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -385,13 +373,12 @@ def inner_call_of_active_call(active_call) server_call.remote_send('server_response') expect(client_call.remote_read).to eq('server_response') send_and_receive_close_and_status( - call, inner_call_of_active_call(server_call)) + @call, inner_call_of_active_call(server_call)) end it 'saves no metadata when the server adds no metadata' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -401,13 +388,12 @@ def inner_call_of_active_call(active_call) client_call.remote_read expect(client_call.metadata).to eq({}) send_and_receive_close_and_status( - call, inner_call_of_active_call(server_call)) + @call, inner_call_of_active_call(server_call)) end it 'saves metadata add by the server' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -418,12 +404,11 @@ def inner_call_of_active_call(active_call) expected = { 'k1' => 'v1', 'k2' => 'v2' } expect(client_call.metadata).to eq(expected) send_and_receive_close_and_status( - call, inner_call_of_active_call(server_call)) + @call, inner_call_of_active_call(server_call)) end it 'get a status from server when nothing else sent from server' do - client_call = make_test_call - ActiveCall.client_invoke(client_call) + ActiveCall.client_invoke(@call) recvd_rpc = @received_rpcs_queue.pop recvd_call = recvd_rpc.call @@ -438,22 +423,21 @@ def inner_call_of_active_call(active_call) server_call.send_status(OK, 'OK') # Check that we can receive initial metadata and a status - client_call.run_batch( + @call.run_batch( CallOps::RECV_INITIAL_METADATA => nil) - batch_result = client_call.run_batch( + batch_result = @call.run_batch( CallOps::RECV_STATUS_ON_CLIENT => nil) expect(batch_result.status.code).to eq(OK) end it 'get a nil msg before a status when an OK status is sent' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) - call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) + @call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) server_call = expect_server_to_receive(msg) server_call.remote_send('server_response') server_call.send_status(OK, 'OK') @@ -463,10 +447,9 @@ def inner_call_of_active_call(active_call) end it 'unmarshals the response using the unmarshal func' do - call = make_test_call - ActiveCall.client_invoke(call) + ActiveCall.client_invoke(@call) unmarshal = proc { |x| 'unmarshalled:' + x } - client_call = ActiveCall.new(call, @pass_through, + client_call = ActiveCall.new(@call, @pass_through, unmarshal, deadline) # confirm the client receives the unmarshalled message @@ -476,14 +459,13 @@ def inner_call_of_active_call(active_call) server_call.remote_send('server_response') expect(client_call.remote_read).to eq('unmarshalled:server_response') send_and_receive_close_and_status( - call, inner_call_of_active_call(server_call)) + @call, inner_call_of_active_call(server_call)) end end describe '#each_remote_read' do it 'creates an Enumerator' do - call = make_test_call - client_call = ActiveCall.new(call, @pass_through, + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) expect(client_call.each_remote_read).to be_a(Enumerator) # finish the call @@ -491,9 +473,8 @@ def inner_call_of_active_call(active_call) end it 'the returned enumerator can read n responses' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' reply = 'server_response' @@ -506,18 +487,17 @@ def inner_call_of_active_call(active_call) expect(e.next).to eq(reply) end send_and_receive_close_and_status( - call, inner_call_of_active_call(server_call)) + @call, inner_call_of_active_call(server_call)) end it 'the returns an enumerator that stops after an OK Status' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' reply = 'server_response' client_call.remote_send(msg) - call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) + @call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) server_call = expect_server_to_receive(msg) e = client_call.each_remote_read n = 3 # arbitrary value > 1 @@ -532,14 +512,13 @@ def inner_call_of_active_call(active_call) describe '#closing the call from the client' do it 'finishes ok if the server sends a status response' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) expect do - call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) + @call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) end.to_not raise_error server_call = expect_server_to_receive(msg) server_call.remote_send('server_response') @@ -549,9 +528,8 @@ def inner_call_of_active_call(active_call) end it 'finishes ok if the server sends an early status response' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -560,15 +538,14 @@ def inner_call_of_active_call(active_call) server_call.send_status(OK, 'status code is OK') expect(client_call.remote_read).to eq('server_response') expect do - call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) + @call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) end.to_not raise_error expect { client_call.receive_and_check_status }.to_not raise_error end it 'finishes ok if SEND_CLOSE and RECV_STATUS has been sent' do - call = make_test_call - ActiveCall.client_invoke(call) - client_call = ActiveCall.new(call, @pass_through, + ActiveCall.client_invoke(@call) + client_call = ActiveCall.new(@call, @pass_through, @pass_through, deadline) msg = 'message is a string' client_call.remote_send(msg) @@ -577,7 +554,7 @@ def inner_call_of_active_call(active_call) server_call.send_status(OK, 'status code is OK') expect(client_call.remote_read).to eq('server_response') expect do - call.run_batch( + @call.run_batch( CallOps::SEND_CLOSE_FROM_CLIENT => nil, CallOps::RECV_STATUS_ON_CLIENT => nil) end.to_not raise_error @@ -631,6 +608,7 @@ def inner_call_of_active_call(active_call) batch_result = @client_call.run_batch( CallOps::RECV_STATUS_ON_CLIENT => nil) expect(batch_result.status.code).to eq(@server_status) + @client_call.close end it 'sends the initial metadata implicitly if not already sent' do diff --git a/src/ruby/spec/support/services.rb b/src/ruby/spec/support/services.rb index a5d8e7c187b83..f4d0f68f20a25 100644 --- a/src/ruby/spec/support/services.rb +++ b/src/ruby/spec/support/services.rb @@ -41,14 +41,17 @@ class EchoService rpc :a_bidi_rpc, stream(EchoMsg), stream(EchoMsg) rpc :a_client_streaming_rpc_unimplemented, stream(EchoMsg), EchoMsg attr_reader :received_md + attr_accessor :on_call_started def initialize(**kw) @trailing_metadata = kw @received_md = [] + @on_call_started = nil end def an_rpc(req, call) GRPC.logger.info('echo service received a request') + on_call_started&.call(call) call.output_metadata.update(@trailing_metadata) @received_md << call.metadata unless call.metadata.nil? req diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb index 5768776a5462e..abfb5c3783ee8 100644 --- a/src/ruby/tools/version.rb +++ b/src/ruby/tools/version.rb @@ -14,6 +14,6 @@ module GRPC module Tools - VERSION = '1.66.0.dev' + VERSION = '1.67.0.dev' end end diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index f0bf5460f0252..18595b90ce6cc 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -199,7 +199,7 @@ ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.35' + ss.dependency 'BoringSSL-GRPC', '0.0.36' % for abseil_spec in grpc_abseil_specs: ss.dependency '${abseil_spec}', abseil_version % endfor diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 1380e70fe4a07..0551011773299 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -70,7 +70,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.35' + version = '0.0.36' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: diff --git a/test/core/call/bm_client_call.cc b/test/core/call/bm_client_call.cc index ce92dd9d991b9..78e4a2a41965b 100644 --- a/test/core/call/bm_client_call.cc +++ b/test/core/call/bm_client_call.cc @@ -140,7 +140,8 @@ void BM_Unary(benchmark::State& state) { auto unstarted_handler = helper.TakeHandler(); unstarted_handler.SpawnInfallible("run_handler", [&]() mutable { auto handler = unstarted_handler.StartCall(); - handler.PushServerInitialMetadata(Arena::MakePooled()); + handler.PushServerInitialMetadata( + Arena::MakePooledForOverwrite()); auto response = Arena::MakePooled(SliceBuffer(response_payload.Copy()), 0); return Map( @@ -156,7 +157,8 @@ void BM_Unary(benchmark::State& state) { handler.PushMessage(std::move(response))), [handler](StatusFlag status) mutable { CHECK(status.ok()); - auto trailing_metadata = Arena::MakePooled(); + auto trailing_metadata = + Arena::MakePooledForOverwrite(); trailing_metadata->Set(GrpcStatusMetadata(), GRPC_STATUS_OK); handler.PushServerTrailingMetadata(std::move(trailing_metadata)); return Empty{}; diff --git a/test/core/call/client_call_test.cc b/test/core/call/client_call_test.cc index be547af27e681..4a4ccfff0e867 100644 --- a/test/core/call/client_call_test.cc +++ b/test/core/call/client_call_test.cc @@ -196,7 +196,7 @@ CLIENT_CALL_TEST(SendInitialMetadataAndReceiveStatusAfterCancellation) { EXPECT_EQ((*md)->get_pointer(HttpPathMetadata())->as_string_view(), kDefaultPath); handler().PushServerTrailingMetadata( - ServerMetadataFromStatus(absl::InternalError("test error"))); + ServerMetadataFromStatus(GRPC_STATUS_INTERNAL, "test error")); return Immediate(Empty{}); }); Expect(1, true); diff --git a/test/core/call/server_call_test.cc b/test/core/call/server_call_test.cc index 69454baaabbf7..b42f050320362 100644 --- a/test/core/call/server_call_test.cc +++ b/test/core/call/server_call_test.cc @@ -73,7 +73,8 @@ class ServerCallTest : public YodelTest { ClientMetadataHandle MakeClientInitialMetadata( std::initializer_list> md) { - auto client_initial_metadata = Arena::MakePooled(); + auto client_initial_metadata = + Arena::MakePooledForOverwrite(); client_initial_metadata->Set(HttpPathMetadata(), Slice::FromCopiedString(kDefaultPath)); for (const auto& pair : md) { diff --git a/test/core/client_channel/BUILD b/test/core/client_channel/BUILD index a6fb5cf4dc5b9..03eda2d7ca8c4 100644 --- a/test/core/client_channel/BUILD +++ b/test/core/client_channel/BUILD @@ -128,6 +128,16 @@ grpc_cc_benchmark( ], ) +grpc_cc_benchmark( + name = "bm_load_balanced_call_destination", + srcs = ["bm_load_balanced_call_destination.cc"], + deps = [ + "//:grpc", + "//src/core:default_event_engine", + "//test/core/transport:call_spine_benchmarks", + ], +) + grpc_cc_test( name = "lb_metadata_test", srcs = ["lb_metadata_test.cc"], diff --git a/test/core/client_channel/bm_client_channel.cc b/test/core/client_channel/bm_client_channel.cc index f3d56b6ea8e5b..1ee51257c9f0a 100644 --- a/test/core/client_channel/bm_client_channel.cc +++ b/test/core/client_channel/bm_client_channel.cc @@ -50,19 +50,19 @@ class ClientChannelTraits { } ClientMetadataHandle MakeClientInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), kTestPath.Copy()); return md; } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); return md; } diff --git a/test/core/client_channel/client_channel_test.cc b/test/core/client_channel/client_channel_test.cc index bc217a354e07c..2c624c3b9c964 100644 --- a/test/core/client_channel/client_channel_test.cc +++ b/test/core/client_channel/client_channel_test.cc @@ -57,7 +57,8 @@ class ClientChannelTest : public YodelTest { ClientChannel& channel() { return *channel_; } ClientMetadataHandle MakeClientInitialMetadata() { - auto client_initial_metadata = Arena::MakePooled(); + auto client_initial_metadata = + Arena::MakePooledForOverwrite(); client_initial_metadata->Set(HttpPathMetadata(), Slice::FromCopiedString(kTestPath)); return client_initial_metadata; diff --git a/test/core/client_channel/connected_subchannel_test.cc b/test/core/client_channel/connected_subchannel_test.cc index 92b9c78271ddd..98f5b26207f08 100644 --- a/test/core/client_channel/connected_subchannel_test.cc +++ b/test/core/client_channel/connected_subchannel_test.cc @@ -59,7 +59,8 @@ class ConnectedSubchannelTest : public YodelTest { } ClientMetadataHandle MakeClientInitialMetadata() { - auto client_initial_metadata = Arena::MakePooled(); + auto client_initial_metadata = + Arena::MakePooledForOverwrite(); client_initial_metadata->Set(HttpPathMetadata(), Slice::FromCopiedString(kTestPath)); return client_initial_metadata; diff --git a/test/core/client_channel/load_balanced_call_destination_test.cc b/test/core/client_channel/load_balanced_call_destination_test.cc index 85a03ec77a909..ba92f44958c26 100644 --- a/test/core/client_channel/load_balanced_call_destination_test.cc +++ b/test/core/client_channel/load_balanced_call_destination_test.cc @@ -41,7 +41,8 @@ class LoadBalancedCallDestinationTest : public YodelTest { using YodelTest::YodelTest; ClientMetadataHandle MakeClientInitialMetadata() { - auto client_initial_metadata = Arena::MakePooled(); + auto client_initial_metadata = + Arena::MakePooledForOverwrite(); client_initial_metadata->Set(HttpPathMetadata(), Slice::FromCopiedString(kTestPath)); return client_initial_metadata; diff --git a/test/core/end2end/fixtures/http_proxy_fixture.cc b/test/core/end2end/fixtures/http_proxy_fixture.cc index f0ffe5519a5ba..957fb7101f064 100644 --- a/test/core/end2end/fixtures/http_proxy_fixture.cc +++ b/test/core/end2end/fixtures/http_proxy_fixture.cc @@ -682,7 +682,7 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create( // Construct proxy address. const int proxy_port = grpc_pick_unused_port_or_die(); proxy->proxy_name = grpc_core::JoinHostPort("localhost", proxy_port); - LOG(INFO) << "Proxy address: " << proxy->proxy_name; + VLOG(2) << "Proxy address: " << proxy->proxy_name; // Create TCP server. auto channel_args = grpc_core::CoreConfiguration::Get() .channel_args_preconditioning() diff --git a/test/core/end2end/fuzzers/BUILD b/test/core/end2end/fuzzers/BUILD index 969bc0645768a..a0ed90bc8046b 100644 --- a/test/core/end2end/fuzzers/BUILD +++ b/test/core/end2end/fuzzers/BUILD @@ -168,6 +168,25 @@ grpc_proto_fuzzer( ], ) +grpc_proto_fuzzer( + name = "server_fuzzer_chttp2_fake_creds", + srcs = ["server_fuzzer_chttp2_fake_creds.cc"], + corpus = "server_fuzzer_chttp2_fake_creds_corpus", + end2end_fuzzer = True, + language = "C++", + proto = None, + tags = [ + "no_mac", + "no_windows", + ], + uses_event_engine = False, + uses_polling = False, + deps = [ + ":server_fuzzer", + "//:grpc", + ], +) + grpc_proto_fuzzer( name = "server_fuzzer_chaotic_good", srcs = ["server_fuzzer_chaotic_good.cc"], @@ -187,3 +206,60 @@ grpc_proto_fuzzer( "//src/core:chaotic_good_server", ], ) + +grpc_cc_library( + name = "connector_fuzzer", + srcs = ["connector_fuzzer.cc"], + hdrs = ["connector_fuzzer.h"], + external_deps = ["absl/log:check"], + deps = [ + "fuzzer_input_proto", + "fuzzing_common", + "network_input", + "//:gpr", + "//:grpc", + "//src/core:channel_args", + "//test/core/event_engine/fuzzing_event_engine", + "//test/core/test_util:fuzz_config_vars", + "//test/core/test_util:grpc_test_util", + "//test/core/test_util:grpc_test_util_base", + ], +) + +grpc_proto_fuzzer( + name = "connector_fuzzer_chttp2", + srcs = ["connector_fuzzer_chttp2.cc"], + corpus = "connector_fuzzer_chttp2_corpus", + end2end_fuzzer = True, + language = "C++", + proto = None, + tags = [ + "no_mac", + "no_windows", + ], + uses_event_engine = False, + uses_polling = False, + deps = [ + ":connector_fuzzer", + "//:grpc", + ], +) + +grpc_proto_fuzzer( + name = "connector_fuzzer_chttp2_fakesec", + srcs = ["connector_fuzzer_chttp2_fakesec.cc"], + corpus = "connector_fuzzer_chttp2_fakesec_corpus", + end2end_fuzzer = True, + language = "C++", + proto = None, + tags = [ + "no_mac", + "no_windows", + ], + uses_event_engine = False, + uses_polling = False, + deps = [ + ":connector_fuzzer", + "//:grpc", + ], +) diff --git a/test/core/end2end/fuzzers/fuzzer_input.proto b/test/core/end2end/fuzzers/fuzzer_input.proto index 17d89f1e627b1..32b1c5d4436c8 100644 --- a/test/core/end2end/fuzzers/fuzzer_input.proto +++ b/test/core/end2end/fuzzers/fuzzer_input.proto @@ -172,6 +172,20 @@ message ChaoticGoodFrame { message ChaoticGoodSettings {} +message FakeTransportFrame { + enum MessageString { + CLIENT_INIT = 0; + SERVER_INIT = 1; + CLIENT_FINISHED = 2; + SERVER_FINISHED = 3; + } + + oneof payload { + bytes raw_bytes = 1; + MessageString message_string = 2; + } +} + message InputSegment { int32 delay_ms = 1; oneof payload { @@ -187,6 +201,7 @@ message InputSegment { H2ClientPrefix client_prefix = 11; uint32 repeated_zeros = 12; ChaoticGoodFrame chaotic_good = 13; + FakeTransportFrame fake_transport_frame = 14; } } @@ -204,10 +219,18 @@ message NetworkInput { } } +// Only for connector fuzzer, when to drop the connector +message ShutdownConnector { + int32 delay_ms = 1; + int32 shutdown_status = 2; + string shutdown_message = 3; +} + message Msg { repeated NetworkInput network_input = 1; repeated api_fuzzer.Action api_actions = 2; fuzzing_event_engine.Actions event_engine_actions = 3; grpc.testing.FuzzConfigVars config_vars = 4; grpc.testing.FuzzingChannelArgs channel_args = 5; + ShutdownConnector shutdown_connector = 6; } diff --git a/test/core/end2end/fuzzers/network_input.cc b/test/core/end2end/fuzzers/network_input.cc index 8aef97ea9c636..0afd8d1b95df5 100644 --- a/test/core/end2end/fuzzers/network_input.cc +++ b/test/core/end2end/fuzzers/network_input.cc @@ -267,6 +267,13 @@ SliceBuffer ChaoticGoodFrame(const fuzzer_input::ChaoticGoodFrame& frame) { return out; } +void store32_little_endian(uint32_t value, unsigned char* buf) { + buf[3] = static_cast((value >> 24) & 0xFF); + buf[2] = static_cast((value >> 16) & 0xFF); + buf[1] = static_cast((value >> 8) & 0xFF); + buf[0] = static_cast((value) & 0xFF); +} + grpc_slice SliceFromSegment(const fuzzer_input::InputSegment& segment) { switch (segment.payload_case()) { case fuzzer_input::InputSegment::kRawBytes: @@ -333,6 +340,38 @@ grpc_slice SliceFromSegment(const fuzzer_input::InputSegment& segment) { .JoinIntoSlice() .TakeCSlice(); } break; + case fuzzer_input::InputSegment::kFakeTransportFrame: { + auto generate = [](absl::string_view payload) { + uint32_t length = payload.length(); + std::vector bytes; + bytes.resize(4); + store32_little_endian(length + 4, bytes.data()); + for (auto c : payload) { + bytes.push_back(static_cast(c)); + } + return grpc_slice_from_copied_buffer( + reinterpret_cast(bytes.data()), bytes.size()); + }; + switch (segment.fake_transport_frame().payload_case()) { + case fuzzer_input::FakeTransportFrame::kRawBytes: + return generate(segment.fake_transport_frame().raw_bytes()); + case fuzzer_input::FakeTransportFrame::kMessageString: + switch (segment.fake_transport_frame().message_string()) { + default: + return generate("UNKNOWN"); + case fuzzer_input::FakeTransportFrame::CLIENT_INIT: + return generate("CLIENT_INIT"); + case fuzzer_input::FakeTransportFrame::SERVER_INIT: + return generate("SERVER_INIT"); + case fuzzer_input::FakeTransportFrame::CLIENT_FINISHED: + return generate("CLIENT_FINISHED"); + case fuzzer_input::FakeTransportFrame::SERVER_FINISHED: + return generate("SERVER_FINISHED"); + } + case fuzzer_input::FakeTransportFrame::PAYLOAD_NOT_SET: + return generate(""); + } + } case fuzzer_input::InputSegment::PAYLOAD_NOT_SET: break; } @@ -545,4 +584,15 @@ Duration ScheduleConnection( return delay; } +void ScheduleWrites( + const fuzzer_input::NetworkInput& network_input, + std::unique_ptr + endpoint, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine) { + auto schedule = MakeSchedule(network_input); + auto ep = std::shared_ptr(std::move(endpoint)); + ReadForever(ep); + ScheduleWritesForReads(ep, event_engine, std::move(schedule)); +} + } // namespace grpc_core diff --git a/test/core/end2end/fuzzers/network_input.h b/test/core/end2end/fuzzers/network_input.h index a0e72d434f03b..afb6490d81d71 100644 --- a/test/core/end2end/fuzzers/network_input.h +++ b/test/core/end2end/fuzzers/network_input.h @@ -30,6 +30,12 @@ Duration ScheduleReads( mock_endpoint_controller, grpc_event_engine::experimental::FuzzingEventEngine* event_engine); +void ScheduleWrites( + const fuzzer_input::NetworkInput& network_input, + std::unique_ptr + endpoint, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine); + Duration ScheduleConnection( const fuzzer_input::NetworkInput& network_input, grpc_event_engine::experimental::FuzzingEventEngine* event_engine, diff --git a/test/core/end2end/tests/cancel_after_client_done.cc b/test/core/end2end/tests/cancel_after_client_done.cc index d4a0f8d0ccfab..c1255ae758775 100644 --- a/test/core/end2end/tests/cancel_after_client_done.cc +++ b/test/core/end2end/tests/cancel_after_client_done.cc @@ -67,12 +67,10 @@ void CancelAfterClientDone( } CORE_END2END_TEST(CoreEnd2endTest, CancelAfterClientDone) { - SKIP_IF_V3(); CancelAfterClientDone(*this, std::make_unique()); } CORE_END2END_TEST(CoreDeadlineTest, DeadlineAfterClientDone) { - SKIP_IF_V3(); CancelAfterClientDone(*this, std::make_unique()); } diff --git a/test/core/end2end/tests/no_logging.cc b/test/core/end2end/tests/no_logging.cc index 467c6e3dec652..1ffb8116d8c19 100644 --- a/test/core/end2end/tests/no_logging.cc +++ b/test/core/end2end/tests/no_logging.cc @@ -22,6 +22,12 @@ #include #include +#include "absl/log/check.h" +#include "absl/log/globals.h" +#include "absl/log/log.h" +#include "absl/log/log_entry.h" +#include "absl/log/log_sink.h" +#include "absl/log/log_sink_registry.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" @@ -29,57 +35,78 @@ #include #include -#include #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/time.h" #include "test/core/end2end/end2end_tests.h" -void gpr_default_log(gpr_log_func_args* args); - namespace grpc_core { -// This test is currently broken. -// The whole test will be re-written as a part of gpr to absl log conversion. -class Verifier { + +class VerifyLogNoiseLogSink : public absl::LogSink { public: - Verifier() { - if (gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { - saved_severity_ = GPR_LOG_SEVERITY_DEBUG; - } else if (gpr_should_log(GPR_LOG_SEVERITY_INFO)) { - saved_severity_ = GPR_LOG_SEVERITY_INFO; - } else if (gpr_should_log(GPR_LOG_SEVERITY_ERROR)) { - saved_severity_ = GPR_LOG_SEVERITY_ERROR; - } else { - saved_severity_ = - static_cast(GPR_LOG_SEVERITY_ERROR + 1); - } - grpc_tracer_set_enabled("all", 0); - grpc_set_absl_verbosity_debug(); - // This is broken. Replace with an absl log sink. - gpr_set_log_function(DispatchLog); + explicit VerifyLogNoiseLogSink(const absl::LogSeverityAtLeast severity, + const int verbosity) + : log_noise_absent_(true) { + saved_absl_severity_ = absl::MinLogLevel(); + absl::SetMinLogLevel(severity); + // SetGlobalVLogLevel sets verbosity and returns previous verbosity. + saved_absl_verbosity_ = absl::SetGlobalVLogLevel(verbosity); + grpc_tracer_set_enabled("all", false); + absl::AddLogSink(this); } - ~Verifier() { - // This is broken. Replace with an absl log sink. - gpr_set_log_function(gpr_default_log); + + ~VerifyLogNoiseLogSink() override { + CHECK(log_noise_absent_) + << "Unwanted logs present. This will cause log noise. Either user a " + "tracer (example GRPC_TRACE_LOG or GRPC_TRACE_VLOG) or convert the " + "statement to VLOG(2)."; + // Reverse everything done in the constructor. + absl::RemoveLogSink(this); saved_trace_flags_.Restore(); - gpr_set_log_verbosity(saved_severity_); + absl::SetGlobalVLogLevel(saved_absl_verbosity_); + absl::SetMinLogLevel(saved_absl_severity_); } - Verifier(const Verifier&) = delete; - Verifier& operator=(const Verifier&) = delete; - void FailOnAnyLog() { g_log_func_.store(NoLog); } - void FailOnNonErrorLog() { g_log_func_.store(NoErrorLog); } + // This function is called each time LOG or VLOG is called. + void Send(const absl::LogEntry& entry) override { CheckForNoisyLogs(entry); } + + VerifyLogNoiseLogSink(const VerifyLogNoiseLogSink& other) = delete; + VerifyLogNoiseLogSink& operator=(const VerifyLogNoiseLogSink& other) = delete; private: - static void DispatchLog(gpr_log_func_args* args) { g_log_func_.load()(args); } + bool IsVlogWithVerbosityMoreThan1(const absl::LogEntry& entry) const { + return entry.log_severity() == absl::LogSeverity::kInfo && + entry.verbosity() >= 1; + } - static void NoLog(gpr_log_func_args* args) { + void CheckForNoisyLogs(const absl::LogEntry& entry) { + // TODO(tjagtap) : Add a hard upper limit on number of times each log should + // appear. We can keep this number slightly higher to avoid our tests + // becoming flaky. Right now all entries in this list get a free pass to log + // infinitely - That may create log noise issues in the future. + // + // This list is an allow list of all LOG(INFO), LOG(WARNING), and LOG(ERROR) + // logs which will appear. For now we have decided to allow these instances. + // We should be very conservative while adding new entries to this list, + // because this has potential to cause massive log noise. Several users are + // using INFO log level setting for production. static const auto* const allowed_logs_by_module = new std::map( {{"cq_verifier.cc", std::regex("^Verify .* for [0-9]+ms")}, {"chttp2_transport.cc", - std::regex("Sending goaway.*Channel Destroyed")}}); - absl::string_view filename = args->file; + std::regex("Sending goaway.*Channel Destroyed")}, + {"chaotic_good_server.cc", + std::regex("Failed to bind some addresses for.*")}, + {"log.cc", + std::regex("Prefer WARNING or ERROR. However if you see this " + "message in a debug environmenmt or test environmenmt " + "it is safe to ignore this message.")}}); + + if (IsVlogWithVerbosityMoreThan1(entry)) { + return; + } + + absl::string_view filename = entry.source_filename(); auto slash = filename.rfind('/'); if (slash != absl::string_view::npos) { filename = filename.substr(slash + 1); @@ -90,29 +117,23 @@ class Verifier { } auto it = allowed_logs_by_module->find(filename); if (it != allowed_logs_by_module->end() && - std::regex_search(args->message, it->second)) { - gpr_default_log(args); + std::regex_search(std::string(entry.text_message()), it->second)) { return; } - std::string message = absl::StrCat("Unwanted log: ", args->message); - args->message = message.c_str(); - gpr_default_log(args); - GTEST_FAIL(); - } - static void NoErrorLog(gpr_log_func_args* args) { - if (args->severity == GPR_LOG_SEVERITY_ERROR) { - NoLog(args); - } + // If we reach here means we have log noise. log_noise_absent_ will make the + // test fail. + log_noise_absent_ = false; + LOG(ERROR) << "Unwanted log at location : " << entry.source_filename() + << ":" << entry.source_line() << " " << entry.text_message(); } - gpr_log_severity saved_severity_; + absl::LogSeverityAtLeast saved_absl_severity_; + int saved_absl_verbosity_; SavedTraceFlags saved_trace_flags_; - static std::atomic g_log_func_; + bool log_noise_absent_; }; -std::atomic Verifier::g_log_func_(gpr_default_log); - void SimpleRequest(CoreEnd2endTest& test) { auto c = test.NewClientCall("/foo").Timeout(Duration::Seconds(5)).Create(); EXPECT_NE(c.GetPeer(), absl::nullopt); @@ -143,7 +164,7 @@ void SimpleRequest(CoreEnd2endTest& test) { } CORE_END2END_TEST(NoLoggingTest, NoLoggingTest) { -// This test makes sure that we dont get spammy logs when making an rpc +// This test makes sure that we don't get log noise when making an rpc // especially when rpcs are successful. // TODO(hork): remove when the listener flake is identified @@ -152,13 +173,10 @@ CORE_END2END_TEST(NoLoggingTest, NoLoggingTest) { GTEST_SKIP() << "not for windows + event engine listener"; } #endif - Verifier verifier; - verifier.FailOnNonErrorLog(); + VerifyLogNoiseLogSink nolog_verifier(absl::LogSeverityAtLeast::kInfo, 2); for (int i = 0; i < 10; i++) { SimpleRequest(*this); } - verifier.FailOnAnyLog(); - SimpleRequest(*this); } } // namespace grpc_core diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc index e67009b8a5bc3..4dec816f1e991 100644 --- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc +++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/event_engine/tcp_socket_utils.h" +#include "src/core/lib/gprpp/dump_args.h" #include "src/core/lib/gprpp/time.h" #include "src/core/lib/iomgr/port.h" #include "src/core/telemetry/stats.h" @@ -189,7 +191,15 @@ void FuzzingEventEngine::TickUntilIdle() { while (true) { { grpc_core::MutexLock lock(&*mu_); - if (tasks_by_id_.empty()) return; + LOG_EVERY_N_SEC(INFO, 5) + << "TickUntilIdle: " + << GRPC_DUMP_ARGS(tasks_by_id_.size(), outstanding_reads_.load(), + outstanding_writes_.load()); + if (tasks_by_id_.empty() && + outstanding_writes_.load(std::memory_order_relaxed) == 0 && + outstanding_reads_.load(std::memory_order_relaxed) == 0) { + return; + } } Tick(); } @@ -299,6 +309,9 @@ absl::Status FuzzingEventEngine::FuzzingListener::Start() { bool FuzzingEventEngine::EndpointMiddle::Write(SliceBuffer* data, int index) { CHECK(!closed[index]); const int peer_index = 1 - index; + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "WRITE[" << this << ":" << index << "]: entry " + << GRPC_DUMP_ARGS(data->Length()); if (data->Length() == 0) return true; size_t write_len = std::numeric_limits::max(); // Check the write_sizes queue for fuzzer imposed restrictions on this write @@ -315,12 +328,16 @@ bool FuzzingEventEngine::EndpointMiddle::Write(SliceBuffer* data, int index) { // byte. if (write_len == 0) write_len = 1; GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) - << "WRITE[" << this << ":" << index << "]: " << write_len << " bytes"; + << "WRITE[" << this << ":" << index << "]: " << write_len << " bytes; " + << GRPC_DUMP_ARGS(pending_read[peer_index].has_value()); // Expand the pending buffer. size_t prev_len = pending[index].size(); pending[index].resize(prev_len + write_len); // Move bytes from the to-write data into the pending buffer. data->MoveFirstNBytesIntoBuffer(write_len, pending[index].data() + prev_len); + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "WRITE[" << this << ":" << index << "]: post-move " + << GRPC_DUMP_ARGS(data->Length()); // If there was a pending read, then we can fulfill it. if (pending_read[peer_index].has_value()) { pending_read[peer_index]->buffer->Append( @@ -328,7 +345,11 @@ bool FuzzingEventEngine::EndpointMiddle::Write(SliceBuffer* data, int index) { pending[index].clear(); g_fuzzing_event_engine->RunLocked( RunType::kWrite, - [cb = std::move(pending_read[peer_index]->on_read)]() mutable { + [cb = std::move(pending_read[peer_index]->on_read), this, peer_index, + buffer = pending_read[peer_index]->buffer]() mutable { + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "FINISH_READ[" << this << ":" << peer_index + << "]: " << GRPC_DUMP_ARGS(buffer->Length()); cb(absl::OkStatus()); }); pending_read[peer_index].reset(); @@ -339,6 +360,10 @@ bool FuzzingEventEngine::EndpointMiddle::Write(SliceBuffer* data, int index) { bool FuzzingEventEngine::FuzzingEndpoint::Write( absl::AnyInvocable on_writable, SliceBuffer* data, const WriteArgs*) { + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "START_WRITE[" << middle_.get() << ":" << my_index() + << "]: " << data->Length() << " bytes"; + IoToken write_token(&g_fuzzing_event_engine->outstanding_writes_); grpc_core::global_stats().IncrementSyscallWrite(); grpc_core::MutexLock lock(&*mu_); CHECK(!middle_->closed[my_index()]); @@ -346,24 +371,38 @@ bool FuzzingEventEngine::FuzzingEndpoint::Write( // If the write succeeds immediately, then we return true. if (middle_->Write(data, my_index())) return true; middle_->writing[my_index()] = true; - ScheduleDelayedWrite(middle_, my_index(), std::move(on_writable), data); + ScheduleDelayedWrite(middle_, my_index(), std::move(on_writable), data, + std::move(write_token)); return false; } void FuzzingEventEngine::FuzzingEndpoint::ScheduleDelayedWrite( std::shared_ptr middle, int index, - absl::AnyInvocable on_writable, SliceBuffer* data) { + absl::AnyInvocable on_writable, SliceBuffer* data, + IoToken write_token) { g_fuzzing_event_engine->RunLocked( - RunType::kWrite, [middle = std::move(middle), index, data, - on_writable = std::move(on_writable)]() mutable { + RunType::kWrite, + [write_token = std::move(write_token), middle = std::move(middle), index, + data, on_writable = std::move(on_writable)]() mutable { grpc_core::ReleasableMutexLock lock(&*mu_); CHECK(middle->writing[index]); if (middle->closed[index]) { + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "CLOSED[" << middle.get() << ":" << index << "]"; g_fuzzing_event_engine->RunLocked( RunType::kRunAfter, [on_writable = std::move(on_writable)]() mutable { on_writable(absl::InternalError("Endpoint closed")); }); + if (middle->pending_read[1 - index].has_value()) { + g_fuzzing_event_engine->RunLocked( + RunType::kRunAfter, + [cb = std::move( + middle->pending_read[1 - index]->on_read)]() mutable { + cb(absl::InternalError("Endpoint closed")); + }); + middle->pending_read[1 - index].reset(); + } return; } if (middle->Write(data, index)) { @@ -373,14 +412,23 @@ void FuzzingEventEngine::FuzzingEndpoint::ScheduleDelayedWrite( return; } ScheduleDelayedWrite(std::move(middle), index, std::move(on_writable), - data); + data, std::move(write_token)); }); } FuzzingEventEngine::FuzzingEndpoint::~FuzzingEndpoint() { grpc_core::MutexLock lock(&*mu_); + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "CLOSE[" << middle_.get() << ":" << my_index() << "]: " + << GRPC_DUMP_ARGS( + middle_->closed[my_index()], middle_->closed[peer_index()], + middle_->pending_read[my_index()].has_value(), + middle_->pending_read[peer_index()].has_value(), + middle_->writing[my_index()], middle_->writing[peer_index()]); middle_->closed[my_index()] = true; if (middle_->pending_read[my_index()].has_value()) { + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "CLOSED_READING[" << middle_.get() << ":" << my_index() << "]"; g_fuzzing_event_engine->RunLocked( RunType::kRunAfter, [cb = std::move(middle_->pending_read[my_index()]->on_read)]() mutable { @@ -388,7 +436,7 @@ FuzzingEventEngine::FuzzingEndpoint::~FuzzingEndpoint() { }); middle_->pending_read[my_index()].reset(); } - if (!middle_->writing[peer_index()] && + if (!middle_->writing[my_index()] && middle_->pending_read[peer_index()].has_value()) { g_fuzzing_event_engine->RunLocked( RunType::kRunAfter, @@ -403,20 +451,25 @@ FuzzingEventEngine::FuzzingEndpoint::~FuzzingEndpoint() { bool FuzzingEventEngine::FuzzingEndpoint::Read( absl::AnyInvocable on_read, SliceBuffer* buffer, const ReadArgs*) { + GRPC_TRACE_LOG(fuzzing_ee_writes, INFO) + << "START_READ[" << middle_.get() << ":" << my_index() << "]"; buffer->Clear(); + IoToken read_token(&g_fuzzing_event_engine->outstanding_reads_); grpc_core::MutexLock lock(&*mu_); CHECK(!middle_->closed[my_index()]); if (middle_->pending[peer_index()].empty()) { // If the endpoint is closed, fail asynchronously. if (middle_->closed[peer_index()]) { g_fuzzing_event_engine->RunLocked( - RunType::kRunAfter, [on_read = std::move(on_read)]() mutable { + RunType::kRunAfter, + [read_token, on_read = std::move(on_read)]() mutable { on_read(absl::InternalError("Endpoint closed")); }); return false; } // If the endpoint has no pending data, then we need to wait for a write. - middle_->pending_read[my_index()] = PendingRead{std::move(on_read), buffer}; + middle_->pending_read[my_index()] = + PendingRead{std::move(read_token), std::move(on_read), buffer}; return false; } else { // If the endpoint has pending data, then we can fulfill the read diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h index f28cdca525165..93aa42c356333 100644 --- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h +++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h @@ -17,6 +17,7 @@ #include +#include #include #include #include @@ -124,6 +125,36 @@ class FuzzingEventEngine : public EventEngine { } private: + class IoToken { + public: + IoToken() : refs_(nullptr) {} + explicit IoToken(std::atomic* refs) : refs_(refs) { + refs_->fetch_add(1, std::memory_order_relaxed); + } + ~IoToken() { + if (refs_ != nullptr) refs_->fetch_sub(1, std::memory_order_relaxed); + } + IoToken(const IoToken& other) : refs_(other.refs_) { + if (refs_ != nullptr) refs_->fetch_add(1, std::memory_order_relaxed); + } + IoToken& operator=(const IoToken& other) { + IoToken copy(other); + Swap(copy); + return *this; + } + IoToken(IoToken&& other) noexcept + : refs_(std::exchange(other.refs_, nullptr)) {} + IoToken& operator=(IoToken&& other) noexcept { + if (refs_ != nullptr) refs_->fetch_sub(1, std::memory_order_relaxed); + refs_ = std::exchange(other.refs_, nullptr); + return *this; + } + void Swap(IoToken& other) { std::swap(refs_, other.refs_); } + + private: + std::atomic* refs_; + }; + enum class RunType { kWrite, kRunAfter, @@ -183,6 +214,8 @@ class FuzzingEventEngine : public EventEngine { // One read that's outstanding. struct PendingRead { + // The associated io token + IoToken io_token; // Callback to invoke when the read completes. absl::AnyInvocable on_read; // The buffer to read into. @@ -243,8 +276,8 @@ class FuzzingEventEngine : public EventEngine { // endpoint shutdown, it's believed this is a legal implementation. static void ScheduleDelayedWrite( std::shared_ptr middle, int index, - absl::AnyInvocable on_writable, SliceBuffer* data) - ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + absl::AnyInvocable on_writable, SliceBuffer* data, + IoToken write_token) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); const std::shared_ptr middle_; const int index_; }; @@ -299,6 +332,8 @@ class FuzzingEventEngine : public EventEngine { std::queue> write_sizes_for_future_connections_ ABSL_GUARDED_BY(mu_); grpc_pick_port_functions previous_pick_port_functions_; + std::atomic outstanding_writes_{0}; + std::atomic outstanding_reads_{0}; grpc_core::Mutex run_after_duration_callback_mu_; absl::AnyInvocable run_after_duration_callback_ diff --git a/test/core/filters/bm_http_client_filter.cc b/test/core/filters/bm_http_client_filter.cc index 77a075e36c559..967af7ab6a424 100644 --- a/test/core/filters/bm_http_client_filter.cc +++ b/test/core/filters/bm_http_client_filter.cc @@ -34,17 +34,17 @@ class HttpClientFilterTraits { ChannelArgs MakeChannelArgs() { return ChannelArgs().SetObject(&transport_); } ClientMetadataHandle MakeClientInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpStatusMetadata(), 200); return md; } diff --git a/test/core/load_balancing/BUILD b/test/core/load_balancing/BUILD index 00464d63e971c..2c1db10851f7a 100644 --- a/test/core/load_balancing/BUILD +++ b/test/core/load_balancing/BUILD @@ -266,3 +266,17 @@ grpc_cc_test( "//test/core/test_util:grpc_test_util", ], ) + +grpc_cc_benchmark( + name = "bm_picker", + srcs = ["bm_picker.cc"], + external_deps = [ + "absl/strings", + ], + deps = [ + "//:config", + "//:grpc", + "//src/core:lb_policy", + "//test/core/test_util:build", + ], +) diff --git a/test/core/promise/party_test.cc b/test/core/promise/party_test.cc index 110377d498283..5695abffe0947 100644 --- a/test/core/promise/party_test.cc +++ b/test/core/promise/party_test.cc @@ -48,187 +48,6 @@ namespace grpc_core { -/////////////////////////////////////////////////////////////////////////////// -// PartySyncTest - -template -class PartySyncTest : public ::testing::Test {}; - -// PartySyncUsingMutex isn't working on Mac, but we don't use it for anything -// right now so that's fine. -#ifdef GPR_APPLE -using PartySyncTypes = ::testing::Types; -#else -using PartySyncTypes = - ::testing::Types; -#endif -TYPED_TEST_SUITE(PartySyncTest, PartySyncTypes); - -TYPED_TEST(PartySyncTest, NoOp) { TypeParam sync(1); } - -TYPED_TEST(PartySyncTest, RefAndUnref) { - Notification half_way; - TypeParam sync(1); - std::thread thread1([&] { - for (int i = 0; i < 1000000; i++) { - sync.IncrementRefCount(); - } - half_way.Notify(); - for (int i = 0; i < 1000000; i++) { - sync.IncrementRefCount(); - } - for (int i = 0; i < 2000000; i++) { - EXPECT_FALSE(sync.Unref()); - } - }); - half_way.WaitForNotification(); - for (int i = 0; i < 2000000; i++) { - sync.IncrementRefCount(); - } - for (int i = 0; i < 2000000; i++) { - EXPECT_FALSE(sync.Unref()); - } - thread1.join(); - EXPECT_TRUE(sync.Unref()); -} - -TYPED_TEST(PartySyncTest, AddAndRemoveParticipant) { - TypeParam sync(1); - std::vector threads; - std::atomic*> participants[party_detail::kMaxParticipants] = - {}; - threads.reserve(8); - for (int i = 0; i < 8; i++) { - threads.emplace_back([&] { - for (int i = 0; i < 100000; i++) { - auto done = std::make_unique>(false); - int slot = -1; - bool run = sync.AddParticipantsAndRef(1, [&](size_t* idxs) { - slot = idxs[0]; - participants[slot].store(done.get(), std::memory_order_release); - }); - EXPECT_NE(slot, -1); - if (run) { - bool run_any = false; - bool run_me = false; - EXPECT_FALSE(sync.RunParty([&](int slot) { - run_any = true; - std::atomic* participant = - participants[slot].exchange(nullptr, std::memory_order_acquire); - if (participant == done.get()) run_me = true; - if (participant == nullptr) { - LOG(ERROR) << "Participant was null (spurious wakeup observed)"; - return false; - } - participant->store(true, std::memory_order_release); - return true; - })); - EXPECT_TRUE(run_any); - EXPECT_TRUE(run_me); - } - EXPECT_FALSE(sync.Unref()); - while (!done->load(std::memory_order_acquire)) { - } - } - }); - } - for (auto& thread : threads) { - thread.join(); - } - EXPECT_TRUE(sync.Unref()); -} - -TYPED_TEST(PartySyncTest, AddAndRemoveTwoParticipants) { - TypeParam sync(1); - std::vector threads; - std::atomic*> participants[party_detail::kMaxParticipants] = - {}; - threads.reserve(8); - for (int i = 0; i < 4; i++) { - threads.emplace_back([&] { - for (int i = 0; i < 100000; i++) { - auto done = std::make_unique>(2); - int slots[2] = {-1, -1}; - bool run = sync.AddParticipantsAndRef(2, [&](size_t* idxs) { - for (int i = 0; i < 2; i++) { - slots[i] = idxs[i]; - participants[slots[i]].store(done.get(), std::memory_order_release); - } - }); - EXPECT_NE(slots[0], -1); - EXPECT_NE(slots[1], -1); - EXPECT_GT(slots[1], slots[0]); - if (run) { - bool run_any = false; - int run_me = 0; - EXPECT_FALSE(sync.RunParty([&](int slot) { - run_any = true; - std::atomic* participant = - participants[slot].exchange(nullptr, std::memory_order_acquire); - if (participant == done.get()) run_me++; - if (participant == nullptr) { - LOG(ERROR) << "Participant was null (spurious wakeup observed)"; - return false; - } - participant->fetch_sub(1, std::memory_order_release); - return true; - })); - EXPECT_TRUE(run_any); - EXPECT_EQ(run_me, 2); - } - EXPECT_FALSE(sync.Unref()); - while (done->load(std::memory_order_acquire) != 0) { - } - } - }); - } - for (auto& thread : threads) { - thread.join(); - } - EXPECT_TRUE(sync.Unref()); -} - -TYPED_TEST(PartySyncTest, UnrefWhileRunning) { - std::vector trials; - std::atomic delete_paths_taken[3] = {{0}, {0}, {0}}; - trials.reserve(100); - for (int i = 0; i < 100; i++) { - trials.emplace_back([&delete_paths_taken] { - TypeParam sync(1); - int delete_path = -1; - EXPECT_TRUE(sync.AddParticipantsAndRef( - 1, [](size_t* slots) { EXPECT_EQ(slots[0], 0); })); - std::thread run_party([&] { - if (sync.RunParty([&sync, n = 0](int slot) mutable { - EXPECT_EQ(slot, 0); - ++n; - if (n < 10) { - sync.ForceImmediateRepoll(1); - return false; - } - return true; - })) { - delete_path = 0; - } - }); - std::thread unref([&] { - if (sync.Unref()) delete_path = 1; - }); - if (sync.Unref()) delete_path = 2; - run_party.join(); - unref.join(); - EXPECT_GE(delete_path, 0); - delete_paths_taken[delete_path].fetch_add(1, std::memory_order_relaxed); - }); - } - for (auto& trial : trials) { - trial.join(); - } - fprintf(stderr, "DELETE_PATHS: RunParty:%d AsyncUnref:%d SyncUnref:%d\n", - delete_paths_taken[0].load(), delete_paths_taken[1].load(), - delete_paths_taken[2].load()); -} - /////////////////////////////////////////////////////////////////////////////// // PartyTest @@ -704,6 +523,7 @@ TEST_F(PartyTest, NestedWakeup) { auto party2 = MakeParty(); auto party3 = MakeParty(); int whats_going_on = 0; + Notification done1; Notification started2; Notification done2; Notification started3; @@ -716,6 +536,7 @@ TEST_F(PartyTest, NestedWakeup) { party2->Spawn( "p2", [&]() { + done1.WaitForNotification(); started2.Notify(); started3.WaitForNotification(); EXPECT_EQ(whats_going_on, 3); @@ -749,6 +570,7 @@ TEST_F(PartyTest, NestedWakeup) { [&](Empty) { EXPECT_EQ(whats_going_on, 2); whats_going_on = 3; + done1.Notify(); }); notify_done.WaitForNotification(); } diff --git a/test/core/resource_quota/periodic_update_test.cc b/test/core/resource_quota/periodic_update_test.cc index 0918575d971e1..90d98913693a5 100644 --- a/test/core/resource_quota/periodic_update_test.cc +++ b/test/core/resource_quota/periodic_update_test.cc @@ -78,35 +78,7 @@ TEST(PeriodicUpdateTest, SimpleTest) { } } -TEST(PeriodicUpdateTest, NoSpin) { - // Ensure that we do not poll the time every update... even initially - class NowCounter final : public Timestamp::ScopedSource { - public: - Timestamp Now() override { - ++n_; - return previous()->Now(); - } - - int now_calls() const { return n_; } - - private: - int n_ = 0; - }; - NowCounter counter; - PeriodicUpdate upd(Duration::Seconds(5)); - while (!upd.Tick([](Duration d) { EXPECT_GE(d, Duration::Seconds(5)); })) { - } - const int initial_now_calls = counter.now_calls(); - EXPECT_GT(initial_now_calls, 2); - EXPECT_LT(initial_now_calls, 100); - while (!upd.Tick([](Duration d) { EXPECT_GE(d, Duration::Seconds(5)); })) { - } - const int second_round_calls = counter.now_calls() - initial_now_calls; - EXPECT_GE(second_round_calls, 1); - EXPECT_LE(second_round_calls, initial_now_calls); -} - -TEST(PeriodicUpdateTest, ThreadTest) { +TEST(PeriodicUpdate, ThreadTest) { std::unique_ptr upd; std::atomic count(0); Timestamp start; diff --git a/test/core/surface/channel_init_test.cc b/test/core/surface/channel_init_test.cc index bc67252472e96..29eadfed9a499 100644 --- a/test/core/surface/channel_init_test.cc +++ b/test/core/surface/channel_init_test.cc @@ -338,8 +338,8 @@ TEST(ChannelInitTest, CanCreateFilterWithCall) { auto arena = allocator->MakeArena(); arena->SetContext( event_engine.get()); - auto call = - MakeCallPair(Arena::MakePooled(), std::move(arena)); + auto call = MakeCallPair(Arena::MakePooledForOverwrite(), + std::move(arena)); (*stack)->StartCall(std::move(call.handler)); EXPECT_EQ(p, 1); EXPECT_EQ(handled, 1); diff --git a/test/core/test_util/fake_stats_plugin.h b/test/core/test_util/fake_stats_plugin.h index 2e53925b04aac..07724c4c530dd 100644 --- a/test/core/test_util/fake_stats_plugin.h +++ b/test/core/test_util/fake_stats_plugin.h @@ -225,8 +225,8 @@ class FakeStatsPlugin : public StatsPlugin { descriptor) { if (!use_disabled_by_default_metrics && !descriptor.enable_by_default) { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]: skipping disabled metric: " << descriptor.name; + VLOG(2) << "FakeStatsPlugin[" << this + << "]: skipping disabled metric: " << descriptor.name; return; } switch (descriptor.instrument_type) { @@ -300,12 +300,11 @@ class FakeStatsPlugin : public StatsPlugin { // just ignore it here. This would also prevent us from having to lock the // GlobalInstrumentsRegistry everytime a metric is recorded. But this is not // a concern for now. - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::AddCounter(index=" << handle.index << ", value=(uint64)" - << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::AddCounter(index=" << handle.index << ", value=(uint64)" + << value << ", label_values={" << absl::StrJoin(label_values, ", ") + << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&mu_); auto iter = uint64_counters_.find(handle.index); if (iter == uint64_counters_.end()) return; @@ -315,12 +314,11 @@ class FakeStatsPlugin : public StatsPlugin { GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, double value, absl::Span label_values, absl::Span optional_values) override { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::AddCounter(index=" << handle.index - << ", value(double)=" << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::AddCounter(index=" << handle.index + << ", value(double)=" << value << ", label_values={" + << absl::StrJoin(label_values, ", ") << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&mu_); auto iter = double_counters_.find(handle.index); if (iter == double_counters_.end()) return; @@ -330,12 +328,11 @@ class FakeStatsPlugin : public StatsPlugin { GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, uint64_t value, absl::Span label_values, absl::Span optional_values) override { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::RecordHistogram(index=" << handle.index - << ", value=(uint64)" << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::RecordHistogram(index=" << handle.index << ", value=(uint64)" + << value << ", label_values={" << absl::StrJoin(label_values, ", ") + << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&mu_); auto iter = uint64_histograms_.find(handle.index); if (iter == uint64_histograms_.end()) return; @@ -345,25 +342,24 @@ class FakeStatsPlugin : public StatsPlugin { GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, double value, absl::Span label_values, absl::Span optional_values) override { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::RecordHistogram(index=" << handle.index - << ", value=(double)" << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::RecordHistogram(index=" << handle.index << ", value=(double)" + << value << ", label_values={" << absl::StrJoin(label_values, ", ") + << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&mu_); auto iter = double_histograms_.find(handle.index); if (iter == double_histograms_.end()) return; iter->second.Record(value, label_values, optional_values); } void AddCallback(RegisteredMetricCallback* callback) override { - LOG(INFO) << "FakeStatsPlugin[" << this << "]::AddCallback(" << callback - << ")"; + VLOG(2) << "FakeStatsPlugin[" << this << "]::AddCallback(" << callback + << ")"; callbacks_.insert(callback); } void RemoveCallback(RegisteredMetricCallback* callback) override { - LOG(INFO) << "FakeStatsPlugin[" << this << "]::RemoveCallback(" << callback - << ")"; + VLOG(2) << "FakeStatsPlugin[" << this << "]::RemoveCallback(" << callback + << ")"; callbacks_.erase(callback); } @@ -428,12 +424,12 @@ class FakeStatsPlugin : public StatsPlugin { return iter->second.GetValues(label_values, optional_values); } void TriggerCallbacks() { - LOG(INFO) << "FakeStatsPlugin[" << this << "]::TriggerCallbacks(): START"; + VLOG(2) << "FakeStatsPlugin[" << this << "]::TriggerCallbacks(): START"; Reporter reporter(*this); for (auto* callback : callbacks_) { callback->Run(reporter); } - LOG(INFO) << "FakeStatsPlugin[" << this << "]::TriggerCallbacks(): END"; + VLOG(2) << "FakeStatsPlugin[" << this << "]::TriggerCallbacks(): END"; } absl::optional GetInt64CallbackGaugeValue( GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, @@ -467,12 +463,12 @@ class FakeStatsPlugin : public StatsPlugin { GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, int64_t value, absl::Span label_values, absl::Span optional_values) override { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::Reporter::Report(index=" << handle.index - << ", value=(int64_t)" << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::Reporter::Report(index=" << handle.index + << ", value=(int64_t)" << value << ", label_values={" + << absl::StrJoin(label_values, ", ") + << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&plugin_.callback_mu_); auto iter = plugin_.int64_callback_gauges_.find(handle.index); if (iter == plugin_.int64_callback_gauges_.end()) return; @@ -483,12 +479,12 @@ class FakeStatsPlugin : public StatsPlugin { GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, double value, absl::Span label_values, absl::Span optional_values) override { - LOG(INFO) << "FakeStatsPlugin[" << this - << "]::Reporter::Report(index=" << handle.index - << ", value=(double)" << value << ", label_values={" - << absl::StrJoin(label_values, ", ") - << "}, optional_label_values={" - << absl::StrJoin(optional_values, ", ") << "}"; + VLOG(2) << "FakeStatsPlugin[" << this + << "]::Reporter::Report(index=" << handle.index + << ", value=(double)" << value << ", label_values={" + << absl::StrJoin(label_values, ", ") + << "}, optional_label_values={" + << absl::StrJoin(optional_values, ", ") << "}"; MutexLock lock(&plugin_.callback_mu_); auto iter = plugin_.double_callback_gauges_.find(handle.index); if (iter == plugin_.double_callback_gauges_.end()) return; diff --git a/test/core/transport/BUILD b/test/core/transport/BUILD index eed6ac82826e1..c70386aedccbd 100644 --- a/test/core/transport/BUILD +++ b/test/core/transport/BUILD @@ -250,3 +250,13 @@ grpc_cc_benchmark( "//src/core:default_event_engine", ], ) + +grpc_cc_benchmark( + name = "bm_metadata", + srcs = ["bm_metadata.cc"], + deps = [ + ":call_spine_benchmarks", + "//:grpc", + "//src/core:default_event_engine", + ], +) diff --git a/test/core/transport/benchmarks/bm_chaotic_good.cc b/test/core/transport/benchmarks/bm_chaotic_good.cc index b5330694b8b8e..362693429d647 100644 --- a/test/core/transport/benchmarks/bm_chaotic_good.cc +++ b/test/core/transport/benchmarks/bm_chaotic_good.cc @@ -54,19 +54,19 @@ class ChaoticGoodTraits { } ClientMetadataHandle MakeClientInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), kTestPath.Copy()); return md; } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); return md; } }; diff --git a/test/core/transport/benchmarks/bm_inproc.cc b/test/core/transport/benchmarks/bm_inproc.cc index d9de9ac3679a9..f7725628f45e7 100644 --- a/test/core/transport/benchmarks/bm_inproc.cc +++ b/test/core/transport/benchmarks/bm_inproc.cc @@ -44,19 +44,19 @@ class InprocTraits { } ClientMetadataHandle MakeClientInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), kTestPath.Copy()); return md; } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); return md; } }; diff --git a/test/core/transport/bm_call_spine.cc b/test/core/transport/bm_call_spine.cc index 2fee9e9e8e442..7a757a5d733d2 100644 --- a/test/core/transport/bm_call_spine.cc +++ b/test/core/transport/bm_call_spine.cc @@ -28,19 +28,19 @@ class CallSpineFixture { auto arena = arena_allocator_->MakeArena(); arena->SetContext( event_engine_.get()); - auto p = - MakeCallPair(Arena::MakePooled(), std::move(arena)); + auto p = MakeCallPair(Arena::MakePooledForOverwrite(), + std::move(arena)); return {std::move(p.initiator), p.handler.StartCall()}; } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } private: @@ -63,10 +63,10 @@ class ForwardCallFixture { event_engine_.get()); arena2->SetContext( event_engine_.get()); - auto p1 = - MakeCallPair(Arena::MakePooled(), std::move(arena1)); - auto p2 = - MakeCallPair(Arena::MakePooled(), std::move(arena2)); + auto p1 = MakeCallPair(Arena::MakePooledForOverwrite(), + std::move(arena1)); + auto p2 = MakeCallPair(Arena::MakePooledForOverwrite(), + std::move(arena2)); p1.handler.SpawnInfallible("initial_metadata", [&]() { auto p1_handler = p1.handler.StartCall(); return Map( @@ -86,13 +86,13 @@ class ForwardCallFixture { } ServerMetadataHandle MakeServerInitialMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } MessageHandle MakePayload() { return Arena::MakePooled(); } ServerMetadataHandle MakeServerTrailingMetadata() { - return Arena::MakePooled(); + return Arena::MakePooledForOverwrite(); } private: diff --git a/test/core/transport/call_filters_test.cc b/test/core/transport/call_filters_test.cc index 922f2aea79054..77973df2c48a2 100644 --- a/test/core/transport/call_filters_test.cc +++ b/test/core/transport/call_filters_test.cc @@ -329,7 +329,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningVoid) { EXPECT_EQ(d.client_initial_metadata.ops[0].poll, nullptr); EXPECT_EQ(d.client_initial_metadata.ops[0].early_destroy, nullptr); // Check promise init - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); char call_data; auto r = d.client_initial_metadata.ops[0].promise_init( @@ -364,7 +364,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningVoidTakingChannelPtr) { EXPECT_EQ(d.client_initial_metadata.ops[0].poll, nullptr); EXPECT_EQ(d.client_initial_metadata.ops[0].early_destroy, nullptr); // Check promise init - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); char call_data; auto r = d.client_initial_metadata.ops[0].promise_init( @@ -409,7 +409,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningAbslStatus) { void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -420,7 +420,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningAbslStatus) { EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( nullptr, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -467,7 +467,7 @@ TEST(StackDataTest, void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -478,7 +478,7 @@ TEST(StackDataTest, EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( nullptr, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -498,7 +498,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningServerMetadata) { md.Set(HttpPathMetadata(), Slice::FromStaticString("hello")); bool first = std::exchange(first_, false); return first ? nullptr - : ServerMetadataFromStatus(absl::CancelledError()); + : ServerMetadataFromStatus(GRPC_STATUS_CANCELLED); } private: @@ -524,7 +524,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningServerMetadata) { void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -535,7 +535,7 @@ TEST(StackDataTest, InstantClientInitialMetadataReturningServerMetadata) { EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( nullptr, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -557,7 +557,7 @@ TEST(StackDataTest, const bool first = std::exchange(first_, false); p->v.push_back(first ? 11 : 22); return first ? nullptr - : ServerMetadataFromStatus(absl::CancelledError()); + : ServerMetadataFromStatus(GRPC_STATUS_CANCELLED); } private: @@ -584,7 +584,7 @@ TEST(StackDataTest, void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -595,7 +595,7 @@ TEST(StackDataTest, EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( nullptr, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -642,7 +642,7 @@ TEST(StackDataTest, PromiseClientInitialMetadataReturningAbslStatus) { void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -660,7 +660,7 @@ TEST(StackDataTest, PromiseClientInitialMetadataReturningAbslStatus) { EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( promise_data, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -673,7 +673,7 @@ TEST(StackDataTest, PromiseClientInitialMetadataReturningAbslStatus) { EXPECT_EQ(r.value().ok, nullptr); EXPECT_EQ(r.value().error->get(GrpcStatusMetadata()), GRPC_STATUS_CANCELLED); // A cancelled call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( promise_data, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -723,7 +723,7 @@ TEST(StackDataTest, void* call_data = gpr_malloc_aligned(d.call_data_size, d.call_data_alignment); d.filter_constructor[0].call_init(call_data, &f1); auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); promise_detail::Context ctx(arena.get()); // A succeeding call EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); @@ -741,7 +741,7 @@ TEST(StackDataTest, EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "hello"); // A failing call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( promise_data, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -754,7 +754,7 @@ TEST(StackDataTest, EXPECT_EQ(r.value().ok, nullptr); EXPECT_EQ(r.value().error->get(GrpcStatusMetadata()), GRPC_STATUS_CANCELLED); // A cancelled call - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = d.client_initial_metadata.ops[0].promise_init( promise_data, call_data, d.client_initial_metadata.ops[0].channel_data, @@ -791,7 +791,7 @@ TEST(StackDataTest, InstantServerInitialMetadataReturningVoid) { EXPECT_EQ(d.server_initial_metadata.ops[0].early_destroy, nullptr); // Check promise init auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); char call_data; auto r = d.server_initial_metadata.ops[0].promise_init( @@ -889,7 +889,7 @@ TEST(StackDataTest, ServerTrailingMetadataReturningVoid) { EXPECT_EQ(d.server_trailing_metadata[0].channel_data, &f1); // Check operation auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); char call_data; auto r = d.server_trailing_metadata[0].server_trailing_metadata( @@ -920,7 +920,7 @@ TEST(StackDataTest, ServerTrailingMetadataReturningVoidTakingChannelPtr) { EXPECT_EQ(d.server_trailing_metadata[0].channel_data, &f1); // Check operation auto arena = SimpleArenaAllocator()->MakeArena(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); char call_data; auto r = d.server_trailing_metadata[0].server_trailing_metadata( @@ -1007,7 +1007,7 @@ TEST(OperationExecutorTest, InstantTwo) { auto arena = SimpleArenaAllocator()->MakeArena(); promise_detail::Context ctx(arena.get()); // First call succeeds - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); auto r = transformer.Start(&d.client_initial_metadata, std::move(md), call_data1); @@ -1015,7 +1015,7 @@ TEST(OperationExecutorTest, InstantTwo) { EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "world"); // Second fails - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = transformer.Start(&d.client_initial_metadata, std::move(md), call_data1); EXPECT_TRUE(r.ready()); @@ -1070,7 +1070,7 @@ TEST(OperationExecutorTest, PromiseTwo) { auto arena = SimpleArenaAllocator()->MakeArena(); promise_detail::Context ctx(arena.get()); // First call succeeds after two sets of two step delays. - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); auto r = transformer.Start(&d.client_initial_metadata, std::move(md), call_data1); @@ -1086,7 +1086,7 @@ TEST(OperationExecutorTest, PromiseTwo) { EXPECT_EQ(r.value().ok->get_pointer(HttpPathMetadata())->as_string_view(), "world"); // Second fails after one set of two step delays. - md = Arena::MakePooled(); + md = Arena::MakePooledForOverwrite(); EXPECT_EQ(md->get_pointer(HttpPathMetadata()), nullptr); r = transformer.Start(&d.client_initial_metadata, std::move(md), call_data1); EXPECT_FALSE(r.ready()); @@ -1161,7 +1161,7 @@ TEST(CallFiltersTest, UnaryCall) { builder.Add(&f1); builder.Add(&f2); auto arena = SimpleArenaAllocator()->MakeArena(); - CallFilters filters(Arena::MakePooled()); + CallFilters filters(Arena::MakePooledForOverwrite()); filters.AddStack(builder.Build()); filters.Start(); promise_detail::Context ctx(arena.get()); @@ -1182,7 +1182,8 @@ TEST(CallFiltersTest, UnaryCall) { // Push should be done EXPECT_THAT(push_client_to_server_message(), IsReady(Success{})); // Push server initial metadata - filters.PushServerInitialMetadata(Arena::MakePooled()); + filters.PushServerInitialMetadata( + Arena::MakePooledForOverwrite()); auto pull_server_initial_metadata = filters.PullServerInitialMetadata(); // Pull server initial metadata EXPECT_THAT(pull_server_initial_metadata(), IsReady()); @@ -1198,7 +1199,8 @@ TEST(CallFiltersTest, UnaryCall) { // Push should be done EXPECT_THAT(push_server_to_client_message(), IsReady(Success{})); // Push server trailing metadata - filters.PushServerTrailingMetadata(Arena::MakePooled()); + filters.PushServerTrailingMetadata( + Arena::MakePooledForOverwrite()); // Pull server trailing metadata auto pull_server_trailing_metadata = filters.PullServerTrailingMetadata(); // Should be done @@ -1253,7 +1255,7 @@ TEST(CallFiltersTest, UnaryCallWithMultiStack) { builder1.Add(&f1); builder2.Add(&f2); auto arena = SimpleArenaAllocator()->MakeArena(); - CallFilters filters(Arena::MakePooled()); + CallFilters filters(Arena::MakePooledForOverwrite()); filters.AddStack(builder1.Build()); filters.AddStack(builder2.Build()); filters.Start(); @@ -1275,7 +1277,8 @@ TEST(CallFiltersTest, UnaryCallWithMultiStack) { // Push should be done EXPECT_THAT(push_client_to_server_message(), IsReady(Success{})); // Push server initial metadata - filters.PushServerInitialMetadata(Arena::MakePooled()); + filters.PushServerInitialMetadata( + Arena::MakePooledForOverwrite()); auto pull_server_initial_metadata = filters.PullServerInitialMetadata(); // Pull server initial metadata EXPECT_THAT(pull_server_initial_metadata(), IsReady()); @@ -1291,7 +1294,8 @@ TEST(CallFiltersTest, UnaryCallWithMultiStack) { // Push should be done EXPECT_THAT(push_server_to_client_message(), IsReady(Success{})); // Push server trailing metadata - filters.PushServerTrailingMetadata(Arena::MakePooled()); + filters.PushServerTrailingMetadata( + Arena::MakePooledForOverwrite()); // Pull server trailing metadata auto pull_server_trailing_metadata = filters.PullServerTrailingMetadata(); // Should be done diff --git a/test/core/transport/call_spine_benchmarks.h b/test/core/transport/call_spine_benchmarks.h index 9c09ef95f87ae..ebdf7c1888448 100644 --- a/test/core/transport/call_spine_benchmarks.h +++ b/test/core/transport/call_spine_benchmarks.h @@ -227,7 +227,7 @@ void BM_ClientToServerStreaming(benchmark::State& state) { }); call.handler.SpawnInfallible("done", [handler = call.handler]() mutable { handler.PushServerTrailingMetadata( - CancelledServerMetadataFromStatus(absl::CancelledError())); + CancelledServerMetadataFromStatus(GRPC_STATUS_CANCELLED)); return Empty{}; }); } @@ -288,7 +288,10 @@ class UnstartedCallDestinationFixture { event_engine_.get()); auto p = MakeCallPair(traits_->MakeClientInitialMetadata(), std::move(arena)); - top_destination_->StartCall(std::move(p.handler)); + p.handler.SpawnInfallible("initiator_setup", [&]() { + top_destination_->StartCall(std::move(p.handler)); + return Empty{}; + }); auto handler = bottom_destination_->TakeHandler(); absl::optional started_handler; Notification started; diff --git a/test/core/transport/call_spine_test.cc b/test/core/transport/call_spine_test.cc index f98f0c84ceb78..b5807e28ec701 100644 --- a/test/core/transport/call_spine_test.cc +++ b/test/core/transport/call_spine_test.cc @@ -41,7 +41,8 @@ class CallSpineTest : public YodelTest { using YodelTest::YodelTest; ClientMetadataHandle MakeClientInitialMetadata() { - auto client_initial_metadata = Arena::MakePooled(); + auto client_initial_metadata = + Arena::MakePooledForOverwrite(); client_initial_metadata->Set(HttpPathMetadata(), Slice::FromCopiedString(kTestPath)); return client_initial_metadata; @@ -126,7 +127,7 @@ void CallSpineTest::UnaryRequest(CallInitiator initiator, CallHandler handler) { [handler](ValueOrFailure> msg) mutable { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, @@ -137,7 +138,7 @@ void CallSpineTest::UnaryRequest(CallInitiator initiator, CallHandler handler) { }, [handler](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; diff --git a/test/core/transport/chaotic_good/client_transport_error_test.cc b/test/core/transport/chaotic_good/client_transport_error_test.cc index 05c89a2aeb8d0..190580f1eb7fe 100644 --- a/test/core/transport/chaotic_good/client_transport_error_test.cc +++ b/test/core/transport/chaotic_good/client_transport_error_test.cc @@ -123,7 +123,7 @@ auto SendClientToServerMessages(CallInitiator initiator, int num_messages) { } ClientMetadataHandle TestInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromStaticString("/test")); return md; } diff --git a/test/core/transport/chaotic_good/client_transport_test.cc b/test/core/transport/chaotic_good/client_transport_test.cc index 8d3a69df759ca..d4f7037b7332c 100644 --- a/test/core/transport/chaotic_good/client_transport_test.cc +++ b/test/core/transport/chaotic_good/client_transport_test.cc @@ -68,7 +68,7 @@ const uint8_t kGrpcStatus0[] = {0x10, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x01, 0x30}; ClientMetadataHandle TestInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromStaticString("/demo.Service/Step")); return md; } diff --git a/test/core/transport/chaotic_good/server_transport_test.cc b/test/core/transport/chaotic_good/server_transport_test.cc index 0dd432f60c602..21977563c60ee 100644 --- a/test/core/transport/chaotic_good/server_transport_test.cc +++ b/test/core/transport/chaotic_good/server_transport_test.cc @@ -71,13 +71,13 @@ const uint8_t kGrpcStatus0[] = {0x40, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x01, 0x30}; ServerMetadataHandle TestInitialMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromStaticString("/demo.Service/Step")); return md; } ServerMetadataHandle TestTrailingMetadata() { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_OK); return md; } diff --git a/test/core/transport/chttp2/BUILD b/test/core/transport/chttp2/BUILD index 54e1b521b77ba..d2cd2a2a27bee 100644 --- a/test/core/transport/chttp2/BUILD +++ b/test/core/transport/chttp2/BUILD @@ -346,16 +346,6 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "max_concurrent_streams_policy_test", - srcs = ["max_concurrent_streams_policy_test.cc"], - external_deps = ["gtest"], - language = "C++", - deps = [ - "//src/core:max_concurrent_streams_policy", - ], -) - grpc_cc_test( name = "streams_not_seen_test", srcs = ["streams_not_seen_test.cc"], diff --git a/test/core/transport/chttp2/hpack_parser_table_test.cc b/test/core/transport/chttp2/hpack_parser_table_test.cc index ea9741d1d3179..8743b07900643 100644 --- a/test/core/transport/chttp2/hpack_parser_table_test.cc +++ b/test/core/transport/chttp2/hpack_parser_table_test.cc @@ -28,11 +28,12 @@ #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice.h" +#include "src/core/telemetry/stats.h" #include "test/core/test_util/test_config.h" namespace grpc_core { namespace { -void AssertIndex(const HPackTable* tbl, uint32_t idx, const char* key, +void AssertIndex(HPackTable* tbl, uint32_t idx, const char* key, const char* value) { const auto* md = tbl->Lookup(idx); ASSERT_NE(md, nullptr); @@ -113,6 +114,8 @@ TEST(HpackParserTableTest, ManyAdditions) { ExecCtx exec_ctx; + auto stats_before = global_stats().Collect(); + for (i = 0; i < 100000; i++) { std::string key = absl::StrCat("K.", i); std::string value = absl::StrCat("VALUE.", i); @@ -134,6 +137,56 @@ TEST(HpackParserTableTest, ManyAdditions) { value.c_str()); } } + + auto stats_after = global_stats().Collect(); + + EXPECT_EQ(stats_after->http2_hpack_hits - stats_before->http2_hpack_hits, + 100000); + EXPECT_EQ(stats_after->http2_hpack_misses, stats_before->http2_hpack_misses); +} + +TEST(HpackParserTableTest, ManyUnusedAdditions) { + auto tbl = std::make_unique(); + int i; + + ExecCtx exec_ctx; + + auto stats_before = global_stats().Collect(); + const Timestamp start = Timestamp::Now(); + + for (i = 0; i < 100000; i++) { + std::string key = absl::StrCat("K.", i); + std::string value = absl::StrCat("VALUE.", i); + auto key_slice = Slice::FromCopiedString(key); + auto value_slice = Slice::FromCopiedString(value); + auto memento = HPackTable::Memento{ + ParsedMetadata( + ParsedMetadata::FromSlicePair{}, + std::move(key_slice), std::move(value_slice), + key.length() + value.length() + 32), + nullptr}; + ASSERT_TRUE(tbl->Add(std::move(memento))); + } + + tbl.reset(); + + auto stats_after = global_stats().Collect(); + const Timestamp end = Timestamp::Now(); + + EXPECT_EQ(stats_after->http2_hpack_hits, stats_before->http2_hpack_hits); + EXPECT_EQ(stats_after->http2_hpack_misses - stats_before->http2_hpack_misses, + 100000); + + size_t num_buckets_changed = 0; + const auto& lifetime_before = stats_before->http2_hpack_entry_lifetime; + const auto& lifetime_after = stats_after->http2_hpack_entry_lifetime; + for (size_t i = 0; i < lifetime_before.bucket_count(); i++) { + if (lifetime_before.buckets()[i] != lifetime_after.buckets()[i]) { + EXPECT_LE(i, lifetime_before.BucketFor((end - start).millis())); + num_buckets_changed++; + } + } + EXPECT_GT(num_buckets_changed, 0); } } // namespace grpc_core diff --git a/test/core/transport/chttp2/hpack_parser_test.cc b/test/core/transport/chttp2/hpack_parser_test.cc index d735ebc2b7ce5..d15d990678c34 100644 --- a/test/core/transport/chttp2/hpack_parser_test.cc +++ b/test/core/transport/chttp2/hpack_parser_test.cc @@ -436,19 +436,82 @@ INSTANTIATE_TEST_SUITE_P( Test{"Base64LegalEncoding", {}, {}, - {// Binary metadata: created using: - // tools/codegen/core/gen_header_frame.py - // --compression inc --no_framing --output hexstr - // < test/core/transport/chttp2/bad-base64.headers - {"4009612e622e632d62696e1c6c75636b696c7920666f722075732c206974" - "27732074756573646179", - absl::InternalError("Error parsing 'a.b.c-bin' metadata: " - "illegal base64 encoding"), - 0}, - {"be", - absl::InternalError("Error parsing 'a.b.c-bin' metadata: " - "illegal base64 encoding"), - 0}}}, + { + // Binary metadata: created using: + // tools/codegen/core/gen_header_frame.py + // --compression inc --no_framing --output hexstr + // < test/core/transport/chttp2/bad-base64.headers + {"4009612e622e632d62696e1c6c75636b696c7920666f722075732c206974" + "27732074756573646179", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + 0}, + {"be", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + kEndOfHeaders}, + {"82", ":method: GET\n", 0}, + }}, + Test{"Base64LegalEncodingWorksAfterFailure", + {}, + {}, + { + // Binary metadata: created using: + // tools/codegen/core/gen_header_frame.py + // --compression inc --no_framing --output hexstr + // < test/core/transport/chttp2/bad-base64.headers + {"4009612e622e632d62696e1c6c75636b696c7920666f722075732c206974" + "27732074756573646179", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + 0}, + {"be", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + 0}, + {"400e636f6e74656e742d6c656e6774680135", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + kEndOfHeaders}, + {"be", "content-length: 5\n", 0}, + }}, + Test{"Base64LegalEncodingWorksAfterFailure2", + {}, + {}, + { + {// Generated with: tools/codegen/core/gen_header_frame.py + // --compression inc --output hexstr --no_framing < + // test/core/transport/chttp2/MiXeD-CaSe.headers + "400a4d695865442d436153651073686f756c64206e6f74207061727365", + absl::InternalError("Illegal header key: MiXeD-CaSe"), 0}, + // Binary metadata: created using: + // tools/codegen/core/gen_header_frame.py + // --compression inc --no_framing --output hexstr + // < test/core/transport/chttp2/bad-base64.headers + {"4009612e622e632d62696e1c6c75636b696c7920666f722075732c206974" + "27732074756573646179", + absl::InternalError("Illegal header key: MiXeD-CaSe"), 0}, + {"be", absl::InternalError("Illegal header key: MiXeD-CaSe"), + 0}, + {"400e636f6e74656e742d6c656e6774680135", + absl::InternalError("Illegal header key: MiXeD-CaSe"), + kEndOfHeaders}, + {"be", "content-length: 5\n", 0}, + {"bf", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + 0}, + // Only the first error in each frame is reported, so we should + // still see the same error here... + {"c0", + absl::InternalError("Error parsing 'a.b.c-bin' metadata: " + "illegal base64 encoding"), + kEndOfHeaders}, + // ... but if we look at the next frame we should see the + // stored error + {"c0", absl::InternalError("Illegal header key: MiXeD-CaSe"), + kEndOfHeaders}, + }}, Test{"TeIsTrailers", {}, {}, diff --git a/test/core/transport/chttp2/hpack_sync_fuzzer.cc b/test/core/transport/chttp2/hpack_sync_fuzzer.cc index 13aa0f2bb4a97..bcc5a50c32fe1 100644 --- a/test/core/transport/chttp2/hpack_sync_fuzzer.cc +++ b/test/core/transport/chttp2/hpack_sync_fuzzer.cc @@ -84,6 +84,10 @@ void FuzzOneInput(const hpack_sync_fuzzer::Msg& msg) { // Not an interesting case to fuzz continue; } + if (msg.check_ab_preservation() && + header.literal_inc_idx().key() == "a") { + continue; + } if (absl::EndsWith(header.literal_inc_idx().value(), "-bin")) { std::ignore = encoder.EmitLitHdrWithBinaryStringKeyIncIdx( Slice::FromCopiedString(header.literal_inc_idx().key()), @@ -95,6 +99,10 @@ void FuzzOneInput(const hpack_sync_fuzzer::Msg& msg) { } break; case hpack_sync_fuzzer::Header::kLiteralNotIdx: + if (msg.check_ab_preservation() && + header.literal_not_idx().key() == "a") { + continue; + } if (absl::EndsWith(header.literal_not_idx().value(), "-bin")) { encoder.EmitLitHdrWithBinaryStringKeyNotIdx( Slice::FromCopiedString(header.literal_not_idx().key()), @@ -113,6 +121,10 @@ void FuzzOneInput(const hpack_sync_fuzzer::Msg& msg) { break; } } + if (msg.check_ab_preservation()) { + std::ignore = encoder.EmitLitHdrWithNonBinaryStringKeyIncIdx( + Slice::FromCopiedString("a"), Slice::FromCopiedString("b")); + } // STAGE 2: Decode the buffer (encode_output) into a list of headers HPackParser parser; @@ -135,6 +147,21 @@ void FuzzOneInput(const hpack_sync_fuzzer::Msg& msg) { } } + if (seen_errors.empty() && msg.check_ab_preservation()) { + std::string backing; + auto a_value = read_metadata.GetStringValue("a", &backing); + if (!a_value.has_value()) { + fprintf(stderr, "Expected 'a' header to be present: %s\n", + read_metadata.DebugString().c_str()); + abort(); + } + if (a_value != "b") { + fprintf(stderr, "Expected 'a' header to be 'b', got '%s'\n", + std::string(*a_value).c_str()); + abort(); + } + } + // STAGE 3: If we reached here we either had a stream error or no error // parsing. // Either way, the hpack tables should be of the same size between client and @@ -163,6 +190,41 @@ void FuzzOneInput(const hpack_sync_fuzzer::Msg& msg) { } abort(); } + + if (msg.check_ab_preservation()) { + SliceBuffer encode_output_2; + hpack_encoder_detail::Encoder encoder_2( + &compressor, msg.use_true_binary_metadata(), encode_output_2); + encoder_2.EmitIndexed(62); + CHECK_EQ(encode_output_2.Count(), 1); + grpc_metadata_batch read_metadata_2; + parser.BeginFrame( + &read_metadata_2, 1024, 1024, HPackParser::Boundary::EndOfHeaders, + HPackParser::Priority::None, + HPackParser::LogInfo{3, HPackParser::LogInfo::kHeaders, false}); + auto err = parser.Parse(encode_output_2.c_slice_at(0), true, + absl::BitGenRef(proto_bit_src), + /*call_tracer=*/nullptr); + if (!err.ok()) { + fprintf(stderr, "Error parsing preservation encoded data: %s\n", + err.ToString().c_str()); + abort(); + } + std::string backing; + auto a_value = read_metadata_2.GetStringValue("a", &backing); + if (!a_value.has_value()) { + fprintf(stderr, + "Expected 'a' header to be present: %s\nfirst metadata: %s\n", + read_metadata_2.DebugString().c_str(), + read_metadata.DebugString().c_str()); + abort(); + } + if (a_value != "b") { + fprintf(stderr, "Expected 'a' header to be 'b', got '%s'\n", + std::string(*a_value).c_str()); + abort(); + } + } } } // namespace diff --git a/test/core/transport/chttp2/hpack_sync_fuzzer.proto b/test/core/transport/chttp2/hpack_sync_fuzzer.proto index 0290f134f7ab0..f8e25079cb565 100644 --- a/test/core/transport/chttp2/hpack_sync_fuzzer.proto +++ b/test/core/transport/chttp2/hpack_sync_fuzzer.proto @@ -44,4 +44,7 @@ message Msg { repeated Header headers = 2; grpc.testing.FuzzConfigVars config_vars = 3; repeated uint64 random_numbers = 4; + // Ensure that a header "a: b" appended to headers with hpack incremental + // indexing is correctly added to the hpack table. + bool check_ab_preservation = 5; } diff --git a/test/core/transport/chttp2/max_concurrent_streams_policy_test.cc b/test/core/transport/chttp2/max_concurrent_streams_policy_test.cc deleted file mode 100644 index 11b347dbcd8c2..0000000000000 --- a/test/core/transport/chttp2/max_concurrent_streams_policy_test.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h" - -#include - -#include "gtest/gtest.h" - -namespace grpc_core { -namespace { - -TEST(MaxConcurrentStreamsPolicyTest, NoOpWorks) { - Chttp2MaxConcurrentStreamsPolicy policy; - policy.SetTarget(100); - EXPECT_EQ(policy.AdvertiseValue(), 100); -} - -TEST(MaxConcurrentStreamsPolicyTest, BasicFlow) { - Chttp2MaxConcurrentStreamsPolicy policy; - policy.SetTarget(100); - EXPECT_EQ(policy.AdvertiseValue(), 100); - policy.AddDemerit(); - EXPECT_EQ(policy.AdvertiseValue(), 99); - policy.FlushedSettings(); - EXPECT_EQ(policy.AdvertiseValue(), 99); - policy.AckLastSend(); - EXPECT_EQ(policy.AdvertiseValue(), 100); -} - -} // namespace -} // namespace grpc_core - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/transport/interception_chain_test.cc b/test/core/transport/interception_chain_test.cc index f7793fd13ad80..02223f4ff73fb 100644 --- a/test/core/transport/interception_chain_test.cc +++ b/test/core/transport/interception_chain_test.cc @@ -161,7 +161,7 @@ class TestConsumingInterceptor final : public Interceptor { void InterceptCall(UnstartedCallHandler unstarted_call_handler) override { Consume(std::move(unstarted_call_handler)) .PushServerTrailingMetadata( - ServerMetadataFromStatus(absl::InternalError("👊 consumed"))); + ServerMetadataFromStatus(GRPC_STATUS_INTERNAL, "👊 consumed")); } void Orphaned() override {} static absl::StatusOr>> Create( @@ -252,8 +252,8 @@ class InterceptionChainTest : public ::testing::Test { auto arena = call_arena_allocator_->MakeArena(); arena->SetContext( event_engine_.get()); - auto call = - MakeCallPair(Arena::MakePooled(), std::move(arena)); + auto call = MakeCallPair(Arena::MakePooledForOverwrite(), + std::move(arena)); Poll trailing_md; call.initiator.SpawnInfallible( "run_call", [destination, &call, &trailing_md]() mutable { @@ -278,11 +278,11 @@ class InterceptionChainTest : public ::testing::Test { << unstarted_call_handler.UnprocessedClientInitialMetadata() .DebugString(); EXPECT_EQ(metadata_.get(), nullptr); - metadata_ = Arena::MakePooled(); + metadata_ = Arena::MakePooledForOverwrite(); *metadata_ = unstarted_call_handler.UnprocessedClientInitialMetadata().Copy(); unstarted_call_handler.PushServerTrailingMetadata( - ServerMetadataFromStatus(absl::InternalError("👊 cancelled"))); + ServerMetadataFromStatus(GRPC_STATUS_INTERNAL, "👊 cancelled")); } void Orphaned() override {} diff --git a/test/core/transport/metadata_map_test.cc b/test/core/transport/metadata_map_test.cc index cc977cd3c4e9a..91d60baab270a 100644 --- a/test/core/transport/metadata_map_test.cc +++ b/test/core/transport/metadata_map_test.cc @@ -260,6 +260,83 @@ TEST(DebugStringBuilderTest, TestAllRedacted) { } } +std::vector GetEncodableHeaders() { + return { + // clang-format off + std::string(ContentTypeMetadata::key()), + std::string(EndpointLoadMetricsBinMetadata::key()), + std::string(GrpcAcceptEncodingMetadata::key()), + std::string(GrpcEncodingMetadata::key()), + std::string(GrpcInternalEncodingRequest::key()), + std::string(GrpcLbClientStatsMetadata::key()), + std::string(GrpcMessageMetadata::key()), + std::string(GrpcPreviousRpcAttemptsMetadata::key()), + std::string(GrpcRetryPushbackMsMetadata::key()), + std::string(GrpcServerStatsBinMetadata::key()), + std::string(GrpcStatusMetadata::key()), + std::string(GrpcTagsBinMetadata::key()), + std::string(GrpcTimeoutMetadata::key()), + std::string(GrpcTraceBinMetadata::key()), + std::string(HostMetadata::key()), + std::string(HttpAuthorityMetadata::key()), + std::string(HttpMethodMetadata::key()), + std::string(HttpPathMetadata::key()), + std::string(HttpSchemeMetadata::key()), + std::string(HttpStatusMetadata::key()), + std::string(LbCostBinMetadata::key()), + std::string(LbTokenMetadata::key()), + std::string(TeMetadata::key()), + // clang-format on + }; +} + +template +void AddNonEncodableHeader(grpc_metadata_batch& md, Value value) { + md.Set(NonEncodableHeader(), value); +} + +template +class HeaderFilter { + public: + template + bool operator()(Key) { + return filter_unknown; + } + bool operator()(absl::string_view /*key*/) { return !filter_unknown; } +}; + +TEST(MetadataMapTest, FilterTest) { + grpc_metadata_batch map; + std::vector allow_list_keys = GetEncodableHeaders(); + std::vector unknown_keys = {"unknown_key_1", "unknown_key_2"}; + allow_list_keys.insert(allow_list_keys.end(), unknown_keys.begin(), + unknown_keys.end()); + // Add some encodable and unknown headers + for (const std::string& curr_key : allow_list_keys) { + map.Append(curr_key, Slice::FromStaticString("value1"), + [](absl::string_view /*error*/, const Slice& /*value*/) {}); + } + + // Add 5 non-encodable headers + constexpr int kNumNonEncodableHeaders = 5; + AddNonEncodableHeader(map, true); + AddNonEncodableHeader(map, nullptr); + AddNonEncodableHeader(map, "value1"); + AddNonEncodableHeader(map, "value1"); + AddNonEncodableHeader( + map, GrpcStreamNetworkState::kNotSentOnWire); + + EXPECT_EQ(map.count(), allow_list_keys.size() + kNumNonEncodableHeaders); + // Remove all unknown headers + map.Filter(HeaderFilter()); + EXPECT_EQ(map.count(), allow_list_keys.size() + kNumNonEncodableHeaders - + unknown_keys.size()); + // Remove all encodable headers + map.Filter(HeaderFilter()); + EXPECT_EQ(map.count(), kNumNonEncodableHeaders); +} + } // namespace testing } // namespace grpc_core diff --git a/test/core/transport/test_suite/call_content.cc b/test/core/transport/test_suite/call_content.cc index 5c393264c98c2..7c9f26da0f091 100644 --- a/test/core/transport/test_suite/call_content.cc +++ b/test/core/transport/test_suite/call_content.cc @@ -68,7 +68,7 @@ TRANSPORT_TEST(UnaryWithSomeContent) { const auto server_trailing_metadata = RandomMetadata(); const auto client_payload = RandomMessage(); const auto server_payload = RandomMessage(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); FillMetadata(client_initial_metadata, *md); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -126,7 +126,7 @@ TRANSPORT_TEST(UnaryWithSomeContent) { [&](ValueOrFailure> msg) { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); FillMetadata(server_initial_metadata, *md); return handler.PushServerInitialMetadata(std::move(md)); }, @@ -137,7 +137,7 @@ TRANSPORT_TEST(UnaryWithSomeContent) { }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); FillMetadata(server_trailing_metadata, *md); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; diff --git a/test/core/transport/test_suite/call_shapes.cc b/test/core/transport/test_suite/call_shapes.cc index fab954a676e86..343720fe2d3ff 100644 --- a/test/core/transport/test_suite/call_shapes.cc +++ b/test/core/transport/test_suite/call_shapes.cc @@ -18,7 +18,7 @@ namespace grpc_core { TRANSPORT_TEST(MetadataOnlyRequest) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -52,13 +52,13 @@ TRANSPORT_TEST(MetadataOnlyRequest) { [&](ValueOrFailure> msg) { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -73,7 +73,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsAfterInitialMetadata) { "rolling out soon, so leaving this disabled."; SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -105,13 +105,13 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsAfterInitialMetadata) { "/foo/bar"); // Don't wait for end of stream for client->server messages, just // publish initial then trailing metadata. - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -126,7 +126,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsImmediately) { "rolling out soon, so leaving this disabled."; SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -156,7 +156,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsImmediately) { "/foo/bar"); // Don't wait for end of stream for client->server messages, just // and don't send initial metadata - just trailing metadata. - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -166,7 +166,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsImmediately) { TRANSPORT_TEST(CanCreateCallThenAbandonIt) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); auto handler = TickUntilServerCall(); @@ -179,7 +179,7 @@ TRANSPORT_TEST(CanCreateCallThenAbandonIt) { TRANSPORT_TEST(UnaryRequest) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -237,7 +237,7 @@ TRANSPORT_TEST(UnaryRequest) { [&](ValueOrFailure> msg) { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, @@ -248,7 +248,7 @@ TRANSPORT_TEST(UnaryRequest) { }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -258,7 +258,7 @@ TRANSPORT_TEST(UnaryRequest) { TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -306,7 +306,7 @@ TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { EXPECT_TRUE(msg.value().has_value()); EXPECT_EQ(msg.value().value()->payload()->JoinIntoString(), "hello world"); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, @@ -317,7 +317,7 @@ TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -327,7 +327,7 @@ TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -371,7 +371,7 @@ TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { EXPECT_TRUE(md.ok()); EXPECT_EQ(md.value()->get_pointer(HttpPathMetadata())->as_string_view(), "/foo/bar"); - auto md_out = Arena::MakePooled(); + auto md_out = Arena::MakePooledForOverwrite(); md_out->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md_out)); @@ -395,7 +395,7 @@ TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -405,7 +405,7 @@ TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { TRANSPORT_TEST(ClientStreamingRequest) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -462,7 +462,7 @@ TRANSPORT_TEST(ClientStreamingRequest) { EXPECT_TRUE(md.ok()); EXPECT_EQ(md.value()->get_pointer(HttpPathMetadata())->as_string_view(), "/foo/bar"); - auto md_out = Arena::MakePooled(); + auto md_out = Arena::MakePooledForOverwrite(); md_out->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md_out)); @@ -509,7 +509,7 @@ TRANSPORT_TEST(ClientStreamingRequest) { [&](ValueOrFailure> msg) { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; @@ -519,7 +519,7 @@ TRANSPORT_TEST(ClientStreamingRequest) { TRANSPORT_TEST(ServerStreamingRequest) { SetServerCallDestination(); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); SpawnTestSeq( @@ -593,7 +593,7 @@ TRANSPORT_TEST(ServerStreamingRequest) { EXPECT_TRUE(md.ok()); EXPECT_EQ(md.value()->get_pointer(HttpPathMetadata())->as_string_view(), "/foo/bar"); - auto md_out = Arena::MakePooled(); + auto md_out = Arena::MakePooledForOverwrite(); md_out->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md_out)); @@ -635,7 +635,7 @@ TRANSPORT_TEST(ServerStreamingRequest) { }, [&](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; diff --git a/test/core/transport/test_suite/stress.cc b/test/core/transport/test_suite/stress.cc index fc3de87dd840d..11f0093ab857f 100644 --- a/test/core/transport/test_suite/stress.cc +++ b/test/core/transport/test_suite/stress.cc @@ -30,7 +30,7 @@ TRANSPORT_TEST(ManyUnaryRequests) { std::map client_messages; std::map server_messages; for (int i = 0; i < kNumRequests; i++) { - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromCopiedString(std::to_string(i))); auto initiator = CreateCall(std::move(md)); client_messages[i] = RandomMessage(); @@ -99,7 +99,7 @@ TRANSPORT_TEST(ManyUnaryRequests) { [handler](ValueOrFailure> msg) mutable { EXPECT_TRUE(msg.ok()); EXPECT_FALSE(msg.value().has_value()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc); return handler.PushServerInitialMetadata(std::move(md)); }, @@ -113,7 +113,7 @@ TRANSPORT_TEST(ManyUnaryRequests) { }, [handler](StatusFlag result) mutable { EXPECT_TRUE(result.ok()); - auto md = Arena::MakePooled(); + auto md = Arena::MakePooledForOverwrite(); md->Set(GrpcStatusMetadata(), GRPC_STATUS_UNIMPLEMENTED); handler.PushServerTrailingMetadata(std::move(md)); return Empty{}; diff --git a/test/core/util/BUILD b/test/core/util/BUILD index 8337de838eb16..41f7fc7254964 100644 --- a/test/core/util/BUILD +++ b/test/core/util/BUILD @@ -112,6 +112,19 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "unique_ptr_with_bitset_test", + srcs = ["unique_ptr_with_bitset_test.cc"], + external_deps = ["gtest"], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//:gpr_platform", + "//src/core:unique_ptr_with_bitset", + ], +) + grpc_cc_test( name = "useful_test", srcs = ["useful_test.cc"], @@ -124,3 +137,16 @@ grpc_cc_test( "//src/core:useful", ], ) + +grpc_cc_test( + name = "ring_buffer_test", + srcs = ["ring_buffer_test.cc"], + external_deps = ["gtest"], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//:gpr_platform", + "//src/core:ring_buffer", + ], +) diff --git a/test/core/util/useful_test.cc b/test/core/util/useful_test.cc index 4eb62e73e5d4e..506b2da3040f5 100644 --- a/test/core/util/useful_test.cc +++ b/test/core/util/useful_test.cc @@ -48,18 +48,11 @@ TEST(UsefulTest, ArraySize) { TEST(UsefulTest, BitOps) { uint32_t bitset = 0; - EXPECT_EQ(BitCount((1u << 31) - 1), 31); - EXPECT_EQ(BitCount(1u << 3), 1); - EXPECT_EQ(BitCount(0), 0); EXPECT_EQ(SetBit(&bitset, 3), 8); - EXPECT_EQ(BitCount(bitset), 1); EXPECT_EQ(GetBit(bitset, 3), 1); EXPECT_EQ(SetBit(&bitset, 1), 10); - EXPECT_EQ(BitCount(bitset), 2); EXPECT_EQ(ClearBit(&bitset, 3), 2); - EXPECT_EQ(BitCount(bitset), 1); EXPECT_EQ(GetBit(bitset, 3), 0); - EXPECT_EQ(BitCount(std::numeric_limits::max()), 64); } TEST(UsefulTest, SaturatingAdd) { @@ -88,55 +81,6 @@ TEST(UsefulTest, RoundUpToPowerOf2) { EXPECT_EQ(RoundUpToPowerOf2(8), 8); } -TEST(UsefulTest, CountTrailingZeros32) { - EXPECT_EQ(CountTrailingZeros(static_cast(1)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(2)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(3)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(4)), 2); - EXPECT_EQ(CountTrailingZeros(static_cast(5)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(6)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(7)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(8)), 3); - EXPECT_EQ(CountTrailingZeros(static_cast(9)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(10)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(11)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(12)), 2); - EXPECT_EQ(CountTrailingZeros(static_cast(13)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(14)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(15)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(16)), 4); - EXPECT_EQ(CountTrailingZeros(static_cast(256)), 8); - EXPECT_EQ(CountTrailingZeros(static_cast(65535)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(65536)), 16); - EXPECT_EQ(CountTrailingZeros(static_cast(0x80000000)), 31); -} - -TEST(UsefulTest, CountTrailingZeros64) { - EXPECT_EQ(CountTrailingZeros(static_cast(1)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(2)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(3)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(4)), 2); - EXPECT_EQ(CountTrailingZeros(static_cast(5)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(6)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(7)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(8)), 3); - EXPECT_EQ(CountTrailingZeros(static_cast(9)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(10)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(11)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(12)), 2); - EXPECT_EQ(CountTrailingZeros(static_cast(13)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(14)), 1); - EXPECT_EQ(CountTrailingZeros(static_cast(15)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(16)), 4); - EXPECT_EQ(CountTrailingZeros(static_cast(256)), 8); - EXPECT_EQ(CountTrailingZeros(static_cast(65535)), 0); - EXPECT_EQ(CountTrailingZeros(static_cast(65536)), 16); - EXPECT_EQ(CountTrailingZeros(static_cast(0x80000000)), 31); - EXPECT_EQ(CountTrailingZeros(static_cast(0x100000000)), 32); - EXPECT_EQ(CountTrailingZeros(static_cast(0x1000000000000)), 48); - EXPECT_EQ(CountTrailingZeros(static_cast(0x8000000000000000)), 63); -} - TEST(UsefulTest, LowestOneBit8) { EXPECT_EQ(LowestOneBit(static_cast(0)), 0); EXPECT_EQ(LowestOneBit(static_cast(1)), 1); diff --git a/test/core/xds/BUILD b/test/core/xds/BUILD index 51413628d61d3..09a6553037ae7 100644 --- a/test/core/xds/BUILD +++ b/test/core/xds/BUILD @@ -225,6 +225,7 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:typed_struct_proto", "//src/proto/grpc/testing/xds/v3:udpa_typed_struct_proto", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", "//test/cpp/util:grpc_cli_utils", ], ) @@ -273,6 +274,7 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:tls_proto", "//src/proto/grpc/testing/xds/v3:typed_struct_proto", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", "//test/cpp/util:grpc_cli_utils", ], ) @@ -319,6 +321,7 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:typed_struct_proto", "//src/proto/grpc/testing/xds/v3:wrr_locality_proto", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", ], ) diff --git a/test/core/xds/xds_cluster_resource_type_test.cc b/test/core/xds/xds_cluster_resource_type_test.cc index 053e5d59bb122..7cf4c1926811f 100644 --- a/test/core/xds/xds_cluster_resource_type_test.cc +++ b/test/core/xds/xds_cluster_resource_type_test.cc @@ -65,6 +65,7 @@ #include "src/proto/grpc/testing/xds/v3/tls.pb.h" #include "src/proto/grpc/testing/xds/v3/typed_struct.pb.h" #include "src/proto/grpc/testing/xds/v3/wrr_locality.pb.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" using envoy::config::cluster::v3::Cluster; @@ -932,12 +933,40 @@ TEST_F(TlsConfigTest, MinimumValidConfig) { EXPECT_EQ(*decode_result.name, "foo"); auto& resource = static_cast(**decode_result.resource); - EXPECT_EQ(resource.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.instance_name, - "provider1"); - EXPECT_EQ(resource.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance.certificate_name, - "cert_name"); + auto* ca_cert_provider = + absl::get_if( + &resource.common_tls_context.certificate_validation_context.ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "cert_name"); +} + +TEST_F(TlsConfigTest, SystemRootCerts) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + Cluster cluster; + cluster.set_name("foo"); + cluster.set_type(cluster.EDS); + cluster.mutable_eds_cluster_config()->mutable_eds_config()->mutable_self(); + auto* transport_socket = cluster.mutable_transport_socket(); + transport_socket->set_name("envoy.transport_sockets.tls"); + UpstreamTlsContext upstream_tls_context; + auto* common_tls_context = upstream_tls_context.mutable_common_tls_context(); + auto* validation_context = common_tls_context->mutable_validation_context(); + validation_context->mutable_system_root_certs(); + transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context); + std::string serialized_resource; + ASSERT_TRUE(cluster.SerializeToString(&serialized_resource)); + auto* resource_type = XdsClusterResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.resource.ok()) << decode_result.resource.status(); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + auto& resource = + static_cast(**decode_result.resource); + ASSERT_TRUE(absl::holds_alternative< + CommonTlsContext::CertificateValidationContext::SystemRootCerts>( + resource.common_tls_context.certificate_validation_context.ca_certs)); } // This is just one example of where CommonTlsContext::Parse() will @@ -1078,7 +1107,7 @@ TEST_F(TlsConfigTest, CaCertProviderUnset) { "field:transport_socket.typed_config.value[" "envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext]" ".common_tls_context " - "error:no CA certificate provider instance configured]") + "error:no CA certs configured]") << decode_result.resource.status(); } diff --git a/test/core/xds/xds_common_types_test.cc b/test/core/xds/xds_common_types_test.cc index 5a4fb32469149..b19a885a79e57 100644 --- a/test/core/xds/xds_common_types_test.cc +++ b/test/core/xds/xds_common_types_test.cc @@ -56,6 +56,7 @@ #include "src/proto/grpc/testing/xds/v3/tls.pb.h" #include "src/proto/grpc/testing/xds/v3/typed_struct.pb.h" #include "src/proto/grpc/testing/xds/v3/udpa_typed_struct.pb.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" #include "test/cpp/util/config_grpc_cli.h" @@ -206,6 +207,24 @@ class CommonTlsConfigTest : public XdsCommonTypesTest { } }; +TEST_F(CommonTlsConfigTest, NoCaCerts) { + // Construct proto. + CommonTlsContextProto common_tls_context_proto; + // Convert to upb. + const auto* upb_proto = ConvertToUpb(common_tls_context_proto); + ASSERT_NE(upb_proto, nullptr); + // Run test. + auto common_tls_context = Parse(upb_proto); + ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); + EXPECT_TRUE(absl::holds_alternative( + common_tls_context->certificate_validation_context.ca_certs)); + EXPECT_THAT(common_tls_context->certificate_validation_context + .match_subject_alt_names, + ::testing::ElementsAre()); + EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) + << common_tls_context->tls_certificate_provider_instance.ToString(); +} + TEST_F(CommonTlsConfigTest, CaCertProviderInCombinedValidationContext) { // Construct proto. CommonTlsContextProto common_tls_context_proto; @@ -221,12 +240,12 @@ TEST_F(CommonTlsConfigTest, CaCertProviderInCombinedValidationContext) { // Run test. auto common_tls_context = Parse(upb_proto); ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); - EXPECT_EQ(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.instance_name, - "provider1"); - EXPECT_EQ(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.certificate_name, - "cert_name"); + auto* ca_cert_provider = + absl::get_if( + &common_tls_context->certificate_validation_context.ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "cert_name"); EXPECT_THAT(common_tls_context->certificate_validation_context .match_subject_alt_names, ::testing::ElementsAre()); @@ -247,12 +266,83 @@ TEST_F(CommonTlsConfigTest, CaCertProviderInValidationContext) { // Run test. auto common_tls_context = Parse(upb_proto); ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); - EXPECT_EQ(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.instance_name, - "provider1"); - EXPECT_EQ(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.certificate_name, - "cert_name"); + auto* ca_cert_provider = + absl::get_if( + &common_tls_context->certificate_validation_context.ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "cert_name"); + EXPECT_THAT(common_tls_context->certificate_validation_context + .match_subject_alt_names, + ::testing::ElementsAre()); + EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) + << common_tls_context->tls_certificate_provider_instance.ToString(); +} + +TEST_F(CommonTlsConfigTest, SystemRootCerts) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + // Construct proto. + CommonTlsContextProto common_tls_context_proto; + common_tls_context_proto.mutable_validation_context() + ->mutable_system_root_certs(); + // Convert to upb. + const auto* upb_proto = ConvertToUpb(common_tls_context_proto); + ASSERT_NE(upb_proto, nullptr); + // Run test. + auto common_tls_context = Parse(upb_proto); + ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); + EXPECT_TRUE(absl::holds_alternative< + CommonTlsContext::CertificateValidationContext::SystemRootCerts>( + common_tls_context->certificate_validation_context.ca_certs)); + EXPECT_THAT(common_tls_context->certificate_validation_context + .match_subject_alt_names, + ::testing::ElementsAre()); + EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) + << common_tls_context->tls_certificate_provider_instance.ToString(); +} + +TEST_F(CommonTlsConfigTest, CaCertProviderTakesPrecedenceOverSystemRootCerts) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + // Construct proto. + CommonTlsContextProto common_tls_context_proto; + auto* cert_provider = common_tls_context_proto.mutable_validation_context() + ->mutable_ca_certificate_provider_instance(); + cert_provider->set_instance_name("provider1"); + cert_provider->set_certificate_name("cert_name"); + common_tls_context_proto.mutable_validation_context() + ->mutable_system_root_certs(); + // Convert to upb. + const auto* upb_proto = ConvertToUpb(common_tls_context_proto); + ASSERT_NE(upb_proto, nullptr); + // Run test. + auto common_tls_context = Parse(upb_proto); + ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); + auto* ca_cert_provider = + absl::get_if( + &common_tls_context->certificate_validation_context.ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "cert_name"); + EXPECT_THAT(common_tls_context->certificate_validation_context + .match_subject_alt_names, + ::testing::ElementsAre()); + EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) + << common_tls_context->tls_certificate_provider_instance.ToString(); +} + +TEST_F(CommonTlsConfigTest, SystemRootCertsIgnoredWithoutEnvVar) { + // Construct proto. + CommonTlsContextProto common_tls_context_proto; + common_tls_context_proto.mutable_validation_context() + ->mutable_system_root_certs(); + // Convert to upb. + const auto* upb_proto = ConvertToUpb(common_tls_context_proto); + ASSERT_NE(upb_proto, nullptr); + // Run test. + auto common_tls_context = Parse(upb_proto); + ASSERT_TRUE(common_tls_context.ok()) << common_tls_context.status(); + EXPECT_TRUE(absl::holds_alternative( + common_tls_context->certificate_validation_context.ca_certs)); EXPECT_THAT(common_tls_context->certificate_validation_context .match_subject_alt_names, ::testing::ElementsAre()); @@ -425,10 +515,8 @@ TEST_F(CommonTlsConfigTest, MatchSubjectAltNames) { EXPECT_EQ(match_subject_alt_names[4].type(), StringMatcher::Type::kSafeRegex); EXPECT_EQ(match_subject_alt_names[4].regex_matcher()->pattern(), "regex"); EXPECT_TRUE(match_subject_alt_names[4].case_sensitive()); - EXPECT_TRUE(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.Empty()) - << common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.ToString(); + EXPECT_TRUE(absl::holds_alternative( + common_tls_context->certificate_validation_context.ca_certs)); EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) << common_tls_context->tls_certificate_provider_instance.ToString(); } @@ -472,10 +560,8 @@ TEST_F(CommonTlsConfigTest, MatchSubjectAltNamesCaseInsensitive) { EXPECT_EQ(match_subject_alt_names[3].type(), StringMatcher::Type::kContains); EXPECT_EQ(match_subject_alt_names[3].string_matcher(), "contains"); EXPECT_FALSE(match_subject_alt_names[3].case_sensitive()); - EXPECT_TRUE(common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.Empty()) - << common_tls_context->certificate_validation_context - .ca_certificate_provider_instance.ToString(); + EXPECT_TRUE(absl::holds_alternative( + common_tls_context->certificate_validation_context.ca_certs)); EXPECT_TRUE(common_tls_context->tls_certificate_provider_instance.Empty()) << common_tls_context->tls_certificate_provider_instance.ToString(); } diff --git a/test/core/xds/xds_listener_resource_type_test.cc b/test/core/xds/xds_listener_resource_type_test.cc index 718202d1e5948..6106a8cda7e21 100644 --- a/test/core/xds/xds_listener_resource_type_test.cc +++ b/test/core/xds/xds_listener_resource_type_test.cc @@ -65,6 +65,7 @@ #include "src/proto/grpc/testing/xds/v3/string.pb.h" #include "src/proto/grpc/testing/xds/v3/tls.pb.h" #include "src/proto/grpc/testing/xds/v3/typed_struct.pb.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" using envoy::config::listener::v3::Listener; @@ -1559,11 +1560,56 @@ TEST_F(TcpListenerTest, DownstreamTlsContextWithCaCertProviderInstance) { tls_context.common_tls_context.tls_certificate_provider_instance; EXPECT_EQ(cert_provider_instance.instance_name, "provider1"); EXPECT_EQ(cert_provider_instance.certificate_name, "cert_name"); - auto& ca_cert_provider_instance = - tls_context.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance; - EXPECT_EQ(ca_cert_provider_instance.instance_name, "provider1"); - EXPECT_EQ(ca_cert_provider_instance.certificate_name, "ca_cert_name"); + auto* ca_cert_provider = + absl::get_if( + &tls_context.common_tls_context.certificate_validation_context + .ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "ca_cert_name"); +} + +TEST_F(TcpListenerTest, SystemRootCerts) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + Listener listener; + listener.set_name("foo"); + HttpConnectionManager hcm; + auto* filter = hcm.add_http_filters(); + filter->set_name("router"); + filter->mutable_typed_config()->PackFrom(Router()); + auto* rds = hcm.mutable_rds(); + rds->set_route_config_name("rds_name"); + rds->mutable_config_source()->mutable_self(); + auto* filter_chain = listener.mutable_default_filter_chain(); + filter_chain->add_filters()->mutable_typed_config()->PackFrom(hcm); + auto* transport_socket = filter_chain->mutable_transport_socket(); + transport_socket->set_name("envoy.transport_sockets.tls"); + DownstreamTlsContext downstream_tls_context; + auto* common_tls_context = + downstream_tls_context.mutable_common_tls_context(); + auto* cert_provider = + common_tls_context->mutable_tls_certificate_provider_instance(); + cert_provider->set_instance_name("provider1"); + cert_provider->set_certificate_name("cert_name"); + common_tls_context->mutable_validation_context()->mutable_system_root_certs(); + transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context); + auto* address = listener.mutable_address()->mutable_socket_address(); + address->set_address("127.0.0.1"); + address->set_port_value(443); + std::string serialized_resource; + ASSERT_TRUE(listener.SerializeToString(&serialized_resource)); + auto* resource_type = XdsListenerResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + EXPECT_EQ(decode_result.resource.status().code(), + absl::StatusCode::kInvalidArgument); + EXPECT_EQ(decode_result.resource.status().message(), + "errors validating server Listener: [" + "field:default_filter_chain.transport_socket.typed_config.value[" + "envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext]" + ".common_tls_context " + "error:system_root_certs not supported]") + << decode_result.resource.status(); } TEST_F(TcpListenerTest, ClientCertificateRequired) { @@ -1620,11 +1666,13 @@ TEST_F(TcpListenerTest, ClientCertificateRequired) { tls_context.common_tls_context.tls_certificate_provider_instance; EXPECT_EQ(cert_provider_instance.instance_name, "provider1"); EXPECT_EQ(cert_provider_instance.certificate_name, "cert_name"); - auto& ca_cert_provider_instance = - tls_context.common_tls_context.certificate_validation_context - .ca_certificate_provider_instance; - EXPECT_EQ(ca_cert_provider_instance.instance_name, "provider1"); - EXPECT_EQ(ca_cert_provider_instance.certificate_name, "ca_cert_name"); + auto* ca_cert_provider = + absl::get_if( + &tls_context.common_tls_context.certificate_validation_context + .ca_certs); + ASSERT_NE(ca_cert_provider, nullptr); + EXPECT_EQ(ca_cert_provider->instance_name, "provider1"); + EXPECT_EQ(ca_cert_provider->certificate_name, "ca_cert_name"); } // This is just one example of where CommonTlsContext::Parse() will diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc index 45460855a10a0..ee2f558a5be9c 100644 --- a/test/cpp/end2end/thread_stress_test.cc +++ b/test/cpp/end2end/thread_stress_test.cc @@ -36,7 +36,6 @@ #include #include "src/core/lib/gprpp/env.h" -#include "src/core/lib/surface/api_trace.h" #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/test_util/port.h" diff --git a/test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc b/test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc index d3762095f413e..b0af0178e8e91 100644 --- a/test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc @@ -124,6 +124,57 @@ TEST_P(LogicalDNSClusterTest, Basic) { CheckRpcSendOk(DEBUG_LOCATION); } +TEST_P(LogicalDNSClusterTest, FailedBackendConnectionCausesReresolution) { + LogicalDnsInitClient(); + CreateAndStartBackends(2); + // Create Logical DNS Cluster + auto cluster = default_cluster_; + cluster.set_type(Cluster::LOGICAL_DNS); + auto* address = cluster.mutable_load_assignment() + ->add_endpoints() + ->add_lb_endpoints() + ->mutable_endpoint() + ->mutable_address() + ->mutable_socket_address(); + address->set_address(kServerName); + address->set_port_value(443); + balancer_->ads_service()->SetCdsResource(cluster); + // Set Logical DNS result to backend 0. + { + grpc_core::ExecCtx exec_ctx; + grpc_core::Resolver::Result result; + result.addresses = CreateAddressListFromPortList(GetBackendPorts(0, 1)); + logical_dns_cluster_resolver_response_generator_->SetResponseSynchronously( + std::move(result)); + } + // RPCs should succeed. + CheckRpcSendOk(DEBUG_LOCATION); + // Now shut down backend 0. + ShutdownBackend(0); + // Wait for logical DNS resolver to see a re-resolution request. + // Then return a DNS result pointing to backend 1. + { + grpc_core::ExecCtx exec_ctx; + ASSERT_TRUE(logical_dns_cluster_resolver_response_generator_ + ->WaitForReresolutionRequest(absl::Seconds(10) * + grpc_test_slowdown_factor())); + grpc_core::Resolver::Result result; + result.addresses = CreateAddressListFromPortList(GetBackendPorts(1, 2)); + logical_dns_cluster_resolver_response_generator_->SetResponseSynchronously( + std::move(result)); + } + // Wait for traffic to switch to backend 1. + // RPCs may fail until the client sees the resolver result. + WaitForBackend(DEBUG_LOCATION, 1, [](const RpcResult& result) { + if (!result.status.ok()) { + EXPECT_EQ(StatusCode::UNAVAILABLE, result.status.error_code()); + EXPECT_THAT(result.status.error_message(), + MakeConnectionFailureRegex( + "connections to all backends failing; last error: ")); + } + }); +} + TEST_P(LogicalDNSClusterTest, AutoHostRewrite) { grpc_core::testing::ScopedExperimentalEnvVar env( "GRPC_EXPERIMENTAL_XDS_AUTHORITY_REWRITE"); diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index 1de043df5748a..0c6cfab5e84a9 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -488,6 +488,24 @@ TEST_P(XdsSecurityTest, CheckRpcSendOk(DEBUG_LOCATION, 1, RpcOptions().set_timeout_ms(5000)); } +TEST_P(XdsSecurityTest, UseSystemRootCerts) { + grpc_core::testing::ScopedExperimentalEnvVar env1( + "GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS"); + grpc_core::testing::ScopedEnvVar env2("GRPC_DEFAULT_SSL_ROOTS_FILE_PATH", + kCaCertPath); + g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}}); + auto cluster = default_cluster_; + auto* transport_socket = cluster.mutable_transport_socket(); + transport_socket->set_name("envoy.transport_sockets.tls"); + UpstreamTlsContext upstream_tls_context; + upstream_tls_context.mutable_common_tls_context() + ->mutable_validation_context() + ->mutable_system_root_certs(); + transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context); + balancer_->ads_service()->SetCdsResource(cluster); + CheckRpcSendOk(DEBUG_LOCATION, 1, RpcOptions().set_timeout_ms(5000)); +} + TEST_P(XdsSecurityTest, TestMtlsConfigurationWithNoSanMatchers) { g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}}); UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1", diff --git a/test/cpp/ext/otel/otel_plugin_test.cc b/test/cpp/ext/otel/otel_plugin_test.cc index 863181f2d342e..cbc9b18fc4257 100644 --- a/test/cpp/ext/otel/otel_plugin_test.cc +++ b/test/cpp/ext/otel/otel_plugin_test.cc @@ -1919,7 +1919,7 @@ TEST_F(OpenTelemetryPluginCallbackMetricsTest, reporter.Report(double_gauge_handle, double_value_1++, kLabelValuesSet2, kOptionalLabelValuesSet2); }, - grpc_core::Duration::Milliseconds(10) * grpc_test_slowdown_factor(), + grpc_core::Duration::Milliseconds(50) * grpc_test_slowdown_factor(), integer_gauge_handle, double_gauge_handle); int report_count_2 = 0; int64_t int_value_2 = 1; @@ -1936,9 +1936,9 @@ TEST_F(OpenTelemetryPluginCallbackMetricsTest, reporter.Report(double_gauge_handle, double_value_2++, kLabelValuesSet2, kOptionalLabelValuesSet2); }, - grpc_core::Duration::Milliseconds(10) * grpc_test_slowdown_factor(), + grpc_core::Duration::Milliseconds(50) * grpc_test_slowdown_factor(), integer_gauge_handle, double_gauge_handle); - constexpr int kIterations = 100; + constexpr int kIterations = 50; MetricsCollectorThread collector{ this, grpc_core::Duration::Milliseconds(100) * grpc_test_slowdown_factor(), diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 548e78185a38a..218b0994f1fe0 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -394,3 +394,19 @@ grpc_cc_benchmark( "//test/core/test_util:grpc_test_util", ], ) + +grpc_cc_benchmark( + name = "bm_stats_plugin", + srcs = ["bm_stats_plugin.cc"], + external_deps = [ + "absl/strings", + "otel/sdk/src/metrics", + ], + deps = [ + ":helpers", + "//src/core:metrics", + "//src/cpp/ext/otel:otel_plugin", + "//test/core/test_util:fake_stats_plugin", + "//test/core/test_util:grpc_test_util", + ], +) diff --git a/test/cpp/microbenchmarks/grpc_benchmark_config.bzl b/test/cpp/microbenchmarks/grpc_benchmark_config.bzl index 4072c32c04f27..f19af0a77c056 100644 --- a/test/cpp/microbenchmarks/grpc_benchmark_config.bzl +++ b/test/cpp/microbenchmarks/grpc_benchmark_config.bzl @@ -45,7 +45,7 @@ def grpc_cc_benchmark(name, external_deps = [], tags = [], uses_polling = False, name = name, args = grpc_benchmark_args(), external_deps = ["benchmark"] + external_deps, - tags = tags + ["no_mac", "no_windows"], + tags = tags + ["no_mac", "no_windows", "bazel_only"], uses_polling = uses_polling, uses_event_engine = uses_event_engine, # cc_binary defaults to 1, and we are interested in performance diff --git a/test/distrib/ruby/run_distrib_test.sh b/test/distrib/ruby/run_distrib_test.sh index a611fd1b3732b..a8aefa0e091c3 100755 --- a/test/distrib/ruby/run_distrib_test.sh +++ b/test/distrib/ruby/run_distrib_test.sh @@ -25,6 +25,8 @@ function die { ARCH="$1" PLATFORM="$2" PACKAGE_TYPE="$3" +PROTOBUF_VERSION="$4" + echo "$EXTERNAL_GIT_ROOT" GRPC_VERSION="$(ruby -e 'require ENV["EXTERNAL_GIT_ROOT"] + "/src/ruby/lib/grpc/version.rb"; puts GRPC::VERSION')" if [[ "$PACKAGE_TYPE" == "source" ]]; then @@ -46,6 +48,10 @@ fi; gem install builder gem generate_index --directory "${GEM_SOURCE}" +if [[ -n "$PROTOBUF_VERSION" ]]; then + bundle add google-protobuf --version "~> $PROTOBUF_VERSION" +fi; + bundle install bundle exec ./distribtest.rb diff --git a/tools/bazelify_tests/dockerimage_current_versions.bzl b/tools/bazelify_tests/dockerimage_current_versions.bzl index a0ee0ee1ea9d6..996b09a38dcd4 100644 --- a/tools/bazelify_tests/dockerimage_current_versions.bzl +++ b/tools/bazelify_tests/dockerimage_current_versions.bzl @@ -54,7 +54,6 @@ DOCKERIMAGE_CURRENT_VERSIONS = { "tools/dockerfile/distribtest/python_python38_buster_aarch64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/python_python38_buster_aarch64@sha256:0a93bf2a0303aebe1280bafad69df228b9444af9144c767d8169ecc70fb383f6", "tools/dockerfile/distribtest/python_ubuntu2004_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/python_ubuntu2004_x64@sha256:288cf72bc98fc384b9352d1f6d258b3513925ffe5746dda7e2e343723dd5f733", "tools/dockerfile/distribtest/python_ubuntu2204_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/python_ubuntu2204_x64@sha256:6054d639247a93af2b496f3c1ce48f63b2e07f5ba54e025f69bb232a747c644e", - "tools/dockerfile/distribtest/ruby_centos7_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_centos7_x64@sha256:4d529b984b78ca179086f7f9b416605e2d9a96ca0a28a71f4421bb5ffdc18f96", "tools/dockerfile/distribtest/ruby_debian11_x64_ruby_3_0.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_x64_ruby_3_0@sha256:05c579d93764f12db1a60fa78a26e0f4d6179e54187a3a531c8ff955001731ec", "tools/dockerfile/distribtest/ruby_debian11_x64_ruby_3_1.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_x64_ruby_3_1@sha256:a48bb08275a588fbcea21b6b6056514b69454f6844bd7db9fd72c796892d02e1", "tools/dockerfile/distribtest/ruby_debian11_x64_ruby_3_2.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_x64_ruby_3_2@sha256:9604f8d07c3ea330cdc1ebe394f67828710bbfef52f0dc144e513e3627279b5a", diff --git a/tools/bazelify_tests/test/portability_tests.bzl b/tools/bazelify_tests/test/portability_tests.bzl index e7852dfb149af..d1a55957416ba 100644 --- a/tools/bazelify_tests/test/portability_tests.bzl +++ b/tools/bazelify_tests/test/portability_tests.bzl @@ -53,8 +53,8 @@ def generate_run_tests_portability_tests(name): # C and C++ under different compilers for language in ["c", "c++"]: compiler_configs = [ - # TODO(https://github.com/grpc/grpc/issues/36751): Replace gcc_8 with gcc_7 once it's fixed. - # ["gcc_7", "", "tools/dockerfile/test/cxx_gcc_7_x64.current_version"], + # Some gRPC tests have an issue with gcc-7 so gcc-7 portability test won't build any gRPC tests + ["gcc_7", "--cmake_configure_extra_args=-DgRPC_BUILD_TESTS=OFF", "tools/dockerfile/test/cxx_gcc_7_x64.current_version"], ["gcc_8", "", "tools/dockerfile/test/cxx_gcc_8_x64.current_version"], ["gcc_12_cxx20", "--cmake_configure_extra_args=-DCMAKE_CXX_STANDARD=20", "tools/dockerfile/test/cxx_gcc_12_x64.current_version"], ["gcc10.2_openssl102", "--cmake_configure_extra_args=-DgRPC_SSL_PROVIDER=package", "tools/dockerfile/test/cxx_debian11_openssl102_x64.current_version"], diff --git a/tools/buildgen/extract_metadata_from_bazel_xml.py b/tools/buildgen/extract_metadata_from_bazel_xml.py index bf203a26455a0..4cfbd22a9560c 100755 --- a/tools/buildgen/extract_metadata_from_bazel_xml.py +++ b/tools/buildgen/extract_metadata_from_bazel_xml.py @@ -1105,11 +1105,21 @@ def _detect_and_print_issues(build_yaml_like: BuildYaml) -> None: "build": "all", "_RENAME": "upb_json_lib", }, + "@com_google_protobuf//upb/mini_descriptor:mini_descriptor": { + "language": "c", + "build": "all", + "_RENAME": "upb_mini_descriptor_lib", + }, "@com_google_protobuf//upb/text:text": { "language": "c", "build": "all", "_RENAME": "upb_textformat_lib", }, + "@com_google_protobuf//upb/wire:wire": { + "language": "c", + "build": "all", + "_RENAME": "upb_wire_lib", + }, "@com_google_protobuf//third_party/utf8_range:utf8_range": { "language": "c", "build": "all", diff --git a/tools/codegen/core/experiments_compiler.py b/tools/codegen/core/experiments_compiler.py index 2159324309877..3d3cc2ee13d44 100644 --- a/tools/codegen/core/experiments_compiler.py +++ b/tools/codegen/core/experiments_compiler.py @@ -261,16 +261,17 @@ def AddRolloutSpecification( ) self._error = True return False - is_dict = isinstance(rollout_attributes["default"], dict) for platform in allowed_platforms: - if is_dict: + if isinstance(rollout_attributes["default"], dict): value = rollout_attributes["default"].get(platform, False) + if isinstance(value, dict): + # debug is assumed for all rollouts with additional constraints + self._default[platform] = "debug" + self._additional_constraints[platform] = value + continue else: value = rollout_attributes["default"] - if isinstance(value, dict): - self._default[platform] = "debug" - self._additional_constraints[platform] = value - elif value not in allowed_defaults: + if value not in allowed_defaults: print( "ERROR: default for experiment %s on platform %s " "is of incorrect format" @@ -278,9 +279,8 @@ def AddRolloutSpecification( ) self._error = True return False - else: - self._default[platform] = value - self._additional_constraints[platform] = {} + self._default[platform] = value + self._additional_constraints[platform] = {} return True @property @@ -637,6 +637,14 @@ def _ExperimentEnableSet(self, name): s.add(req) return s + def EnsureNoDebugExperiments(self): + for name, exp in self._experiment_definitions.items(): + for platform, default in exp._default.items(): + if default == "debug": + raise ValueError( + f"Debug experiments are prohibited. '{name}' is configured with {exp._default}" + ) + def GenExperimentsBzl(self, mode, output_file): assert self._FinalizeExperiments() if self._bzl_list_for_defaults is None: diff --git a/tools/codegen/core/gen_experiments.py b/tools/codegen/core/gen_experiments.py index 27000044174b4..0d4736e7dc195 100755 --- a/tools/codegen/core/gen_experiments.py +++ b/tools/codegen/core/gen_experiments.py @@ -87,6 +87,12 @@ def ParseCommandLineArguments(args): action="store_false", help="If specified, disables checking experiment expiry dates", ) + flag_parser.add_argument( + "--no_dbg_experiments", + action="store_true", + help="Prohibit 'debug' configurations", + default=False, + ) return flag_parser.parse_args(args) @@ -162,6 +168,10 @@ def _GenerateExperimentFiles(args, mode): print("ERROR adding rollout spec") sys.exit(1) + if mode != "test" and args.no_dbg_experiments: + print("Ensuring no debug experiments are configured") + compiler.EnsureNoDebugExperiments() + print(f"Mode = {mode} Generating experiments headers") compiler.GenerateExperimentsHdr(_EXPERIMENTS_HDR_FILE, mode) diff --git a/tools/codegen/core/gen_join.py b/tools/codegen/core/gen_join.py index 418b7c87219b3..d0bd3434a07c9 100755 --- a/tools/codegen/core/gen_join.py +++ b/tools/codegen/core/gen_join.py @@ -46,13 +46,10 @@ } JoinState& operator=(const JoinState& other) = delete; JoinState& operator=(JoinState&& other) = delete; - GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept : ready(other.ready) { + GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION JoinState(JoinState&& other) noexcept { + DCHECK(other.ready.none()); % for i in range(0,n): - if (ready.is_set(${i})) { - Construct(&result${i}, std::move(other.result${i})); - } else { - Construct(&promise${i}, std::move(other.promise${i})); - } + Construct(&promise${i}, std::move(other.promise${i})); % endfor } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~JoinState() { diff --git a/tools/codegen/core/gen_seq.py b/tools/codegen/core/gen_seq.py index faa5b65a4eb46..f537fd63f9c83 100755 --- a/tools/codegen/core/gen_seq.py +++ b/tools/codegen/core/gen_seq.py @@ -110,9 +110,9 @@ % endfor } GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(const SeqState& other) noexcept : state(other.state), whence(other.whence) { - CHECK(state == State::kState0); - Construct(&${"prior."*(n-1-i)}current_promise, - other.${"prior."*(n-1-i)}current_promise); + DCHECK(state == State::kState0); + Construct(&${"prior."*(n-1)}current_promise, + other.${"prior."*(n-1)}current_promise); % for i in range(0,n-1): Construct(&${"prior."*(n-1-i)}next_factory, other.${"prior."*(n-1-i)}next_factory); @@ -120,19 +120,10 @@ } SeqState& operator=(const SeqState& other) = delete; GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION SeqState(SeqState&& other) noexcept : state(other.state), whence(other.whence) { - switch (state) { + DCHECK(state == State::kState0); + Construct(&${"prior."*(n-1)}current_promise, + std::move(other.${"prior."*(n-1)}current_promise)); % for i in range(0,n-1): - case State::kState${i}: - Construct(&${"prior."*(n-1-i)}current_promise, - std::move(other.${"prior."*(n-1-i)}current_promise)); - goto tail${i}; -% endfor - case State::kState${n-1}: - Construct(¤t_promise, std::move(other.current_promise)); - return; - } -% for i in range(0,n-1): -tail${i}: Construct(&${"prior."*(n-1-i)}next_factory, std::move(other.${"prior."*(n-1-i)}next_factory)); % endfor diff --git a/tools/codegen/core/gen_stats_data.py b/tools/codegen/core/gen_stats_data.py index b7e66f00107b2..44fdcb00abc71 100755 --- a/tools/codegen/core/gen_stats_data.py +++ b/tools/codegen/core/gen_stats_data.py @@ -302,6 +302,10 @@ def snake_to_pascal(name): print(" public:", file=H) print(" static int BucketFor(int value);", file=H) print(" const uint64_t* buckets() const { return buckets_; }", file=H) + print( + " size_t bucket_count() const { return %d; }" % shape.buckets, + file=H, + ) print( " friend Histogram_%d_%d operator-(const Histogram_%d_%d& left," " const Histogram_%d_%d& right);" diff --git a/tools/distrib/fix_build_deps.py b/tools/distrib/fix_build_deps.py index 3b93cb23fe56c..4753db69bb3d6 100755 --- a/tools/distrib/fix_build_deps.py +++ b/tools/distrib/fix_build_deps.py @@ -404,6 +404,7 @@ def score_best(proposed, existing): "test/core/call/yodel", "test/core/client_channel", "test/core/experiments", + "test/core/load_balancing", "test/core/uri", "test/core/test_util", "test/core/end2end", @@ -430,6 +431,7 @@ def score_best(proposed, existing): "config_setting": lambda **kwargs: None, "selects": FakeSelects(), "python_config_settings": lambda **kwargs: None, + "grpc_cc_benchmark": grpc_cc_library, "grpc_cc_binary": grpc_cc_library, "grpc_cc_library": grpc_cc_library, "grpc_cc_test": grpc_cc_library, diff --git a/tools/distrib/gen_experiments_and_format.sh b/tools/distrib/gen_experiments_and_format.sh index f1fa5440dce76..d5dd5a703ad55 100755 --- a/tools/distrib/gen_experiments_and_format.sh +++ b/tools/distrib/gen_experiments_and_format.sh @@ -15,7 +15,7 @@ set -e cd $(dirname $0)/../.. -tools/codegen/core/gen_experiments.py --check +tools/codegen/core/gen_experiments.py --check --no_dbg_experiments # clang format TEST='' \ CHANGED_FILES="$(git status --porcelain | awk '{print $2}' | tr '\n' ' ')" \ diff --git a/tools/distrib/python/grpc_version.py b/tools/distrib/python/grpc_version.py index c96b43acd3063..0a2b4c0a17ced 100644 --- a/tools/distrib/python/grpc_version.py +++ b/tools/distrib/python/grpc_version.py @@ -14,5 +14,5 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' PROTOBUF_VERSION = '3.27.2' diff --git a/tools/distrib/python/grpcio_tools/grpc_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_tools/grpc_version.py index faa89ddf83785..164aa76d02a9c 100644 --- a/tools/distrib/python/grpcio_tools/grpc_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_tools/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_tools/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py index 9166c14570e88..85cac2659c304 100644 --- a/tools/distrib/python/grpcio_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_version.py @@ -14,5 +14,5 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' PROTOBUF_VERSION = '3.27.2' diff --git a/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py b/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py index 65716280de8fb..2dd84f96e9a3d 100644 --- a/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py +++ b/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py @@ -37,7 +37,7 @@ from validate import validate_pb2 as validate_dot_validate__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%envoy/config/cluster/v3/cluster.proto\x12\x17\x65nvoy.config.cluster.v3\x1a-envoy/config/cluster/v3/circuit_breaker.proto\x1a$envoy/config/cluster/v3/filter.proto\x1a/envoy/config/cluster/v3/outlier_detection.proto\x1a\"envoy/config/core/v3/address.proto\x1a\x1f\x65nvoy/config/core/v3/base.proto\x1a(envoy/config/core/v3/config_source.proto\x1a$envoy/config/core/v3/extension.proto\x1a\'envoy/config/core/v3/health_check.proto\x1a#envoy/config/core/v3/protocol.proto\x1a#envoy/config/core/v3/resolver.proto\x1a\'envoy/config/endpoint/v3/endpoint.proto\x1a%envoy/type/metadata/v3/metadata.proto\x1a\x1b\x65nvoy/type/v3/percent.proto\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\"xds/core/v3/collection_entry.proto\x1a#envoy/annotations/deprecation.proto\x1a\x1eudpa/annotations/migrate.proto\x1a\x1fudpa/annotations/security.proto\x1a\x1dudpa/annotations/status.proto\x1a!udpa/annotations/versioning.proto\x1a\x17validate/validate.proto\"B\n\x11\x43lusterCollection\x12-\n\x07\x65ntries\x18\x01 \x01(\x0b\x32\x1c.xds.core.v3.CollectionEntry\"\xb9\x44\n\x07\x43luster\x12W\n\x18transport_socket_matches\x18+ \x03(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12\x31\n\ralt_stat_name\x18\x1c \x01(\tB\x1a\xf2\x98\xfe\x8f\x05\x14\n\x12observability_name\x12H\n\x04type\x18\x02 \x01(\x0e\x32..envoy.config.cluster.v3.Cluster.DiscoveryTypeB\x08\xfa\x42\x05\x82\x01\x02\x10\x01H\x00\x12J\n\x0c\x63luster_type\x18& \x01(\x0b\x32\x32.envoy.config.cluster.v3.Cluster.CustomClusterTypeH\x00\x12M\n\x12\x65\x64s_cluster_config\x18\x03 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.EdsClusterConfig\x12<\n\x0f\x63onnect_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationB\x08\xfa\x42\x05\xaa\x01\x02*\x00\x12P\n!per_connection_buffer_limit_bytes\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\x8a\x93\xb7*\x02\x10\x01\x12\x46\n\tlb_policy\x18\x06 \x01(\x0e\x32).envoy.config.cluster.v3.Cluster.LbPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12H\n\x0fload_assignment\x18! \x01(\x0b\x32/.envoy.config.endpoint.v3.ClusterLoadAssignment\x12\x38\n\rhealth_checks\x18\x08 \x03(\x0b\x32!.envoy.config.core.v3.HealthCheck\x12N\n\x1bmax_requests_per_connection\x18\t \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x42\n\x10\x63ircuit_breakers\x18\n \x01(\x0b\x32(.envoy.config.cluster.v3.CircuitBreakers\x12\x66\n\x1eupstream_http_protocol_options\x18. \x01(\x0b\x32\x31.envoy.config.core.v3.UpstreamHttpProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\\\n\x1c\x63ommon_http_protocol_options\x18\x1d \x01(\x0b\x32).envoy.config.core.v3.HttpProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12V\n\x15http_protocol_options\x18\r \x01(\x0b\x32*.envoy.config.core.v3.Http1ProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12^\n\x16http2_protocol_options\x18\x0e \x01(\x0b\x32*.envoy.config.core.v3.Http2ProtocolOptionsB\x12\x18\x01\x8a\x93\xb7*\x02\x10\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12m\n typed_extension_protocol_options\x18$ \x03(\x0b\x32\x43.envoy.config.cluster.v3.Cluster.TypedExtensionProtocolOptionsEntry\x12\x41\n\x10\x64ns_refresh_rate\x18\x10 \x01(\x0b\x32\x19.google.protobuf.DurationB\x0c\xfa\x42\t\xaa\x01\x06*\x04\x10\xc0\x84=\x12N\n\x18\x64ns_failure_refresh_rate\x18, \x01(\x0b\x32,.envoy.config.cluster.v3.Cluster.RefreshRate\x12\x17\n\x0frespect_dns_ttl\x18\' \x01(\x08\x12U\n\x11\x64ns_lookup_family\x18\x11 \x01(\x0e\x32\x30.envoy.config.cluster.v3.Cluster.DnsLookupFamilyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x41\n\rdns_resolvers\x18\x12 \x03(\x0b\x32\x1d.envoy.config.core.v3.AddressB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12,\n\x17use_tcp_for_dns_lookups\x18- \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12U\n\x15\x64ns_resolution_config\x18\x35 \x01(\x0b\x32).envoy.config.core.v3.DnsResolutionConfigB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12M\n\x19typed_dns_resolver_config\x18\x37 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12\x39\n\x15wait_for_warm_on_init\x18\x36 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x44\n\x11outlier_detection\x18\x13 \x01(\x0b\x32).envoy.config.cluster.v3.OutlierDetection\x12=\n\x10\x63leanup_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.DurationB\x08\xfa\x42\x05\xaa\x01\x02*\x00\x12>\n\x14upstream_bind_config\x18\x15 \x01(\x0b\x32 .envoy.config.core.v3.BindConfig\x12I\n\x10lb_subset_config\x18\x16 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.LbSubsetConfig\x12P\n\x13ring_hash_lb_config\x18\x17 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.RingHashLbConfigH\x01\x12K\n\x10maglev_lb_config\x18\x34 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.MaglevLbConfigH\x01\x12V\n\x16original_dst_lb_config\x18\" \x01(\x0b\x32\x34.envoy.config.cluster.v3.Cluster.OriginalDstLbConfigH\x01\x12X\n\x17least_request_lb_config\x18% \x01(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.LeastRequestLbConfigH\x01\x12T\n\x15round_robin_lb_config\x18\x38 \x01(\x0b\x32\x33.envoy.config.cluster.v3.Cluster.RoundRobinLbConfigH\x01\x12I\n\x10\x63ommon_lb_config\x18\x1b \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.CommonLbConfig\x12?\n\x10transport_socket\x18\x18 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket\x12\x30\n\x08metadata\x18\x19 \x01(\x0b\x32\x1e.envoy.config.core.v3.Metadata\x12\x62\n\x12protocol_selection\x18\x1a \x01(\x0e\x32\x39.envoy.config.cluster.v3.Cluster.ClusterProtocolSelectionB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12W\n\x1bupstream_connection_options\x18\x1e \x01(\x0b\x32\x32.envoy.config.cluster.v3.UpstreamConnectionOptions\x12\x30\n(close_connections_on_host_health_failure\x18\x1f \x01(\x08\x12%\n\x1dignore_health_on_host_removal\x18 \x01(\x08\x12\x30\n\x07\x66ilters\x18( \x03(\x0b\x32\x1f.envoy.config.cluster.v3.Filter\x12K\n\x15load_balancing_policy\x18) \x01(\x0b\x32,.envoy.config.cluster.v3.LoadBalancingPolicy\x12\x36\n\nlrs_server\x18* \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12*\n\x15track_timeout_budgets\x18/ \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x43\n\x0fupstream_config\x18\x30 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12G\n\x13track_cluster_stats\x18\x31 \x01(\x0b\x32*.envoy.config.cluster.v3.TrackClusterStats\x12L\n\x11preconnect_policy\x18\x32 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.PreconnectPolicy\x12\x31\n)connection_pool_per_downstream_connection\x18\x33 \x01(\x08\x1a\xc8\x01\n\x14TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12&\n\x05match\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12?\n\x10transport_socket\x18\x03 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.TransportSocketMatch\x1a\x85\x01\n\x11\x43ustomClusterType\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12*\n\x0ctyped_config\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:-\x9a\xc5\x88\x1e(\n&envoy.api.v2.Cluster.CustomClusterType\x1a\x8e\x01\n\x10\x45\x64sClusterConfig\x12\x36\n\neds_config\x18\x01 \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12\x14\n\x0cservice_name\x18\x02 \x01(\t:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.EdsClusterConfig\x1a\xd9\x08\n\x0eLbSubsetConfig\x12i\n\x0f\x66\x61llback_policy\x18\x01 \x01(\x0e\x32\x46.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12/\n\x0e\x64\x65\x66\x61ult_subset\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12Z\n\x10subset_selectors\x18\x03 \x03(\x0b\x32@.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector\x12\x1d\n\x15locality_weight_aware\x18\x04 \x01(\x08\x12\x1d\n\x15scale_locality_weight\x18\x05 \x01(\x08\x12\x16\n\x0epanic_mode_any\x18\x06 \x01(\x08\x12\x13\n\x0blist_as_any\x18\x07 \x01(\x08\x12z\n\x18metadata_fallback_policy\x18\x08 \x01(\x0e\x32N.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x1a\x9b\x03\n\x10LbSubsetSelector\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x1e\n\x16single_host_per_subset\x18\x04 \x01(\x08\x12\x82\x01\n\x0f\x66\x61llback_policy\x18\x02 \x01(\x0e\x32_.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x1c\n\x14\x66\x61llback_keys_subset\x18\x03 \x03(\t\"y\n\x1eLbSubsetSelectorFallbackPolicy\x12\x0f\n\x0bNOT_DEFINED\x10\x00\x12\x0f\n\x0bNO_FALLBACK\x10\x01\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x02\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x03\x12\x0f\n\x0bKEYS_SUBSET\x10\x04:;\x9a\xc5\x88\x1e\x36\n4envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector\"O\n\x16LbSubsetFallbackPolicy\x12\x0f\n\x0bNO_FALLBACK\x10\x00\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x01\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x02\"M\n\x1eLbSubsetMetadataFallbackPolicy\x12\x18\n\x14METADATA_NO_FALLBACK\x10\x00\x12\x11\n\rFALLBACK_LIST\x10\x01:*\x9a\xc5\x88\x1e%\n#envoy.api.v2.Cluster.LbSubsetConfig\x1a\xb4\x01\n\x0fSlowStartConfig\x12\x34\n\x11slow_start_window\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\naggression\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12\x32\n\x12min_weight_percent\x18\x03 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x1a\x61\n\x12RoundRobinLbConfig\x12K\n\x11slow_start_config\x18\x01 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig\x1a\x94\x02\n\x14LeastRequestLbConfig\x12;\n\x0c\x63hoice_count\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\xfa\x42\x04*\x02(\x02\x12@\n\x13\x61\x63tive_request_bias\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12K\n\x11slow_start_config\x18\x03 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.LeastRequestLbConfig\x1a\xe1\x02\n\x10RingHashLbConfig\x12\x43\n\x11minimum_ring_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\x12_\n\rhash_function\x18\x03 \x01(\x0e\x32>.envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunctionB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x43\n\x11maximum_ring_size\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\".\n\x0cHashFunction\x12\x0b\n\x07XX_HASH\x10\x00\x12\x11\n\rMURMUR_HASH_2\x10\x01:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.RingHashLbConfigJ\x04\x08\x02\x10\x03\x1aN\n\x0eMaglevLbConfig\x12<\n\ntable_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\xcb\x96\xb1\x02\x1a\xfd\x01\n\x13OriginalDstLbConfig\x12\x17\n\x0fuse_http_header\x18\x01 \x01(\x08\x12\x18\n\x10http_header_name\x18\x02 \x01(\t\x12G\n\x16upstream_port_override\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\t\xfa\x42\x06*\x04\x18\xff\xff\x03\x12\x39\n\x0cmetadata_key\x18\x04 \x01(\x0b\x32#.envoy.type.metadata.v3.MetadataKey:/\x9a\xc5\x88\x1e*\n(envoy.api.v2.Cluster.OriginalDstLbConfig\x1a\xb2\t\n\x0e\x43ommonLbConfig\x12\x37\n\x17healthy_panic_threshold\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x61\n\x14zone_aware_lb_config\x18\x02 \x01(\x0b\x32\x41.envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfigH\x00\x12o\n\x1blocality_weighted_lb_config\x18\x03 \x01(\x0b\x32H.envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfigH\x00\x12\x36\n\x13update_merge_window\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1fignore_new_hosts_until_first_hc\x18\x05 \x01(\x08\x12,\n$close_connections_on_host_set_change\x18\x06 \x01(\x08\x12o\n\x1c\x63onsistent_hashing_lb_config\x18\x07 \x01(\x0b\x32I.envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig\x12\x43\n\x14override_host_status\x18\x08 \x01(\x0b\x32%.envoy.config.core.v3.HealthStatusSet\x1a\xd9\x01\n\x11ZoneAwareLbConfig\x12/\n\x0frouting_enabled\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x36\n\x10min_cluster_size\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt64Value\x12\x1d\n\x15\x66\x61il_traffic_on_panic\x18\x03 \x01(\x08:<\x9a\xc5\x88\x1e\x37\n5envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig\x1a_\n\x18LocalityWeightedLbConfig:C\x9a\xc5\x88\x1e>\n\n\x14upstream_bind_config\x18\x15 \x01(\x0b\x32 .envoy.config.core.v3.BindConfig\x12I\n\x10lb_subset_config\x18\x16 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.LbSubsetConfig\x12P\n\x13ring_hash_lb_config\x18\x17 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.RingHashLbConfigH\x01\x12K\n\x10maglev_lb_config\x18\x34 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.MaglevLbConfigH\x01\x12V\n\x16original_dst_lb_config\x18\" \x01(\x0b\x32\x34.envoy.config.cluster.v3.Cluster.OriginalDstLbConfigH\x01\x12X\n\x17least_request_lb_config\x18% \x01(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.LeastRequestLbConfigH\x01\x12T\n\x15round_robin_lb_config\x18\x38 \x01(\x0b\x32\x33.envoy.config.cluster.v3.Cluster.RoundRobinLbConfigH\x01\x12I\n\x10\x63ommon_lb_config\x18\x1b \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.CommonLbConfig\x12?\n\x10transport_socket\x18\x18 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket\x12\x30\n\x08metadata\x18\x19 \x01(\x0b\x32\x1e.envoy.config.core.v3.Metadata\x12\x62\n\x12protocol_selection\x18\x1a \x01(\x0e\x32\x39.envoy.config.cluster.v3.Cluster.ClusterProtocolSelectionB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12W\n\x1bupstream_connection_options\x18\x1e \x01(\x0b\x32\x32.envoy.config.cluster.v3.UpstreamConnectionOptions\x12\x30\n(close_connections_on_host_health_failure\x18\x1f \x01(\x08\x12%\n\x1dignore_health_on_host_removal\x18 \x01(\x08\x12\x30\n\x07\x66ilters\x18( \x03(\x0b\x32\x1f.envoy.config.cluster.v3.Filter\x12K\n\x15load_balancing_policy\x18) \x01(\x0b\x32,.envoy.config.cluster.v3.LoadBalancingPolicy\x12\x36\n\nlrs_server\x18* \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12#\n\x1blrs_report_endpoint_metrics\x18\x39 \x03(\t\x12*\n\x15track_timeout_budgets\x18/ \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x43\n\x0fupstream_config\x18\x30 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12G\n\x13track_cluster_stats\x18\x31 \x01(\x0b\x32*.envoy.config.cluster.v3.TrackClusterStats\x12L\n\x11preconnect_policy\x18\x32 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.PreconnectPolicy\x12\x31\n)connection_pool_per_downstream_connection\x18\x33 \x01(\x08\x1a\xc8\x01\n\x14TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12&\n\x05match\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12?\n\x10transport_socket\x18\x03 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.TransportSocketMatch\x1a\x85\x01\n\x11\x43ustomClusterType\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12*\n\x0ctyped_config\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:-\x9a\xc5\x88\x1e(\n&envoy.api.v2.Cluster.CustomClusterType\x1a\x8e\x01\n\x10\x45\x64sClusterConfig\x12\x36\n\neds_config\x18\x01 \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12\x14\n\x0cservice_name\x18\x02 \x01(\t:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.EdsClusterConfig\x1a\xd9\x08\n\x0eLbSubsetConfig\x12i\n\x0f\x66\x61llback_policy\x18\x01 \x01(\x0e\x32\x46.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12/\n\x0e\x64\x65\x66\x61ult_subset\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12Z\n\x10subset_selectors\x18\x03 \x03(\x0b\x32@.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector\x12\x1d\n\x15locality_weight_aware\x18\x04 \x01(\x08\x12\x1d\n\x15scale_locality_weight\x18\x05 \x01(\x08\x12\x16\n\x0epanic_mode_any\x18\x06 \x01(\x08\x12\x13\n\x0blist_as_any\x18\x07 \x01(\x08\x12z\n\x18metadata_fallback_policy\x18\x08 \x01(\x0e\x32N.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x1a\x9b\x03\n\x10LbSubsetSelector\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x1e\n\x16single_host_per_subset\x18\x04 \x01(\x08\x12\x82\x01\n\x0f\x66\x61llback_policy\x18\x02 \x01(\x0e\x32_.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x1c\n\x14\x66\x61llback_keys_subset\x18\x03 \x03(\t\"y\n\x1eLbSubsetSelectorFallbackPolicy\x12\x0f\n\x0bNOT_DEFINED\x10\x00\x12\x0f\n\x0bNO_FALLBACK\x10\x01\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x02\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x03\x12\x0f\n\x0bKEYS_SUBSET\x10\x04:;\x9a\xc5\x88\x1e\x36\n4envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector\"O\n\x16LbSubsetFallbackPolicy\x12\x0f\n\x0bNO_FALLBACK\x10\x00\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x01\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x02\"M\n\x1eLbSubsetMetadataFallbackPolicy\x12\x18\n\x14METADATA_NO_FALLBACK\x10\x00\x12\x11\n\rFALLBACK_LIST\x10\x01:*\x9a\xc5\x88\x1e%\n#envoy.api.v2.Cluster.LbSubsetConfig\x1a\xb4\x01\n\x0fSlowStartConfig\x12\x34\n\x11slow_start_window\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\naggression\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12\x32\n\x12min_weight_percent\x18\x03 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x1a\x61\n\x12RoundRobinLbConfig\x12K\n\x11slow_start_config\x18\x01 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig\x1a\x94\x02\n\x14LeastRequestLbConfig\x12;\n\x0c\x63hoice_count\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\xfa\x42\x04*\x02(\x02\x12@\n\x13\x61\x63tive_request_bias\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12K\n\x11slow_start_config\x18\x03 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.LeastRequestLbConfig\x1a\xe1\x02\n\x10RingHashLbConfig\x12\x43\n\x11minimum_ring_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\x12_\n\rhash_function\x18\x03 \x01(\x0e\x32>.envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunctionB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x43\n\x11maximum_ring_size\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\".\n\x0cHashFunction\x12\x0b\n\x07XX_HASH\x10\x00\x12\x11\n\rMURMUR_HASH_2\x10\x01:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.RingHashLbConfigJ\x04\x08\x02\x10\x03\x1aN\n\x0eMaglevLbConfig\x12<\n\ntable_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\xcb\x96\xb1\x02\x1a\xfd\x01\n\x13OriginalDstLbConfig\x12\x17\n\x0fuse_http_header\x18\x01 \x01(\x08\x12\x18\n\x10http_header_name\x18\x02 \x01(\t\x12G\n\x16upstream_port_override\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\t\xfa\x42\x06*\x04\x18\xff\xff\x03\x12\x39\n\x0cmetadata_key\x18\x04 \x01(\x0b\x32#.envoy.type.metadata.v3.MetadataKey:/\x9a\xc5\x88\x1e*\n(envoy.api.v2.Cluster.OriginalDstLbConfig\x1a\xb2\t\n\x0e\x43ommonLbConfig\x12\x37\n\x17healthy_panic_threshold\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x61\n\x14zone_aware_lb_config\x18\x02 \x01(\x0b\x32\x41.envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfigH\x00\x12o\n\x1blocality_weighted_lb_config\x18\x03 \x01(\x0b\x32H.envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfigH\x00\x12\x36\n\x13update_merge_window\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1fignore_new_hosts_until_first_hc\x18\x05 \x01(\x08\x12,\n$close_connections_on_host_set_change\x18\x06 \x01(\x08\x12o\n\x1c\x63onsistent_hashing_lb_config\x18\x07 \x01(\x0b\x32I.envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig\x12\x43\n\x14override_host_status\x18\x08 \x01(\x0b\x32%.envoy.config.core.v3.HealthStatusSet\x1a\xd9\x01\n\x11ZoneAwareLbConfig\x12/\n\x0frouting_enabled\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x36\n\x10min_cluster_size\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt64Value\x12\x1d\n\x15\x66\x61il_traffic_on_panic\x18\x03 \x01(\x08:<\x9a\xc5\x88\x1e\x37\n5envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig\x1a_\n\x18LocalityWeightedLbConfig:C\x9a\xc5\x88\x1e>\n\n\x0bstatus_code\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x0b\xfa\x42\x08*\x06\x18\xe7\x07(\xc8\x01\x12S\n\x17response_headers_to_add\x18\x04 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12R\n\x16request_headers_to_add\x18\x05 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12Q\n\x1dmodify_request_headers_action\x18\x06 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfigB \n\x19redirect_action_specifier\x12\x03\xf8\x42\x01\x42\xe2\x01\nFio.envoyproxy.envoy.extensions.http.custom_response.redirect_policy.v3B\x13RedirectPolicyProtoP\x01Zqgithub.com/envoyproxy/go-control-plane/envoy/extensions/http/custom_response/redirect_policy/v3;redirect_policyv3\xba\x80\xc8\xd1\x06\x02\x10\x02\xd2\xc6\xa4\xe1\x06\x02\x08\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,11 +33,11 @@ _REDIRECTPOLICY.fields_by_name['uri']._options = None _REDIRECTPOLICY.fields_by_name['uri']._serialized_options = b'\372B\004r\002\020\001' _REDIRECTPOLICY.fields_by_name['status_code']._options = None - _REDIRECTPOLICY.fields_by_name['status_code']._serialized_options = b'\372B\007*\005\030\347\007(d' + _REDIRECTPOLICY.fields_by_name['status_code']._serialized_options = b'\372B\010*\006\030\347\007(\310\001' _REDIRECTPOLICY.fields_by_name['response_headers_to_add']._options = None _REDIRECTPOLICY.fields_by_name['response_headers_to_add']._serialized_options = b'\372B\006\222\001\003\020\350\007' _REDIRECTPOLICY.fields_by_name['request_headers_to_add']._options = None _REDIRECTPOLICY.fields_by_name['request_headers_to_add']._serialized_options = b'\372B\006\222\001\003\020\350\007' _globals['_REDIRECTPOLICY']._serialized_start=379 - _globals['_REDIRECTPOLICY']._serialized_end=834 + _globals['_REDIRECTPOLICY']._serialized_end=835 # @@protoc_insertion_point(module_scope) diff --git a/tools/distrib/python/xds_protos/generated_file_import_test.py b/tools/distrib/python/xds_protos/generated_file_import_test.py index c7fc6cb811f99..4487a82a09082 100644 --- a/tools/distrib/python/xds_protos/generated_file_import_test.py +++ b/tools/distrib/python/xds_protos/generated_file_import_test.py @@ -463,6 +463,7 @@ from envoy.extensions.string_matcher.lua.v3 import lua_pb2 from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import dynatrace_resource_detector_pb2 from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import environment_resource_detector_pb2 +from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import static_config_resource_detector_pb2 from envoy.extensions.tracers.opentelemetry.samplers.v3 import always_on_sampler_pb2 from envoy.extensions.tracers.opentelemetry.samplers.v3 import dynatrace_sampler_pb2 from envoy.extensions.transport_sockets.alts.v3 import alts_pb2 diff --git a/tools/distrib/python/xds_protos/grpc_version.py b/tools/distrib/python/xds_protos/grpc_version.py index dc857d8dcc5b9..978c2c572b6c9 100644 --- a/tools/distrib/python/xds_protos/grpc_version.py +++ b/tools/distrib/python/xds_protos/grpc_version.py @@ -14,5 +14,5 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION = '1.66.0.dev0' +VERSION = '1.67.0.dev0' PROTOBUF_VERSION = '3.27.2' diff --git a/tools/dockerfile/distribtest/ruby_centos7_x64.current_version b/tools/dockerfile/distribtest/ruby_centos7_x64.current_version deleted file mode 100644 index d65b1a461cc22..0000000000000 --- a/tools/dockerfile/distribtest/ruby_centos7_x64.current_version +++ /dev/null @@ -1 +0,0 @@ -us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_centos7_x64:b37e078e920ba1f75bd26bc67c2d3496432e36af@sha256:4d529b984b78ca179086f7f9b416605e2d9a96ca0a28a71f4421bb5ffdc18f96 \ No newline at end of file diff --git a/tools/dockerfile/distribtest/ruby_centos7_x64/Dockerfile b/tools/dockerfile/distribtest/ruby_centos7_x64/Dockerfile deleted file mode 100644 index 944ff76c56148..0000000000000 --- a/tools/dockerfile/distribtest/ruby_centos7_x64/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2015 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM centos:7 - -RUN yum update -y && yum install -y curl tar which - -# Install rvm -RUN gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB -RUN curl -sSL https://get.rvm.io | bash -s stable - -# Install Ruby 2.7 -RUN /bin/bash -l -c "rvm install ruby-2.7" -RUN /bin/bash -l -c "rvm use --default ruby-2.7" -RUN /bin/bash -l -c "echo 'gem: --no-document' > ~/.gemrc" -RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc" -RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.7' >> ~/.bashrc" -RUN /bin/bash -l -c "gem install bundler --no-document" - -RUN mkdir /var/local/jenkins - -RUN /bin/bash -l -c "echo '. /etc/profile.d/rvm.sh' >> ~/.bashrc" diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 1ef3371ccf5ad..40501c821bca0 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.66.0-dev +PROJECT_NUMBER = 1.67.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 112a3c6d24abc..68987e28551f7 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.66.0-dev +PROJECT_NUMBER = 1.67.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -1254,8 +1254,6 @@ src/core/ext/transport/chttp2/transport/huffsyms.cc \ src/core/ext/transport/chttp2/transport/huffsyms.h \ src/core/ext/transport/chttp2/transport/internal.h \ src/core/ext/transport/chttp2/transport/legacy_frame.h \ -src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc \ -src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h \ src/core/ext/transport/chttp2/transport/parsing.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.h \ @@ -2647,7 +2645,6 @@ src/core/lib/slice/slice_internal.h \ src/core/lib/slice/slice_refcount.h \ src/core/lib/slice/slice_string_helpers.cc \ src/core/lib/slice/slice_string_helpers.h \ -src/core/lib/surface/api_trace.h \ src/core/lib/surface/byte_buffer.cc \ src/core/lib/surface/byte_buffer_reader.cc \ src/core/lib/surface/call.cc \ @@ -2949,6 +2946,7 @@ src/core/util/posix/string.cc \ src/core/util/posix/sync.cc \ src/core/util/posix/time.cc \ src/core/util/posix/tmpfile.cc \ +src/core/util/ring_buffer.h \ src/core/util/spinlock.h \ src/core/util/string.cc \ src/core/util/string.h \ @@ -2958,6 +2956,7 @@ src/core/util/time.cc \ src/core/util/time_precise.cc \ src/core/util/time_precise.h \ src/core/util/tmpfile.h \ +src/core/util/unique_ptr_with_bitset.h \ src/core/util/upb_utils.h \ src/core/util/useful.h \ src/core/util/windows/cpu.cc \ diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index 3242f05f88bcf..9748cec3244af 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Core" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 42.0.0 +PROJECT_NUMBER = 43.0.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 6a60330a420ca..c0bdead5549f8 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Core" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 42.0.0 +PROJECT_NUMBER = 43.0.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -1022,8 +1022,6 @@ src/core/ext/transport/chttp2/transport/huffsyms.cc \ src/core/ext/transport/chttp2/transport/huffsyms.h \ src/core/ext/transport/chttp2/transport/internal.h \ src/core/ext/transport/chttp2/transport/legacy_frame.h \ -src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.cc \ -src/core/ext/transport/chttp2/transport/max_concurrent_streams_policy.h \ src/core/ext/transport/chttp2/transport/parsing.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc \ src/core/ext/transport/chttp2/transport/ping_abuse_policy.h \ @@ -2420,7 +2418,6 @@ src/core/lib/slice/slice_refcount.h \ src/core/lib/slice/slice_string_helpers.cc \ src/core/lib/slice/slice_string_helpers.h \ src/core/lib/surface/README.md \ -src/core/lib/surface/api_trace.h \ src/core/lib/surface/byte_buffer.cc \ src/core/lib/surface/byte_buffer_reader.cc \ src/core/lib/surface/call.cc \ @@ -2729,6 +2726,7 @@ src/core/util/posix/string.cc \ src/core/util/posix/sync.cc \ src/core/util/posix/time.cc \ src/core/util/posix/tmpfile.cc \ +src/core/util/ring_buffer.h \ src/core/util/spinlock.h \ src/core/util/string.cc \ src/core/util/string.h \ @@ -2738,6 +2736,7 @@ src/core/util/time.cc \ src/core/util/time_precise.cc \ src/core/util/time_precise.h \ src/core/util/tmpfile.h \ +src/core/util/unique_ptr_with_bitset.h \ src/core/util/upb_utils.h \ src/core/util/useful.h \ src/core/util/windows/cpu.cc \ diff --git a/tools/doxygen/Doxyfile.objc b/tools/doxygen/Doxyfile.objc index c62c68fb8d1fc..a212a28a91088 100644 --- a/tools/doxygen/Doxyfile.objc +++ b/tools/doxygen/Doxyfile.objc @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.66.0-dev +PROJECT_NUMBER = 1.67.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.objc.internal b/tools/doxygen/Doxyfile.objc.internal index a73b22399e385..5661dd708c50a 100644 --- a/tools/doxygen/Doxyfile.objc.internal +++ b/tools/doxygen/Doxyfile.objc.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.66.0-dev +PROJECT_NUMBER = 1.67.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.php b/tools/doxygen/Doxyfile.php index 4e8a641ca5698..4908e4f06e9cb 100644 --- a/tools/doxygen/Doxyfile.php +++ b/tools/doxygen/Doxyfile.php @@ -40,7 +40,7 @@ # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.66.0-dev +PROJECT_NUMBER = 1.67.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/internal_ci/linux/arm64/grpc_basictests_csharp.cfg b/tools/internal_ci/linux/arm64/grpc_basictests_csharp.cfg index dfd3e27c96604..3b5e1cfb4b8fe 100644 --- a/tools/internal_ci/linux/arm64/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/linux/arm64/grpc_basictests_csharp.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests_arm64 linux csharp --inner_jobs 4 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests_arm64 linux csharp --inner_jobs 4 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/arm64/grpc_basictests_php.cfg b/tools/internal_ci/linux/arm64/grpc_basictests_php.cfg index cda33bc6d64eb..d3183434a9989 100644 --- a/tools/internal_ci/linux/arm64/grpc_basictests_php.cfg +++ b/tools/internal_ci/linux/arm64/grpc_basictests_php.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests_arm64 linux php7 --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests_arm64 linux php7 --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/arm64/grpc_basictests_python.cfg b/tools/internal_ci/linux/arm64/grpc_basictests_python.cfg index f3038d8fa1c7c..320628a01505a 100644 --- a/tools/internal_ci/linux/arm64/grpc_basictests_python.cfg +++ b/tools/internal_ci/linux/arm64/grpc_basictests_python.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests_arm64 linux python --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests_arm64 linux python --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/arm64/grpc_basictests_ruby.cfg b/tools/internal_ci/linux/arm64/grpc_basictests_ruby.cfg index 4b6c9d28d8acb..cb0be0fdde21d 100644 --- a/tools/internal_ci/linux/arm64/grpc_basictests_ruby.cfg +++ b/tools/internal_ci/linux/arm64/grpc_basictests_ruby.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests_arm64 linux ruby --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests_arm64 linux ruby --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg b/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg index 07f7f0c659120..6e0ae6084ca85 100644 --- a/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg +++ b/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux corelang dbg --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux corelang dbg --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg b/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg index 8f2813febf857..93a8f4b342ad3 100644 --- a/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg +++ b/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux corelang opt --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux corelang opt --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_csharp.cfg b/tools/internal_ci/linux/grpc_basictests_csharp.cfg index d6c237609c92b..6ea90e09bb1ca 100644 --- a/tools/internal_ci/linux/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/linux/grpc_basictests_csharp.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux csharp --inner_jobs 4 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux csharp --inner_jobs 4 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_php.cfg b/tools/internal_ci/linux/grpc_basictests_php.cfg index 012709cfe44b6..998d90ee4b081 100644 --- a/tools/internal_ci/linux/grpc_basictests_php.cfg +++ b/tools/internal_ci/linux/grpc_basictests_php.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux php7 --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux php7 --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_python.cfg b/tools/internal_ci/linux/grpc_basictests_python.cfg index 444dba9f4df70..4bdccb7d0c330 100644 --- a/tools/internal_ci/linux/grpc_basictests_python.cfg +++ b/tools/internal_ci/linux/grpc_basictests_python.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux python --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux python --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_basictests_ruby.cfg b/tools/internal_ci/linux/grpc_basictests_ruby.cfg index 336aa469958a9..77360aca174fa 100644 --- a/tools/internal_ci/linux/grpc_basictests_ruby.cfg +++ b/tools/internal_ci/linux/grpc_basictests_ruby.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux ruby --inner_jobs 16 -j 2 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux ruby --inner_jobs 16 -j 2 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_build_submodule_at_head.sh b/tools/internal_ci/linux/grpc_build_submodule_at_head.sh index 8beedb1c5b30a..92df3390ead45 100755 --- a/tools/internal_ci/linux/grpc_build_submodule_at_head.sh +++ b/tools/internal_ci/linux/grpc_build_submodule_at_head.sh @@ -51,6 +51,8 @@ case "$SUBMODULE_NAME" in ;; protobuf) BAZEL_DEP_NAME="com_google_protobuf" + # TODO(xuanwang-amos): Remove the following once python test gets fixed for protobuf-at-head test. + EXTRA_EXCLUDE_FILTER="python" ;; esac if [ -z "$BAZEL_DEP_NAME" ] @@ -88,4 +90,4 @@ tools/buildgen/generate_projects.sh git add -A git -c user.name='foo' -c user.email='foo@google.com' commit -m 'Update submodule' --allow-empty -tools/run_tests/run_tests_matrix.py -f linux --exclude c sanity basictests_arm64 openssl dbg --inner_jobs 16 -j 2 --internal_ci --build_only +tools/run_tests/run_tests_matrix.py -f linux --exclude c sanity basictests_arm64 openssl dbg $EXTRA_EXCLUDE_FILTER --inner_jobs 16 -j 2 --build_only diff --git a/tools/internal_ci/linux/grpc_clang_tidy.cfg b/tools/internal_ci/linux/grpc_clang_tidy.cfg index 675014173e931..0df876c0a1320 100644 --- a/tools/internal_ci/linux/grpc_clang_tidy.cfg +++ b/tools/internal_ci/linux/grpc_clang_tidy.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux clang-tidy --inner_jobs 32 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux clang-tidy --inner_jobs 32 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_interop_alts.cfg b/tools/internal_ci/linux/grpc_interop_alts.cfg index 4684aba96bfda..c5bf167aa68a8 100644 --- a/tools/internal_ci/linux/grpc_interop_alts.cfg +++ b/tools/internal_ci/linux/grpc_interop_alts.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-l all -s all --use_docker --transport_security alts --internal_ci -t -j 12 --bq_result_table interop_results" + value: "-l all -s all --use_docker --transport_security alts -t -j 12 --bq_result_table interop_results" } diff --git a/tools/internal_ci/linux/grpc_interop_tocloud.cfg b/tools/internal_ci/linux/grpc_interop_tocloud.cfg index 9b35adcece216..30c4b28cd4c9a 100644 --- a/tools/internal_ci/linux/grpc_interop_tocloud.cfg +++ b/tools/internal_ci/linux/grpc_interop_tocloud.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-l all -s all --use_docker --http2_interop --internal_ci -t -j 8 --bq_result_table interop_results" + value: "-l all -s all --use_docker --http2_interop -t -j 8 --bq_result_table interop_results" } diff --git a/tools/internal_ci/linux/grpc_interop_toprod.cfg b/tools/internal_ci/linux/grpc_interop_toprod.cfg index 377dff771fe61..9464f6d1b6ff9 100644 --- a/tools/internal_ci/linux/grpc_interop_toprod.cfg +++ b/tools/internal_ci/linux/grpc_interop_toprod.cfg @@ -26,7 +26,7 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-l all --cloud_to_prod --cloud_to_prod_auth --prod_servers default gateway_v4 --use_docker --internal_ci -t -j 8 --bq_result_table interop_results" + value: "-l all --cloud_to_prod --cloud_to_prod_auth --prod_servers default gateway_v4 --use_docker -t -j 8 --bq_result_table interop_results" } before_action { diff --git a/tools/internal_ci/linux/grpc_portability.cfg b/tools/internal_ci/linux/grpc_portability.cfg index f417f24bb1ca1..dbfce09e206a0 100644 --- a/tools/internal_ci/linux/grpc_portability.cfg +++ b/tools/internal_ci/linux/grpc_portability.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f portability linux --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f portability linux --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/grpc_pull_request_sanity.cfg b/tools/internal_ci/linux/grpc_pull_request_sanity.cfg index 704d5c6cbc92f..4f763be433643 100644 --- a/tools/internal_ci/linux/grpc_pull_request_sanity.cfg +++ b/tools/internal_ci/linux/grpc_pull_request_sanity.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux sanity opt --inner_jobs 16 -j 1 --internal_ci" + value: "-f basictests linux sanity opt --inner_jobs 16 -j 1" } diff --git a/tools/internal_ci/linux/grpc_sanity.cfg b/tools/internal_ci/linux/grpc_sanity.cfg index 84ef26fa2d0ea..8d9d5963582d6 100644 --- a/tools/internal_ci/linux/grpc_sanity.cfg +++ b/tools/internal_ci/linux/grpc_sanity.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux sanity --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests linux sanity --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_csharp.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_csharp.cfg index 31873ea3409a6..fc63d6571a5b9 100644 --- a/tools/internal_ci/linux/pull_request/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_basictests_csharp.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux csharp --inner_jobs 4 -j 1 --internal_ci --max_time=3600" + value: "-f basictests linux csharp --inner_jobs 4 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_php.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_php.cfg index a83ce01646744..e735b6f4ce636 100644 --- a/tools/internal_ci/linux/pull_request/grpc_basictests_php.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_basictests_php.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux php7 --inner_jobs 16 -j 2 --internal_ci --max_time=3600" + value: "-f basictests linux php7 --inner_jobs 16 -j 2 --max_time=3600" } diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_python.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_python.cfg index b4e91c2a7e22e..b8ac0a53600e3 100644 --- a/tools/internal_ci/linux/pull_request/grpc_basictests_python.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_basictests_python.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux python --inner_jobs 16 -j 2 --internal_ci --max_time=3600" + value: "-f basictests linux python --inner_jobs 16 -j 2 --max_time=3600" } diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_ruby.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_ruby.cfg index 49d3dad592e95..1c689ad62e443 100644 --- a/tools/internal_ci/linux/pull_request/grpc_basictests_ruby.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_basictests_ruby.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux ruby --inner_jobs 16 -j 2 --internal_ci --max_time=3600" + value: "-f basictests linux ruby --inner_jobs 16 -j 2 --max_time=3600" } diff --git a/tools/internal_ci/linux/pull_request/grpc_clang_tidy.cfg b/tools/internal_ci/linux/pull_request/grpc_clang_tidy.cfg index 7a42c3a48a0ae..0e2e82a3961ee 100644 --- a/tools/internal_ci/linux/pull_request/grpc_clang_tidy.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_clang_tidy.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux clang-tidy --inner_jobs 32 -j 1 --internal_ci" + value: "-f basictests linux clang-tidy --inner_jobs 32 -j 1" } diff --git a/tools/internal_ci/linux/pull_request/grpc_sanity.cfg b/tools/internal_ci/linux/pull_request/grpc_sanity.cfg index 866fdfd2a3e2a..793120d49e1e5 100644 --- a/tools/internal_ci/linux/pull_request/grpc_sanity.cfg +++ b/tools/internal_ci/linux/pull_request/grpc_sanity.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests linux sanity --inner_jobs 16 -j 1 --internal_ci" + value: "-f basictests linux sanity --inner_jobs 16 -j 1" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg index d6d70677ddf40..3b68a9ffd4fc5 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c asan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c asan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg index 7b22c6afef57f..a0c7323e07e56 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c msan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c msan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg index 6c9dd6ef8dc79..cfcc33c5af90c 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c tsan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c tsan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg index 8700c74c8d947..cc8f349360224 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c ubsan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c ubsan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg b/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg index 02162d860b084..214dbe854e97e 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c++ asan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c++ asan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg index 95582184ed1ec..622994036dd55 100644 --- a/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg +++ b/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c++ tsan --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results" + value: "-f c++ tsan --inner_jobs 16 -j 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg index d444596a81e9a..5bd548e897cb2 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c asan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c asan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg index 3891cc37e8e47..431b531b805e6 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c msan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c msan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg index 91ce1627afc46..4657524755ea2 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c tsan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c tsan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg index fcdc2de37bb3f..12392b2b1bccd 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c ubsan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c ubsan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg index de2a74051b6aa..bf4ba1d43dbdf 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c++ asan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c++ asan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg index 51c291f7dff10..eb9b8734d05fb 100644 --- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg +++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f c++ tsan --inner_jobs 16 -j 1 --internal_ci --max_time=3600" + value: "-f c++ tsan --inner_jobs 16 -j 1 --max_time=3600" } diff --git a/tools/internal_ci/macos/grpc_basictests_c_cpp_dbg.cfg b/tools/internal_ci/macos/grpc_basictests_c_cpp_dbg.cfg index 935bef1197488..bcd690cae1afa 100644 --- a/tools/internal_ci/macos/grpc_basictests_c_cpp_dbg.cfg +++ b/tools/internal_ci/macos/grpc_basictests_c_cpp_dbg.cfg @@ -17,7 +17,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/macos/grpc_run_tests_matrix.sh" gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json" -timeout_mins: 240 +timeout_mins: 360 action { define_artifacts { regex: "**/*sponge_log.*" @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos corelang dbg --internal_ci -j 4 --inner_jobs 8 --bq_result_table aggregate_results" + value: "-f basictests macos corelang dbg -j 4 --inner_jobs 8 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_basictests_c_cpp_opt.cfg b/tools/internal_ci/macos/grpc_basictests_c_cpp_opt.cfg index 640485085890a..00bf6ba81f80b 100644 --- a/tools/internal_ci/macos/grpc_basictests_c_cpp_opt.cfg +++ b/tools/internal_ci/macos/grpc_basictests_c_cpp_opt.cfg @@ -17,7 +17,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/macos/grpc_run_tests_matrix.sh" gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json" -timeout_mins: 240 +timeout_mins: 360 action { define_artifacts { regex: "**/*sponge_log.*" @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos corelang opt --internal_ci -j 4 --inner_jobs 8 --bq_result_table aggregate_results" + value: "-f basictests macos corelang opt -j 4 --inner_jobs 8 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_basictests_cpp_ios.cfg b/tools/internal_ci/macos/grpc_basictests_cpp_ios.cfg index d3b81517da4dd..d26949bb7868d 100644 --- a/tools/internal_ci/macos/grpc_basictests_cpp_ios.cfg +++ b/tools/internal_ci/macos/grpc_basictests_cpp_ios.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-cpp-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-cpp-test-.*" } diff --git a/tools/internal_ci/macos/grpc_basictests_csharp.cfg b/tools/internal_ci/macos/grpc_basictests_csharp.cfg index 6c48a5bcf1ff3..02e22714ef17f 100644 --- a/tools/internal_ci/macos/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/macos/grpc_basictests_csharp.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos csharp --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results" + value: "-f basictests macos csharp -j 1 --inner_jobs 4 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_basictests_objc_examples.cfg b/tools/internal_ci/macos/grpc_basictests_objc_examples.cfg index 309c4429d1717..50c93fd6b9671 100644 --- a/tools/internal_ci/macos/grpc_basictests_objc_examples.cfg +++ b/tools/internal_ci/macos/grpc_basictests_objc_examples.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-buildtest-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-buildtest-.*" } diff --git a/tools/internal_ci/macos/grpc_basictests_objc_ios.cfg b/tools/internal_ci/macos/grpc_basictests_objc_ios.cfg index dc9adbdc5664c..2c19e2370ea98 100644 --- a/tools/internal_ci/macos/grpc_basictests_objc_ios.cfg +++ b/tools/internal_ci/macos/grpc_basictests_objc_ios.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r ios-test-.*" } diff --git a/tools/internal_ci/macos/grpc_basictests_objc_mac.cfg b/tools/internal_ci/macos/grpc_basictests_objc_mac.cfg index 1087217217fce..fe339bfd1099c 100644 --- a/tools/internal_ci/macos/grpc_basictests_objc_mac.cfg +++ b/tools/internal_ci/macos/grpc_basictests_objc_mac.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r mac-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r mac-test-.*" } diff --git a/tools/internal_ci/macos/grpc_basictests_objc_tvos.cfg b/tools/internal_ci/macos/grpc_basictests_objc_tvos.cfg index 17940f48c36e0..bd3a365fa325d 100644 --- a/tools/internal_ci/macos/grpc_basictests_objc_tvos.cfg +++ b/tools/internal_ci/macos/grpc_basictests_objc_tvos.cfg @@ -27,6 +27,6 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r tvos-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --bq_result_table aggregate_results --extra_args -r tvos-test-.*" } diff --git a/tools/internal_ci/macos/grpc_basictests_php.cfg b/tools/internal_ci/macos/grpc_basictests_php.cfg index b96bd03f976bb..f54293cba8bc1 100644 --- a/tools/internal_ci/macos/grpc_basictests_php.cfg +++ b/tools/internal_ci/macos/grpc_basictests_php.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos php7 --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results" + value: "-f basictests macos php7 -j 1 --inner_jobs 4 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_basictests_python.cfg b/tools/internal_ci/macos/grpc_basictests_python.cfg index 575ddaf82cb56..6a8ab4048ed2c 100644 --- a/tools/internal_ci/macos/grpc_basictests_python.cfg +++ b/tools/internal_ci/macos/grpc_basictests_python.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos python --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results" + value: "-f basictests macos python -j 1 --inner_jobs 4 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_basictests_ruby.cfg b/tools/internal_ci/macos/grpc_basictests_ruby.cfg index 51b4d87e0a414..7566df42cdeb6 100644 --- a/tools/internal_ci/macos/grpc_basictests_ruby.cfg +++ b/tools/internal_ci/macos/grpc_basictests_ruby.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos ruby --internal_ci -j 1 --inner_jobs 4 --bq_result_table aggregate_results" + value: "-f basictests macos ruby -j 1 --inner_jobs 4 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/macos/grpc_interop_toprod.sh b/tools/internal_ci/macos/grpc_interop_toprod.sh index 962a37d8eb581..174e25380f4e7 100755 --- a/tools/internal_ci/macos/grpc_interop_toprod.sh +++ b/tools/internal_ci/macos/grpc_interop_toprod.sh @@ -42,7 +42,7 @@ tools/run_tests/run_interop_tests.py -l c++ \ --prod_servers default gateway_v4 \ --service_account_key_file="${KOKORO_KEYSTORE_DIR}/73836_interop_to_prod_tests_service_account_key" \ --default_service_account="interop-to-prod-tests@grpc-testing.iam.gserviceaccount.com" \ - --skip_compute_engine_creds --internal_ci -t -j 4 || FAILED="true" + --skip_compute_engine_creds -t -j 4 || FAILED="true" if [ "$FAILED" != "" ] then diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_c_cpp_dbg.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_c_cpp_dbg.cfg index a421a083ea6de..bd0ed6ef3388b 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_c_cpp_dbg.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_c_cpp_dbg.cfg @@ -17,7 +17,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/macos/grpc_run_tests_matrix.sh" gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json" -timeout_mins: 180 +timeout_mins: 360 action { define_artifacts { regex: "**/*sponge_log.*" @@ -28,5 +28,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" # on pull requests, only run the "dbg" configuration due to CI resource constraints - value: "-f basictests macos corelang dbg --internal_ci -j 4 --inner_jobs 8 --max_time=3600" + value: "-f basictests macos corelang dbg -j 4 --inner_jobs 8 --max_time=3600" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_cpp_ios.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_cpp_ios.cfg index a34b9aa9ff2cc..7ec76be20960c 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_cpp_ios.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_cpp_ios.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --extra_args -r ios-cpp-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --extra_args -r ios-cpp-test-.*" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_csharp.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_csharp.cfg index 5ee22e375d01e..d8f7a3150f699 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_csharp.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos csharp --internal_ci -j 1 --inner_jobs 4 --max_time=3600" + value: "-f basictests macos csharp -j 1 --inner_jobs 4 --max_time=3600" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_examples.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_examples.cfg index 79b4fef0c0ec6..7a36a80cf9008 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_examples.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_examples.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --extra_args -r ios-buildtest-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --extra_args -r ios-buildtest-.*" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_ios.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_ios.cfg index 530dc1d41b941..cd03f3dd4336a 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_ios.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_ios.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --extra_args -r ios-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --extra_args -r ios-test-.*" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_mac.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_mac.cfg index 66f98d4d0d343..8dc50b4d0d6cc 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_mac.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_mac.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --extra_args -r mac-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --extra_args -r mac-test-.*" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_tvos.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_tvos.cfg index 64d67ee53a927..065331a699e61 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_objc_tvos.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_objc_tvos.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos objc opt --internal_ci -j 1 --inner_jobs 4 --extra_args -r tvos-test-.*" + value: "-f basictests macos objc opt -j 1 --inner_jobs 4 --extra_args -r tvos-test-.*" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_php.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_php.cfg index 880d8aa733bde..b8ee5a6579b8f 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_php.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_php.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos php7 --internal_ci -j 1 --inner_jobs 4 --max_time=3600" + value: "-f basictests macos php7 -j 1 --inner_jobs 4 --max_time=3600" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg index 71f71604ae14c..42a771e32f05b 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos python --internal_ci -j 1 --inner_jobs 4 --max_time=3600" + value: "-f basictests macos python -j 1 --inner_jobs 4 --max_time=3600" } diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_ruby.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_ruby.cfg index 1b60ddef9b007..187e8fb83aa7b 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_ruby.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_ruby.cfg @@ -27,5 +27,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests macos ruby --internal_ci -j 1 --inner_jobs 4 --max_time=3600" + value: "-f basictests macos ruby obs 4 --max_time=3600" } diff --git a/tools/internal_ci/windows/grpc_basictests_c.cfg b/tools/internal_ci/windows/grpc_basictests_c.cfg index 223cf389d0e13..b0fcd1e0fe2b2 100644 --- a/tools/internal_ci/windows/grpc_basictests_c.cfg +++ b/tools/internal_ci/windows/grpc_basictests_c.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows c -j 1 --inner_jobs 8 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests windows c -j 1 --inner_jobs 8 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/windows/grpc_basictests_csharp.cfg b/tools/internal_ci/windows/grpc_basictests_csharp.cfg index 17f2d87610f98..7fb2f065ca695 100644 --- a/tools/internal_ci/windows/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/windows/grpc_basictests_csharp.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows csharp -j 1 --inner_jobs 1 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests windows csharp -j 1 --inner_jobs 1 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/windows/grpc_basictests_python.cfg b/tools/internal_ci/windows/grpc_basictests_python.cfg index 2d757789e1322..09137a9df5577 100644 --- a/tools/internal_ci/windows/grpc_basictests_python.cfg +++ b/tools/internal_ci/windows/grpc_basictests_python.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows python -j 1 --inner_jobs 8 --internal_ci --bq_result_table aggregate_results" + value: "-f basictests windows python -j 1 --inner_jobs 8 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/windows/grpc_portability.cfg b/tools/internal_ci/windows/grpc_portability.cfg index c17dadc2fc60a..04bddc637b6b9 100644 --- a/tools/internal_ci/windows/grpc_portability.cfg +++ b/tools/internal_ci/windows/grpc_portability.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f portability windows -j 4 --inner_jobs 8 --internal_ci --bq_result_table aggregate_results" + value: "-f portability windows -j 4 --inner_jobs 8 --bq_result_table aggregate_results" } diff --git a/tools/internal_ci/windows/grpc_portability_build_only.cfg b/tools/internal_ci/windows/grpc_portability_build_only.cfg index 4df367f686b1a..6f917c76ce62e 100644 --- a/tools/internal_ci/windows/grpc_portability_build_only.cfg +++ b/tools/internal_ci/windows/grpc_portability_build_only.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f portability windows c++ -j 4 --inner_jobs 8 --internal_ci --build_only" + value: "-f portability windows c++ -j 4 --inner_jobs 8 --build_only" } diff --git a/tools/internal_ci/windows/pull_request/grpc_basictests_c.cfg b/tools/internal_ci/windows/pull_request/grpc_basictests_c.cfg index 4cedcae9a8797..cd384a68248fc 100644 --- a/tools/internal_ci/windows/pull_request/grpc_basictests_c.cfg +++ b/tools/internal_ci/windows/pull_request/grpc_basictests_c.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows c -j 1 --inner_jobs 8 --internal_ci --max_time=3600" + value: "-f basictests windows c -j 1 --inner_jobs 8 --max_time=3600" } diff --git a/tools/internal_ci/windows/pull_request/grpc_basictests_csharp.cfg b/tools/internal_ci/windows/pull_request/grpc_basictests_csharp.cfg index e5815b3cd71c8..1e6cf7bc76a04 100644 --- a/tools/internal_ci/windows/pull_request/grpc_basictests_csharp.cfg +++ b/tools/internal_ci/windows/pull_request/grpc_basictests_csharp.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows csharp -j 1 --inner_jobs 8 --internal_ci --max_time=3600" + value: "-f basictests windows csharp -j 1 --inner_jobs 8 --max_time=3600" } diff --git a/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg b/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg index aba512d17d908..ab541436b407b 100644 --- a/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg +++ b/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg @@ -26,5 +26,5 @@ action { env_vars { key: "RUN_TESTS_FLAGS" - value: "-f basictests windows python -j 1 --inner_jobs 8 --internal_ci --max_time=5400" + value: "-f basictests windows python -j 1 --inner_jobs 8 --max_time=5400" } diff --git a/tools/interop_matrix/README.md b/tools/interop_matrix/README.md index 3a3bdd1326dd6..1998c13bfb1b8 100644 --- a/tools/interop_matrix/README.md +++ b/tools/interop_matrix/README.md @@ -2,21 +2,24 @@ This directory contains scripts that facilitate building and running gRPC interoperability tests for combinations of language/runtimes (known as matrix). -The setup builds gRPC docker images for each language/runtime and upload it to Google Container Registry (GCR). These images, encapsulating gRPC stack +The setup builds gRPC docker images for each language/runtime and upload it to Artifact Registry (AR). These images, encapsulating gRPC stack from specific releases/tag, are used to test version compatibility between gRPC release versions. -## Step-by-step instructions for adding a GCR image for a new release for compatibility test -We have continuous nightly test setup to test gRPC backward compatibility between old clients and latest server. When a gRPC developer creates a new gRPC release, s/he is also responsible to add the just-released gRPC client to the nightly test. The steps are: +## Step-by-step instructions for adding a AR docker image for a new release for compatibility test + +We have continuous nightly test setup to test gRPC backward compatibility between old clients and latest server. +When a gRPC developer creates a new gRPC release, s/he is also responsible to add the just-released gRPC client to the nightly test. +The steps are: - Add (or update) an entry in `./client_matrix.py` file to reference the github tag for the release. - Build new client docker image(s). For example, for C and wrapper languages release `v1.9.9`, do - `tools/interop_matrix/create_matrix_images.py --git_checkout --release=v1.9.9 --upload_images --language cxx python ruby php` -- Verify that the new docker image was built successfully and uploaded to GCR. For example, - - `gcloud container images list --repository gcr.io/grpc-testing` lists available images. - - `gcloud container images list-tags gcr.io/grpc-testing/grpc_interop_java` should show an image entry with tag `v1.9.9`. - - images can also be viewed in https://pantheon.corp.google.com/gcr/images/grpc-testing?project=grpc-testing +- Verify that the new docker image was built successfully and uploaded to AR. For example, + - `gcloud artifacts docker images list us-docker.pkg.dev/grpc-testing/testing-images-public` lists available images. + - `gcloud artifacts docker images list us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_java --include-tags` should show an image entry with tag `v1.9.9`. + - images can also be viewed in https://pantheon.corp.google.com/artifacts/docker/grpc-testing/us/testing-images-public - Verify the just-created docker client image would pass backward compatibility test (it should). For example, - - `gcloud docker -- pull gcr.io/grpc-testing/grpc_interop_java:v1.9.9` followed by - - `docker_image=gcr.io/grpc-testing/grpc_interop_java:v1.9.9 tools/interop_matrix/testcases/java__master` + - `docker pull us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_java:v1.9.9` followed by + - `docker_image=us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_java:v1.9.9 tools/interop_matrix/testcases/java__master` - Commit the change and create a PR to upstream/master. - Trigger an adhoc run of interop matrix tests: https://fusion.corp.google.com/projectanalysis/summary/KOKORO/prod:grpc%2Fcore%2Fexperimental%2Flinux%2Fgrpc_interop_matrix_adhoc - Once tests pass, request a PR review. @@ -24,30 +27,34 @@ We have continuous nightly test setup to test gRPC backward compatibility betwee For more details on each step, refer to sections below. ## Instructions for adding new language/runtimes + - Create new `Dockerfile.template`, `build_interop.sh.template` for the language/runtime under `template/tools/dockerfile/`. - Run `tools/buildgen/generate_projects.sh` to create corresponding files under `tools/dockerfile/`. - Add language/runtimes to `client_matrix.py` following existing language/runtimes examples. -- Run `tools/interop_matrix/create_matrix_images.py` which will build (and upload) images to GCR. +- Run `tools/interop_matrix/create_matrix_images.py` which will build (and upload) images to AR. ## Instructions for creating new test cases + - Create test cases by running `LANG= [RELEASE=] ./create_testcases.sh`. For example, - `LANG=go ./create_testcases.sh` will generate `./testcases/go__master`, which is also a functional bash script. - `LANG=go KEEP_IMAGE=1 ./create_testcases.sh` will generate `./testcases/go__master` and keep the local docker image so it can be invoked simply via `./testcases/go__master`. Note: remove local docker images manually afterwards with `docker rmi `. - Stage and commit the generated test case file `./testcases/__`. -## Instructions for running test cases against GCR images +## Instructions for running test cases against AR docker images + - Run `tools/interop_matrix/run_interop_matrix_tests.py`. Useful options: - - `--release` specifies a git release tag. Defaults to `--release=all`. Make sure the GCR images with the tag have been created using `create_matrix_images.py` above. + - `--release` specifies a git release tag. Defaults to `--release=all`. Make sure the AR images with the tag have been created using `create_matrix_images.py` above. - `--language` specifies a language. Defaults to `--language=all`. For example, To test all languages for all gRPC releases across all runtimes, do `tools/interop_matrix/run_interop_matrix_test.py --release=all`. - The output for all the test cases is recorded in a junit style xml file (defaults to 'report.xml'). -## Instructions for running test cases against a GCR image manually -- Download docker image from GCR. For example: `gcloud docker -- pull gcr.io/grpc-testing/grpc_interop_go1.8:v1.16.0`. +## Instructions for running test cases against an AR image manually + +- Download a docker image from AR. For example: `docker pull us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_go1.8:v1.16.0`. - Run test cases by specifying `docker_image` variable inline with the test case script created above. For example: - - `docker_image=gcr.io/grpc-testing/grpc_interop_go1.8:v1.16.0 ./testcases/go__master` will run go__master test cases against `go1.8` with gRPC release `v1.16.0` docker image in GCR. + - `docker_image=us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_go1.8:v1.16.0 ./testcases/go__master` will run go__master test cases against `go1.8` with gRPC release `v1.16.0` docker image in AR. Note: - File path starting with `tools/` or `template/` are relative to the grpc repo root dir. File path starting with `./` are relative to current directory (`tools/interop_matrix`). -- Creating and referencing images in GCR require read and write permission to Google Container Registry path gcr.io/grpc-testing. +- Creating and referencing images in AR require read and write permission to AR path us-docker.pkg.dev/grpc-testing. diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 7ef4223b8272d..ab43a6c086818 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -300,8 +300,9 @@ def __init__(self, patch=[], runtimes=[], testcases_file=None): ("v1.60.1", ReleaseInfo(runtimes=["go1.19"])), ("v1.61.2", ReleaseInfo(runtimes=["go1.19"])), ("v1.62.2", ReleaseInfo(runtimes=["go1.19"])), - ("v1.63.2", ReleaseInfo(runtimes=["go1.19"])), - ("v1.64.0", ReleaseInfo()), + ("v1.63.3", ReleaseInfo()), + ("v1.64.1", ReleaseInfo()), + ("v1.65.0", ReleaseInfo()), ] ), "java": OrderedDict( @@ -443,9 +444,9 @@ def __init__(self, patch=[], runtimes=[], testcases_file=None): ("v1.59.1", ReleaseInfo()), ("v1.60.1", ReleaseInfo()), ("v1.61.0", ReleaseInfo()), - ("v1.63.1", ReleaseInfo()), - ("v1.64.0", ReleaseInfo()), - ("v1.65.0", ReleaseInfo()), + ("v1.63.2", ReleaseInfo()), + ("v1.64.2", ReleaseInfo()), + ("v1.65.1", ReleaseInfo()), ] ), "python": OrderedDict( diff --git a/tools/interop_matrix/create_matrix_images.py b/tools/interop_matrix/create_matrix_images.py index 48d37d044b098..c940196b0266b 100755 --- a/tools/interop_matrix/create_matrix_images.py +++ b/tools/interop_matrix/create_matrix_images.py @@ -53,9 +53,9 @@ argp = argparse.ArgumentParser(description="Run interop tests.") argp.add_argument( - "--gcr_path", - default="gcr.io/grpc-testing", - help="Path of docker images in Google Container Registry", + "--docker_path", + default="us-docker.pkg.dev/grpc-testing/testing-images-public", + help="Path of docker images", ) argp.add_argument( @@ -175,7 +175,7 @@ def build_image_jobspec(runtime, env, gcr_tag, stack_base): stack_base: the local gRPC repo path. """ basename = "grpc_interop_%s" % runtime - tag = "%s/%s:%s" % (args.gcr_path, basename, gcr_tag) + tag = "%s/%s:%s" % (args.docker_path, basename, gcr_tag) build_env = {"INTEROP_IMAGE": tag, "BASE_NAME": basename} build_env.update(env) image_builder_path = _IMAGE_BUILDER @@ -407,8 +407,8 @@ def checkout_grpc_stack(lang, release): for image in docker_images: if args.upload_images: jobset.message("START", "Uploading %s" % image, do_newline=True) - # docker image name must be in the format /: - assert image.startswith(args.gcr_path) and image.find(":") != -1 + # docker image name must be in the format /: + assert image.startswith(args.docker_path) and image.find(":") != -1 # Add a tag to exclude the image from the GCP Vulnerability Scanner. (image_name, tag_name) = image.rsplit(":", 1) alternate_image = ( diff --git a/tools/interop_matrix/run_interop_matrix_tests.py b/tools/interop_matrix/run_interop_matrix_tests.py index abeae00fc22ed..d44a916b1b743 100755 --- a/tools/interop_matrix/run_interop_matrix_tests.py +++ b/tools/interop_matrix/run_interop_matrix_tests.py @@ -56,9 +56,9 @@ argp = argparse.ArgumentParser(description="Run interop tests.") argp.add_argument("-j", "--jobs", default=multiprocessing.cpu_count(), type=int) argp.add_argument( - "--gcr_path", - default="gcr.io/grpc-testing", - help="Path of docker images in Google Container Registry", + "--docker_path", + default="us-docker.pkg.dev/grpc-testing/testing-images-public", + help="Path of docker images", ) argp.add_argument( "--release", @@ -348,7 +348,9 @@ def _run_tests_for_lang(lang, runtime, images, xml_report_tree): total_num_failures = 0 _xml_report_tree = report_utils.new_junit_xml_tree() for lang in languages: - docker_images = _get_test_images_for_lang(lang, args.release, args.gcr_path) + docker_images = _get_test_images_for_lang( + lang, args.release, args.docker_path + ) for runtime in sorted(docker_images.keys()): total_num_failures += _run_tests_for_lang( lang, runtime, docker_images[runtime], _xml_report_tree diff --git a/tools/remote_build/include/rbe_remote_execution.bazelrc b/tools/remote_build/include/rbe_remote_execution.bazelrc index cab072225a010..308e1f9ccccc1 100644 --- a/tools/remote_build/include/rbe_remote_execution.bazelrc +++ b/tools/remote_build/include/rbe_remote_execution.bazelrc @@ -20,11 +20,8 @@ import %workspace%/tools/remote_build/include/rbe_base_config.bazelrc # configure backend for remote execution build --remote_executor=grpcs://remotebuildexecution.googleapis.com -build --spawn_strategy=remote -build --strategy=Javac=remote -build --strategy=Closure=remote -build --genrule_strategy=remote -build --remote_timeout=7200 # very large value to avoid problems like https://github.com/grpc/grpc/issues/20777 +# Very large value to avoid problems like https://github.com/grpc/grpc/issues/20777 +build --remote_timeout=7200 # In the remote execution environment, each test gets its own docker containers # and port server won't be available. diff --git a/tools/run_tests/artifacts/artifact_targets.py b/tools/run_tests/artifacts/artifact_targets.py index e67be1f7bb516..3146af9266ac0 100644 --- a/tools/run_tests/artifacts/artifact_targets.py +++ b/tools/run_tests/artifacts/artifact_targets.py @@ -270,7 +270,7 @@ def build_jobspec(self, inner_jobs=None): self.gem_platform, ], use_workspace=True, - timeout_seconds=90 * 60, + timeout_seconds=120 * 60, environ=environ, ) diff --git a/tools/run_tests/artifacts/distribtest_targets.py b/tools/run_tests/artifacts/distribtest_targets.py index ec8c9bd9c0989..3549495a1553e 100644 --- a/tools/run_tests/artifacts/distribtest_targets.py +++ b/tools/run_tests/artifacts/distribtest_targets.py @@ -220,6 +220,7 @@ def __init__( ruby_version=None, source=False, presubmit=False, + protobuf_version="", ): self.package_type = "binary" if source: @@ -231,10 +232,13 @@ def __init__( ruby_version or "unspecified", self.package_type, ) + if not protobuf_version == "": + self.name += "_protobuf_%s" % protobuf_version self.platform = platform self.arch = arch self.docker_suffix = docker_suffix self.ruby_version = ruby_version + self.protobuf_version = protobuf_version self.labels = ["distribtest", "ruby", platform, arch, docker_suffix] if presubmit: self.labels.append("presubmit") @@ -261,8 +265,13 @@ def build_jobspec(self, inner_jobs=None): return create_docker_jobspec( self.name, dockerfile_name, - "test/distrib/ruby/run_distrib_test.sh %s %s %s" - % (arch_to_gem_arch[self.arch], self.platform, self.package_type), + "test/distrib/ruby/run_distrib_test.sh %s %s %s %s" + % ( + arch_to_gem_arch[self.arch], + self.platform, + self.package_type, + self.protobuf_version, + ), copy_rel_path="test/distrib", ) @@ -485,7 +494,14 @@ def targets(): RubyDistribTest( "linux", "x64", "debian11", ruby_version="ruby_3_3", presubmit=True ), - RubyDistribTest("linux", "x64", "centos7"), + RubyDistribTest( + "linux", + "x64", + "debian11", + ruby_version="ruby_3_3", + protobuf_version="3.25", + presubmit=True, + ), RubyDistribTest("linux", "x64", "ubuntu2004"), RubyDistribTest("linux", "x64", "ubuntu2204", presubmit=True), # PHP7 diff --git a/tools/run_tests/helper_scripts/build_cxx.sh b/tools/run_tests/helper_scripts/build_cxx.sh index 5639797e27245..d6c47a5b89a78 100755 --- a/tools/run_tests/helper_scripts/build_cxx.sh +++ b/tools/run_tests/helper_scripts/build_cxx.sh @@ -24,7 +24,7 @@ INSTALL_PATH="$(pwd)/cmake/install" cd third_party/abseil-cpp mkdir build cd build -cmake -DCMAKE_CXX_STANDARD=14 -DABSL_BUILD_TESTING=OFF -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" .. +cmake -DABSL_BUILD_TESTING=OFF -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" .. make -j"${GRPC_RUN_TESTS_JOBS}" install # Install opentelemetry-cpp since we only support "package" mode for opentelemetry at present. @@ -32,7 +32,7 @@ cd ../../.. cd third_party/opentelemetry-cpp mkdir build cd build -cmake -DCMAKE_CXX_STANDARD=14 -DWITH_ABSEIL=ON -DBUILD_TESTING=OFF -DWITH_BENCHMARK=OFF -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" .. +cmake -DWITH_ABSEIL=ON -DBUILD_TESTING=OFF -DWITH_BENCHMARK=OFF -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" .. make -j"${GRPC_RUN_TESTS_JOBS}" install cd ../../.. @@ -41,10 +41,15 @@ cd cmake/build # TODO(yashykt/veblush): Remove workaround after fixing b/332425004 if [ "${GRPC_RUNTESTS_ARCHITECTURE}" = "x86" ]; then -cmake -DCMAKE_CXX_STANDARD=14 -DgRPC_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" "$@" ../.. +cmake -DgRPC_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" "$@" ../.. else -cmake -DCMAKE_CXX_STANDARD=14 -DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=ON -DgRPC_ABSL_PROVIDER=package -DgRPC_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" ../.. +cmake -DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=ON -DgRPC_ABSL_PROVIDER=package -DgRPC_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE="${MSBUILD_CONFIG}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" ../.. fi +if [[ "$*" =~ "-DgRPC_BUILD_TESTS=OFF" ]]; then +# Just build grpc++ target when gRPC_BUILD_TESTS is OFF (This is a temporary mitigation for gcc 7. Remove this once gcc 7 is removed from the supported compilers) +make -j"${GRPC_RUN_TESTS_JOBS}" "grpc++" +else # GRPC_RUN_TESTS_CXX_LANGUAGE_SUFFIX will be set to either "c" or "cxx" make -j"${GRPC_RUN_TESTS_JOBS}" "buildtests_${GRPC_RUN_TESTS_CXX_LANGUAGE_SUFFIX}" "tools_${GRPC_RUN_TESTS_CXX_LANGUAGE_SUFFIX}" +fi diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 059522b42d657..010f20fd38045 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -1424,16 +1424,6 @@ def aggregate_http2_results(stdout): const=True, help="Skip auth tests requiring access to compute engine credentials.", ) -argp.add_argument( - "--internal_ci", - default=False, - action="store_const", - const=True, - help=( - "(Deprecated, has no effect) Put reports into subdirectories to improve" - " presentation of results by Internal CI." - ), -) argp.add_argument( "--bq_result_table", default="", diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index d59a20afbd4e7..e2b5f92262e18 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -568,7 +568,13 @@ def _compiler_options( _check_compiler(compiler, ["default", "cmake"]) if compiler == "default" or compiler == "cmake": - return ("debian11", []) + # This is to address Apple clang defaults C++98. + cmake_args = ( + ["-DCMAKE_CXX_STANDARD=14"] + if platform_string() == "mac" + else [] + ) + return ("debian11", cmake_args) elif compiler == "gcc8": return ("gcc_8", []) elif compiler == "gcc10.2": @@ -1777,7 +1783,7 @@ def _build_and_run( argp.add_argument( "--cmake_configure_extra_args", default=[], - nargs="+", + action="append", help="Extra arguments that will be passed to the cmake configure command. Only works for C/C++.", ) args = argp.parse_args() diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py index 577642440ac9f..a1ac350319cbf 100755 --- a/tools/run_tests/run_tests_matrix.py +++ b/tools/run_tests/run_tests_matrix.py @@ -531,16 +531,6 @@ def _runs_per_test_type(arg_str): help="Maximum amount of time to run tests for" + "(other tests will be skipped)", ) - argp.add_argument( - "--internal_ci", - default=False, - action="store_const", - const=True, - help=( - "(Deprecated, has no effect) Put reports into subdirectories to" - " improve presentation of results by Kokoro." - ), - ) argp.add_argument( "--bq_result_table", default="", diff --git a/tools/run_tests/sanity/banned_functions.py b/tools/run_tests/sanity/banned_functions.py index 5b868e37cc478..df6084a10a02b 100755 --- a/tools/run_tests/sanity/banned_functions.py +++ b/tools/run_tests/sanity/banned_functions.py @@ -46,15 +46,9 @@ "./src/core/util/windows/log.cc", "./src/ruby/ext/grpc/rb_grpc_imports.generated.c", "./src/ruby/ext/grpc/rb_grpc_imports.generated.h", - "./test/core/end2end/tests/no_logging.cc", ], - "gpr_log_severity_string": [], "gpr_log(": [ "./include/grpc/support/log.h", - "./src/core/ext/transport/cronet/transport/cronet_transport.cc", - "./src/core/ext/transport/inproc/legacy_inproc_transport.cc", - "./src/core/handshaker/http_connect/http_proxy_mapper.cc", - "./src/core/lib/surface/api_trace.h", "./src/core/util/android/log.cc", "./src/core/util/linux/log.cc", "./src/core/util/posix/log.cc", @@ -76,34 +70,27 @@ "./src/core/util/posix/log.cc", "./src/core/util/windows/log.cc", "./src/ruby/ext/grpc/rb_call_credentials.c", - "./test/core/end2end/tests/no_logging.cc", ], "gpr_log_message(": [ - "./include/grpc/support/log.h", "./src/core/util/android/log.cc", "./src/core/util/linux/log.cc", "./src/core/util/log.cc", "./src/core/util/posix/log.cc", "./src/core/util/windows/log.cc", ], - "gpr_set_log_verbosity(": [ - "./include/grpc/support/log.h", - "./src/core/util/log.cc", - "./test/core/end2end/tests/no_logging.cc", - ], "gpr_log_func_args": [ "./include/grpc/support/log.h", "./src/core/util/log.cc", - "./test/core/end2end/tests/no_logging.cc", ], "gpr_set_log_function(": [ "./include/grpc/support/log.h", "./src/core/util/log.cc", - "./test/core/end2end/tests/no_logging.cc", ], - "gpr_assertion_failed": [], "GPR_ASSERT": [], + "gpr_assertion_failed": [], "GPR_DEBUG_ASSERT": [], + "gpr_log_severity_string": [], + "gpr_set_log_verbosity(": [], } errors = 0 diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index 6f61c25d57c48..4d9a11892d701 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -28,9 +28,9 @@ cat <"$want_submodules" third_party/abseil-cpp 4a2c63365eff8823a5221db86ef490e828306f9d third_party/benchmark 344117638c8ff7e239044fd0fa7085839fc03021 third_party/bloaty 60209eb1ccc34d5deefb002d1b7f37545204f7f2 -third_party/boringssl-with-bazel b8a2bffc598f230484ff48a247526a9820facfc2 +third_party/boringssl-with-bazel 16c8d3db1af20fcc04b5190b25242aadcb1fbb30 third_party/cares/cares 6360e96b5cf8e5980c887ce58ef727e53d77243a -third_party/envoy-api 091cfd044258312a56c632ae1860813b1c0c58bc +third_party/envoy-api f8b75d1efa92bbf534596a013d9ca5873f79dd30 third_party/googleapis 2f9af297c84c55c8b871ba4495e01ade42476c92 third_party/googletest 2dd1c131950043a8ad5ab0d2dda0e0970596586a third_party/opencensus-proto 4aa53e15cbf1a47bc9087e6cfdca214c1eea4e89 From fac3e81a95a02f870f2bc69f389b51ae833e2abe Mon Sep 17 00:00:00 2001 From: erm-g <110920239+erm-g@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:24:11 +0000 Subject: [PATCH 7/7] Automated change: Fix sanity tests --- build_autogenerated.yaml | 19 --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- .../envoy/config/cluster/v3/cluster_pb2.py | 132 +++++++++--------- .../config/endpoint/v3/load_report_pb2.py | 22 ++- .../envoy/config/trace/v3/datadog_pb2.py | 9 +- .../http/gcp_authn/v3/gcp_authn_pb2.py | 24 ++-- .../grpc_json_transcoder/v3/transcoder_pb2.py | 24 ++-- .../redirect_policy/v3/redirect_policy_pb2.py | 6 +- .../xds_protos/generated_file_import_test.py | 1 - tools/run_tests/generated/tests.json | 22 --- 10 files changed, 101 insertions(+), 160 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index dd56cb0f9d76b..43213aceb14fb 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -12944,25 +12944,6 @@ targets: deps: - gtest - grpc_test_util -- name: lock_free_event_test - gtest: true - build: test - language: c++ - headers: [] - src: - - test/core/event_engine/posix/lock_free_event_test.cc - deps: - - gtest - - benchmark - - grpc_test_util - args: - - --benchmark_min_time=0.001s - benchmark: true - defaults: benchmark - platforms: - - linux - - posix - uses_polling: false - name: log_too_many_open_files_test gtest: true build: test diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 260f6c6b908c9..85c27a09dc955 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "16c8d3db1af20fcc04b5190b25242aadcb1fbb30", + :commit => "b8a2bffc598f230484ff48a247526a9820facfc2", } s.ios.deployment_target = '10.0' diff --git a/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py b/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py index 2dd84f96e9a3d..65716280de8fb 100644 --- a/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py +++ b/tools/distrib/python/xds_protos/envoy/config/cluster/v3/cluster_pb2.py @@ -37,7 +37,7 @@ from validate import validate_pb2 as validate_dot_validate__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%envoy/config/cluster/v3/cluster.proto\x12\x17\x65nvoy.config.cluster.v3\x1a-envoy/config/cluster/v3/circuit_breaker.proto\x1a$envoy/config/cluster/v3/filter.proto\x1a/envoy/config/cluster/v3/outlier_detection.proto\x1a\"envoy/config/core/v3/address.proto\x1a\x1f\x65nvoy/config/core/v3/base.proto\x1a(envoy/config/core/v3/config_source.proto\x1a$envoy/config/core/v3/extension.proto\x1a\'envoy/config/core/v3/health_check.proto\x1a#envoy/config/core/v3/protocol.proto\x1a#envoy/config/core/v3/resolver.proto\x1a\'envoy/config/endpoint/v3/endpoint.proto\x1a%envoy/type/metadata/v3/metadata.proto\x1a\x1b\x65nvoy/type/v3/percent.proto\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\"xds/core/v3/collection_entry.proto\x1a#envoy/annotations/deprecation.proto\x1a\x1eudpa/annotations/migrate.proto\x1a\x1fudpa/annotations/security.proto\x1a\x1dudpa/annotations/status.proto\x1a!udpa/annotations/versioning.proto\x1a\x17validate/validate.proto\"B\n\x11\x43lusterCollection\x12-\n\x07\x65ntries\x18\x01 \x01(\x0b\x32\x1c.xds.core.v3.CollectionEntry\"\xde\x44\n\x07\x43luster\x12W\n\x18transport_socket_matches\x18+ \x03(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12\x31\n\ralt_stat_name\x18\x1c \x01(\tB\x1a\xf2\x98\xfe\x8f\x05\x14\n\x12observability_name\x12H\n\x04type\x18\x02 \x01(\x0e\x32..envoy.config.cluster.v3.Cluster.DiscoveryTypeB\x08\xfa\x42\x05\x82\x01\x02\x10\x01H\x00\x12J\n\x0c\x63luster_type\x18& \x01(\x0b\x32\x32.envoy.config.cluster.v3.Cluster.CustomClusterTypeH\x00\x12M\n\x12\x65\x64s_cluster_config\x18\x03 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.EdsClusterConfig\x12<\n\x0f\x63onnect_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationB\x08\xfa\x42\x05\xaa\x01\x02*\x00\x12P\n!per_connection_buffer_limit_bytes\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\x8a\x93\xb7*\x02\x10\x01\x12\x46\n\tlb_policy\x18\x06 \x01(\x0e\x32).envoy.config.cluster.v3.Cluster.LbPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12H\n\x0fload_assignment\x18! \x01(\x0b\x32/.envoy.config.endpoint.v3.ClusterLoadAssignment\x12\x38\n\rhealth_checks\x18\x08 \x03(\x0b\x32!.envoy.config.core.v3.HealthCheck\x12N\n\x1bmax_requests_per_connection\x18\t \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x42\n\x10\x63ircuit_breakers\x18\n \x01(\x0b\x32(.envoy.config.cluster.v3.CircuitBreakers\x12\x66\n\x1eupstream_http_protocol_options\x18. \x01(\x0b\x32\x31.envoy.config.core.v3.UpstreamHttpProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\\\n\x1c\x63ommon_http_protocol_options\x18\x1d \x01(\x0b\x32).envoy.config.core.v3.HttpProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12V\n\x15http_protocol_options\x18\r \x01(\x0b\x32*.envoy.config.core.v3.Http1ProtocolOptionsB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12^\n\x16http2_protocol_options\x18\x0e \x01(\x0b\x32*.envoy.config.core.v3.Http2ProtocolOptionsB\x12\x18\x01\x8a\x93\xb7*\x02\x10\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12m\n typed_extension_protocol_options\x18$ \x03(\x0b\x32\x43.envoy.config.cluster.v3.Cluster.TypedExtensionProtocolOptionsEntry\x12\x41\n\x10\x64ns_refresh_rate\x18\x10 \x01(\x0b\x32\x19.google.protobuf.DurationB\x0c\xfa\x42\t\xaa\x01\x06*\x04\x10\xc0\x84=\x12N\n\x18\x64ns_failure_refresh_rate\x18, \x01(\x0b\x32,.envoy.config.cluster.v3.Cluster.RefreshRate\x12\x17\n\x0frespect_dns_ttl\x18\' \x01(\x08\x12U\n\x11\x64ns_lookup_family\x18\x11 \x01(\x0e\x32\x30.envoy.config.cluster.v3.Cluster.DnsLookupFamilyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x41\n\rdns_resolvers\x18\x12 \x03(\x0b\x32\x1d.envoy.config.core.v3.AddressB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12,\n\x17use_tcp_for_dns_lookups\x18- \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12U\n\x15\x64ns_resolution_config\x18\x35 \x01(\x0b\x32).envoy.config.core.v3.DnsResolutionConfigB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12M\n\x19typed_dns_resolver_config\x18\x37 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12\x39\n\x15wait_for_warm_on_init\x18\x36 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x44\n\x11outlier_detection\x18\x13 \x01(\x0b\x32).envoy.config.cluster.v3.OutlierDetection\x12=\n\x10\x63leanup_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.DurationB\x08\xfa\x42\x05\xaa\x01\x02*\x00\x12>\n\x14upstream_bind_config\x18\x15 \x01(\x0b\x32 .envoy.config.core.v3.BindConfig\x12I\n\x10lb_subset_config\x18\x16 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.LbSubsetConfig\x12P\n\x13ring_hash_lb_config\x18\x17 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.RingHashLbConfigH\x01\x12K\n\x10maglev_lb_config\x18\x34 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.MaglevLbConfigH\x01\x12V\n\x16original_dst_lb_config\x18\" \x01(\x0b\x32\x34.envoy.config.cluster.v3.Cluster.OriginalDstLbConfigH\x01\x12X\n\x17least_request_lb_config\x18% \x01(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.LeastRequestLbConfigH\x01\x12T\n\x15round_robin_lb_config\x18\x38 \x01(\x0b\x32\x33.envoy.config.cluster.v3.Cluster.RoundRobinLbConfigH\x01\x12I\n\x10\x63ommon_lb_config\x18\x1b \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.CommonLbConfig\x12?\n\x10transport_socket\x18\x18 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket\x12\x30\n\x08metadata\x18\x19 \x01(\x0b\x32\x1e.envoy.config.core.v3.Metadata\x12\x62\n\x12protocol_selection\x18\x1a \x01(\x0e\x32\x39.envoy.config.cluster.v3.Cluster.ClusterProtocolSelectionB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12W\n\x1bupstream_connection_options\x18\x1e \x01(\x0b\x32\x32.envoy.config.cluster.v3.UpstreamConnectionOptions\x12\x30\n(close_connections_on_host_health_failure\x18\x1f \x01(\x08\x12%\n\x1dignore_health_on_host_removal\x18 \x01(\x08\x12\x30\n\x07\x66ilters\x18( \x03(\x0b\x32\x1f.envoy.config.cluster.v3.Filter\x12K\n\x15load_balancing_policy\x18) \x01(\x0b\x32,.envoy.config.cluster.v3.LoadBalancingPolicy\x12\x36\n\nlrs_server\x18* \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12#\n\x1blrs_report_endpoint_metrics\x18\x39 \x03(\t\x12*\n\x15track_timeout_budgets\x18/ \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x43\n\x0fupstream_config\x18\x30 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12G\n\x13track_cluster_stats\x18\x31 \x01(\x0b\x32*.envoy.config.cluster.v3.TrackClusterStats\x12L\n\x11preconnect_policy\x18\x32 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.PreconnectPolicy\x12\x31\n)connection_pool_per_downstream_connection\x18\x33 \x01(\x08\x1a\xc8\x01\n\x14TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12&\n\x05match\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12?\n\x10transport_socket\x18\x03 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.TransportSocketMatch\x1a\x85\x01\n\x11\x43ustomClusterType\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12*\n\x0ctyped_config\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:-\x9a\xc5\x88\x1e(\n&envoy.api.v2.Cluster.CustomClusterType\x1a\x8e\x01\n\x10\x45\x64sClusterConfig\x12\x36\n\neds_config\x18\x01 \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12\x14\n\x0cservice_name\x18\x02 \x01(\t:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.EdsClusterConfig\x1a\xd9\x08\n\x0eLbSubsetConfig\x12i\n\x0f\x66\x61llback_policy\x18\x01 \x01(\x0e\x32\x46.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12/\n\x0e\x64\x65\x66\x61ult_subset\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12Z\n\x10subset_selectors\x18\x03 \x03(\x0b\x32@.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector\x12\x1d\n\x15locality_weight_aware\x18\x04 \x01(\x08\x12\x1d\n\x15scale_locality_weight\x18\x05 \x01(\x08\x12\x16\n\x0epanic_mode_any\x18\x06 \x01(\x08\x12\x13\n\x0blist_as_any\x18\x07 \x01(\x08\x12z\n\x18metadata_fallback_policy\x18\x08 \x01(\x0e\x32N.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x1a\x9b\x03\n\x10LbSubsetSelector\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x1e\n\x16single_host_per_subset\x18\x04 \x01(\x08\x12\x82\x01\n\x0f\x66\x61llback_policy\x18\x02 \x01(\x0e\x32_.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x1c\n\x14\x66\x61llback_keys_subset\x18\x03 \x03(\t\"y\n\x1eLbSubsetSelectorFallbackPolicy\x12\x0f\n\x0bNOT_DEFINED\x10\x00\x12\x0f\n\x0bNO_FALLBACK\x10\x01\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x02\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x03\x12\x0f\n\x0bKEYS_SUBSET\x10\x04:;\x9a\xc5\x88\x1e\x36\n4envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector\"O\n\x16LbSubsetFallbackPolicy\x12\x0f\n\x0bNO_FALLBACK\x10\x00\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x01\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x02\"M\n\x1eLbSubsetMetadataFallbackPolicy\x12\x18\n\x14METADATA_NO_FALLBACK\x10\x00\x12\x11\n\rFALLBACK_LIST\x10\x01:*\x9a\xc5\x88\x1e%\n#envoy.api.v2.Cluster.LbSubsetConfig\x1a\xb4\x01\n\x0fSlowStartConfig\x12\x34\n\x11slow_start_window\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\naggression\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12\x32\n\x12min_weight_percent\x18\x03 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x1a\x61\n\x12RoundRobinLbConfig\x12K\n\x11slow_start_config\x18\x01 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig\x1a\x94\x02\n\x14LeastRequestLbConfig\x12;\n\x0c\x63hoice_count\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\xfa\x42\x04*\x02(\x02\x12@\n\x13\x61\x63tive_request_bias\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12K\n\x11slow_start_config\x18\x03 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.LeastRequestLbConfig\x1a\xe1\x02\n\x10RingHashLbConfig\x12\x43\n\x11minimum_ring_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\x12_\n\rhash_function\x18\x03 \x01(\x0e\x32>.envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunctionB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x43\n\x11maximum_ring_size\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\".\n\x0cHashFunction\x12\x0b\n\x07XX_HASH\x10\x00\x12\x11\n\rMURMUR_HASH_2\x10\x01:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.RingHashLbConfigJ\x04\x08\x02\x10\x03\x1aN\n\x0eMaglevLbConfig\x12<\n\ntable_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\xcb\x96\xb1\x02\x1a\xfd\x01\n\x13OriginalDstLbConfig\x12\x17\n\x0fuse_http_header\x18\x01 \x01(\x08\x12\x18\n\x10http_header_name\x18\x02 \x01(\t\x12G\n\x16upstream_port_override\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\t\xfa\x42\x06*\x04\x18\xff\xff\x03\x12\x39\n\x0cmetadata_key\x18\x04 \x01(\x0b\x32#.envoy.type.metadata.v3.MetadataKey:/\x9a\xc5\x88\x1e*\n(envoy.api.v2.Cluster.OriginalDstLbConfig\x1a\xb2\t\n\x0e\x43ommonLbConfig\x12\x37\n\x17healthy_panic_threshold\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x61\n\x14zone_aware_lb_config\x18\x02 \x01(\x0b\x32\x41.envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfigH\x00\x12o\n\x1blocality_weighted_lb_config\x18\x03 \x01(\x0b\x32H.envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfigH\x00\x12\x36\n\x13update_merge_window\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1fignore_new_hosts_until_first_hc\x18\x05 \x01(\x08\x12,\n$close_connections_on_host_set_change\x18\x06 \x01(\x08\x12o\n\x1c\x63onsistent_hashing_lb_config\x18\x07 \x01(\x0b\x32I.envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig\x12\x43\n\x14override_host_status\x18\x08 \x01(\x0b\x32%.envoy.config.core.v3.HealthStatusSet\x1a\xd9\x01\n\x11ZoneAwareLbConfig\x12/\n\x0frouting_enabled\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x36\n\x10min_cluster_size\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt64Value\x12\x1d\n\x15\x66\x61il_traffic_on_panic\x18\x03 \x01(\x08:<\x9a\xc5\x88\x1e\x37\n5envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig\x1a_\n\x18LocalityWeightedLbConfig:C\x9a\xc5\x88\x1e>\n\n\x14upstream_bind_config\x18\x15 \x01(\x0b\x32 .envoy.config.core.v3.BindConfig\x12I\n\x10lb_subset_config\x18\x16 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.LbSubsetConfig\x12P\n\x13ring_hash_lb_config\x18\x17 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.RingHashLbConfigH\x01\x12K\n\x10maglev_lb_config\x18\x34 \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.MaglevLbConfigH\x01\x12V\n\x16original_dst_lb_config\x18\" \x01(\x0b\x32\x34.envoy.config.cluster.v3.Cluster.OriginalDstLbConfigH\x01\x12X\n\x17least_request_lb_config\x18% \x01(\x0b\x32\x35.envoy.config.cluster.v3.Cluster.LeastRequestLbConfigH\x01\x12T\n\x15round_robin_lb_config\x18\x38 \x01(\x0b\x32\x33.envoy.config.cluster.v3.Cluster.RoundRobinLbConfigH\x01\x12I\n\x10\x63ommon_lb_config\x18\x1b \x01(\x0b\x32/.envoy.config.cluster.v3.Cluster.CommonLbConfig\x12?\n\x10transport_socket\x18\x18 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket\x12\x30\n\x08metadata\x18\x19 \x01(\x0b\x32\x1e.envoy.config.core.v3.Metadata\x12\x62\n\x12protocol_selection\x18\x1a \x01(\x0e\x32\x39.envoy.config.cluster.v3.Cluster.ClusterProtocolSelectionB\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12W\n\x1bupstream_connection_options\x18\x1e \x01(\x0b\x32\x32.envoy.config.cluster.v3.UpstreamConnectionOptions\x12\x30\n(close_connections_on_host_health_failure\x18\x1f \x01(\x08\x12%\n\x1dignore_health_on_host_removal\x18 \x01(\x08\x12\x30\n\x07\x66ilters\x18( \x03(\x0b\x32\x1f.envoy.config.cluster.v3.Filter\x12K\n\x15load_balancing_policy\x18) \x01(\x0b\x32,.envoy.config.cluster.v3.LoadBalancingPolicy\x12\x36\n\nlrs_server\x18* \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12*\n\x15track_timeout_budgets\x18/ \x01(\x08\x42\x0b\x18\x01\x92\xc7\x86\xd8\x04\x03\x33.0\x12\x43\n\x0fupstream_config\x18\x30 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfig\x12G\n\x13track_cluster_stats\x18\x31 \x01(\x0b\x32*.envoy.config.cluster.v3.TrackClusterStats\x12L\n\x11preconnect_policy\x18\x32 \x01(\x0b\x32\x31.envoy.config.cluster.v3.Cluster.PreconnectPolicy\x12\x31\n)connection_pool_per_downstream_connection\x18\x33 \x01(\x08\x1a\xc8\x01\n\x14TransportSocketMatch\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12&\n\x05match\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12?\n\x10transport_socket\x18\x03 \x01(\x0b\x32%.envoy.config.core.v3.TransportSocket:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.TransportSocketMatch\x1a\x85\x01\n\x11\x43ustomClusterType\x12\x15\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01\x12*\n\x0ctyped_config\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:-\x9a\xc5\x88\x1e(\n&envoy.api.v2.Cluster.CustomClusterType\x1a\x8e\x01\n\x10\x45\x64sClusterConfig\x12\x36\n\neds_config\x18\x01 \x01(\x0b\x32\".envoy.config.core.v3.ConfigSource\x12\x14\n\x0cservice_name\x18\x02 \x01(\t:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.EdsClusterConfig\x1a\xd9\x08\n\x0eLbSubsetConfig\x12i\n\x0f\x66\x61llback_policy\x18\x01 \x01(\x0e\x32\x46.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12/\n\x0e\x64\x65\x66\x61ult_subset\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12Z\n\x10subset_selectors\x18\x03 \x03(\x0b\x32@.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector\x12\x1d\n\x15locality_weight_aware\x18\x04 \x01(\x08\x12\x1d\n\x15scale_locality_weight\x18\x05 \x01(\x08\x12\x16\n\x0epanic_mode_any\x18\x06 \x01(\x08\x12\x13\n\x0blist_as_any\x18\x07 \x01(\x08\x12z\n\x18metadata_fallback_policy\x18\x08 \x01(\x0e\x32N.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x1a\x9b\x03\n\x10LbSubsetSelector\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x1e\n\x16single_host_per_subset\x18\x04 \x01(\x08\x12\x82\x01\n\x0f\x66\x61llback_policy\x18\x02 \x01(\x0e\x32_.envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicyB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x1c\n\x14\x66\x61llback_keys_subset\x18\x03 \x03(\t\"y\n\x1eLbSubsetSelectorFallbackPolicy\x12\x0f\n\x0bNOT_DEFINED\x10\x00\x12\x0f\n\x0bNO_FALLBACK\x10\x01\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x02\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x03\x12\x0f\n\x0bKEYS_SUBSET\x10\x04:;\x9a\xc5\x88\x1e\x36\n4envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector\"O\n\x16LbSubsetFallbackPolicy\x12\x0f\n\x0bNO_FALLBACK\x10\x00\x12\x10\n\x0c\x41NY_ENDPOINT\x10\x01\x12\x12\n\x0e\x44\x45\x46\x41ULT_SUBSET\x10\x02\"M\n\x1eLbSubsetMetadataFallbackPolicy\x12\x18\n\x14METADATA_NO_FALLBACK\x10\x00\x12\x11\n\rFALLBACK_LIST\x10\x01:*\x9a\xc5\x88\x1e%\n#envoy.api.v2.Cluster.LbSubsetConfig\x1a\xb4\x01\n\x0fSlowStartConfig\x12\x34\n\x11slow_start_window\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\naggression\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12\x32\n\x12min_weight_percent\x18\x03 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x1a\x61\n\x12RoundRobinLbConfig\x12K\n\x11slow_start_config\x18\x01 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig\x1a\x94\x02\n\x14LeastRequestLbConfig\x12;\n\x0c\x63hoice_count\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x07\xfa\x42\x04*\x02(\x02\x12@\n\x13\x61\x63tive_request_bias\x18\x02 \x01(\x0b\x32#.envoy.config.core.v3.RuntimeDouble\x12K\n\x11slow_start_config\x18\x03 \x01(\x0b\x32\x30.envoy.config.cluster.v3.Cluster.SlowStartConfig:0\x9a\xc5\x88\x1e+\n)envoy.api.v2.Cluster.LeastRequestLbConfig\x1a\xe1\x02\n\x10RingHashLbConfig\x12\x43\n\x11minimum_ring_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\x12_\n\rhash_function\x18\x03 \x01(\x0e\x32>.envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunctionB\x08\xfa\x42\x05\x82\x01\x02\x10\x01\x12\x43\n\x11maximum_ring_size\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\x80\x80\x80\x04\".\n\x0cHashFunction\x12\x0b\n\x07XX_HASH\x10\x00\x12\x11\n\rMURMUR_HASH_2\x10\x01:,\x9a\xc5\x88\x1e\'\n%envoy.api.v2.Cluster.RingHashLbConfigJ\x04\x08\x02\x10\x03\x1aN\n\x0eMaglevLbConfig\x12<\n\ntable_size\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt64ValueB\n\xfa\x42\x07\x32\x05\x18\xcb\x96\xb1\x02\x1a\xfd\x01\n\x13OriginalDstLbConfig\x12\x17\n\x0fuse_http_header\x18\x01 \x01(\x08\x12\x18\n\x10http_header_name\x18\x02 \x01(\t\x12G\n\x16upstream_port_override\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\t\xfa\x42\x06*\x04\x18\xff\xff\x03\x12\x39\n\x0cmetadata_key\x18\x04 \x01(\x0b\x32#.envoy.type.metadata.v3.MetadataKey:/\x9a\xc5\x88\x1e*\n(envoy.api.v2.Cluster.OriginalDstLbConfig\x1a\xb2\t\n\x0e\x43ommonLbConfig\x12\x37\n\x17healthy_panic_threshold\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x61\n\x14zone_aware_lb_config\x18\x02 \x01(\x0b\x32\x41.envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfigH\x00\x12o\n\x1blocality_weighted_lb_config\x18\x03 \x01(\x0b\x32H.envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfigH\x00\x12\x36\n\x13update_merge_window\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1fignore_new_hosts_until_first_hc\x18\x05 \x01(\x08\x12,\n$close_connections_on_host_set_change\x18\x06 \x01(\x08\x12o\n\x1c\x63onsistent_hashing_lb_config\x18\x07 \x01(\x0b\x32I.envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig\x12\x43\n\x14override_host_status\x18\x08 \x01(\x0b\x32%.envoy.config.core.v3.HealthStatusSet\x1a\xd9\x01\n\x11ZoneAwareLbConfig\x12/\n\x0frouting_enabled\x18\x01 \x01(\x0b\x32\x16.envoy.type.v3.Percent\x12\x36\n\x10min_cluster_size\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt64Value\x12\x1d\n\x15\x66\x61il_traffic_on_panic\x18\x03 \x01(\x08:<\x9a\xc5\x88\x1e\x37\n5envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig\x1a_\n\x18LocalityWeightedLbConfig:C\x9a\xc5\x88\x1e>\n\n\x0bstatus_code\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x0b\xfa\x42\x08*\x06\x18\xe7\x07(\xc8\x01\x12S\n\x17response_headers_to_add\x18\x04 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12R\n\x16request_headers_to_add\x18\x05 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12Q\n\x1dmodify_request_headers_action\x18\x06 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfigB \n\x19redirect_action_specifier\x12\x03\xf8\x42\x01\x42\xe2\x01\nFio.envoyproxy.envoy.extensions.http.custom_response.redirect_policy.v3B\x13RedirectPolicyProtoP\x01Zqgithub.com/envoyproxy/go-control-plane/envoy/extensions/http/custom_response/redirect_policy/v3;redirect_policyv3\xba\x80\xc8\xd1\x06\x02\x10\x02\xd2\xc6\xa4\xe1\x06\x02\x08\x01\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\nNenvoy/extensions/http/custom_response/redirect_policy/v3/redirect_policy.proto\x12\x38\x65nvoy.extensions.http.custom_response.redirect_policy.v3\x1a\x1f\x65nvoy/config/core/v3/base.proto\x1a$envoy/config/core/v3/extension.proto\x1a,envoy/config/route/v3/route_components.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1fxds/annotations/v3/status.proto\x1a\x1dudpa/annotations/status.proto\x1a\x17validate/validate.proto\"\xc7\x03\n\x0eRedirectPolicy\x12\x16\n\x03uri\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x10\x01H\x00\x12@\n\x0fredirect_action\x18\x02 \x01(\x0b\x32%.envoy.config.route.v3.RedirectActionH\x00\x12=\n\x0bstatus_code\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\n\xfa\x42\x07*\x05\x18\xe7\x07(d\x12S\n\x17response_headers_to_add\x18\x04 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12R\n\x16request_headers_to_add\x18\x05 \x03(\x0b\x32\'.envoy.config.core.v3.HeaderValueOptionB\t\xfa\x42\x06\x92\x01\x03\x10\xe8\x07\x12Q\n\x1dmodify_request_headers_action\x18\x06 \x01(\x0b\x32*.envoy.config.core.v3.TypedExtensionConfigB \n\x19redirect_action_specifier\x12\x03\xf8\x42\x01\x42\xe2\x01\nFio.envoyproxy.envoy.extensions.http.custom_response.redirect_policy.v3B\x13RedirectPolicyProtoP\x01Zqgithub.com/envoyproxy/go-control-plane/envoy/extensions/http/custom_response/redirect_policy/v3;redirect_policyv3\xba\x80\xc8\xd1\x06\x02\x10\x02\xd2\xc6\xa4\xe1\x06\x02\x08\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,11 +33,11 @@ _REDIRECTPOLICY.fields_by_name['uri']._options = None _REDIRECTPOLICY.fields_by_name['uri']._serialized_options = b'\372B\004r\002\020\001' _REDIRECTPOLICY.fields_by_name['status_code']._options = None - _REDIRECTPOLICY.fields_by_name['status_code']._serialized_options = b'\372B\010*\006\030\347\007(\310\001' + _REDIRECTPOLICY.fields_by_name['status_code']._serialized_options = b'\372B\007*\005\030\347\007(d' _REDIRECTPOLICY.fields_by_name['response_headers_to_add']._options = None _REDIRECTPOLICY.fields_by_name['response_headers_to_add']._serialized_options = b'\372B\006\222\001\003\020\350\007' _REDIRECTPOLICY.fields_by_name['request_headers_to_add']._options = None _REDIRECTPOLICY.fields_by_name['request_headers_to_add']._serialized_options = b'\372B\006\222\001\003\020\350\007' _globals['_REDIRECTPOLICY']._serialized_start=379 - _globals['_REDIRECTPOLICY']._serialized_end=835 + _globals['_REDIRECTPOLICY']._serialized_end=834 # @@protoc_insertion_point(module_scope) diff --git a/tools/distrib/python/xds_protos/generated_file_import_test.py b/tools/distrib/python/xds_protos/generated_file_import_test.py index 4487a82a09082..c7fc6cb811f99 100644 --- a/tools/distrib/python/xds_protos/generated_file_import_test.py +++ b/tools/distrib/python/xds_protos/generated_file_import_test.py @@ -463,7 +463,6 @@ from envoy.extensions.string_matcher.lua.v3 import lua_pb2 from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import dynatrace_resource_detector_pb2 from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import environment_resource_detector_pb2 -from envoy.extensions.tracers.opentelemetry.resource_detectors.v3 import static_config_resource_detector_pb2 from envoy.extensions.tracers.opentelemetry.samplers.v3 import always_on_sampler_pb2 from envoy.extensions.tracers.opentelemetry.samplers.v3 import dynatrace_sampler_pb2 from envoy.extensions.transport_sockets.alts.v3 import alts_pb2 diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index be0c6d819aed5..ddbddd5ba4b46 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5755,28 +5755,6 @@ ], "uses_polling": true }, - { - "args": [ - "--benchmark_min_time=0.001s" - ], - "benchmark": true, - "ci_platforms": [ - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "lock_free_event_test", - "platforms": [ - "linux", - "posix" - ], - "uses_polling": false - }, { "args": [], "benchmark": false,