grpc 1.64.3 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +57 -58
- data/include/grpc/event_engine/event_engine.h +13 -6
- data/include/grpc/impl/channel_arg_names.h +7 -3
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/passive_listener.h +62 -0
- data/include/grpc/support/log.h +7 -17
- data/include/grpc/support/port_platform.h +3 -0
- data/src/core/channelz/channel_trace.cc +1 -1
- data/src/core/channelz/channel_trace.h +1 -1
- data/src/core/channelz/channelz.cc +3 -3
- data/src/core/channelz/channelz.h +7 -7
- data/src/core/channelz/channelz_registry.cc +4 -3
- data/src/core/client_channel/backup_poller.cc +4 -5
- data/src/core/client_channel/client_channel.cc +1324 -0
- data/src/core/client_channel/client_channel.h +243 -0
- data/src/core/client_channel/client_channel_filter.cc +266 -709
- data/src/core/client_channel/client_channel_filter.h +11 -64
- data/src/core/client_channel/client_channel_internal.h +16 -5
- data/src/core/client_channel/client_channel_plugin.cc +1 -14
- data/src/core/client_channel/client_channel_service_config.h +3 -3
- data/src/core/client_channel/config_selector.cc +1 -1
- data/src/core/client_channel/config_selector.h +1 -1
- data/src/core/client_channel/dynamic_filters.cc +3 -3
- data/src/core/client_channel/dynamic_filters.h +1 -3
- data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
- data/src/core/client_channel/load_balanced_call_destination.h +49 -0
- data/src/core/client_channel/retry_filter.cc +2 -9
- data/src/core/client_channel/retry_filter.h +2 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
- data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
- data/src/core/client_channel/retry_service_config.cc +4 -5
- data/src/core/client_channel/retry_service_config.h +3 -3
- data/src/core/client_channel/subchannel.cc +220 -112
- data/src/core/client_channel/subchannel.h +31 -18
- data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
- data/src/core/client_channel/subchannel_pool_interface.h +2 -4
- data/src/core/client_channel/subchannel_stream_client.cc +36 -49
- data/src/core/client_channel/subchannel_stream_client.h +2 -4
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
- data/src/core/ext/filters/census/grpc_context.cc +2 -4
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
- data/src/core/ext/filters/http/client_authority_filter.h +1 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
- data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
- data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
- data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
- data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
- data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -43
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
- data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
- data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
- data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
- data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
- data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
- data/src/core/handshaker/handshaker.cc +6 -14
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
- data/src/core/handshaker/security/secure_endpoint.cc +38 -32
- data/src/core/handshaker/security/secure_endpoint.h +0 -2
- data/src/core/handshaker/security/security_handshaker.cc +25 -37
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
- data/src/core/lib/address_utils/parse_address.cc +27 -39
- data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
- data/src/core/lib/avl/avl.h +1 -1
- data/src/core/lib/channel/channel_args.cc +13 -17
- data/src/core/lib/channel/channel_args.h +19 -8
- data/src/core/lib/channel/channel_stack.cc +5 -63
- data/src/core/lib/channel/channel_stack.h +13 -37
- data/src/core/lib/channel/channel_stack_builder.h +0 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
- data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
- data/src/core/lib/channel/connected_channel.cc +37 -676
- data/src/core/lib/channel/promise_based_filter.cc +41 -47
- data/src/core/lib/channel/promise_based_filter.h +124 -477
- data/src/core/lib/channel/status_util.cc +1 -1
- data/src/core/lib/compression/compression.cc +1 -1
- data/src/core/lib/compression/message_compress.cc +6 -6
- data/src/core/lib/config/config_vars.cc +3 -8
- data/src/core/lib/config/config_vars.h +1 -5
- data/src/core/lib/debug/event_log.h +1 -1
- data/src/core/lib/debug/trace.cc +43 -59
- data/src/core/lib/debug/trace.h +2 -97
- data/src/core/lib/debug/trace_flags.cc +255 -0
- data/src/core/lib/debug/trace_flags.h +133 -0
- data/src/core/lib/debug/trace_impl.h +115 -0
- data/src/core/lib/event_engine/ares_resolver.cc +5 -7
- data/src/core/lib/event_engine/ares_resolver.h +1 -3
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
- data/src/core/lib/event_engine/event_engine.cc +29 -4
- data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
- data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
- data/src/core/lib/event_engine/forkable.cc +4 -5
- data/src/core/lib/event_engine/forkable.h +0 -11
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
- data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
- data/src/core/lib/event_engine/shim.cc +1 -1
- data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
- data/src/core/lib/event_engine/thread_local.h +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
- data/src/core/lib/event_engine/trace.h +6 -17
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
- data/src/core/lib/event_engine/windows/win_socket.h +4 -5
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
- data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
- data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
- data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
- data/src/core/lib/experiments/experiments.cc +35 -151
- data/src/core/lib/experiments/experiments.h +12 -45
- data/src/core/lib/gprpp/bitset.h +1 -1
- data/src/core/lib/gprpp/crash.cc +2 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
- data/src/core/lib/gprpp/dump_args.cc +54 -0
- data/src/core/lib/gprpp/dump_args.h +69 -0
- data/src/core/lib/gprpp/glob.cc +70 -0
- data/src/core/lib/gprpp/glob.h +29 -0
- data/src/core/lib/gprpp/per_cpu.cc +1 -1
- data/src/core/lib/gprpp/posix/stat.cc +3 -4
- data/src/core/lib/gprpp/posix/thd.cc +8 -9
- data/src/core/lib/gprpp/ref_counted.h +30 -22
- data/src/core/lib/gprpp/single_set_ptr.h +5 -3
- data/src/core/lib/gprpp/status_helper.cc +11 -30
- data/src/core/lib/gprpp/status_helper.h +3 -31
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +3 -2
- data/src/core/lib/gprpp/unique_type_name.h +1 -1
- data/src/core/lib/gprpp/validation_errors.cc +10 -1
- data/src/core/lib/gprpp/validation_errors.h +11 -0
- data/src/core/lib/gprpp/windows/stat.cc +3 -4
- data/src/core/lib/gprpp/windows/thd.cc +3 -2
- data/src/core/lib/gprpp/work_serializer.cc +48 -57
- data/src/core/lib/iomgr/buffer_list.cc +4 -2
- data/src/core/lib/iomgr/call_combiner.cc +18 -27
- data/src/core/lib/iomgr/call_combiner.h +1 -3
- data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
- data/src/core/lib/iomgr/closure.h +2 -4
- data/src/core/lib/iomgr/combiner.cc +6 -8
- data/src/core/lib/iomgr/combiner.h +0 -2
- data/src/core/lib/iomgr/endpoint.cc +0 -6
- data/src/core/lib/iomgr/endpoint.h +0 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
- data/src/core/lib/iomgr/error.cc +13 -21
- data/src/core/lib/iomgr/error.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +3 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
- data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
- data/src/core/lib/iomgr/ev_posix.cc +8 -9
- data/src/core/lib/iomgr/ev_posix.h +10 -7
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
- data/src/core/lib/iomgr/exec_ctx.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/executor.cc +6 -15
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/fork_posix.cc +8 -10
- data/src/core/lib/iomgr/fork_windows.cc +3 -1
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
- data/src/core/lib/iomgr/iocp_windows.cc +4 -3
- data/src/core/lib/iomgr/iomgr.cc +13 -17
- data/src/core/lib/iomgr/lockfree_event.cc +3 -5
- data/src/core/lib/iomgr/pollset.h +0 -2
- data/src/core/lib/iomgr/pollset_windows.cc +0 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
- data/src/core/lib/iomgr/socket_windows.cc +4 -6
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
- data/src/core/lib/iomgr/tcp_posix.cc +57 -84
- data/src/core/lib/iomgr/tcp_posix.h +0 -2
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
- data/src/core/lib/iomgr/tcp_windows.cc +25 -41
- data/src/core/lib/iomgr/timer_generic.cc +17 -20
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/iomgr/timer_manager.cc +17 -30
- data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
- data/src/core/lib/iomgr/vsock.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
- data/src/core/lib/promise/activity.h +27 -4
- data/src/core/lib/promise/cancel_callback.h +24 -0
- data/src/core/lib/promise/context.h +11 -0
- data/src/core/lib/promise/detail/basic_seq.h +1 -2
- data/src/core/lib/promise/detail/join_state.h +354 -398
- data/src/core/lib/promise/detail/promise_like.h +6 -5
- data/src/core/lib/promise/detail/seq_state.h +1178 -1178
- data/src/core/lib/promise/for_each.h +6 -6
- data/src/core/lib/promise/interceptor_list.h +6 -7
- data/src/core/lib/promise/latch.h +9 -9
- data/src/core/lib/promise/map.h +17 -0
- data/src/core/lib/promise/observable.h +182 -0
- data/src/core/lib/promise/party.cc +7 -8
- data/src/core/lib/promise/party.h +10 -8
- data/src/core/lib/promise/pipe.h +16 -35
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/status_flag.h +2 -0
- data/src/core/lib/resource_quota/arena.cc +56 -79
- data/src/core/lib/resource_quota/arena.h +118 -209
- data/src/core/lib/resource_quota/memory_quota.cc +12 -13
- data/src/core/lib/resource_quota/memory_quota.h +2 -3
- data/src/core/lib/resource_quota/periodic_update.cc +1 -1
- data/src/core/lib/resource_quota/resource_quota.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
- data/src/core/lib/security/authorization/matchers.cc +3 -3
- data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
- data/src/core/lib/security/context/security_context.cc +12 -13
- data/src/core/lib/security/context/security_context.h +31 -8
- data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
- data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
- data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
- data/src/core/lib/security/credentials/credentials.cc +6 -6
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
- data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
- data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
- data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
- data/src/core/lib/security/security_connector/security_connector.cc +1 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
- data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
- data/src/core/lib/security/transport/auth_filters.h +1 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
- data/src/core/lib/security/util/json_util.h +1 -1
- data/src/core/lib/slice/slice.h +1 -1
- data/src/core/lib/slice/slice_refcount.h +2 -4
- data/src/core/lib/slice/slice_string_helpers.cc +1 -1
- data/src/core/lib/surface/api_trace.h +1 -3
- data/src/core/lib/surface/call.cc +64 -3738
- data/src/core/lib/surface/call.h +41 -143
- data/src/core/lib/surface/call_log_batch.cc +1 -1
- data/src/core/lib/surface/call_utils.cc +276 -0
- data/src/core/lib/surface/call_utils.h +449 -0
- data/src/core/lib/surface/channel.cc +8 -3
- data/src/core/lib/surface/channel.h +10 -7
- data/src/core/lib/surface/channel_create.cc +14 -6
- data/src/core/lib/surface/channel_create.h +3 -2
- data/src/core/lib/surface/channel_init.cc +21 -77
- data/src/core/lib/surface/channel_init.h +19 -97
- data/src/core/lib/surface/client_call.cc +419 -0
- data/src/core/lib/surface/client_call.h +180 -0
- data/src/core/lib/surface/completion_queue.cc +28 -33
- data/src/core/lib/surface/completion_queue.h +0 -8
- data/src/core/lib/surface/filter_stack_call.cc +1157 -0
- data/src/core/lib/surface/filter_stack_call.h +369 -0
- data/src/core/lib/surface/init.cc +7 -6
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/legacy_channel.cc +40 -27
- data/src/core/lib/surface/legacy_channel.h +9 -18
- data/src/core/lib/surface/server_call.cc +222 -0
- data/src/core/lib/surface/server_call.h +167 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +3 -5
- data/src/core/lib/transport/bdp_estimator.h +2 -4
- data/src/core/lib/transport/call_arena_allocator.h +9 -7
- data/src/core/lib/transport/call_destination.h +76 -0
- data/src/core/lib/transport/call_filters.cc +28 -10
- data/src/core/lib/transport/call_filters.h +128 -22
- data/src/core/lib/transport/call_spine.cc +5 -6
- data/src/core/lib/transport/call_spine.h +159 -334
- data/src/core/lib/transport/connectivity_state.cc +8 -10
- data/src/core/lib/transport/connectivity_state.h +0 -2
- data/src/core/lib/transport/interception_chain.cc +155 -0
- data/src/core/lib/transport/interception_chain.h +236 -0
- data/src/core/lib/transport/metadata_batch.h +10 -1
- data/src/core/lib/transport/metadata_info.h +1 -1
- data/src/core/lib/transport/transport.cc +3 -6
- data/src/core/lib/transport/transport.h +43 -40
- data/src/core/load_balancing/child_policy_handler.cc +8 -8
- data/src/core/load_balancing/endpoint_list.cc +5 -5
- data/src/core/load_balancing/endpoint_list.h +1 -1
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
- data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
- data/src/core/load_balancing/health_check_client.cc +10 -13
- data/src/core/load_balancing/lb_policy.cc +5 -8
- data/src/core/load_balancing/lb_policy.h +19 -3
- data/src/core/load_balancing/lb_policy_factory.h +1 -1
- data/src/core/load_balancing/lb_policy_registry.cc +2 -3
- data/src/core/load_balancing/lb_policy_registry.h +1 -1
- data/src/core/load_balancing/oob_backend_metric.cc +2 -4
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
- data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
- data/src/core/load_balancing/priority/priority.cc +26 -28
- data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
- data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
- data/src/core/load_balancing/rls/rls.cc +82 -82
- data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
- data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
- data/src/core/load_balancing/xds/cds.cc +14 -16
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
- data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
- data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
- data/src/core/load_balancing/xds/xds_override_host.h +3 -3
- data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
- data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
- data/src/core/resolver/binder/binder_resolver.cc +3 -2
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
- data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
- data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
- data/src/core/resolver/endpoint_addresses.cc +1 -1
- data/src/core/resolver/fake/fake_resolver.cc +1 -1
- data/src/core/resolver/fake/fake_resolver.h +1 -1
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
- data/src/core/resolver/polling_resolver.cc +30 -35
- data/src/core/resolver/resolver.cc +2 -6
- data/src/core/resolver/resolver.h +0 -2
- data/src/core/resolver/resolver_registry.cc +6 -8
- data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
- data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
- data/src/core/resolver/xds/xds_resolver.cc +13 -15
- data/src/core/server/server.cc +269 -389
- data/src/core/server/server.h +37 -19
- data/src/core/server/server_call_tracer_filter.cc +7 -14
- data/src/core/server/server_config_selector.h +1 -1
- data/src/core/server/server_config_selector_filter.cc +3 -3
- data/src/core/server/server_interface.h +2 -0
- data/src/core/server/xds_channel_stack_modifier.cc +1 -1
- data/src/core/server/xds_channel_stack_modifier.h +1 -1
- data/src/core/server/xds_server_config_fetcher.cc +1 -4
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_call_data.h +13 -11
- data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
- data/src/core/service_config/service_config_impl.cc +5 -5
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/service_config/service_config_parser.cc +3 -6
- data/src/core/service_config/service_config_parser.h +1 -1
- data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
- data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
- data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
- data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
- data/src/core/telemetry/metrics.cc +178 -0
- data/src/core/telemetry/metrics.h +562 -0
- data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
- data/src/core/{lib/debug → telemetry}/stats.h +5 -5
- data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
- data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
- data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
- data/src/core/tsi/fake_transport_security.cc +14 -17
- data/src/core/tsi/local_transport_security.cc +6 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
- data/src/core/tsi/ssl_transport_security.cc +76 -81
- data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
- data/src/core/tsi/ssl_transport_security_utils.h +11 -0
- data/src/core/tsi/transport_security.cc +0 -4
- data/src/core/tsi/transport_security.h +0 -2
- data/src/core/tsi/transport_security_interface.h +0 -4
- data/src/core/{lib/gpr → util}/alloc.h +3 -3
- data/src/core/{lib/gpr → util}/android/log.cc +0 -19
- data/src/core/{lib/gpr → util}/atm.cc +1 -1
- data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
- data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
- data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
- data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
- data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
- data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
- data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
- data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
- data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
- data/src/core/{lib/http → util/http_client}/parser.h +5 -6
- data/src/core/{lib → util}/json/json.h +5 -4
- data/src/core/{lib → util}/json/json_args.h +5 -5
- data/src/core/{lib → util}/json/json_channel_args.h +6 -6
- data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
- data/src/core/{lib → util}/json/json_object_loader.h +7 -7
- data/src/core/{lib → util}/json/json_reader.cc +3 -2
- data/src/core/{lib → util}/json/json_reader.h +6 -6
- data/src/core/{lib → util}/json/json_util.cc +4 -4
- data/src/core/{lib → util}/json/json_util.h +6 -6
- data/src/core/{lib → util}/json/json_writer.cc +3 -3
- data/src/core/{lib → util}/json/json_writer.h +6 -6
- data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
- data/src/core/util/log.cc +165 -0
- data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
- data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
- data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
- data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
- data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
- data/src/core/{lib/gpr → util}/spinlock.h +3 -3
- data/src/core/{lib/gpr → util}/string.cc +2 -2
- data/src/core/{lib/gpr → util}/string.h +3 -3
- data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
- data/src/core/{lib/gpr → util}/time_precise.h +3 -3
- data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
- data/src/core/{lib/gpr → util}/useful.h +3 -3
- data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
- data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
- data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
- data/src/core/xds/grpc/certificate_provider_store.h +4 -4
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
- data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
- data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
- data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
- data/src/core/xds/grpc/xds_client_grpc.h +2 -2
- data/src/core/xds/grpc/xds_cluster.cc +4 -5
- data/src/core/xds/grpc/xds_cluster.h +1 -1
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
- data/src/core/xds/grpc/xds_common_types.cc +1 -1
- data/src/core/xds/grpc/xds_common_types.h +1 -1
- data/src/core/xds/grpc/xds_endpoint.cc +4 -5
- data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
- data/src/core/xds/grpc/xds_http_filters.h +2 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
- data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
- data/src/core/xds/grpc/xds_listener.cc +4 -6
- data/src/core/xds/grpc/xds_route_config.cc +7 -8
- data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
- data/src/core/xds/xds_client/xds_api.cc +5 -9
- data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
- data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
- data/src/core/xds/xds_client/xds_client.cc +39 -45
- data/src/core/xds/xds_client/xds_client.h +0 -3
- data/src/core/xds/xds_client/xds_client_stats.cc +6 -6
- data/src/core/xds/xds_client/xds_client_stats.h +2 -2
- data/src/ruby/bin/math_pb.rb +1 -22
- data/src/ruby/ext/grpc/rb_call.c +8 -1
- data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
- data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/ext/grpc/rb_server.c +39 -22
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
- data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
- data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
- data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
- data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
- metadata +103 -93
- data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
- data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
- data/src/core/handshaker/security/tsi_error.cc +0 -31
- data/src/core/handshaker/security/tsi_error.h +0 -30
- data/src/core/lib/channel/channel_stack_trace.cc +0 -19
- data/src/core/lib/channel/channel_stack_trace.h +0 -24
- data/src/core/lib/channel/context.h +0 -105
- data/src/core/lib/channel/metrics.cc +0 -334
- data/src/core/lib/channel/metrics.h +0 -365
- data/src/core/lib/event_engine/trace.cc +0 -25
- data/src/core/lib/gpr/log.cc +0 -166
- data/src/core/lib/iomgr/ev_windows.cc +0 -30
- data/src/core/lib/promise/trace.cc +0 -20
- data/src/core/lib/promise/trace.h +0 -24
- data/src/core/lib/resource_quota/trace.cc +0 -19
- data/src/core/lib/resource_quota/trace.h +0 -24
- data/src/core/lib/slice/slice_refcount.cc +0 -20
- data/src/core/lib/surface/api_trace.cc +0 -25
- data/src/core/lib/surface/call_trace.h +0 -24
- data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
- data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
- data/src/core/lib/transport/batch_builder.cc +0 -172
- data/src/core/lib/transport/batch_builder.h +0 -474
- data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
- data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
- /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
- /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
- /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
- /data/src/core/{lib/gpr → util}/sync.cc +0 -0
- /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
- /data/src/core/{lib/gpr → util}/time.cc +0 -0
- /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -0,0 +1,1324 @@
|
|
1
|
+
// Copyright 2015 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/client_channel/client_channel.h"
|
18
|
+
|
19
|
+
#include <inttypes.h>
|
20
|
+
#include <limits.h>
|
21
|
+
|
22
|
+
#include <algorithm>
|
23
|
+
#include <functional>
|
24
|
+
#include <new>
|
25
|
+
#include <set>
|
26
|
+
#include <type_traits>
|
27
|
+
#include <utility>
|
28
|
+
#include <vector>
|
29
|
+
|
30
|
+
#include "absl/cleanup/cleanup.h"
|
31
|
+
#include "absl/status/status.h"
|
32
|
+
#include "absl/status/statusor.h"
|
33
|
+
#include "absl/strings/cord.h"
|
34
|
+
#include "absl/strings/numbers.h"
|
35
|
+
#include "absl/strings/str_cat.h"
|
36
|
+
#include "absl/strings/str_join.h"
|
37
|
+
#include "absl/strings/string_view.h"
|
38
|
+
#include "absl/types/optional.h"
|
39
|
+
#include "absl/types/variant.h"
|
40
|
+
|
41
|
+
#include <grpc/event_engine/event_engine.h>
|
42
|
+
#include <grpc/impl/channel_arg_names.h>
|
43
|
+
#include <grpc/slice.h>
|
44
|
+
#include <grpc/status.h>
|
45
|
+
#include <grpc/support/json.h>
|
46
|
+
#include <grpc/support/log.h>
|
47
|
+
#include <grpc/support/metrics.h>
|
48
|
+
#include <grpc/support/string_util.h>
|
49
|
+
#include <grpc/support/time.h>
|
50
|
+
|
51
|
+
#include "src/core/client_channel/client_channel_internal.h"
|
52
|
+
#include "src/core/client_channel/client_channel_service_config.h"
|
53
|
+
#include "src/core/client_channel/config_selector.h"
|
54
|
+
#include "src/core/client_channel/dynamic_filters.h"
|
55
|
+
#include "src/core/client_channel/global_subchannel_pool.h"
|
56
|
+
#include "src/core/client_channel/local_subchannel_pool.h"
|
57
|
+
#include "src/core/client_channel/subchannel.h"
|
58
|
+
#include "src/core/client_channel/subchannel_interface_internal.h"
|
59
|
+
#include "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h"
|
60
|
+
#include "src/core/lib/channel/channel_args.h"
|
61
|
+
#include "src/core/lib/channel/status_util.h"
|
62
|
+
#include "src/core/lib/config/core_configuration.h"
|
63
|
+
#include "src/core/lib/debug/trace.h"
|
64
|
+
#include "src/core/lib/gprpp/crash.h"
|
65
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
66
|
+
#include "src/core/lib/gprpp/sync.h"
|
67
|
+
#include "src/core/lib/gprpp/work_serializer.h"
|
68
|
+
#include "src/core/lib/iomgr/resolved_address.h"
|
69
|
+
#include "src/core/lib/promise/context.h"
|
70
|
+
#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
|
71
|
+
#include "src/core/lib/promise/loop.h"
|
72
|
+
#include "src/core/lib/promise/map.h"
|
73
|
+
#include "src/core/lib/promise/poll.h"
|
74
|
+
#include "src/core/lib/promise/sleep.h"
|
75
|
+
#include "src/core/lib/promise/try_seq.h"
|
76
|
+
#include "src/core/lib/security/credentials/credentials.h"
|
77
|
+
#include "src/core/lib/slice/slice.h"
|
78
|
+
#include "src/core/lib/slice/slice_internal.h"
|
79
|
+
#include "src/core/lib/surface/call.h"
|
80
|
+
#include "src/core/lib/surface/channel.h"
|
81
|
+
#include "src/core/lib/surface/client_call.h"
|
82
|
+
#include "src/core/lib/surface/completion_queue.h"
|
83
|
+
#include "src/core/lib/transport/call_spine.h"
|
84
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
85
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
86
|
+
#include "src/core/load_balancing/child_policy_handler.h"
|
87
|
+
#include "src/core/load_balancing/lb_policy.h"
|
88
|
+
#include "src/core/load_balancing/lb_policy_registry.h"
|
89
|
+
#include "src/core/load_balancing/subchannel_interface.h"
|
90
|
+
#include "src/core/resolver/endpoint_addresses.h"
|
91
|
+
#include "src/core/resolver/resolver_registry.h"
|
92
|
+
#include "src/core/service_config/service_config_impl.h"
|
93
|
+
#include "src/core/telemetry/metrics.h"
|
94
|
+
#include "src/core/util/json/json.h"
|
95
|
+
#include "src/core/util/useful.h"
|
96
|
+
|
97
|
+
namespace grpc_core {
|
98
|
+
|
99
|
+
using grpc_event_engine::experimental::EventEngine;
|
100
|
+
|
101
|
+
using internal::ClientChannelMethodParsedConfig;
|
102
|
+
|
103
|
+
//
|
104
|
+
// ClientChannel::ResolverResultHandler
|
105
|
+
//
|
106
|
+
|
107
|
+
class ClientChannel::ResolverResultHandler : public Resolver::ResultHandler {
|
108
|
+
public:
|
109
|
+
explicit ResolverResultHandler(
|
110
|
+
WeakRefCountedPtr<ClientChannel> client_channel)
|
111
|
+
: client_channel_(std::move(client_channel)) {}
|
112
|
+
|
113
|
+
~ResolverResultHandler() override {
|
114
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
115
|
+
<< "client_channel=" << client_channel_.get()
|
116
|
+
<< ": resolver shutdown complete";
|
117
|
+
}
|
118
|
+
|
119
|
+
void ReportResult(Resolver::Result result) override
|
120
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
|
121
|
+
client_channel_->OnResolverResultChangedLocked(std::move(result));
|
122
|
+
}
|
123
|
+
|
124
|
+
private:
|
125
|
+
WeakRefCountedPtr<ClientChannel> client_channel_;
|
126
|
+
};
|
127
|
+
|
128
|
+
//
|
129
|
+
// ClientChannel::SubchannelWrapper
|
130
|
+
//
|
131
|
+
|
132
|
+
// This class is a wrapper for Subchannel that hides details of the
|
133
|
+
// channel's implementation (such as the connected subchannel) from the
|
134
|
+
// LB policy API.
|
135
|
+
//
|
136
|
+
// Note that no synchronization is needed here, because even if the
|
137
|
+
// underlying subchannel is shared between channels, this wrapper will only
|
138
|
+
// be used within one channel, so it will always be synchronized by the
|
139
|
+
// control plane work_serializer.
|
140
|
+
class ClientChannel::SubchannelWrapper
|
141
|
+
: public SubchannelInterfaceWithCallDestination {
|
142
|
+
public:
|
143
|
+
SubchannelWrapper(WeakRefCountedPtr<ClientChannel> client_channel,
|
144
|
+
RefCountedPtr<Subchannel> subchannel);
|
145
|
+
~SubchannelWrapper() override;
|
146
|
+
|
147
|
+
void Orphaned() override;
|
148
|
+
void WatchConnectivityState(
|
149
|
+
std::unique_ptr<ConnectivityStateWatcherInterface> watcher) override
|
150
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
|
151
|
+
void CancelConnectivityStateWatch(
|
152
|
+
ConnectivityStateWatcherInterface* watcher) override
|
153
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
|
154
|
+
|
155
|
+
RefCountedPtr<UnstartedCallDestination> call_destination() override {
|
156
|
+
return subchannel_->call_destination();
|
157
|
+
}
|
158
|
+
|
159
|
+
void RequestConnection() override { subchannel_->RequestConnection(); }
|
160
|
+
|
161
|
+
void ResetBackoff() override { subchannel_->ResetBackoff(); }
|
162
|
+
|
163
|
+
void AddDataWatcher(std::unique_ptr<DataWatcherInterface> watcher) override
|
164
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
|
165
|
+
void CancelDataWatcher(DataWatcherInterface* watcher) override
|
166
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
|
167
|
+
void ThrottleKeepaliveTime(int new_keepalive_time);
|
168
|
+
|
169
|
+
private:
|
170
|
+
class WatcherWrapper;
|
171
|
+
|
172
|
+
// A heterogenous lookup comparator for data watchers that allows
|
173
|
+
// unique_ptr keys to be looked up as raw pointers.
|
174
|
+
struct DataWatcherLessThan {
|
175
|
+
using is_transparent = void;
|
176
|
+
bool operator()(const std::unique_ptr<DataWatcherInterface>& p1,
|
177
|
+
const std::unique_ptr<DataWatcherInterface>& p2) const {
|
178
|
+
return p1 < p2;
|
179
|
+
}
|
180
|
+
bool operator()(const std::unique_ptr<DataWatcherInterface>& p1,
|
181
|
+
const DataWatcherInterface* p2) const {
|
182
|
+
return p1.get() < p2;
|
183
|
+
}
|
184
|
+
bool operator()(const DataWatcherInterface* p1,
|
185
|
+
const std::unique_ptr<DataWatcherInterface>& p2) const {
|
186
|
+
return p1 < p2.get();
|
187
|
+
}
|
188
|
+
};
|
189
|
+
|
190
|
+
WeakRefCountedPtr<ClientChannel> client_channel_;
|
191
|
+
RefCountedPtr<Subchannel> subchannel_;
|
192
|
+
// Maps from the address of the watcher passed to us by the LB policy
|
193
|
+
// to the address of the WrapperWatcher that we passed to the underlying
|
194
|
+
// subchannel. This is needed so that when the LB policy calls
|
195
|
+
// CancelConnectivityStateWatch() with its watcher, we know the
|
196
|
+
// corresponding WrapperWatcher to cancel on the underlying subchannel.
|
197
|
+
std::map<ConnectivityStateWatcherInterface*, WatcherWrapper*> watcher_map_
|
198
|
+
ABSL_GUARDED_BY(*client_channel_->work_serializer_);
|
199
|
+
std::set<std::unique_ptr<DataWatcherInterface>, DataWatcherLessThan>
|
200
|
+
data_watchers_ ABSL_GUARDED_BY(*client_channel_->work_serializer_);
|
201
|
+
};
|
202
|
+
|
203
|
+
// This wrapper provides a bridge between the internal Subchannel API
|
204
|
+
// and the SubchannelInterface API that we expose to LB policies.
|
205
|
+
// It implements Subchannel::ConnectivityStateWatcherInterface and wraps
|
206
|
+
// the instance of SubchannelInterface::ConnectivityStateWatcherInterface
|
207
|
+
// that was passed in by the LB policy. We pass an instance of this
|
208
|
+
// class to the underlying Subchannel, and when we get updates from
|
209
|
+
// the subchannel, we pass those on to the wrapped watcher to return
|
210
|
+
// the update to the LB policy.
|
211
|
+
//
|
212
|
+
// This class handles things like hopping into the WorkSerializer
|
213
|
+
// before passing notifications to the LB policy and propagating
|
214
|
+
// keepalive information betwen subchannels.
|
215
|
+
class ClientChannel::SubchannelWrapper::WatcherWrapper
|
216
|
+
: public Subchannel::ConnectivityStateWatcherInterface {
|
217
|
+
public:
|
218
|
+
WatcherWrapper(
|
219
|
+
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
220
|
+
watcher,
|
221
|
+
RefCountedPtr<SubchannelWrapper> subchannel_wrapper)
|
222
|
+
: watcher_(std::move(watcher)),
|
223
|
+
subchannel_wrapper_(std::move(subchannel_wrapper)) {}
|
224
|
+
|
225
|
+
~WatcherWrapper() override {
|
226
|
+
subchannel_wrapper_.reset(DEBUG_LOCATION, "WatcherWrapper");
|
227
|
+
}
|
228
|
+
|
229
|
+
void OnConnectivityStateChange(
|
230
|
+
RefCountedPtr<ConnectivityStateWatcherInterface> self,
|
231
|
+
grpc_connectivity_state state, const absl::Status& status) override {
|
232
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
233
|
+
<< "client_channel=" << subchannel_wrapper_->client_channel_.get()
|
234
|
+
<< ": connectivity change for subchannel wrapper "
|
235
|
+
<< subchannel_wrapper_.get() << " subchannel "
|
236
|
+
<< subchannel_wrapper_->subchannel_.get()
|
237
|
+
<< "; hopping into work_serializer";
|
238
|
+
self.release(); // Held by callback.
|
239
|
+
subchannel_wrapper_->client_channel_->work_serializer_->Run(
|
240
|
+
[this, state, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
241
|
+
*subchannel_wrapper_->client_channel_->work_serializer_) {
|
242
|
+
ApplyUpdateInControlPlaneWorkSerializer(state, status);
|
243
|
+
Unref();
|
244
|
+
},
|
245
|
+
DEBUG_LOCATION);
|
246
|
+
}
|
247
|
+
|
248
|
+
grpc_pollset_set* interested_parties() override { return nullptr; }
|
249
|
+
|
250
|
+
private:
|
251
|
+
void ApplyUpdateInControlPlaneWorkSerializer(grpc_connectivity_state state,
|
252
|
+
const absl::Status& status)
|
253
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
254
|
+
*subchannel_wrapper_->client_channel_->work_serializer_) {
|
255
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
256
|
+
<< "client_channel=" << subchannel_wrapper_->client_channel_.get()
|
257
|
+
<< ": processing connectivity change in work serializer for subchannel "
|
258
|
+
"wrapper "
|
259
|
+
<< subchannel_wrapper_.get() << " subchannel "
|
260
|
+
<< subchannel_wrapper_->subchannel_.get()
|
261
|
+
<< " watcher=" << watcher_.get()
|
262
|
+
<< "state=" << ConnectivityStateName(state) << " status=" << status;
|
263
|
+
absl::optional<absl::Cord> keepalive_throttling =
|
264
|
+
status.GetPayload(kKeepaliveThrottlingKey);
|
265
|
+
if (keepalive_throttling.has_value()) {
|
266
|
+
int new_keepalive_time = -1;
|
267
|
+
if (absl::SimpleAtoi(std::string(keepalive_throttling.value()),
|
268
|
+
&new_keepalive_time)) {
|
269
|
+
if (new_keepalive_time >
|
270
|
+
subchannel_wrapper_->client_channel_->keepalive_time_) {
|
271
|
+
subchannel_wrapper_->client_channel_->keepalive_time_ =
|
272
|
+
new_keepalive_time;
|
273
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
274
|
+
<< "client_channel=" << subchannel_wrapper_->client_channel_.get()
|
275
|
+
<< ": throttling keepalive time to "
|
276
|
+
<< subchannel_wrapper_->client_channel_->keepalive_time_;
|
277
|
+
// Propagate the new keepalive time to all subchannels. This is so
|
278
|
+
// that new transports created by any subchannel (and not just the
|
279
|
+
// subchannel that received the GOAWAY), use the new keepalive time.
|
280
|
+
for (auto* subchannel_wrapper :
|
281
|
+
subchannel_wrapper_->client_channel_->subchannel_wrappers_) {
|
282
|
+
subchannel_wrapper->ThrottleKeepaliveTime(new_keepalive_time);
|
283
|
+
}
|
284
|
+
}
|
285
|
+
} else {
|
286
|
+
gpr_log(GPR_ERROR,
|
287
|
+
"client_channel=%p: Illegal keepalive throttling value %s",
|
288
|
+
subchannel_wrapper_->client_channel_.get(),
|
289
|
+
std::string(keepalive_throttling.value()).c_str());
|
290
|
+
}
|
291
|
+
}
|
292
|
+
// Propagate status only in state TF.
|
293
|
+
// We specifically want to avoid propagating the status for
|
294
|
+
// state IDLE that the real subchannel gave us only for the
|
295
|
+
// purpose of keepalive propagation.
|
296
|
+
watcher_->OnConnectivityStateChange(
|
297
|
+
state,
|
298
|
+
state == GRPC_CHANNEL_TRANSIENT_FAILURE ? status : absl::OkStatus());
|
299
|
+
}
|
300
|
+
|
301
|
+
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
302
|
+
watcher_;
|
303
|
+
RefCountedPtr<SubchannelWrapper> subchannel_wrapper_;
|
304
|
+
};
|
305
|
+
|
306
|
+
ClientChannel::SubchannelWrapper::SubchannelWrapper(
|
307
|
+
WeakRefCountedPtr<ClientChannel> client_channel,
|
308
|
+
RefCountedPtr<Subchannel> subchannel)
|
309
|
+
: SubchannelInterfaceWithCallDestination(
|
310
|
+
GRPC_TRACE_FLAG_ENABLED(client_channel) ? "SubchannelWrapper"
|
311
|
+
: nullptr),
|
312
|
+
client_channel_(std::move(client_channel)),
|
313
|
+
subchannel_(std::move(subchannel)) {
|
314
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
315
|
+
<< "client_channel=" << client_channel_.get()
|
316
|
+
<< ": creating subchannel wrapper " << this << " for subchannel "
|
317
|
+
<< subchannel_.get();
|
318
|
+
#ifndef NDEBUG
|
319
|
+
DCHECK(client_channel_->work_serializer_->RunningInWorkSerializer());
|
320
|
+
#endif
|
321
|
+
if (client_channel_->channelz_node_ != nullptr) {
|
322
|
+
auto* subchannel_node = subchannel_->channelz_node();
|
323
|
+
if (subchannel_node != nullptr) {
|
324
|
+
auto it =
|
325
|
+
client_channel_->subchannel_refcount_map_.find(subchannel_.get());
|
326
|
+
if (it == client_channel_->subchannel_refcount_map_.end()) {
|
327
|
+
client_channel_->channelz_node_->AddChildSubchannel(
|
328
|
+
subchannel_node->uuid());
|
329
|
+
it = client_channel_->subchannel_refcount_map_
|
330
|
+
.emplace(subchannel_.get(), 0)
|
331
|
+
.first;
|
332
|
+
}
|
333
|
+
++it->second;
|
334
|
+
}
|
335
|
+
}
|
336
|
+
client_channel_->subchannel_wrappers_.insert(this);
|
337
|
+
}
|
338
|
+
|
339
|
+
ClientChannel::SubchannelWrapper::~SubchannelWrapper() {
|
340
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
341
|
+
<< "client_channel=" << client_channel_.get()
|
342
|
+
<< ": destroying subchannel wrapper " << this << " for subchannel "
|
343
|
+
<< subchannel_.get();
|
344
|
+
}
|
345
|
+
|
346
|
+
void ClientChannel::SubchannelWrapper::Orphaned() {
|
347
|
+
// Make sure we clean up the channel's subchannel maps inside the
|
348
|
+
// WorkSerializer.
|
349
|
+
auto self = WeakRefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION,
|
350
|
+
"subchannel map cleanup");
|
351
|
+
client_channel_->work_serializer_->Run(
|
352
|
+
[self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
353
|
+
*self->client_channel_->work_serializer_) {
|
354
|
+
self->client_channel_->subchannel_wrappers_.erase(self.get());
|
355
|
+
if (self->client_channel_->channelz_node_ != nullptr) {
|
356
|
+
auto* subchannel_node = self->subchannel_->channelz_node();
|
357
|
+
if (subchannel_node != nullptr) {
|
358
|
+
auto it = self->client_channel_->subchannel_refcount_map_.find(
|
359
|
+
self->subchannel_.get());
|
360
|
+
CHECK(it != self->client_channel_->subchannel_refcount_map_.end());
|
361
|
+
--it->second;
|
362
|
+
if (it->second == 0) {
|
363
|
+
self->client_channel_->channelz_node_->RemoveChildSubchannel(
|
364
|
+
subchannel_node->uuid());
|
365
|
+
self->client_channel_->subchannel_refcount_map_.erase(it);
|
366
|
+
}
|
367
|
+
}
|
368
|
+
}
|
369
|
+
},
|
370
|
+
DEBUG_LOCATION);
|
371
|
+
}
|
372
|
+
|
373
|
+
void ClientChannel::SubchannelWrapper::WatchConnectivityState(
|
374
|
+
std::unique_ptr<ConnectivityStateWatcherInterface> watcher) {
|
375
|
+
auto& watcher_wrapper = watcher_map_[watcher.get()];
|
376
|
+
CHECK(watcher_wrapper == nullptr);
|
377
|
+
watcher_wrapper = new WatcherWrapper(
|
378
|
+
std::move(watcher),
|
379
|
+
RefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION, "WatcherWrapper"));
|
380
|
+
subchannel_->WatchConnectivityState(
|
381
|
+
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
|
382
|
+
watcher_wrapper));
|
383
|
+
}
|
384
|
+
|
385
|
+
void ClientChannel::SubchannelWrapper::CancelConnectivityStateWatch(
|
386
|
+
ConnectivityStateWatcherInterface* watcher) {
|
387
|
+
auto it = watcher_map_.find(watcher);
|
388
|
+
CHECK(it != watcher_map_.end());
|
389
|
+
subchannel_->CancelConnectivityStateWatch(it->second);
|
390
|
+
watcher_map_.erase(it);
|
391
|
+
}
|
392
|
+
|
393
|
+
void ClientChannel::SubchannelWrapper::AddDataWatcher(
|
394
|
+
std::unique_ptr<DataWatcherInterface> watcher) {
|
395
|
+
static_cast<InternalSubchannelDataWatcherInterface*>(watcher.get())
|
396
|
+
->SetSubchannel(subchannel_.get());
|
397
|
+
CHECK(data_watchers_.insert(std::move(watcher)).second);
|
398
|
+
}
|
399
|
+
|
400
|
+
void ClientChannel::SubchannelWrapper::CancelDataWatcher(
|
401
|
+
DataWatcherInterface* watcher) {
|
402
|
+
auto it = data_watchers_.find(watcher);
|
403
|
+
if (it != data_watchers_.end()) data_watchers_.erase(it);
|
404
|
+
}
|
405
|
+
|
406
|
+
void ClientChannel::SubchannelWrapper::ThrottleKeepaliveTime(
|
407
|
+
int new_keepalive_time) {
|
408
|
+
subchannel_->ThrottleKeepaliveTime(new_keepalive_time);
|
409
|
+
}
|
410
|
+
|
411
|
+
//
|
412
|
+
// ClientChannel::ClientChannelControlHelper
|
413
|
+
//
|
414
|
+
|
415
|
+
class ClientChannel::ClientChannelControlHelper
|
416
|
+
: public LoadBalancingPolicy::ChannelControlHelper {
|
417
|
+
public:
|
418
|
+
explicit ClientChannelControlHelper(
|
419
|
+
WeakRefCountedPtr<ClientChannel> client_channel)
|
420
|
+
: client_channel_(std::move(client_channel)) {}
|
421
|
+
|
422
|
+
~ClientChannelControlHelper() override {
|
423
|
+
client_channel_.reset(DEBUG_LOCATION, "ClientChannelControlHelper");
|
424
|
+
}
|
425
|
+
|
426
|
+
RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
427
|
+
const grpc_resolved_address& address, const ChannelArgs& per_address_args,
|
428
|
+
const ChannelArgs& args) override
|
429
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
|
430
|
+
// If shutting down, do nothing.
|
431
|
+
if (client_channel_->resolver_ == nullptr) return nullptr;
|
432
|
+
ChannelArgs subchannel_args = Subchannel::MakeSubchannelArgs(
|
433
|
+
args, per_address_args, client_channel_->subchannel_pool_,
|
434
|
+
client_channel_->default_authority_);
|
435
|
+
// Create subchannel.
|
436
|
+
RefCountedPtr<Subchannel> subchannel =
|
437
|
+
client_channel_->client_channel_factory_->CreateSubchannel(
|
438
|
+
address, subchannel_args);
|
439
|
+
if (subchannel == nullptr) return nullptr;
|
440
|
+
// Make sure the subchannel has updated keepalive time.
|
441
|
+
subchannel->ThrottleKeepaliveTime(client_channel_->keepalive_time_);
|
442
|
+
// Create and return wrapper for the subchannel.
|
443
|
+
return MakeRefCounted<SubchannelWrapper>(client_channel_,
|
444
|
+
std::move(subchannel));
|
445
|
+
}
|
446
|
+
|
447
|
+
void UpdateState(
|
448
|
+
grpc_connectivity_state state, const absl::Status& status,
|
449
|
+
RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker) override
|
450
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
|
451
|
+
if (client_channel_->resolver_ == nullptr) return; // Shutting down.
|
452
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel)) {
|
453
|
+
const char* extra = client_channel_->disconnect_error_.ok()
|
454
|
+
? ""
|
455
|
+
: " (ignoring -- channel shutting down)";
|
456
|
+
gpr_log(GPR_INFO,
|
457
|
+
"client_channel=%p: update: state=%s status=(%s) picker=%p%s",
|
458
|
+
client_channel_.get(), ConnectivityStateName(state),
|
459
|
+
status.ToString().c_str(), picker.get(), extra);
|
460
|
+
}
|
461
|
+
// Do update only if not shutting down.
|
462
|
+
if (client_channel_->disconnect_error_.ok()) {
|
463
|
+
client_channel_->UpdateStateAndPickerLocked(state, status, "helper",
|
464
|
+
std::move(picker));
|
465
|
+
}
|
466
|
+
}
|
467
|
+
|
468
|
+
void RequestReresolution() override
|
469
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
|
470
|
+
if (client_channel_->resolver_ == nullptr) return; // Shutting down.
|
471
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
472
|
+
<< "client_channel=" << client_channel_.get()
|
473
|
+
<< ": started name re-resolving";
|
474
|
+
client_channel_->resolver_->RequestReresolutionLocked();
|
475
|
+
}
|
476
|
+
|
477
|
+
absl::string_view GetTarget() override { return client_channel_->target(); }
|
478
|
+
|
479
|
+
absl::string_view GetAuthority() override {
|
480
|
+
return client_channel_->default_authority_;
|
481
|
+
}
|
482
|
+
|
483
|
+
RefCountedPtr<grpc_channel_credentials> GetChannelCredentials() override {
|
484
|
+
return client_channel_->channel_args_.GetObject<grpc_channel_credentials>()
|
485
|
+
->duplicate_without_call_credentials();
|
486
|
+
}
|
487
|
+
|
488
|
+
RefCountedPtr<grpc_channel_credentials> GetUnsafeChannelCredentials()
|
489
|
+
override {
|
490
|
+
return client_channel_->channel_args_.GetObject<grpc_channel_credentials>()
|
491
|
+
->Ref();
|
492
|
+
}
|
493
|
+
|
494
|
+
EventEngine* GetEventEngine() override {
|
495
|
+
return client_channel_->event_engine();
|
496
|
+
}
|
497
|
+
|
498
|
+
GlobalStatsPluginRegistry::StatsPluginGroup& GetStatsPluginGroup() override {
|
499
|
+
return client_channel_->stats_plugin_group_;
|
500
|
+
}
|
501
|
+
|
502
|
+
void AddTraceEvent(TraceSeverity severity, absl::string_view message) override
|
503
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
|
504
|
+
if (client_channel_->resolver_ == nullptr) return; // Shutting down.
|
505
|
+
if (client_channel_->channelz_node_ != nullptr) {
|
506
|
+
client_channel_->channelz_node_->AddTraceEvent(
|
507
|
+
ConvertSeverityEnum(severity),
|
508
|
+
grpc_slice_from_copied_buffer(message.data(), message.size()));
|
509
|
+
}
|
510
|
+
}
|
511
|
+
|
512
|
+
private:
|
513
|
+
static channelz::ChannelTrace::Severity ConvertSeverityEnum(
|
514
|
+
TraceSeverity severity) {
|
515
|
+
if (severity == TRACE_INFO) return channelz::ChannelTrace::Info;
|
516
|
+
if (severity == TRACE_WARNING) return channelz::ChannelTrace::Warning;
|
517
|
+
return channelz::ChannelTrace::Error;
|
518
|
+
}
|
519
|
+
|
520
|
+
WeakRefCountedPtr<ClientChannel> client_channel_;
|
521
|
+
};
|
522
|
+
|
523
|
+
//
|
524
|
+
// ClientChannel implementation
|
525
|
+
//
|
526
|
+
|
527
|
+
namespace {
|
528
|
+
|
529
|
+
RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
|
530
|
+
const ChannelArgs& args) {
|
531
|
+
if (args.GetBool(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL).value_or(false)) {
|
532
|
+
return MakeRefCounted<LocalSubchannelPool>();
|
533
|
+
}
|
534
|
+
return GlobalSubchannelPool::instance();
|
535
|
+
}
|
536
|
+
|
537
|
+
} // namespace
|
538
|
+
|
539
|
+
absl::StatusOr<RefCountedPtr<Channel>> ClientChannel::Create(
|
540
|
+
std::string target, ChannelArgs channel_args) {
|
541
|
+
// Get URI to resolve, using proxy mapper if needed.
|
542
|
+
if (target.empty()) {
|
543
|
+
return absl::InternalError("target URI is empty in client channel");
|
544
|
+
}
|
545
|
+
std::string uri_to_resolve = CoreConfiguration::Get()
|
546
|
+
.proxy_mapper_registry()
|
547
|
+
.MapName(target, &channel_args)
|
548
|
+
.value_or(target);
|
549
|
+
// Make sure the URI to resolve is valid, so that we know that
|
550
|
+
// resolver creation will succeed later.
|
551
|
+
if (!CoreConfiguration::Get().resolver_registry().IsValidTarget(
|
552
|
+
uri_to_resolve)) {
|
553
|
+
return absl::InvalidArgumentError(
|
554
|
+
absl::StrCat("invalid target URI: ", uri_to_resolve));
|
555
|
+
}
|
556
|
+
// Get default service config. If none is specified via the client API,
|
557
|
+
// we use an empty config.
|
558
|
+
absl::optional<absl::string_view> service_config_json =
|
559
|
+
channel_args.GetString(GRPC_ARG_SERVICE_CONFIG);
|
560
|
+
if (!service_config_json.has_value()) service_config_json = "{}";
|
561
|
+
auto default_service_config =
|
562
|
+
ServiceConfigImpl::Create(channel_args, *service_config_json);
|
563
|
+
if (!default_service_config.ok()) return default_service_config.status();
|
564
|
+
// Strip out service config channel arg, so that it doesn't affect
|
565
|
+
// subchannel uniqueness when the args flow down to that layer.
|
566
|
+
channel_args = channel_args.Remove(GRPC_ARG_SERVICE_CONFIG);
|
567
|
+
// Check client channel factory.
|
568
|
+
auto* client_channel_factory = channel_args.GetObject<ClientChannelFactory>();
|
569
|
+
if (client_channel_factory == nullptr) {
|
570
|
+
return absl::InternalError(
|
571
|
+
"Missing client channel factory in args for client channel");
|
572
|
+
}
|
573
|
+
auto* call_destination_factory =
|
574
|
+
channel_args.GetObject<CallDestinationFactory>();
|
575
|
+
if (call_destination_factory == nullptr) {
|
576
|
+
return absl::InternalError(
|
577
|
+
"Missing call destination factory in args for client channel");
|
578
|
+
}
|
579
|
+
if (channel_args.GetObject<EventEngine>() == nullptr) {
|
580
|
+
return absl::InternalError(
|
581
|
+
"Missing event engine in args for client channel");
|
582
|
+
}
|
583
|
+
// Success. Construct channel.
|
584
|
+
return MakeRefCounted<ClientChannel>(
|
585
|
+
std::move(target), std::move(channel_args), std::move(uri_to_resolve),
|
586
|
+
std::move(*default_service_config), client_channel_factory,
|
587
|
+
call_destination_factory);
|
588
|
+
}
|
589
|
+
|
590
|
+
namespace {
|
591
|
+
std::string GetDefaultAuthorityFromChannelArgs(const ChannelArgs& channel_args,
|
592
|
+
absl::string_view target) {
|
593
|
+
absl::optional<std::string> default_authority =
|
594
|
+
channel_args.GetOwnedString(GRPC_ARG_DEFAULT_AUTHORITY);
|
595
|
+
if (!default_authority.has_value()) {
|
596
|
+
return CoreConfiguration::Get().resolver_registry().GetDefaultAuthority(
|
597
|
+
target);
|
598
|
+
} else {
|
599
|
+
return std::move(*default_authority);
|
600
|
+
}
|
601
|
+
}
|
602
|
+
} // namespace
|
603
|
+
|
604
|
+
ClientChannel::ClientChannel(
|
605
|
+
std::string target, ChannelArgs channel_args, std::string uri_to_resolve,
|
606
|
+
RefCountedPtr<ServiceConfig> default_service_config,
|
607
|
+
ClientChannelFactory* client_channel_factory,
|
608
|
+
CallDestinationFactory* call_destination_factory)
|
609
|
+
: Channel(std::move(target), channel_args),
|
610
|
+
channel_args_(std::move(channel_args)),
|
611
|
+
event_engine_(channel_args_.GetObjectRef<EventEngine>()),
|
612
|
+
uri_to_resolve_(std::move(uri_to_resolve)),
|
613
|
+
service_config_parser_index_(
|
614
|
+
internal::ClientChannelServiceConfigParser::ParserIndex()),
|
615
|
+
default_service_config_(std::move(default_service_config)),
|
616
|
+
client_channel_factory_(client_channel_factory),
|
617
|
+
default_authority_(
|
618
|
+
GetDefaultAuthorityFromChannelArgs(channel_args_, this->target())),
|
619
|
+
channelz_node_(channel_args_.GetObject<channelz::ChannelNode>()),
|
620
|
+
idle_timeout_(GetClientIdleTimeout(channel_args_)),
|
621
|
+
resolver_data_for_calls_(ResolverDataForCalls{}),
|
622
|
+
picker_(nullptr),
|
623
|
+
call_destination_(
|
624
|
+
call_destination_factory->CreateCallDestination(picker_)),
|
625
|
+
work_serializer_(std::make_shared<WorkSerializer>(event_engine_)),
|
626
|
+
state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
|
627
|
+
subchannel_pool_(GetSubchannelPool(channel_args_)) {
|
628
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
629
|
+
<< "client_channel=" << this << ": creating client_channel";
|
630
|
+
// Set initial keepalive time.
|
631
|
+
auto keepalive_arg = channel_args_.GetInt(GRPC_ARG_KEEPALIVE_TIME_MS);
|
632
|
+
if (keepalive_arg.has_value()) {
|
633
|
+
keepalive_time_ = Clamp(*keepalive_arg, 1, INT_MAX);
|
634
|
+
} else {
|
635
|
+
keepalive_time_ = -1; // unset
|
636
|
+
}
|
637
|
+
// Get stats plugins for channel.
|
638
|
+
experimental::StatsPluginChannelScope scope(this->target(),
|
639
|
+
default_authority_);
|
640
|
+
stats_plugin_group_ =
|
641
|
+
GlobalStatsPluginRegistry::GetStatsPluginsForChannel(scope);
|
642
|
+
}
|
643
|
+
|
644
|
+
ClientChannel::~ClientChannel() {
|
645
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
646
|
+
<< "client_channel=" << this << ": destroying";
|
647
|
+
}
|
648
|
+
|
649
|
+
void ClientChannel::Orphaned() {
|
650
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
651
|
+
<< "client_channel=" << this << ": shutting down";
|
652
|
+
// Weird capture then copy needed to satisfy thread safety analysis,
|
653
|
+
// otherwise it seems to fail to recognize the correct lock is taken in the
|
654
|
+
// lambda.
|
655
|
+
auto self = WeakRefAsSubclass<ClientChannel>();
|
656
|
+
work_serializer_->Run(
|
657
|
+
[self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
|
658
|
+
self->DestroyResolverAndLbPolicyLocked();
|
659
|
+
},
|
660
|
+
DEBUG_LOCATION);
|
661
|
+
// IncreaseCallCount() introduces a phony call and prevents the idle
|
662
|
+
// timer from being reset by other threads.
|
663
|
+
idle_state_.IncreaseCallCount();
|
664
|
+
idle_activity_.Reset();
|
665
|
+
}
|
666
|
+
|
667
|
+
grpc_connectivity_state ClientChannel::CheckConnectivityState(
|
668
|
+
bool try_to_connect) {
|
669
|
+
// state_tracker_ is guarded by work_serializer_, which we're not
|
670
|
+
// holding here. But the one method of state_tracker_ that *is*
|
671
|
+
// thread-safe to call without external synchronization is the state()
|
672
|
+
// method, so we can disable thread-safety analysis for this one read.
|
673
|
+
grpc_connectivity_state state =
|
674
|
+
ABSL_TS_UNCHECKED_READ(state_tracker_).state();
|
675
|
+
if (state == GRPC_CHANNEL_IDLE && try_to_connect) {
|
676
|
+
auto self = WeakRefAsSubclass<ClientChannel>(); // Held by callback.
|
677
|
+
work_serializer_->Run(
|
678
|
+
[self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
|
679
|
+
self->TryToConnectLocked();
|
680
|
+
},
|
681
|
+
DEBUG_LOCATION);
|
682
|
+
}
|
683
|
+
return state;
|
684
|
+
}
|
685
|
+
|
686
|
+
void ClientChannel::WatchConnectivityState(grpc_connectivity_state, Timestamp,
|
687
|
+
grpc_completion_queue*, void*) {
|
688
|
+
// TODO(ctiller): implement
|
689
|
+
Crash("not implemented");
|
690
|
+
}
|
691
|
+
|
692
|
+
void ClientChannel::AddConnectivityWatcher(
|
693
|
+
grpc_connectivity_state,
|
694
|
+
OrphanablePtr<AsyncConnectivityStateWatcherInterface>) {
|
695
|
+
Crash("not implemented");
|
696
|
+
// TODO(ctiller): to make this work, need to change WorkSerializer to use
|
697
|
+
// absl::AnyInvocable<> instead of std::function<>
|
698
|
+
// work_serializer_->Run(
|
699
|
+
// [self = RefAsSubclass<ClientChannel>(), initial_state,
|
700
|
+
// watcher = std::move(watcher)]()
|
701
|
+
// ABSL_EXCLUSIVE_LOCKS_REQUIRED(*work_serializer_) {
|
702
|
+
// self->state_tracker_.AddWatcher(initial_state, std::move(watcher));
|
703
|
+
// },
|
704
|
+
// DEBUG_LOCATION);
|
705
|
+
}
|
706
|
+
|
707
|
+
void ClientChannel::RemoveConnectivityWatcher(
|
708
|
+
AsyncConnectivityStateWatcherInterface* watcher) {
|
709
|
+
auto self = RefAsSubclass<ClientChannel>(); // Held by callback.
|
710
|
+
work_serializer_->Run(
|
711
|
+
[self, watcher]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
|
712
|
+
self->state_tracker_.RemoveWatcher(watcher);
|
713
|
+
},
|
714
|
+
DEBUG_LOCATION);
|
715
|
+
}
|
716
|
+
|
717
|
+
void ClientChannel::GetInfo(const grpc_channel_info* info) {
|
718
|
+
MutexLock lock(&info_mu_);
|
719
|
+
if (info->lb_policy_name != nullptr) {
|
720
|
+
*info->lb_policy_name = gpr_strdup(info_lb_policy_name_.c_str());
|
721
|
+
}
|
722
|
+
if (info->service_config_json != nullptr) {
|
723
|
+
*info->service_config_json = gpr_strdup(info_service_config_json_.c_str());
|
724
|
+
}
|
725
|
+
}
|
726
|
+
|
727
|
+
void ClientChannel::ResetConnectionBackoff() {
|
728
|
+
auto self = RefAsSubclass<ClientChannel>();
|
729
|
+
work_serializer_->Run(
|
730
|
+
[self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
|
731
|
+
if (self->lb_policy_ != nullptr) self->lb_policy_->ResetBackoffLocked();
|
732
|
+
},
|
733
|
+
DEBUG_LOCATION);
|
734
|
+
}
|
735
|
+
|
736
|
+
namespace {
|
737
|
+
|
738
|
+
// A class to handle CQ completion for a ping.
|
739
|
+
class PingRequest {
|
740
|
+
public:
|
741
|
+
PingRequest(grpc_completion_queue* cq, void* tag) : cq_(cq), tag_(tag) {
|
742
|
+
grpc_cq_begin_op(cq, tag);
|
743
|
+
}
|
744
|
+
|
745
|
+
// Triggers CQ completion and eventually deletes the PingRequest object.
|
746
|
+
void Complete(grpc_error_handle error) {
|
747
|
+
grpc_cq_end_op(cq_, tag_, error, Destroy, this, &completion_storage_);
|
748
|
+
}
|
749
|
+
|
750
|
+
private:
|
751
|
+
static void Destroy(void* arg, grpc_cq_completion* /*storage*/) {
|
752
|
+
delete static_cast<PingRequest*>(arg);
|
753
|
+
}
|
754
|
+
|
755
|
+
grpc_completion_queue* cq_;
|
756
|
+
void* tag_;
|
757
|
+
grpc_cq_completion completion_storage_;
|
758
|
+
};
|
759
|
+
|
760
|
+
} // namespace
|
761
|
+
|
762
|
+
void ClientChannel::Ping(grpc_completion_queue*, void*) {
|
763
|
+
// TODO(ctiller): implement
|
764
|
+
Crash("not implemented");
|
765
|
+
}
|
766
|
+
|
767
|
+
grpc_call* ClientChannel::CreateCall(
|
768
|
+
grpc_call* parent_call, uint32_t propagation_mask,
|
769
|
+
grpc_completion_queue* cq, grpc_pollset_set* /*pollset_set_alternative*/,
|
770
|
+
Slice path, absl::optional<Slice> authority, Timestamp deadline, bool) {
|
771
|
+
return MakeClientCall(parent_call, propagation_mask, cq, std::move(path),
|
772
|
+
std::move(authority), false, deadline,
|
773
|
+
compression_options(), event_engine_.get(),
|
774
|
+
call_arena_allocator()->MakeArena(), Ref());
|
775
|
+
}
|
776
|
+
|
777
|
+
void ClientChannel::StartCall(UnstartedCallHandler unstarted_handler) {
|
778
|
+
// Increment call count.
|
779
|
+
if (idle_timeout_ != Duration::Zero()) idle_state_.IncreaseCallCount();
|
780
|
+
// Exit IDLE if needed.
|
781
|
+
CheckConnectivityState(/*try_to_connect=*/true);
|
782
|
+
// Spawn a promise to wait for the resolver result.
|
783
|
+
// This will eventually start the call.
|
784
|
+
unstarted_handler.SpawnGuardedUntilCallCompletes(
|
785
|
+
"wait-for-name-resolution",
|
786
|
+
[self = RefAsSubclass<ClientChannel>(), unstarted_handler]() mutable {
|
787
|
+
const bool wait_for_ready =
|
788
|
+
unstarted_handler.UnprocessedClientInitialMetadata()
|
789
|
+
.GetOrCreatePointer(WaitForReady())
|
790
|
+
->value;
|
791
|
+
return Map(
|
792
|
+
// Wait for the resolver result.
|
793
|
+
CheckDelayed(self->resolver_data_for_calls_.NextWhen(
|
794
|
+
[wait_for_ready](
|
795
|
+
const absl::StatusOr<ResolverDataForCalls> result) {
|
796
|
+
bool got_result = false;
|
797
|
+
// If the resolver reports an error but the call is
|
798
|
+
// wait_for_ready, keep waiting for the next result
|
799
|
+
// instead of failing the call.
|
800
|
+
if (!result.ok()) {
|
801
|
+
got_result = !wait_for_ready;
|
802
|
+
} else {
|
803
|
+
// Not an error. Make sure we actually have a result.
|
804
|
+
got_result = result->config_selector != nullptr;
|
805
|
+
}
|
806
|
+
return got_result;
|
807
|
+
})),
|
808
|
+
// Handle resolver result.
|
809
|
+
[self, unstarted_handler](
|
810
|
+
std::tuple<absl::StatusOr<ResolverDataForCalls>, bool>
|
811
|
+
result_and_delayed) mutable {
|
812
|
+
auto& resolver_data = std::get<0>(result_and_delayed);
|
813
|
+
const bool was_queued = std::get<1>(result_and_delayed);
|
814
|
+
if (!resolver_data.ok()) return resolver_data.status();
|
815
|
+
// Apply service config to call.
|
816
|
+
absl::Status status = self->ApplyServiceConfigToCall(
|
817
|
+
*resolver_data->config_selector,
|
818
|
+
unstarted_handler.UnprocessedClientInitialMetadata());
|
819
|
+
if (!status.ok()) return status;
|
820
|
+
// If the call was queued, add trace annotation.
|
821
|
+
if (was_queued) {
|
822
|
+
auto* call_tracer =
|
823
|
+
MaybeGetContext<CallTracerAnnotationInterface>();
|
824
|
+
if (call_tracer != nullptr) {
|
825
|
+
call_tracer->RecordAnnotation(
|
826
|
+
"Delayed name resolution complete.");
|
827
|
+
}
|
828
|
+
}
|
829
|
+
// Start the call on the destination provided by the
|
830
|
+
// resolver.
|
831
|
+
resolver_data->call_destination->StartCall(
|
832
|
+
std::move(unstarted_handler));
|
833
|
+
return absl::OkStatus();
|
834
|
+
});
|
835
|
+
});
|
836
|
+
}
|
837
|
+
|
838
|
+
void ClientChannel::CreateResolverLocked() {
|
839
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
840
|
+
<< "client_channel=" << this << ": starting name resolution for "
|
841
|
+
<< uri_to_resolve_;
|
842
|
+
resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
|
843
|
+
uri_to_resolve_, channel_args_, nullptr, work_serializer_,
|
844
|
+
std::make_unique<ResolverResultHandler>(
|
845
|
+
WeakRefAsSubclass<ClientChannel>()));
|
846
|
+
// Since the validity of the args was checked when the channel was created,
|
847
|
+
// CreateResolver() must return a non-null result.
|
848
|
+
CHECK(resolver_ != nullptr);
|
849
|
+
UpdateStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status(),
|
850
|
+
"started resolving");
|
851
|
+
resolver_->StartLocked();
|
852
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
853
|
+
<< "client_channel=" << this << ": created resolver=" << resolver_.get();
|
854
|
+
}
|
855
|
+
|
856
|
+
void ClientChannel::DestroyResolverAndLbPolicyLocked() {
|
857
|
+
if (resolver_ != nullptr) {
|
858
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
859
|
+
<< "client_channel=" << this
|
860
|
+
<< ": shutting down resolver=" << resolver_.get();
|
861
|
+
resolver_.reset();
|
862
|
+
saved_service_config_.reset();
|
863
|
+
saved_config_selector_.reset();
|
864
|
+
resolver_data_for_calls_.Set(ResolverDataForCalls{nullptr, nullptr});
|
865
|
+
// Clear LB policy if set.
|
866
|
+
if (lb_policy_ != nullptr) {
|
867
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
868
|
+
<< "client_channel=" << this
|
869
|
+
<< ": shutting down lb_policy=" << lb_policy_.get();
|
870
|
+
lb_policy_.reset();
|
871
|
+
picker_.Set(MakeRefCounted<LoadBalancingPolicy::DropPicker>(
|
872
|
+
absl::UnavailableError("Channel shutdown")));
|
873
|
+
}
|
874
|
+
}
|
875
|
+
}
|
876
|
+
|
877
|
+
void ClientChannel::TryToConnectLocked() {
|
878
|
+
if (disconnect_error_.ok()) {
|
879
|
+
if (lb_policy_ != nullptr) {
|
880
|
+
lb_policy_->ExitIdleLocked();
|
881
|
+
} else if (resolver_ == nullptr) {
|
882
|
+
CreateResolverLocked();
|
883
|
+
}
|
884
|
+
}
|
885
|
+
}
|
886
|
+
|
887
|
+
namespace {
|
888
|
+
|
889
|
+
RefCountedPtr<LoadBalancingPolicy::Config> ChooseLbPolicy(
|
890
|
+
const Resolver::Result& resolver_result,
|
891
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config) {
|
892
|
+
// Prefer the LB policy config found in the service config.
|
893
|
+
if (parsed_service_config->parsed_lb_config() != nullptr) {
|
894
|
+
return parsed_service_config->parsed_lb_config();
|
895
|
+
}
|
896
|
+
// Try the deprecated LB policy name from the service config.
|
897
|
+
// If not, try the setting from channel args.
|
898
|
+
absl::optional<absl::string_view> policy_name;
|
899
|
+
if (!parsed_service_config->parsed_deprecated_lb_policy().empty()) {
|
900
|
+
policy_name = parsed_service_config->parsed_deprecated_lb_policy();
|
901
|
+
} else {
|
902
|
+
policy_name = resolver_result.args.GetString(GRPC_ARG_LB_POLICY_NAME);
|
903
|
+
bool requires_config = false;
|
904
|
+
if (policy_name.has_value() &&
|
905
|
+
(!CoreConfiguration::Get()
|
906
|
+
.lb_policy_registry()
|
907
|
+
.LoadBalancingPolicyExists(*policy_name, &requires_config) ||
|
908
|
+
requires_config)) {
|
909
|
+
if (requires_config) {
|
910
|
+
gpr_log(GPR_ERROR,
|
911
|
+
"LB policy: %s passed through channel_args must not "
|
912
|
+
"require a config. Using pick_first instead.",
|
913
|
+
std::string(*policy_name).c_str());
|
914
|
+
} else {
|
915
|
+
gpr_log(GPR_ERROR,
|
916
|
+
"LB policy: %s passed through channel_args does not exist. "
|
917
|
+
"Using pick_first instead.",
|
918
|
+
std::string(*policy_name).c_str());
|
919
|
+
}
|
920
|
+
policy_name = "pick_first";
|
921
|
+
}
|
922
|
+
}
|
923
|
+
// Use pick_first if nothing was specified and we didn't select grpclb
|
924
|
+
// above.
|
925
|
+
if (!policy_name.has_value()) policy_name = "pick_first";
|
926
|
+
// Now that we have the policy name, construct an empty config for it.
|
927
|
+
Json config_json = Json::FromArray({Json::FromObject({
|
928
|
+
{std::string(*policy_name), Json::FromObject({})},
|
929
|
+
})});
|
930
|
+
auto lb_policy_config =
|
931
|
+
CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
|
932
|
+
config_json);
|
933
|
+
// The policy name came from one of three places:
|
934
|
+
// - The deprecated loadBalancingPolicy field in the service config,
|
935
|
+
// in which case the code in ClientChannelServiceConfigParser
|
936
|
+
// already verified that the policy does not require a config.
|
937
|
+
// - One of the hard-coded values here, all of which are known to not
|
938
|
+
// require a config.
|
939
|
+
// - A channel arg, in which case we check that the specified policy exists
|
940
|
+
// and accepts an empty config. If not, we revert to using pick_first
|
941
|
+
// lb_policy
|
942
|
+
CHECK_OK(lb_policy_config);
|
943
|
+
return std::move(*lb_policy_config);
|
944
|
+
}
|
945
|
+
|
946
|
+
} // namespace
|
947
|
+
|
948
|
+
void ClientChannel::OnResolverResultChangedLocked(Resolver::Result result) {
|
949
|
+
// Handle race conditions.
|
950
|
+
if (resolver_ == nullptr) return;
|
951
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
952
|
+
<< "client_channel=" << this << ": got resolver result";
|
953
|
+
// Grab resolver result health callback.
|
954
|
+
auto resolver_callback = std::move(result.result_health_callback);
|
955
|
+
absl::Status resolver_result_status;
|
956
|
+
// We only want to trace the address resolution in the follow cases:
|
957
|
+
// (a) Address resolution resulted in service config change.
|
958
|
+
// (b) Address resolution that causes number of backends to go from
|
959
|
+
// zero to non-zero.
|
960
|
+
// (c) Address resolution that causes number of backends to go from
|
961
|
+
// non-zero to zero.
|
962
|
+
// (d) Address resolution that causes a new LB policy to be created.
|
963
|
+
//
|
964
|
+
// We track a list of strings to eventually be concatenated and traced.
|
965
|
+
std::vector<const char*> trace_strings;
|
966
|
+
const bool resolution_contains_addresses =
|
967
|
+
result.addresses.ok() && !result.addresses->empty();
|
968
|
+
if (!resolution_contains_addresses &&
|
969
|
+
previous_resolution_contained_addresses_) {
|
970
|
+
trace_strings.push_back("Address list became empty");
|
971
|
+
} else if (resolution_contains_addresses &&
|
972
|
+
!previous_resolution_contained_addresses_) {
|
973
|
+
trace_strings.push_back("Address list became non-empty");
|
974
|
+
}
|
975
|
+
previous_resolution_contained_addresses_ = resolution_contains_addresses;
|
976
|
+
std::string service_config_error_string_storage;
|
977
|
+
if (!result.service_config.ok()) {
|
978
|
+
service_config_error_string_storage =
|
979
|
+
result.service_config.status().ToString();
|
980
|
+
trace_strings.push_back(service_config_error_string_storage.c_str());
|
981
|
+
}
|
982
|
+
// Choose the service config.
|
983
|
+
RefCountedPtr<ServiceConfig> service_config;
|
984
|
+
RefCountedPtr<ConfigSelector> config_selector;
|
985
|
+
if (!result.service_config.ok()) {
|
986
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
987
|
+
<< "client_channel=" << this
|
988
|
+
<< ": resolver returned service config error: "
|
989
|
+
<< result.service_config.status();
|
990
|
+
// If the service config was invalid, then fallback to the
|
991
|
+
// previously returned service config, if any.
|
992
|
+
if (saved_service_config_ != nullptr) {
|
993
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
994
|
+
<< "client_channel=" << this
|
995
|
+
<< ": resolver returned invalid service config; "
|
996
|
+
"continuing to use previous service config";
|
997
|
+
service_config = saved_service_config_;
|
998
|
+
config_selector = saved_config_selector_;
|
999
|
+
} else {
|
1000
|
+
// We received a service config error and we don't have a
|
1001
|
+
// previous service config to fall back to. Put the channel into
|
1002
|
+
// TRANSIENT_FAILURE.
|
1003
|
+
OnResolverErrorLocked(result.service_config.status());
|
1004
|
+
trace_strings.push_back("no valid service config");
|
1005
|
+
resolver_result_status =
|
1006
|
+
absl::UnavailableError("no valid service config");
|
1007
|
+
}
|
1008
|
+
} else if (*result.service_config == nullptr) {
|
1009
|
+
// Resolver did not return any service config.
|
1010
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1011
|
+
<< "client_channel=" << this
|
1012
|
+
<< ": resolver returned no service config; using default service "
|
1013
|
+
"config for channel";
|
1014
|
+
service_config = default_service_config_;
|
1015
|
+
} else {
|
1016
|
+
// Use ServiceConfig and ConfigSelector returned by resolver.
|
1017
|
+
service_config = std::move(*result.service_config);
|
1018
|
+
config_selector = result.args.GetObjectRef<ConfigSelector>();
|
1019
|
+
}
|
1020
|
+
// Note: The only case in which service_config is null here is if the
|
1021
|
+
// resolver returned a service config error and we don't have a previous
|
1022
|
+
// service config to fall back to.
|
1023
|
+
if (service_config != nullptr) {
|
1024
|
+
// Extract global config for client channel.
|
1025
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
|
1026
|
+
static_cast<const internal::ClientChannelGlobalParsedConfig*>(
|
1027
|
+
service_config->GetGlobalParsedConfig(
|
1028
|
+
service_config_parser_index_));
|
1029
|
+
// Choose LB policy config.
|
1030
|
+
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config =
|
1031
|
+
ChooseLbPolicy(result, parsed_service_config);
|
1032
|
+
// Check if the ServiceConfig has changed.
|
1033
|
+
const bool service_config_changed =
|
1034
|
+
saved_service_config_ == nullptr ||
|
1035
|
+
service_config->json_string() != saved_service_config_->json_string();
|
1036
|
+
// Check if the ConfigSelector has changed.
|
1037
|
+
const bool config_selector_changed = !ConfigSelector::Equals(
|
1038
|
+
saved_config_selector_.get(), config_selector.get());
|
1039
|
+
// If either has changed, apply the global parameters now.
|
1040
|
+
if (service_config_changed || config_selector_changed) {
|
1041
|
+
// Update service config in control plane.
|
1042
|
+
UpdateServiceConfigInControlPlaneLocked(
|
1043
|
+
std::move(service_config), std::move(config_selector),
|
1044
|
+
std::string(lb_policy_config->name()));
|
1045
|
+
// TODO(ncteisen): might be worth somehow including a snippet of the
|
1046
|
+
// config in the trace, at the risk of bloating the trace logs.
|
1047
|
+
trace_strings.push_back("Service config changed");
|
1048
|
+
} else {
|
1049
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1050
|
+
<< "client_channel=" << this << ": service config not changed";
|
1051
|
+
}
|
1052
|
+
// Create or update LB policy, as needed.
|
1053
|
+
resolver_result_status = CreateOrUpdateLbPolicyLocked(
|
1054
|
+
std::move(lb_policy_config),
|
1055
|
+
parsed_service_config->health_check_service_name(), std::move(result));
|
1056
|
+
// Start using new service config for calls.
|
1057
|
+
// This needs to happen after the LB policy has been updated, since
|
1058
|
+
// the ConfigSelector may need the LB policy to know about new
|
1059
|
+
// destinations before it can send RPCs to those destinations.
|
1060
|
+
if (service_config_changed || config_selector_changed) {
|
1061
|
+
UpdateServiceConfigInDataPlaneLocked();
|
1062
|
+
}
|
1063
|
+
}
|
1064
|
+
// Invoke resolver callback if needed.
|
1065
|
+
if (resolver_callback != nullptr) {
|
1066
|
+
resolver_callback(std::move(resolver_result_status));
|
1067
|
+
}
|
1068
|
+
// Add channel trace event.
|
1069
|
+
if (!trace_strings.empty()) {
|
1070
|
+
std::string message =
|
1071
|
+
absl::StrCat("Resolution event: ", absl::StrJoin(trace_strings, ", "));
|
1072
|
+
if (channelz_node_ != nullptr) {
|
1073
|
+
channelz_node_->AddTraceEvent(channelz::ChannelTrace::Severity::Info,
|
1074
|
+
grpc_slice_from_cpp_string(message));
|
1075
|
+
}
|
1076
|
+
}
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
void ClientChannel::OnResolverErrorLocked(absl::Status status) {
|
1080
|
+
if (resolver_ == nullptr) return;
|
1081
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1082
|
+
<< "client_channel=" << this
|
1083
|
+
<< ": resolver transient failure: " << status;
|
1084
|
+
// If we already have an LB policy from a previous resolution
|
1085
|
+
// result, then we continue to let it set the connectivity state.
|
1086
|
+
// Otherwise, we go into TRANSIENT_FAILURE.
|
1087
|
+
if (lb_policy_ == nullptr) {
|
1088
|
+
// Update connectivity state.
|
1089
|
+
UpdateStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE, status,
|
1090
|
+
"resolver failure");
|
1091
|
+
// Send updated resolver result.
|
1092
|
+
resolver_data_for_calls_.Set(
|
1093
|
+
MaybeRewriteIllegalStatusCode(status, "resolver"));
|
1094
|
+
}
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
absl::Status ClientChannel::CreateOrUpdateLbPolicyLocked(
|
1098
|
+
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
|
1099
|
+
const absl::optional<std::string>& health_check_service_name,
|
1100
|
+
Resolver::Result result) {
|
1101
|
+
// Construct update.
|
1102
|
+
LoadBalancingPolicy::UpdateArgs update_args;
|
1103
|
+
if (!result.addresses.ok()) {
|
1104
|
+
update_args.addresses = result.addresses.status();
|
1105
|
+
} else {
|
1106
|
+
update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
|
1107
|
+
std::move(*result.addresses));
|
1108
|
+
}
|
1109
|
+
update_args.config = std::move(lb_policy_config);
|
1110
|
+
update_args.resolution_note = std::move(result.resolution_note);
|
1111
|
+
// Remove the config selector from channel args so that we're not holding
|
1112
|
+
// unnecessary refs that cause it to be destroyed somewhere other than in
|
1113
|
+
// the WorkSerializer.
|
1114
|
+
update_args.args = result.args.Remove(GRPC_ARG_CONFIG_SELECTOR);
|
1115
|
+
// Add health check service name to channel args.
|
1116
|
+
if (health_check_service_name.has_value()) {
|
1117
|
+
update_args.args = update_args.args.Set(GRPC_ARG_HEALTH_CHECK_SERVICE_NAME,
|
1118
|
+
*health_check_service_name);
|
1119
|
+
}
|
1120
|
+
// Create policy if needed.
|
1121
|
+
if (lb_policy_ == nullptr) {
|
1122
|
+
lb_policy_ = CreateLbPolicyLocked(update_args.args);
|
1123
|
+
}
|
1124
|
+
// Update the policy.
|
1125
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1126
|
+
<< "client_channel=" << this << ": Updating child policy "
|
1127
|
+
<< lb_policy_.get();
|
1128
|
+
return lb_policy_->UpdateLocked(std::move(update_args));
|
1129
|
+
}
|
1130
|
+
|
1131
|
+
// Creates a new LB policy.
|
1132
|
+
OrphanablePtr<LoadBalancingPolicy> ClientChannel::CreateLbPolicyLocked(
|
1133
|
+
const ChannelArgs& args) {
|
1134
|
+
// The LB policy will start in state CONNECTING but will not
|
1135
|
+
// necessarily send us an update synchronously, so set state to
|
1136
|
+
// CONNECTING (in case the resolver had previously failed and put the
|
1137
|
+
// channel into TRANSIENT_FAILURE) and make sure we have a queueing picker.
|
1138
|
+
UpdateStateAndPickerLocked(
|
1139
|
+
GRPC_CHANNEL_CONNECTING, absl::Status(), "started resolving",
|
1140
|
+
MakeRefCounted<LoadBalancingPolicy::QueuePicker>(nullptr));
|
1141
|
+
// Now create the LB policy.
|
1142
|
+
LoadBalancingPolicy::Args lb_policy_args;
|
1143
|
+
lb_policy_args.work_serializer = work_serializer_;
|
1144
|
+
lb_policy_args.channel_control_helper =
|
1145
|
+
std::make_unique<ClientChannelControlHelper>(
|
1146
|
+
WeakRefAsSubclass<ClientChannel>());
|
1147
|
+
lb_policy_args.args = args;
|
1148
|
+
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
1149
|
+
MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
|
1150
|
+
&client_channel_trace);
|
1151
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1152
|
+
<< "client_channel=" << this << ": created new LB policy "
|
1153
|
+
<< lb_policy.get();
|
1154
|
+
return lb_policy;
|
1155
|
+
}
|
1156
|
+
|
1157
|
+
void ClientChannel::UpdateServiceConfigInControlPlaneLocked(
|
1158
|
+
RefCountedPtr<ServiceConfig> service_config,
|
1159
|
+
RefCountedPtr<ConfigSelector> config_selector, std::string lb_policy_name) {
|
1160
|
+
std::string service_config_json(service_config->json_string());
|
1161
|
+
// Update service config.
|
1162
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1163
|
+
<< "client_channel=" << this << ": using service config: \""
|
1164
|
+
<< service_config_json << "\"";
|
1165
|
+
saved_service_config_ = std::move(service_config);
|
1166
|
+
// Update config selector.
|
1167
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1168
|
+
<< "client_channel=" << this << ": using ConfigSelector "
|
1169
|
+
<< config_selector.get();
|
1170
|
+
saved_config_selector_ = std::move(config_selector);
|
1171
|
+
// Update the data used by GetChannelInfo().
|
1172
|
+
{
|
1173
|
+
MutexLock lock(&info_mu_);
|
1174
|
+
info_lb_policy_name_ = std::move(lb_policy_name);
|
1175
|
+
info_service_config_json_ = std::move(service_config_json);
|
1176
|
+
}
|
1177
|
+
}
|
1178
|
+
|
1179
|
+
void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
|
1180
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1181
|
+
<< "client_channel=" << this << ": switching to ConfigSelector "
|
1182
|
+
<< saved_config_selector_.get();
|
1183
|
+
// Use default config selector if resolver didn't supply one.
|
1184
|
+
RefCountedPtr<ConfigSelector> config_selector = saved_config_selector_;
|
1185
|
+
if (config_selector == nullptr) {
|
1186
|
+
config_selector =
|
1187
|
+
MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
|
1188
|
+
}
|
1189
|
+
// Construct filter stack.
|
1190
|
+
InterceptionChainBuilder builder(channel_args_.SetObject(this));
|
1191
|
+
if (idle_timeout_ != Duration::Zero()) {
|
1192
|
+
builder.AddOnServerTrailingMetadata([this](ServerMetadata&) {
|
1193
|
+
if (idle_state_.DecreaseCallCount()) StartIdleTimer();
|
1194
|
+
});
|
1195
|
+
}
|
1196
|
+
CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder(
|
1197
|
+
GRPC_CLIENT_CHANNEL, builder);
|
1198
|
+
// TODO(roth): add filters returned by config selector
|
1199
|
+
// Create call destination.
|
1200
|
+
const bool enable_retries =
|
1201
|
+
!channel_args_.WantMinimalStack() &&
|
1202
|
+
channel_args_.GetBool(GRPC_ARG_ENABLE_RETRIES).value_or(true);
|
1203
|
+
if (enable_retries) {
|
1204
|
+
Crash("call v3 stack does not yet support retries");
|
1205
|
+
}
|
1206
|
+
auto top_of_stack_call_destination = builder.Build(call_destination_);
|
1207
|
+
// Send result to data plane.
|
1208
|
+
if (!top_of_stack_call_destination.ok()) {
|
1209
|
+
resolver_data_for_calls_.Set(MaybeRewriteIllegalStatusCode(
|
1210
|
+
top_of_stack_call_destination.status(), "channel construction"));
|
1211
|
+
} else {
|
1212
|
+
resolver_data_for_calls_.Set(ResolverDataForCalls{
|
1213
|
+
std::move(config_selector), std::move(*top_of_stack_call_destination)});
|
1214
|
+
}
|
1215
|
+
}
|
1216
|
+
|
1217
|
+
void ClientChannel::UpdateStateLocked(grpc_connectivity_state state,
|
1218
|
+
const absl::Status& status,
|
1219
|
+
const char* reason) {
|
1220
|
+
if (state != GRPC_CHANNEL_SHUTDOWN &&
|
1221
|
+
state_tracker_.state() == GRPC_CHANNEL_SHUTDOWN) {
|
1222
|
+
Crash("Illegal transition SHUTDOWN -> anything");
|
1223
|
+
}
|
1224
|
+
state_tracker_.SetState(state, status, reason);
|
1225
|
+
if (channelz_node_ != nullptr) {
|
1226
|
+
channelz_node_->SetConnectivityState(state);
|
1227
|
+
channelz_node_->AddTraceEvent(
|
1228
|
+
channelz::ChannelTrace::Severity::Info,
|
1229
|
+
grpc_slice_from_static_string(
|
1230
|
+
channelz::ChannelNode::GetChannelConnectivityStateChangeString(
|
1231
|
+
state)));
|
1232
|
+
}
|
1233
|
+
}
|
1234
|
+
|
1235
|
+
void ClientChannel::UpdateStateAndPickerLocked(
|
1236
|
+
grpc_connectivity_state state, const absl::Status& status,
|
1237
|
+
const char* reason,
|
1238
|
+
RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker) {
|
1239
|
+
UpdateStateLocked(state, status, reason);
|
1240
|
+
picker_.Set(std::move(picker));
|
1241
|
+
}
|
1242
|
+
|
1243
|
+
void ClientChannel::StartIdleTimer() {
|
1244
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1245
|
+
<< "client_channel=" << this << ": idle timer started";
|
1246
|
+
auto self = WeakRefAsSubclass<ClientChannel>();
|
1247
|
+
auto promise = Loop([self]() {
|
1248
|
+
return TrySeq(Sleep(Timestamp::Now() + self->idle_timeout_),
|
1249
|
+
[self]() -> Poll<LoopCtl<absl::Status>> {
|
1250
|
+
if (self->idle_state_.CheckTimer()) {
|
1251
|
+
return Continue{};
|
1252
|
+
} else {
|
1253
|
+
return absl::OkStatus();
|
1254
|
+
}
|
1255
|
+
});
|
1256
|
+
});
|
1257
|
+
idle_activity_.Set(MakeActivity(
|
1258
|
+
std::move(promise), ExecCtxWakeupScheduler{},
|
1259
|
+
[self = std::move(self)](absl::Status status) mutable {
|
1260
|
+
if (status.ok()) {
|
1261
|
+
self->work_serializer_->Run(
|
1262
|
+
[self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
|
1263
|
+
self->DestroyResolverAndLbPolicyLocked();
|
1264
|
+
self->UpdateStateAndPickerLocked(
|
1265
|
+
GRPC_CHANNEL_IDLE, absl::OkStatus(),
|
1266
|
+
"channel entering IDLE", nullptr);
|
1267
|
+
// TODO(roth): In case there's a race condition, we
|
1268
|
+
// might need to check for any calls that are queued
|
1269
|
+
// waiting for a resolver result or an LB pick.
|
1270
|
+
},
|
1271
|
+
DEBUG_LOCATION);
|
1272
|
+
}
|
1273
|
+
},
|
1274
|
+
GetContext<EventEngine>()));
|
1275
|
+
}
|
1276
|
+
|
1277
|
+
absl::Status ClientChannel::ApplyServiceConfigToCall(
|
1278
|
+
ConfigSelector& config_selector,
|
1279
|
+
ClientMetadata& client_initial_metadata) const {
|
1280
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1281
|
+
<< "client_channel=" << this << ": " << GetContext<Activity>()->DebugTag()
|
1282
|
+
<< " service config to call";
|
1283
|
+
// Create a ClientChannelServiceConfigCallData for the call. This stores
|
1284
|
+
// a ref to the ServiceConfig and caches the right set of parsed configs
|
1285
|
+
// to use for the call. The ClientChannelServiceConfigCallData will store
|
1286
|
+
// itself in the call context, so that it can be accessed by filters
|
1287
|
+
// below us in the stack, and it will be cleaned up when the call ends.
|
1288
|
+
auto* service_config_call_data =
|
1289
|
+
GetContext<Arena>()->New<ClientChannelServiceConfigCallData>(
|
1290
|
+
GetContext<Arena>());
|
1291
|
+
// Use the ConfigSelector to determine the config for the call.
|
1292
|
+
absl::Status call_config_status = config_selector.GetCallConfig(
|
1293
|
+
{&client_initial_metadata, GetContext<Arena>(),
|
1294
|
+
service_config_call_data});
|
1295
|
+
if (!call_config_status.ok()) {
|
1296
|
+
return MaybeRewriteIllegalStatusCode(call_config_status, "ConfigSelector");
|
1297
|
+
}
|
1298
|
+
// Apply our own method params to the call.
|
1299
|
+
auto* method_params = DownCast<ClientChannelMethodParsedConfig*>(
|
1300
|
+
service_config_call_data->GetMethodParsedConfig(
|
1301
|
+
service_config_parser_index_));
|
1302
|
+
if (method_params != nullptr) {
|
1303
|
+
// If the service config specifies a deadline, update the call's
|
1304
|
+
// deadline timer.
|
1305
|
+
if (method_params->timeout() != Duration::Zero()) {
|
1306
|
+
Call* call = GetContext<Call>();
|
1307
|
+
const Timestamp per_method_deadline =
|
1308
|
+
Timestamp::FromCycleCounterRoundUp(call->start_time()) +
|
1309
|
+
method_params->timeout();
|
1310
|
+
call->UpdateDeadline(per_method_deadline);
|
1311
|
+
}
|
1312
|
+
// If the service config set wait_for_ready and the application
|
1313
|
+
// did not explicitly set it, use the value from the service config.
|
1314
|
+
auto* wait_for_ready =
|
1315
|
+
client_initial_metadata.GetOrCreatePointer(WaitForReady());
|
1316
|
+
if (method_params->wait_for_ready().has_value() &&
|
1317
|
+
!wait_for_ready->explicitly_set) {
|
1318
|
+
wait_for_ready->value = method_params->wait_for_ready().value();
|
1319
|
+
}
|
1320
|
+
}
|
1321
|
+
return absl::OkStatus();
|
1322
|
+
}
|
1323
|
+
|
1324
|
+
} // namespace grpc_core
|