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
@@ -68,7 +68,6 @@
|
|
68
68
|
#include "src/core/lib/config/core_configuration.h"
|
69
69
|
#include "src/core/lib/debug/trace.h"
|
70
70
|
#include "src/core/lib/experiments/experiments.h"
|
71
|
-
#include "src/core/lib/gpr/useful.h"
|
72
71
|
#include "src/core/lib/gprpp/crash.h"
|
73
72
|
#include "src/core/lib/gprpp/debug_location.h"
|
74
73
|
#include "src/core/lib/gprpp/manual_constructor.h"
|
@@ -80,7 +79,6 @@
|
|
80
79
|
#include "src/core/lib/iomgr/polling_entity.h"
|
81
80
|
#include "src/core/lib/iomgr/pollset_set.h"
|
82
81
|
#include "src/core/lib/iomgr/resolved_address.h"
|
83
|
-
#include "src/core/lib/json/json.h"
|
84
82
|
#include "src/core/lib/promise/cancel_callback.h"
|
85
83
|
#include "src/core/lib/promise/context.h"
|
86
84
|
#include "src/core/lib/promise/latch.h"
|
@@ -104,6 +102,8 @@
|
|
104
102
|
#include "src/core/resolver/resolver_registry.h"
|
105
103
|
#include "src/core/service_config/service_config_call_data.h"
|
106
104
|
#include "src/core/service_config/service_config_impl.h"
|
105
|
+
#include "src/core/util/json/json.h"
|
106
|
+
#include "src/core/util/useful.h"
|
107
107
|
|
108
108
|
//
|
109
109
|
// Client channel filter
|
@@ -113,10 +113,6 @@ namespace grpc_core {
|
|
113
113
|
|
114
114
|
using internal::ClientChannelMethodParsedConfig;
|
115
115
|
|
116
|
-
TraceFlag grpc_client_channel_trace(false, "client_channel");
|
117
|
-
TraceFlag grpc_client_channel_call_trace(false, "client_channel_call");
|
118
|
-
TraceFlag grpc_client_channel_lb_call_trace(false, "client_channel_lb_call");
|
119
|
-
|
120
116
|
//
|
121
117
|
// ClientChannelFilter::CallData definition
|
122
118
|
//
|
@@ -159,7 +155,6 @@ class ClientChannelFilter::CallData {
|
|
159
155
|
virtual Arena* arena() const = 0;
|
160
156
|
virtual grpc_polling_entity* pollent() = 0;
|
161
157
|
virtual grpc_metadata_batch* send_initial_metadata() = 0;
|
162
|
-
virtual grpc_call_context_element* call_context() const = 0;
|
163
158
|
|
164
159
|
// Helper function for CheckResolution(). Returns true if the call
|
165
160
|
// can continue (i.e., there is a valid resolution result, or there is
|
@@ -222,9 +217,6 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
222
217
|
return pending_batches_[0]
|
223
218
|
->payload->send_initial_metadata.send_initial_metadata;
|
224
219
|
}
|
225
|
-
grpc_call_context_element* call_context() const override {
|
226
|
-
return call_context_;
|
227
|
-
}
|
228
220
|
|
229
221
|
// Returns the index into pending_batches_ to be used for batch.
|
230
222
|
static size_t GetBatchIndex(grpc_transport_stream_op_batch* batch);
|
@@ -269,8 +261,7 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
269
261
|
void ResetDeadline(Duration timeout) override {
|
270
262
|
const Timestamp per_method_deadline =
|
271
263
|
Timestamp::FromCycleCounterRoundUp(call_start_time_) + timeout;
|
272
|
-
|
273
|
-
->UpdateDeadline(per_method_deadline);
|
264
|
+
arena_->GetContext<Call>()->UpdateDeadline(per_method_deadline);
|
274
265
|
}
|
275
266
|
|
276
267
|
void CreateDynamicCall();
|
@@ -279,7 +270,6 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
279
270
|
void* arg, grpc_error_handle error);
|
280
271
|
|
281
272
|
grpc_slice path_; // Request path.
|
282
|
-
grpc_call_context_element* call_context_;
|
283
273
|
gpr_cycle_counter call_start_time_;
|
284
274
|
Timestamp deadline_;
|
285
275
|
|
@@ -310,122 +300,12 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
310
300
|
grpc_error_handle cancel_error_;
|
311
301
|
};
|
312
302
|
|
313
|
-
class ClientChannelFilter::PromiseBasedCallData final
|
314
|
-
: public ClientChannelFilter::CallData {
|
315
|
-
public:
|
316
|
-
explicit PromiseBasedCallData(ClientChannelFilter* chand) : chand_(chand) {}
|
317
|
-
|
318
|
-
~PromiseBasedCallData() override {
|
319
|
-
if (was_queued_ && client_initial_metadata_ != nullptr) {
|
320
|
-
MutexLock lock(&chand_->resolution_mu_);
|
321
|
-
RemoveCallFromResolverQueuedCallsLocked();
|
322
|
-
chand_->resolver_queued_calls_.erase(this);
|
323
|
-
}
|
324
|
-
}
|
325
|
-
|
326
|
-
ArenaPromise<absl::StatusOr<CallArgs>> MakeNameResolutionPromise(
|
327
|
-
CallArgs call_args) {
|
328
|
-
pollent_ = NowOrNever(call_args.polling_entity->WaitAndCopy()).value();
|
329
|
-
client_initial_metadata_ = std::move(call_args.client_initial_metadata);
|
330
|
-
// If we're still in IDLE, we need to start resolving.
|
331
|
-
if (GPR_UNLIKELY(chand_->CheckConnectivityState(false) ==
|
332
|
-
GRPC_CHANNEL_IDLE)) {
|
333
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
334
|
-
gpr_log(GPR_INFO, "chand=%p calld=%p: %striggering exit idle", chand_,
|
335
|
-
this, GetContext<Activity>()->DebugTag().c_str());
|
336
|
-
}
|
337
|
-
// Bounce into the control plane work serializer to start resolving.
|
338
|
-
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExitIdle");
|
339
|
-
chand_->work_serializer_->Run(
|
340
|
-
[chand = chand_]()
|
341
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
342
|
-
chand->CheckConnectivityState(/*try_to_connect=*/true);
|
343
|
-
GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "ExitIdle");
|
344
|
-
},
|
345
|
-
DEBUG_LOCATION);
|
346
|
-
}
|
347
|
-
return [this, call_args = std::move(
|
348
|
-
call_args)]() mutable -> Poll<absl::StatusOr<CallArgs>> {
|
349
|
-
auto result = CheckResolution(was_queued_);
|
350
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
351
|
-
gpr_log(GPR_INFO, "chand=%p calld=%p: %sCheckResolution returns %s",
|
352
|
-
chand_, this, GetContext<Activity>()->DebugTag().c_str(),
|
353
|
-
result.has_value() ? result->ToString().c_str() : "Pending");
|
354
|
-
}
|
355
|
-
if (!result.has_value()) return Pending{};
|
356
|
-
if (!result->ok()) return *result;
|
357
|
-
call_args.client_initial_metadata = std::move(client_initial_metadata_);
|
358
|
-
return std::move(call_args);
|
359
|
-
};
|
360
|
-
}
|
361
|
-
|
362
|
-
private:
|
363
|
-
ClientChannelFilter* chand() const override { return chand_; }
|
364
|
-
Arena* arena() const override { return GetContext<Arena>(); }
|
365
|
-
grpc_polling_entity* pollent() override { return &pollent_; }
|
366
|
-
grpc_metadata_batch* send_initial_metadata() override {
|
367
|
-
return client_initial_metadata_.get();
|
368
|
-
}
|
369
|
-
grpc_call_context_element* call_context() const override {
|
370
|
-
return GetContext<grpc_call_context_element>();
|
371
|
-
}
|
372
|
-
|
373
|
-
void OnAddToQueueLocked() override
|
374
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_) {
|
375
|
-
waker_ = GetContext<Activity>()->MakeNonOwningWaker();
|
376
|
-
was_queued_ = true;
|
377
|
-
}
|
378
|
-
|
379
|
-
void RetryCheckResolutionLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
380
|
-
&ClientChannelFilter::resolution_mu_) override {
|
381
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
382
|
-
gpr_log(GPR_INFO, "chand=%p calld=%p: RetryCheckResolutionLocked(): %s",
|
383
|
-
chand_, this, waker_.ActivityDebugTag().c_str());
|
384
|
-
}
|
385
|
-
waker_.WakeupAsync();
|
386
|
-
}
|
387
|
-
|
388
|
-
void ResetDeadline(Duration timeout) override {
|
389
|
-
Call* call = GetContext<Call>();
|
390
|
-
CallContext* call_context = GetContext<CallContext>();
|
391
|
-
const Timestamp per_method_deadline =
|
392
|
-
Timestamp::FromCycleCounterRoundUp(call_context->call_start_time()) +
|
393
|
-
timeout;
|
394
|
-
call->UpdateDeadline(per_method_deadline);
|
395
|
-
}
|
396
|
-
|
397
|
-
ClientChannelFilter* chand_;
|
398
|
-
grpc_polling_entity pollent_;
|
399
|
-
ClientMetadataHandle client_initial_metadata_;
|
400
|
-
bool was_queued_ = false;
|
401
|
-
Waker waker_ ABSL_GUARDED_BY(&ClientChannelFilter::resolution_mu_);
|
402
|
-
};
|
403
|
-
|
404
303
|
//
|
405
304
|
// Filter vtable
|
406
305
|
//
|
407
306
|
|
408
|
-
const grpc_channel_filter ClientChannelFilter::
|
307
|
+
const grpc_channel_filter ClientChannelFilter::kFilter = {
|
409
308
|
ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch,
|
410
|
-
ClientChannelFilter::MakeCallPromise,
|
411
|
-
/* init_call: */ nullptr,
|
412
|
-
ClientChannelFilter::StartTransportOp,
|
413
|
-
sizeof(ClientChannelFilter::FilterBasedCallData),
|
414
|
-
ClientChannelFilter::FilterBasedCallData::Init,
|
415
|
-
ClientChannelFilter::FilterBasedCallData::SetPollent,
|
416
|
-
ClientChannelFilter::FilterBasedCallData::Destroy,
|
417
|
-
sizeof(ClientChannelFilter),
|
418
|
-
ClientChannelFilter::Init,
|
419
|
-
grpc_channel_stack_no_post_init,
|
420
|
-
ClientChannelFilter::Destroy,
|
421
|
-
ClientChannelFilter::GetChannelInfo,
|
422
|
-
"client-channel",
|
423
|
-
};
|
424
|
-
|
425
|
-
const grpc_channel_filter ClientChannelFilter::kFilterVtableWithoutPromises = {
|
426
|
-
ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch,
|
427
|
-
nullptr,
|
428
|
-
/* init_call: */ nullptr,
|
429
309
|
ClientChannelFilter::StartTransportOp,
|
430
310
|
sizeof(ClientChannelFilter::FilterBasedCallData),
|
431
311
|
ClientChannelFilter::FilterBasedCallData::Init,
|
@@ -445,10 +325,9 @@ const grpc_channel_filter ClientChannelFilter::kFilterVtableWithoutPromises = {
|
|
445
325
|
|
446
326
|
namespace {
|
447
327
|
|
448
|
-
ClientChannelServiceConfigCallData* GetServiceConfigCallData(
|
449
|
-
|
450
|
-
|
451
|
-
context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
|
328
|
+
ClientChannelServiceConfigCallData* GetServiceConfigCallData(Arena* arena) {
|
329
|
+
return DownCast<ClientChannelServiceConfigCallData*>(
|
330
|
+
arena->GetContext<ServiceConfigCallData>());
|
452
331
|
}
|
453
332
|
|
454
333
|
class DynamicTerminationFilter final {
|
@@ -476,19 +355,6 @@ class DynamicTerminationFilter final {
|
|
476
355
|
static void GetChannelInfo(grpc_channel_element* /*elem*/,
|
477
356
|
const grpc_channel_info* /*info*/) {}
|
478
357
|
|
479
|
-
static ArenaPromise<ServerMetadataHandle> MakeCallPromise(
|
480
|
-
grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory) {
|
481
|
-
auto* chand = static_cast<DynamicTerminationFilter*>(elem->channel_data);
|
482
|
-
return chand->chand_->CreateLoadBalancedCallPromise(
|
483
|
-
std::move(call_args),
|
484
|
-
[]() {
|
485
|
-
auto* service_config_call_data =
|
486
|
-
GetServiceConfigCallData(GetContext<grpc_call_context_element>());
|
487
|
-
service_config_call_data->Commit();
|
488
|
-
},
|
489
|
-
/*is_transparent_retry=*/false);
|
490
|
-
}
|
491
|
-
|
492
358
|
private:
|
493
359
|
explicit DynamicTerminationFilter(const ChannelArgs& args)
|
494
360
|
: chand_(args.GetObject<ClientChannelFilter>()) {}
|
@@ -532,21 +398,18 @@ class DynamicTerminationFilter::CallData final {
|
|
532
398
|
auto* calld = static_cast<CallData*>(elem->call_data);
|
533
399
|
auto* chand = static_cast<DynamicTerminationFilter*>(elem->channel_data);
|
534
400
|
ClientChannelFilter* client_channel = chand->chand_;
|
535
|
-
grpc_call_element_args args = {calld->owning_call_,
|
536
|
-
calld->
|
537
|
-
/*start_time=*/0,
|
538
|
-
calld->arena_,
|
539
|
-
auto* service_config_call_data =
|
540
|
-
GetServiceConfigCallData(calld->call_context_);
|
401
|
+
grpc_call_element_args args = {calld->owning_call_, nullptr,
|
402
|
+
calld->path_,
|
403
|
+
/*start_time=*/0, calld->deadline_,
|
404
|
+
calld->arena_, calld->call_combiner_};
|
405
|
+
auto* service_config_call_data = GetServiceConfigCallData(calld->arena_);
|
541
406
|
calld->lb_call_ = client_channel->CreateLoadBalancedCall(
|
542
407
|
args, pollent, nullptr,
|
543
408
|
[service_config_call_data]() { service_config_call_data->Commit(); },
|
544
409
|
/*is_transparent_retry=*/false);
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
client_channel, calld->lb_call_.get());
|
549
|
-
}
|
410
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
411
|
+
<< "chand=" << chand << " dynamic_termination_calld=" << client_channel
|
412
|
+
<< ": create lb_call=" << calld->lb_call_.get();
|
550
413
|
}
|
551
414
|
|
552
415
|
private:
|
@@ -555,8 +418,7 @@ class DynamicTerminationFilter::CallData final {
|
|
555
418
|
deadline_(args.deadline),
|
556
419
|
arena_(args.arena),
|
557
420
|
owning_call_(args.call_stack),
|
558
|
-
call_combiner_(args.call_combiner)
|
559
|
-
call_context_(args.context) {}
|
421
|
+
call_combiner_(args.call_combiner) {}
|
560
422
|
|
561
423
|
~CallData() { CSliceUnref(path_); }
|
562
424
|
|
@@ -565,15 +427,12 @@ class DynamicTerminationFilter::CallData final {
|
|
565
427
|
Arena* arena_;
|
566
428
|
grpc_call_stack* owning_call_;
|
567
429
|
CallCombiner* call_combiner_;
|
568
|
-
grpc_call_context_element* call_context_;
|
569
430
|
|
570
431
|
OrphanablePtr<ClientChannelFilter::FilterBasedLoadBalancedCall> lb_call_;
|
571
432
|
};
|
572
433
|
|
573
434
|
const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
|
574
435
|
DynamicTerminationFilter::CallData::StartTransportStreamOpBatch,
|
575
|
-
DynamicTerminationFilter::MakeCallPromise,
|
576
|
-
/* init_call: */ nullptr,
|
577
436
|
DynamicTerminationFilter::StartTransportOp,
|
578
437
|
sizeof(DynamicTerminationFilter::CallData),
|
579
438
|
DynamicTerminationFilter::CallData::Init,
|
@@ -601,9 +460,8 @@ class ClientChannelFilter::ResolverResultHandler final
|
|
601
460
|
}
|
602
461
|
|
603
462
|
~ResolverResultHandler() override {
|
604
|
-
|
605
|
-
|
606
|
-
}
|
463
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
464
|
+
<< "chand=" << chand_ << ": resolver shutdown complete";
|
607
465
|
GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ResolverResultHandler");
|
608
466
|
}
|
609
467
|
|
@@ -633,16 +491,14 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
633
491
|
public:
|
634
492
|
SubchannelWrapper(ClientChannelFilter* chand,
|
635
493
|
RefCountedPtr<Subchannel> subchannel)
|
636
|
-
: SubchannelInterface(GRPC_TRACE_FLAG_ENABLED(
|
494
|
+
: SubchannelInterface(GRPC_TRACE_FLAG_ENABLED(client_channel)
|
637
495
|
? "SubchannelWrapper"
|
638
496
|
: nullptr),
|
639
497
|
chand_(chand),
|
640
498
|
subchannel_(std::move(subchannel)) {
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
chand, this, subchannel_.get());
|
645
|
-
}
|
499
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
500
|
+
<< "chand=" << chand << ": creating subchannel wrapper " << this
|
501
|
+
<< " for subchannel " << subchannel_.get();
|
646
502
|
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "SubchannelWrapper");
|
647
503
|
#ifndef NDEBUG
|
648
504
|
DCHECK(chand_->work_serializer_->RunningInWorkSerializer());
|
@@ -663,11 +519,9 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
663
519
|
}
|
664
520
|
|
665
521
|
~SubchannelWrapper() override {
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
chand_, this, subchannel_.get());
|
670
|
-
}
|
522
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
523
|
+
<< "chand=" << chand_ << ": destroying subchannel wrapper " << this
|
524
|
+
<< "for subchannel " << subchannel_.get();
|
671
525
|
if (!IsWorkSerializerDispatchEnabled()) {
|
672
526
|
chand_->subchannel_wrappers_.erase(this);
|
673
527
|
if (chand_->channelz_node_ != nullptr) {
|
@@ -800,12 +654,11 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
800
654
|
void OnConnectivityStateChange(
|
801
655
|
RefCountedPtr<ConnectivityStateWatcherInterface> self,
|
802
656
|
grpc_connectivity_state state, const absl::Status& status) override {
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
}
|
657
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
658
|
+
<< "chand=" << parent_->chand_
|
659
|
+
<< ": connectivity change for subchannel wrapper " << parent_.get()
|
660
|
+
<< " subchannel " << parent_->subchannel_.get()
|
661
|
+
<< "hopping into work_serializer";
|
809
662
|
self.release(); // Held by callback.
|
810
663
|
parent_->chand_->work_serializer_->Run(
|
811
664
|
[this, state, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
@@ -824,15 +677,13 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
824
677
|
void ApplyUpdateInControlPlaneWorkSerializer(grpc_connectivity_state state,
|
825
678
|
const absl::Status& status)
|
826
679
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*parent_->chand_->work_serializer_) {
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
status.ToString().c_str());
|
835
|
-
}
|
680
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
681
|
+
<< "chand=" << parent_->chand_
|
682
|
+
<< ": processing connectivity change in work serializer for "
|
683
|
+
"subchannel wrapper "
|
684
|
+
<< parent_.get() << " subchannel " << parent_->subchannel_.get()
|
685
|
+
<< " watcher=" << watcher_.get()
|
686
|
+
<< " state=" << ConnectivityStateName(state) << " status=" << status;
|
836
687
|
absl::optional<absl::Cord> keepalive_throttling =
|
837
688
|
status.GetPayload(kKeepaliveThrottlingKey);
|
838
689
|
if (keepalive_throttling.has_value()) {
|
@@ -841,10 +692,10 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
841
692
|
&new_keepalive_time)) {
|
842
693
|
if (new_keepalive_time > parent_->chand_->keepalive_time_) {
|
843
694
|
parent_->chand_->keepalive_time_ = new_keepalive_time;
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
695
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
696
|
+
<< "chand=" << parent_->chand_
|
697
|
+
<< ": throttling keepalive time to "
|
698
|
+
<< parent_->chand_->keepalive_time_;
|
848
699
|
// Propagate the new keepalive time to all subchannels. This is so
|
849
700
|
// that new transports created by any subchannel (and not just the
|
850
701
|
// subchannel that received the GOAWAY), use the new keepalive time.
|
@@ -1109,7 +960,7 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
1109
960
|
const ChannelArgs& args) override
|
1110
961
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
1111
962
|
if (chand_->resolver_ == nullptr) return nullptr; // Shutting down.
|
1112
|
-
ChannelArgs subchannel_args =
|
963
|
+
ChannelArgs subchannel_args = Subchannel::MakeSubchannelArgs(
|
1113
964
|
args, per_address_args, chand_->subchannel_pool_,
|
1114
965
|
chand_->default_authority_);
|
1115
966
|
// Create subchannel.
|
@@ -1127,14 +978,13 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
1127
978
|
RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker)
|
1128
979
|
override ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
1129
980
|
if (chand_->resolver_ == nullptr) return; // Shutting down.
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
}
|
981
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
982
|
+
<< "chand=" << chand_
|
983
|
+
<< ": update: state=" << ConnectivityStateName(state) << " status=("
|
984
|
+
<< status << ") picker=" << picker.get()
|
985
|
+
<< (chand_->disconnect_error_.ok()
|
986
|
+
? ""
|
987
|
+
: " (ignoring -- channel shutting down)");
|
1138
988
|
// Do update only if not shutting down.
|
1139
989
|
if (chand_->disconnect_error_.ok()) {
|
1140
990
|
chand_->UpdateStateAndPickerLocked(state, status, "helper",
|
@@ -1145,9 +995,8 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
1145
995
|
void RequestReresolution() override
|
1146
996
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
1147
997
|
if (chand_->resolver_ == nullptr) return; // Shutting down.
|
1148
|
-
|
1149
|
-
|
1150
|
-
}
|
998
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
999
|
+
<< "chand=" << chand_ << ": started name re-resolving";
|
1151
1000
|
chand_->resolver_->RequestReresolutionLocked();
|
1152
1001
|
}
|
1153
1002
|
|
@@ -1203,8 +1052,7 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
1203
1052
|
grpc_error_handle ClientChannelFilter::Init(grpc_channel_element* elem,
|
1204
1053
|
grpc_channel_element_args* args) {
|
1205
1054
|
CHECK(args->is_last);
|
1206
|
-
CHECK(elem->filter == &
|
1207
|
-
elem->filter == &kFilterVtableWithoutPromises);
|
1055
|
+
CHECK(elem->filter == &kFilter);
|
1208
1056
|
grpc_error_handle error;
|
1209
1057
|
new (elem->channel_data) ClientChannelFilter(args, &error);
|
1210
1058
|
return error;
|
@@ -1240,10 +1088,9 @@ ClientChannelFilter::ClientChannelFilter(grpc_channel_element_args* args,
|
|
1240
1088
|
std::make_shared<WorkSerializer>(*args->channel_stack->event_engine)),
|
1241
1089
|
state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
|
1242
1090
|
subchannel_pool_(GetSubchannelPool(channel_args_)) {
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
}
|
1091
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1092
|
+
<< "chand=" << this << ": creating client_channel for channel stack "
|
1093
|
+
<< owning_stack_;
|
1247
1094
|
// Start backup polling.
|
1248
1095
|
grpc_client_channel_start_backup_polling(interested_parties_);
|
1249
1096
|
// Check client channel factory.
|
@@ -1312,30 +1159,14 @@ ClientChannelFilter::ClientChannelFilter(grpc_channel_element_args* args,
|
|
1312
1159
|
}
|
1313
1160
|
|
1314
1161
|
ClientChannelFilter::~ClientChannelFilter() {
|
1315
|
-
|
1316
|
-
|
1317
|
-
}
|
1162
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1163
|
+
<< "chand=" << this << ": destroying channel";
|
1318
1164
|
DestroyResolverAndLbPolicyLocked();
|
1319
1165
|
// Stop backup polling.
|
1320
1166
|
grpc_client_channel_stop_backup_polling(interested_parties_);
|
1321
1167
|
grpc_pollset_set_destroy(interested_parties_);
|
1322
1168
|
}
|
1323
1169
|
|
1324
|
-
ArenaPromise<ServerMetadataHandle> ClientChannelFilter::MakeCallPromise(
|
1325
|
-
grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory) {
|
1326
|
-
auto* chand = static_cast<ClientChannelFilter*>(elem->channel_data);
|
1327
|
-
// TODO(roth): Is this the right lifetime story for calld?
|
1328
|
-
auto* calld = GetContext<Arena>()->ManagedNew<PromiseBasedCallData>(chand);
|
1329
|
-
return TrySeq(
|
1330
|
-
// Name resolution.
|
1331
|
-
calld->MakeNameResolutionPromise(std::move(call_args)),
|
1332
|
-
// Dynamic filter stack.
|
1333
|
-
[calld](CallArgs call_args) mutable {
|
1334
|
-
return calld->dynamic_filters()->channel_stack()->MakeClientCallPromise(
|
1335
|
-
std::move(call_args));
|
1336
|
-
});
|
1337
|
-
}
|
1338
|
-
|
1339
1170
|
OrphanablePtr<ClientChannelFilter::FilterBasedLoadBalancedCall>
|
1340
1171
|
ClientChannelFilter::CreateLoadBalancedCall(
|
1341
1172
|
const grpc_call_element_args& args, grpc_polling_entity* pollent,
|
@@ -1348,42 +1179,6 @@ ClientChannelFilter::CreateLoadBalancedCall(
|
|
1348
1179
|
std::move(on_commit), is_transparent_retry));
|
1349
1180
|
}
|
1350
1181
|
|
1351
|
-
ArenaPromise<ServerMetadataHandle>
|
1352
|
-
ClientChannelFilter::CreateLoadBalancedCallPromise(
|
1353
|
-
CallArgs call_args, absl::AnyInvocable<void()> on_commit,
|
1354
|
-
bool is_transparent_retry) {
|
1355
|
-
OrphanablePtr<PromiseBasedLoadBalancedCall> lb_call(
|
1356
|
-
GetContext<Arena>()->New<PromiseBasedLoadBalancedCall>(
|
1357
|
-
this, std::move(on_commit), is_transparent_retry));
|
1358
|
-
auto* call_ptr = lb_call.get();
|
1359
|
-
return call_ptr->MakeCallPromise(std::move(call_args), std::move(lb_call));
|
1360
|
-
}
|
1361
|
-
|
1362
|
-
ChannelArgs ClientChannelFilter::MakeSubchannelArgs(
|
1363
|
-
const ChannelArgs& channel_args, const ChannelArgs& address_args,
|
1364
|
-
const RefCountedPtr<SubchannelPoolInterface>& subchannel_pool,
|
1365
|
-
const std::string& channel_default_authority) {
|
1366
|
-
// Note that we start with the channel-level args and then apply the
|
1367
|
-
// per-address args, so that if a value is present in both, the one
|
1368
|
-
// in the channel-level args is used. This is particularly important
|
1369
|
-
// for the GRPC_ARG_DEFAULT_AUTHORITY arg, which we want to allow
|
1370
|
-
// resolvers to set on a per-address basis only if the application
|
1371
|
-
// did not explicitly set it at the channel level.
|
1372
|
-
return channel_args.UnionWith(address_args)
|
1373
|
-
.SetObject(subchannel_pool)
|
1374
|
-
// If we haven't already set the default authority arg (i.e., it
|
1375
|
-
// was not explicitly set by the application nor overridden by
|
1376
|
-
// the resolver), add it from the channel's default.
|
1377
|
-
.SetIfUnset(GRPC_ARG_DEFAULT_AUTHORITY, channel_default_authority)
|
1378
|
-
// Remove channel args that should not affect subchannel
|
1379
|
-
// uniqueness.
|
1380
|
-
.Remove(GRPC_ARG_HEALTH_CHECK_SERVICE_NAME)
|
1381
|
-
.Remove(GRPC_ARG_INHIBIT_HEALTH_CHECKING)
|
1382
|
-
.Remove(GRPC_ARG_CHANNELZ_CHANNEL_NODE)
|
1383
|
-
// Remove all keys with the no-subchannel prefix.
|
1384
|
-
.RemoveAllKeysWithPrefix(GRPC_ARG_NO_SUBCHANNEL_PREFIX);
|
1385
|
-
}
|
1386
|
-
|
1387
1182
|
void ClientChannelFilter::ReprocessQueuedResolverCalls() {
|
1388
1183
|
for (CallData* calld : resolver_queued_calls_) {
|
1389
1184
|
calld->RemoveCallFromResolverQueuedCallsLocked();
|
@@ -1457,9 +1252,8 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
1457
1252
|
Resolver::Result result) {
|
1458
1253
|
// Handle race conditions.
|
1459
1254
|
if (resolver_ == nullptr) return;
|
1460
|
-
|
1461
|
-
|
1462
|
-
}
|
1255
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1256
|
+
<< "chand=" << this << ": got resolver result";
|
1463
1257
|
// Grab resolver result health callback.
|
1464
1258
|
auto resolver_callback = std::move(result.result_health_callback);
|
1465
1259
|
absl::Status resolver_result_status;
|
@@ -1493,19 +1287,16 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
1493
1287
|
RefCountedPtr<ServiceConfig> service_config;
|
1494
1288
|
RefCountedPtr<ConfigSelector> config_selector;
|
1495
1289
|
if (!result.service_config.ok()) {
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
}
|
1290
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1291
|
+
<< "chand=" << this << ": resolver returned service config error: "
|
1292
|
+
<< result.service_config.status();
|
1500
1293
|
// If the service config was invalid, then fallback to the
|
1501
1294
|
// previously returned service config.
|
1502
1295
|
if (saved_service_config_ != nullptr) {
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
this);
|
1508
|
-
}
|
1296
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1297
|
+
<< "chand=" << this
|
1298
|
+
<< ": resolver returned invalid service config. "
|
1299
|
+
"Continuing to use previous service config.";
|
1509
1300
|
service_config = saved_service_config_;
|
1510
1301
|
config_selector = saved_config_selector_;
|
1511
1302
|
} else {
|
@@ -1519,12 +1310,10 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
1519
1310
|
}
|
1520
1311
|
} else if (*result.service_config == nullptr) {
|
1521
1312
|
// Resolver did not return any service config.
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
this);
|
1527
|
-
}
|
1313
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1314
|
+
<< "chand=" << this
|
1315
|
+
<< ": resolver returned no service config. Using default service "
|
1316
|
+
"config for channel.";
|
1528
1317
|
service_config = default_service_config_;
|
1529
1318
|
} else {
|
1530
1319
|
// Use ServiceConfig and ConfigSelector returned by resolver.
|
@@ -1556,8 +1345,9 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
1556
1345
|
UpdateServiceConfigInControlPlaneLocked(
|
1557
1346
|
std::move(service_config), std::move(config_selector),
|
1558
1347
|
std::string(lb_policy_config->name()));
|
1559
|
-
} else
|
1560
|
-
|
1348
|
+
} else {
|
1349
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1350
|
+
<< "chand=" << this << ": service config not changed";
|
1561
1351
|
}
|
1562
1352
|
// Create or update LB policy, as needed.
|
1563
1353
|
resolver_result_status = CreateOrUpdateLbPolicyLocked(
|
@@ -1591,10 +1381,8 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
1591
1381
|
|
1592
1382
|
void ClientChannelFilter::OnResolverErrorLocked(absl::Status status) {
|
1593
1383
|
if (resolver_ == nullptr) return;
|
1594
|
-
|
1595
|
-
|
1596
|
-
status.ToString().c_str());
|
1597
|
-
}
|
1384
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1385
|
+
<< "chand=" << this << ": resolver transient failure: " << status;
|
1598
1386
|
// If we already have an LB policy from a previous resolution
|
1599
1387
|
// result, then we continue to let it set the connectivity state.
|
1600
1388
|
// Otherwise, we go into TRANSIENT_FAILURE.
|
@@ -1640,10 +1428,8 @@ absl::Status ClientChannelFilter::CreateOrUpdateLbPolicyLocked(
|
|
1640
1428
|
lb_policy_ = CreateLbPolicyLocked(update_args.args);
|
1641
1429
|
}
|
1642
1430
|
// Update the policy.
|
1643
|
-
|
1644
|
-
|
1645
|
-
lb_policy_.get());
|
1646
|
-
}
|
1431
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1432
|
+
<< "chand=" << this << ": Updating child policy " << lb_policy_.get();
|
1647
1433
|
return lb_policy_->UpdateLocked(std::move(update_args));
|
1648
1434
|
}
|
1649
1435
|
|
@@ -1665,11 +1451,9 @@ OrphanablePtr<LoadBalancingPolicy> ClientChannelFilter::CreateLbPolicyLocked(
|
|
1665
1451
|
lb_policy_args.args = args;
|
1666
1452
|
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
1667
1453
|
MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
|
1668
|
-
&
|
1669
|
-
|
1670
|
-
|
1671
|
-
lb_policy.get());
|
1672
|
-
}
|
1454
|
+
&client_channel_trace);
|
1455
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1456
|
+
<< "chand=" << this << ": created new LB policy " << lb_policy.get();
|
1673
1457
|
grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
|
1674
1458
|
interested_parties_);
|
1675
1459
|
return lb_policy;
|
@@ -1679,10 +1463,9 @@ void ClientChannelFilter::UpdateServiceConfigInControlPlaneLocked(
|
|
1679
1463
|
RefCountedPtr<ServiceConfig> service_config,
|
1680
1464
|
RefCountedPtr<ConfigSelector> config_selector, std::string lb_policy_name) {
|
1681
1465
|
std::string service_config_json(service_config->json_string());
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
}
|
1466
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1467
|
+
<< "chand=" << this << ": using service config: \"" << service_config_json
|
1468
|
+
<< "\"";
|
1686
1469
|
// Save service config.
|
1687
1470
|
saved_service_config_ = std::move(service_config);
|
1688
1471
|
// Swap out the data used by GetChannelInfo().
|
@@ -1693,10 +1476,9 @@ void ClientChannelFilter::UpdateServiceConfigInControlPlaneLocked(
|
|
1693
1476
|
}
|
1694
1477
|
// Save config selector.
|
1695
1478
|
saved_config_selector_ = std::move(config_selector);
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
}
|
1479
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1480
|
+
<< "chand=" << this << ": using ConfigSelector "
|
1481
|
+
<< saved_config_selector_.get();
|
1700
1482
|
}
|
1701
1483
|
|
1702
1484
|
void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked() {
|
@@ -1704,10 +1486,9 @@ void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked() {
|
|
1704
1486
|
RefCountedPtr<ServiceConfig> service_config = saved_service_config_;
|
1705
1487
|
// Grab ref to config selector. Use default if resolver didn't supply one.
|
1706
1488
|
RefCountedPtr<ConfigSelector> config_selector = saved_config_selector_;
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
}
|
1489
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1490
|
+
<< "chand=" << this << ": switching to ConfigSelector "
|
1491
|
+
<< saved_config_selector_.get();
|
1711
1492
|
if (config_selector == nullptr) {
|
1712
1493
|
config_selector =
|
1713
1494
|
MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
|
@@ -1749,10 +1530,9 @@ void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked() {
|
|
1749
1530
|
}
|
1750
1531
|
|
1751
1532
|
void ClientChannelFilter::CreateResolverLocked() {
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
}
|
1533
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1534
|
+
<< "chand=" << this << ": starting name resolution for "
|
1535
|
+
<< uri_to_resolve_;
|
1756
1536
|
resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
|
1757
1537
|
uri_to_resolve_, channel_args_, interested_parties_, work_serializer_,
|
1758
1538
|
std::make_unique<ResolverResultHandler>(this));
|
@@ -1762,17 +1542,14 @@ void ClientChannelFilter::CreateResolverLocked() {
|
|
1762
1542
|
UpdateStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status(),
|
1763
1543
|
"started resolving");
|
1764
1544
|
resolver_->StartLocked();
|
1765
|
-
|
1766
|
-
|
1767
|
-
}
|
1545
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1546
|
+
<< "chand=" << this << ": created resolver=" << resolver_.get();
|
1768
1547
|
}
|
1769
1548
|
|
1770
1549
|
void ClientChannelFilter::DestroyResolverAndLbPolicyLocked() {
|
1771
1550
|
if (resolver_ != nullptr) {
|
1772
|
-
|
1773
|
-
|
1774
|
-
resolver_.get());
|
1775
|
-
}
|
1551
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1552
|
+
<< "chand=" << this << ": shutting down resolver=" << resolver_.get();
|
1776
1553
|
resolver_.reset();
|
1777
1554
|
// Clear resolution state.
|
1778
1555
|
saved_service_config_.reset();
|
@@ -1792,10 +1569,9 @@ void ClientChannelFilter::DestroyResolverAndLbPolicyLocked() {
|
|
1792
1569
|
}
|
1793
1570
|
// Clear LB policy if set.
|
1794
1571
|
if (lb_policy_ != nullptr) {
|
1795
|
-
|
1796
|
-
|
1797
|
-
|
1798
|
-
}
|
1572
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1573
|
+
<< "chand=" << this
|
1574
|
+
<< ": shutting down lb_policy=" << lb_policy_.get();
|
1799
1575
|
grpc_pollset_set_del_pollset_set(lb_policy_->interested_parties(),
|
1800
1576
|
interested_parties_);
|
1801
1577
|
lb_policy_.reset();
|
@@ -1941,10 +1717,9 @@ void ClientChannelFilter::StartTransportOpLocked(grpc_transport_op* op) {
|
|
1941
1717
|
}
|
1942
1718
|
// Disconnect or enter IDLE.
|
1943
1719
|
if (!op->disconnect_with_error.ok()) {
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
1947
|
-
}
|
1720
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
1721
|
+
<< "chand=" << this << ": disconnect_with_error: "
|
1722
|
+
<< StatusToString(op->disconnect_with_error);
|
1948
1723
|
DestroyResolverAndLbPolicyLocked();
|
1949
1724
|
intptr_t value;
|
1950
1725
|
if (grpc_error_get_int(op->disconnect_with_error,
|
@@ -2049,11 +1824,9 @@ void ClientChannelFilter::RemoveConnectivityWatcher(
|
|
2049
1824
|
//
|
2050
1825
|
|
2051
1826
|
void ClientChannelFilter::CallData::RemoveCallFromResolverQueuedCallsLocked() {
|
2052
|
-
|
2053
|
-
|
2054
|
-
|
2055
|
-
chand(), this);
|
2056
|
-
}
|
1827
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1828
|
+
<< "chand=" << chand() << " calld=" << this
|
1829
|
+
<< ": removing from resolver queued picks list";
|
2057
1830
|
// Remove call's pollent from channel's interested_parties.
|
2058
1831
|
grpc_polling_entity_del_from_pollset_set(pollent(),
|
2059
1832
|
chand()->interested_parties_);
|
@@ -2064,12 +1837,10 @@ void ClientChannelFilter::CallData::RemoveCallFromResolverQueuedCallsLocked() {
|
|
2064
1837
|
}
|
2065
1838
|
|
2066
1839
|
void ClientChannelFilter::CallData::AddCallToResolverQueuedCallsLocked() {
|
2067
|
-
|
2068
|
-
|
2069
|
-
|
2070
|
-
|
2071
|
-
chand(), this, grpc_polling_entity_string(pollent()).c_str());
|
2072
|
-
}
|
1840
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1841
|
+
<< "chand=" << chand() << " calld=" << this
|
1842
|
+
<< ": adding to resolver queued picks list; pollent="
|
1843
|
+
<< grpc_polling_entity_string(pollent());
|
2073
1844
|
// Add call's pollent to channel's interested_parties, so that I/O
|
2074
1845
|
// can be done under the call's CQ.
|
2075
1846
|
grpc_polling_entity_add_to_pollset_set(pollent(),
|
@@ -2081,10 +1852,9 @@ void ClientChannelFilter::CallData::AddCallToResolverQueuedCallsLocked() {
|
|
2081
1852
|
|
2082
1853
|
grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked(
|
2083
1854
|
const absl::StatusOr<RefCountedPtr<ConfigSelector>>& config_selector) {
|
2084
|
-
|
2085
|
-
|
2086
|
-
|
2087
|
-
}
|
1855
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1856
|
+
<< "chand=" << chand() << " calld=" << this
|
1857
|
+
<< ": applying service config to call";
|
2088
1858
|
if (!config_selector.ok()) return config_selector.status();
|
2089
1859
|
// Create a ClientChannelServiceConfigCallData for the call. This stores
|
2090
1860
|
// a ref to the ServiceConfig and caches the right set of parsed configs
|
@@ -2092,7 +1862,7 @@ grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked(
|
|
2092
1862
|
// itself in the call context, so that it can be accessed by filters
|
2093
1863
|
// below us in the stack, and it will be cleaned up when the call ends.
|
2094
1864
|
auto* service_config_call_data =
|
2095
|
-
arena()->New<ClientChannelServiceConfigCallData>(arena()
|
1865
|
+
arena()->New<ClientChannelServiceConfigCallData>(arena());
|
2096
1866
|
// Use the ConfigSelector to determine the config for the call.
|
2097
1867
|
absl::Status call_config_status =
|
2098
1868
|
(*config_selector)
|
@@ -2149,17 +1919,14 @@ absl::optional<absl::Status> ClientChannelFilter::CallData::CheckResolution(
|
|
2149
1919
|
}
|
2150
1920
|
// Handle errors.
|
2151
1921
|
if (!error.ok()) {
|
2152
|
-
|
2153
|
-
|
2154
|
-
|
2155
|
-
chand(), this, StatusToString(error).c_str());
|
2156
|
-
}
|
1922
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1923
|
+
<< "chand=" << chand() << " calld=" << this
|
1924
|
+
<< ": error applying config to call: error=" << StatusToString(error);
|
2157
1925
|
return error;
|
2158
1926
|
}
|
2159
1927
|
// If the call was queued, add trace annotation.
|
2160
1928
|
if (was_queued) {
|
2161
|
-
auto* call_tracer =
|
2162
|
-
call_context()[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
|
1929
|
+
auto* call_tracer = arena()->GetContext<CallTracerAnnotationInterface>();
|
2163
1930
|
if (call_tracer != nullptr) {
|
2164
1931
|
call_tracer->RecordAnnotation("Delayed name resolution complete.");
|
2165
1932
|
}
|
@@ -2177,20 +1944,18 @@ bool ClientChannelFilter::CallData::CheckResolutionLocked(
|
|
2177
1944
|
absl::Status resolver_error = chand()->resolver_transient_failure_error_;
|
2178
1945
|
if (!resolver_error.ok() &&
|
2179
1946
|
!send_initial_metadata()->GetOrCreatePointer(WaitForReady())->value) {
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2183
|
-
}
|
1947
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1948
|
+
<< "chand=" << chand() << " calld=" << this
|
1949
|
+
<< ": resolution failed, failing call";
|
2184
1950
|
*config_selector = absl_status_to_grpc_error(resolver_error);
|
2185
1951
|
return true;
|
2186
1952
|
}
|
2187
1953
|
// Either the resolver has not yet returned a result, or it has
|
2188
1954
|
// returned transient failure but the call is wait_for_ready. In
|
2189
1955
|
// either case, queue the call.
|
2190
|
-
|
2191
|
-
|
2192
|
-
|
2193
|
-
}
|
1956
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1957
|
+
<< "chand=" << chand() << " calld=" << this
|
1958
|
+
<< ": no resolver result yet";
|
2194
1959
|
return false;
|
2195
1960
|
}
|
2196
1961
|
// Result found.
|
@@ -2206,16 +1971,14 @@ bool ClientChannelFilter::CallData::CheckResolutionLocked(
|
|
2206
1971
|
ClientChannelFilter::FilterBasedCallData::FilterBasedCallData(
|
2207
1972
|
grpc_call_element* elem, const grpc_call_element_args& args)
|
2208
1973
|
: path_(CSliceRef(args.path)),
|
2209
|
-
call_context_(args.context),
|
2210
1974
|
call_start_time_(args.start_time),
|
2211
1975
|
deadline_(args.deadline),
|
2212
1976
|
arena_(args.arena),
|
2213
1977
|
elem_(elem),
|
2214
1978
|
owning_call_(args.call_stack),
|
2215
1979
|
call_combiner_(args.call_combiner) {
|
2216
|
-
|
2217
|
-
|
2218
|
-
}
|
1980
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
1981
|
+
<< "chand=" << chand() << " calld=" << this << ": created call";
|
2219
1982
|
}
|
2220
1983
|
|
2221
1984
|
ClientChannelFilter::FilterBasedCallData::~FilterBasedCallData() {
|
@@ -2251,8 +2014,8 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2251
2014
|
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
2252
2015
|
auto* calld = static_cast<FilterBasedCallData*>(elem->call_data);
|
2253
2016
|
auto* chand = static_cast<ClientChannelFilter*>(elem->channel_data);
|
2254
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
2255
|
-
!GRPC_TRACE_FLAG_ENABLED(
|
2017
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call) &&
|
2018
|
+
!GRPC_TRACE_FLAG_ENABLED(channel)) {
|
2256
2019
|
gpr_log(GPR_INFO, "chand=%p calld=%p: batch started from above: %s", chand,
|
2257
2020
|
calld, grpc_transport_stream_op_batch_string(batch, false).c_str());
|
2258
2021
|
}
|
@@ -2271,10 +2034,9 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2271
2034
|
// Note that once we have done so, we do not need to acquire the channel's
|
2272
2035
|
// resolution mutex, which is more efficient (especially for streaming calls).
|
2273
2036
|
if (calld->dynamic_call_ != nullptr) {
|
2274
|
-
|
2275
|
-
|
2276
|
-
|
2277
|
-
}
|
2037
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2038
|
+
<< "chand=" << chand << " calld=" << calld
|
2039
|
+
<< ": starting batch on dynamic_call=" << calld->dynamic_call_.get();
|
2278
2040
|
calld->dynamic_call_->StartTransportStreamOpBatch(batch);
|
2279
2041
|
return;
|
2280
2042
|
}
|
@@ -2282,10 +2044,10 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2282
2044
|
//
|
2283
2045
|
// If we've previously been cancelled, immediately fail any new batches.
|
2284
2046
|
if (GPR_UNLIKELY(!calld->cancel_error_.ok())) {
|
2285
|
-
|
2286
|
-
|
2287
|
-
|
2288
|
-
|
2047
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2048
|
+
<< "chand=" << chand << " calld=" << calld
|
2049
|
+
<< ": failing batch with error: "
|
2050
|
+
<< StatusToString(calld->cancel_error_);
|
2289
2051
|
// Note: This will release the call combiner.
|
2290
2052
|
grpc_transport_stream_op_batch_finish_with_failure(
|
2291
2053
|
batch, calld->cancel_error_, calld->call_combiner());
|
@@ -2299,10 +2061,9 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2299
2061
|
// is in the past when the call starts), we can return the right
|
2300
2062
|
// error to the caller when the first batch does get passed down.
|
2301
2063
|
calld->cancel_error_ = batch->payload->cancel_stream.cancel_error;
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2305
|
-
}
|
2064
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2065
|
+
<< "chand=" << chand << " calld=" << calld
|
2066
|
+
<< ": recording cancel_error=" << StatusToString(calld->cancel_error_);
|
2306
2067
|
// Fail all pending batches.
|
2307
2068
|
calld->PendingBatchesFail(calld->cancel_error_, NoYieldCallCombiner);
|
2308
2069
|
// Note: This will release the call combiner.
|
@@ -2316,19 +2077,15 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2316
2077
|
// channel's resolution mutex to apply the service config to the call,
|
2317
2078
|
// after which we will create a dynamic call.
|
2318
2079
|
if (GPR_LIKELY(batch->send_initial_metadata)) {
|
2319
|
-
|
2320
|
-
|
2321
|
-
|
2322
|
-
"config",
|
2323
|
-
chand, calld);
|
2324
|
-
}
|
2080
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2081
|
+
<< "chand=" << chand << " calld=" << calld
|
2082
|
+
<< ": grabbing resolution mutex to apply service ";
|
2325
2083
|
// If we're still in IDLE, we need to start resolving.
|
2326
2084
|
if (GPR_UNLIKELY(chand->CheckConnectivityState(false) ==
|
2327
2085
|
GRPC_CHANNEL_IDLE)) {
|
2328
|
-
|
2329
|
-
|
2330
|
-
|
2331
|
-
}
|
2086
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2087
|
+
<< "chand=" << chand << " calld=" << calld
|
2088
|
+
<< ": triggering exit idle";
|
2332
2089
|
// Bounce into the control plane work serializer to start resolving.
|
2333
2090
|
GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "ExitIdle");
|
2334
2091
|
chand->work_serializer_->Run(
|
@@ -2341,11 +2098,9 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
2341
2098
|
calld->TryCheckResolution(/*was_queued=*/false);
|
2342
2099
|
} else {
|
2343
2100
|
// For all other batches, release the call combiner.
|
2344
|
-
|
2345
|
-
|
2346
|
-
|
2347
|
-
calld);
|
2348
|
-
}
|
2101
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2102
|
+
<< "chand=" << chand << " calld=" << calld
|
2103
|
+
<< ": saved batch, yielding call combiner";
|
2349
2104
|
GRPC_CALL_COMBINER_STOP(calld->call_combiner(),
|
2350
2105
|
"batch does not include send_initial_metadata");
|
2351
2106
|
}
|
@@ -2374,11 +2129,9 @@ size_t ClientChannelFilter::FilterBasedCallData::GetBatchIndex(
|
|
2374
2129
|
void ClientChannelFilter::FilterBasedCallData::PendingBatchesAdd(
|
2375
2130
|
grpc_transport_stream_op_batch* batch) {
|
2376
2131
|
const size_t idx = GetBatchIndex(batch);
|
2377
|
-
|
2378
|
-
|
2379
|
-
|
2380
|
-
chand(), this, idx);
|
2381
|
-
}
|
2132
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2133
|
+
<< "chand=" << chand() << " calld=" << this
|
2134
|
+
<< ": adding pending batch at index " << idx;
|
2382
2135
|
grpc_transport_stream_op_batch*& pending = pending_batches_[idx];
|
2383
2136
|
CHECK_EQ(pending, nullptr);
|
2384
2137
|
pending = batch;
|
@@ -2401,7 +2154,7 @@ void ClientChannelFilter::FilterBasedCallData::PendingBatchesFail(
|
|
2401
2154
|
grpc_error_handle error,
|
2402
2155
|
YieldCallCombinerPredicate yield_call_combiner_predicate) {
|
2403
2156
|
CHECK(!error.ok());
|
2404
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
2157
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call)) {
|
2405
2158
|
size_t num_batches = 0;
|
2406
2159
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
2407
2160
|
if (pending_batches_[i] != nullptr) ++num_batches;
|
@@ -2444,7 +2197,7 @@ void ClientChannelFilter::FilterBasedCallData::ResumePendingBatchInCallCombiner(
|
|
2444
2197
|
// This is called via the call combiner, so access to calld is synchronized.
|
2445
2198
|
void ClientChannelFilter::FilterBasedCallData::PendingBatchesResume() {
|
2446
2199
|
// Retries not enabled; send down batches as-is.
|
2447
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
2200
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call)) {
|
2448
2201
|
size_t num_batches = 0;
|
2449
2202
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
2450
2203
|
if (pending_batches_[i] != nullptr) ++num_batches;
|
@@ -2490,13 +2243,13 @@ class ClientChannelFilter::FilterBasedCallData::ResolverQueuedCallCanceller
|
|
2490
2243
|
auto* chand = calld->chand();
|
2491
2244
|
{
|
2492
2245
|
MutexLock lock(&chand->resolution_mu_);
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
|
2498
|
-
|
2499
|
-
|
2246
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2247
|
+
<< "chand=" << chand << " calld=" << calld
|
2248
|
+
<< ": cancelling resolver queued pick: "
|
2249
|
+
"error="
|
2250
|
+
<< StatusToString(error) << " self=" << self
|
2251
|
+
<< " calld->resolver_pick_canceller="
|
2252
|
+
<< calld->resolver_call_canceller_;
|
2500
2253
|
if (calld->resolver_call_canceller_ == self && !error.ok()) {
|
2501
2254
|
// Remove pick from list of queued picks.
|
2502
2255
|
calld->RemoveCallFromResolverQueuedCallsLocked();
|
@@ -2544,24 +2297,19 @@ void ClientChannelFilter::FilterBasedCallData::RetryCheckResolutionLocked() {
|
|
2544
2297
|
}
|
2545
2298
|
|
2546
2299
|
void ClientChannelFilter::FilterBasedCallData::CreateDynamicCall() {
|
2547
|
-
DynamicFilters::Call::Args args = {dynamic_filters(), pollent_,
|
2548
|
-
call_start_time_, deadline_,
|
2549
|
-
|
2300
|
+
DynamicFilters::Call::Args args = {dynamic_filters(), pollent_, path_,
|
2301
|
+
call_start_time_, deadline_, arena(),
|
2302
|
+
call_combiner()};
|
2550
2303
|
grpc_error_handle error;
|
2551
2304
|
DynamicFilters* channel_stack = args.channel_stack.get();
|
2552
|
-
|
2553
|
-
|
2554
|
-
|
2555
|
-
"chand=%p calld=%p: creating dynamic call stack on channel_stack=%p",
|
2556
|
-
chand(), this, channel_stack);
|
2557
|
-
}
|
2305
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2306
|
+
<< "chand=" << chand() << " calld=" << this
|
2307
|
+
<< ": creating dynamic call stack on channel_stack=" << channel_stack;
|
2558
2308
|
dynamic_call_ = channel_stack->CreateCall(std::move(args), &error);
|
2559
2309
|
if (!error.ok()) {
|
2560
|
-
|
2561
|
-
|
2562
|
-
|
2563
|
-
chand(), this, StatusToString(error).c_str());
|
2564
|
-
}
|
2310
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2311
|
+
<< "chand=" << chand() << " calld=" << this
|
2312
|
+
<< ": failed to create dynamic call: error=" << StatusToString(error);
|
2565
2313
|
PendingBatchesFail(error, YieldCallCombiner);
|
2566
2314
|
return;
|
2567
2315
|
}
|
@@ -2573,15 +2321,11 @@ void ClientChannelFilter::FilterBasedCallData::
|
|
2573
2321
|
void* arg, grpc_error_handle error) {
|
2574
2322
|
auto* calld = static_cast<FilterBasedCallData*>(arg);
|
2575
2323
|
auto* chand = calld->chand();
|
2576
|
-
auto* service_config_call_data =
|
2577
|
-
|
2578
|
-
|
2579
|
-
|
2580
|
-
|
2581
|
-
"service_config_call_data=%p",
|
2582
|
-
chand, calld, StatusToString(error).c_str(),
|
2583
|
-
service_config_call_data);
|
2584
|
-
}
|
2324
|
+
auto* service_config_call_data = GetServiceConfigCallData(calld->arena());
|
2325
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
2326
|
+
<< "chand=" << chand << " calld=" << calld
|
2327
|
+
<< ": got recv_trailing_metadata_ready: error=" << StatusToString(error)
|
2328
|
+
<< " service_config_call_data=" << service_config_call_data;
|
2585
2329
|
if (service_config_call_data != nullptr) {
|
2586
2330
|
service_config_call_data->Commit();
|
2587
2331
|
}
|
@@ -2599,7 +2343,7 @@ class ClientChannelFilter::LoadBalancedCall::LbCallState final
|
|
2599
2343
|
public:
|
2600
2344
|
explicit LbCallState(LoadBalancedCall* lb_call) : lb_call_(lb_call) {}
|
2601
2345
|
|
2602
|
-
void* Alloc(size_t size) override { return lb_call_->
|
2346
|
+
void* Alloc(size_t size) override { return lb_call_->arena_->Alloc(size); }
|
2603
2347
|
|
2604
2348
|
// Internal API to allow first-party LB policies to access per-call
|
2605
2349
|
// attributes set by the ConfigSelector.
|
@@ -2694,8 +2438,7 @@ class ClientChannelFilter::LoadBalancedCall::Metadata final
|
|
2694
2438
|
ServiceConfigCallData::CallAttributeInterface*
|
2695
2439
|
ClientChannelFilter::LoadBalancedCall::LbCallState::GetCallAttribute(
|
2696
2440
|
UniqueTypeName type) const {
|
2697
|
-
auto* service_config_call_data =
|
2698
|
-
GetServiceConfigCallData(lb_call_->call_context_);
|
2441
|
+
auto* service_config_call_data = GetServiceConfigCallData(lb_call_->arena_);
|
2699
2442
|
return service_config_call_data->GetCallAttribute(type);
|
2700
2443
|
}
|
2701
2444
|
|
@@ -2721,7 +2464,7 @@ class ClientChannelFilter::LoadBalancedCall::BackendMetricAccessor final
|
|
2721
2464
|
recv_trailing_metadata_ != nullptr) {
|
2722
2465
|
if (const auto* md = recv_trailing_metadata_->get_pointer(
|
2723
2466
|
EndpointLoadMetricsBinMetadata())) {
|
2724
|
-
BackendMetricAllocator allocator(lb_call_->
|
2467
|
+
BackendMetricAllocator allocator(lb_call_->arena_);
|
2725
2468
|
lb_call_->backend_metric_data_ =
|
2726
2469
|
ParseBackendMetricData(md->as_string_view(), &allocator);
|
2727
2470
|
}
|
@@ -2756,31 +2499,28 @@ class ClientChannelFilter::LoadBalancedCall::BackendMetricAccessor final
|
|
2756
2499
|
|
2757
2500
|
namespace {
|
2758
2501
|
|
2759
|
-
void CreateCallAttemptTracer(
|
2760
|
-
|
2761
|
-
|
2762
|
-
context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
|
2502
|
+
void CreateCallAttemptTracer(Arena* arena, bool is_transparent_retry) {
|
2503
|
+
auto* call_tracer = DownCast<ClientCallTracer*>(
|
2504
|
+
arena->GetContext<CallTracerAnnotationInterface>());
|
2763
2505
|
if (call_tracer == nullptr) return;
|
2764
2506
|
auto* tracer = call_tracer->StartNewAttempt(is_transparent_retry);
|
2765
|
-
|
2507
|
+
arena->SetContext<CallTracerInterface>(tracer);
|
2766
2508
|
}
|
2767
2509
|
|
2768
2510
|
} // namespace
|
2769
2511
|
|
2770
2512
|
ClientChannelFilter::LoadBalancedCall::LoadBalancedCall(
|
2771
|
-
ClientChannelFilter* chand,
|
2513
|
+
ClientChannelFilter* chand, Arena* arena,
|
2772
2514
|
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
|
2773
|
-
: InternallyRefCounted(
|
2774
|
-
|
2775
|
-
|
2776
|
-
: nullptr),
|
2515
|
+
: InternallyRefCounted(GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)
|
2516
|
+
? "LoadBalancedCall"
|
2517
|
+
: nullptr),
|
2777
2518
|
chand_(chand),
|
2778
2519
|
on_commit_(std::move(on_commit)),
|
2779
|
-
|
2780
|
-
CreateCallAttemptTracer(
|
2781
|
-
|
2782
|
-
|
2783
|
-
}
|
2520
|
+
arena_(arena) {
|
2521
|
+
CreateCallAttemptTracer(arena, is_transparent_retry);
|
2522
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2523
|
+
<< "chand=" << chand_ << " lb_call=" << this << ": created";
|
2784
2524
|
}
|
2785
2525
|
|
2786
2526
|
ClientChannelFilter::LoadBalancedCall::~LoadBalancedCall() {
|
@@ -2821,10 +2561,9 @@ void ClientChannelFilter::LoadBalancedCall::RecordLatency() {
|
|
2821
2561
|
|
2822
2562
|
void ClientChannelFilter::LoadBalancedCall::
|
2823
2563
|
RemoveCallFromLbQueuedCallsLocked() {
|
2824
|
-
|
2825
|
-
|
2826
|
-
|
2827
|
-
}
|
2564
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2565
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2566
|
+
<< ": removing from queued picks list";
|
2828
2567
|
// Remove pollset_set linkage.
|
2829
2568
|
grpc_polling_entity_del_from_pollset_set(pollent(),
|
2830
2569
|
chand_->interested_parties_);
|
@@ -2835,10 +2574,9 @@ void ClientChannelFilter::LoadBalancedCall::
|
|
2835
2574
|
}
|
2836
2575
|
|
2837
2576
|
void ClientChannelFilter::LoadBalancedCall::AddCallToLbQueuedCallsLocked() {
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
}
|
2577
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2578
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2579
|
+
<< ": adding to queued picks list";
|
2842
2580
|
// Add call's pollent to channel's interested_parties, so that I/O
|
2843
2581
|
// can be done under the call's CQ.
|
2844
2582
|
grpc_polling_entity_add_to_pollset_set(pollent(),
|
@@ -2880,10 +2618,9 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
2880
2618
|
};
|
2881
2619
|
}
|
2882
2620
|
// Grab mutex and take a ref to the picker.
|
2883
|
-
|
2884
|
-
|
2885
|
-
|
2886
|
-
}
|
2621
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2622
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2623
|
+
<< ": grabbing LB mutex to get picker";
|
2887
2624
|
RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker;
|
2888
2625
|
{
|
2889
2626
|
MutexLock lock(&chand_->lb_mu_);
|
@@ -2893,17 +2630,15 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
2893
2630
|
// TODO(roth): Fix race condition in channel_idle filter and any
|
2894
2631
|
// other possible causes of this.
|
2895
2632
|
if (pickers.back() == nullptr) {
|
2896
|
-
|
2897
|
-
|
2898
|
-
|
2899
|
-
}
|
2633
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2634
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2635
|
+
<< ": picker is null, failing call";
|
2900
2636
|
return absl::InternalError("picker is null -- shouldn't happen");
|
2901
2637
|
}
|
2902
2638
|
// Do pick.
|
2903
|
-
|
2904
|
-
|
2905
|
-
|
2906
|
-
}
|
2639
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2640
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2641
|
+
<< ": performing pick with picker=" << pickers.back().get();
|
2907
2642
|
grpc_error_handle error;
|
2908
2643
|
bool pick_complete = PickSubchannelImpl(pickers.back().get(), &error);
|
2909
2644
|
if (!pick_complete) {
|
@@ -2911,11 +2646,9 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
2911
2646
|
MutexLock lock(&chand_->lb_mu_);
|
2912
2647
|
// If picker has been swapped out since we grabbed it, try again.
|
2913
2648
|
if (pickers.back() != chand_->picker_) {
|
2914
|
-
|
2915
|
-
|
2916
|
-
|
2917
|
-
chand_, this);
|
2918
|
-
}
|
2649
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2650
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2651
|
+
<< ": pick not complete, but picker changed";
|
2919
2652
|
if (IsWorkSerializerDispatchEnabled()) {
|
2920
2653
|
// Don't unref until after we release the mutex.
|
2921
2654
|
old_picker = std::move(pickers.back());
|
@@ -2934,11 +2667,9 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
2934
2667
|
}
|
2935
2668
|
// If the pick failed, fail the call.
|
2936
2669
|
if (!error.ok()) {
|
2937
|
-
|
2938
|
-
|
2939
|
-
|
2940
|
-
chand_, this, StatusToString(error).c_str());
|
2941
|
-
}
|
2670
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2671
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2672
|
+
<< ": failed to pick subchannel: error=" << StatusToString(error);
|
2942
2673
|
return error;
|
2943
2674
|
}
|
2944
2675
|
// Pick succeeded.
|
@@ -2964,11 +2695,10 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
2964
2695
|
&result,
|
2965
2696
|
// CompletePick
|
2966
2697
|
[this](LoadBalancingPolicy::PickResult::Complete* complete_pick) {
|
2967
|
-
|
2968
|
-
|
2969
|
-
|
2970
|
-
|
2971
|
-
}
|
2698
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2699
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2700
|
+
<< ": LB pick succeeded: subchannel="
|
2701
|
+
<< complete_pick->subchannel.get();
|
2972
2702
|
CHECK(complete_pick->subchannel != nullptr);
|
2973
2703
|
// Grab a ref to the connected subchannel while we're still
|
2974
2704
|
// holding the data plane mutex.
|
@@ -2980,12 +2710,10 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
2980
2710
|
// yet seen that change and given us a new picker), then just
|
2981
2711
|
// queue the pick. We'll try again as soon as we get a new picker.
|
2982
2712
|
if (connected_subchannel_ == nullptr) {
|
2983
|
-
|
2984
|
-
|
2985
|
-
|
2986
|
-
|
2987
|
-
chand_, this);
|
2988
|
-
}
|
2713
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2714
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2715
|
+
<< ": subchannel returned by LB picker "
|
2716
|
+
"has no connected subchannel; queueing pick";
|
2989
2717
|
return false;
|
2990
2718
|
}
|
2991
2719
|
lb_subchannel_call_tracker_ =
|
@@ -2997,18 +2725,15 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
2997
2725
|
},
|
2998
2726
|
// QueuePick
|
2999
2727
|
[this](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/) {
|
3000
|
-
|
3001
|
-
|
3002
|
-
this);
|
3003
|
-
}
|
2728
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2729
|
+
<< "chand=" << chand_ << " lb_call=" << this << ": LB pick queued";
|
3004
2730
|
return false;
|
3005
2731
|
},
|
3006
2732
|
// FailPick
|
3007
2733
|
[this, &error](LoadBalancingPolicy::PickResult::Fail* fail_pick) {
|
3008
|
-
|
3009
|
-
|
3010
|
-
|
3011
|
-
}
|
2734
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2735
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2736
|
+
<< ": LB pick failed: " << fail_pick->status;
|
3012
2737
|
// If wait_for_ready is false, then the error indicates the RPC
|
3013
2738
|
// attempt's final status.
|
3014
2739
|
if (!send_initial_metadata()
|
@@ -3024,10 +2749,9 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
3024
2749
|
},
|
3025
2750
|
// DropPick
|
3026
2751
|
[this, &error](LoadBalancingPolicy::PickResult::Drop* drop_pick) {
|
3027
|
-
|
3028
|
-
|
3029
|
-
|
3030
|
-
}
|
2752
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2753
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
2754
|
+
<< ": LB pick dropped: " << drop_pick->status;
|
3031
2755
|
*error = grpc_error_set_int(
|
3032
2756
|
absl_status_to_grpc_error(MaybeRewriteIllegalStatusCode(
|
3033
2757
|
std::move(drop_pick->status), "LB drop")),
|
@@ -3044,9 +2768,8 @@ ClientChannelFilter::FilterBasedLoadBalancedCall::FilterBasedLoadBalancedCall(
|
|
3044
2768
|
ClientChannelFilter* chand, const grpc_call_element_args& args,
|
3045
2769
|
grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
|
3046
2770
|
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
|
3047
|
-
: LoadBalancedCall(chand, args.
|
2771
|
+
: LoadBalancedCall(chand, args.arena, std::move(on_commit),
|
3048
2772
|
is_transparent_retry),
|
3049
|
-
arena_(args.arena),
|
3050
2773
|
owning_call_(args.call_stack),
|
3051
2774
|
call_combiner_(args.call_combiner),
|
3052
2775
|
pollent_(pollent),
|
@@ -3094,11 +2817,9 @@ size_t ClientChannelFilter::FilterBasedLoadBalancedCall::GetBatchIndex(
|
|
3094
2817
|
void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesAdd(
|
3095
2818
|
grpc_transport_stream_op_batch* batch) {
|
3096
2819
|
const size_t idx = GetBatchIndex(batch);
|
3097
|
-
|
3098
|
-
|
3099
|
-
|
3100
|
-
chand(), this, idx);
|
3101
|
-
}
|
2820
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2821
|
+
<< "chand=" << chand() << " lb_call=" << this
|
2822
|
+
<< ": adding pending batch at index " << idx;
|
3102
2823
|
CHECK_EQ(pending_batches_[idx], nullptr);
|
3103
2824
|
pending_batches_[idx] = batch;
|
3104
2825
|
}
|
@@ -3121,7 +2842,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesFail(
|
|
3121
2842
|
YieldCallCombinerPredicate yield_call_combiner_predicate) {
|
3122
2843
|
CHECK(!error.ok());
|
3123
2844
|
failure_error_ = error;
|
3124
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
2845
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)) {
|
3125
2846
|
size_t num_batches = 0;
|
3126
2847
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
3127
2848
|
if (pending_batches_[i] != nullptr) ++num_batches;
|
@@ -3163,7 +2884,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3163
2884
|
|
3164
2885
|
// This is called via the call combiner, so access to calld is synchronized.
|
3165
2886
|
void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesResume() {
|
3166
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
2887
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)) {
|
3167
2888
|
size_t num_batches = 0;
|
3168
2889
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
3169
2890
|
if (pending_batches_[i] != nullptr) ++num_batches;
|
@@ -3192,8 +2913,8 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesResume() {
|
|
3192
2913
|
|
3193
2914
|
void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
3194
2915
|
StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch) {
|
3195
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
3196
|
-
GRPC_TRACE_FLAG_ENABLED(
|
2916
|
+
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call) ||
|
2917
|
+
GRPC_TRACE_FLAG_ENABLED(channel)) {
|
3197
2918
|
gpr_log(GPR_INFO,
|
3198
2919
|
"chand=%p lb_call=%p: batch started from above: %s, "
|
3199
2920
|
"call_attempt_tracer()=%p",
|
@@ -3247,11 +2968,9 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3247
2968
|
// the channel's data plane mutex, which is more efficient (especially for
|
3248
2969
|
// streaming calls).
|
3249
2970
|
if (subchannel_call_ != nullptr) {
|
3250
|
-
|
3251
|
-
|
3252
|
-
|
3253
|
-
chand(), this, subchannel_call_.get());
|
3254
|
-
}
|
2971
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2972
|
+
<< "chand=" << chand() << " lb_call=" << this
|
2973
|
+
<< ": starting batch on subchannel_call=" << subchannel_call_.get();
|
3255
2974
|
subchannel_call_->StartTransportStreamOpBatch(batch);
|
3256
2975
|
return;
|
3257
2976
|
}
|
@@ -3259,10 +2978,9 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3259
2978
|
//
|
3260
2979
|
// If we've previously been cancelled, immediately fail any new batches.
|
3261
2980
|
if (GPR_UNLIKELY(!cancel_error_.ok())) {
|
3262
|
-
|
3263
|
-
|
3264
|
-
|
3265
|
-
}
|
2981
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2982
|
+
<< "chand=" << chand() << " lb_call=" << this
|
2983
|
+
<< ": failing batch with error: " << StatusToString(cancel_error_);
|
3266
2984
|
// Note: This will release the call combiner.
|
3267
2985
|
grpc_transport_stream_op_batch_finish_with_failure(batch, cancel_error_,
|
3268
2986
|
call_combiner_);
|
@@ -3276,10 +2994,9 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3276
2994
|
// is in the past when the call starts), we can return the right
|
3277
2995
|
// error to the caller when the first batch does get passed down.
|
3278
2996
|
cancel_error_ = batch->payload->cancel_stream.cancel_error;
|
3279
|
-
|
3280
|
-
|
3281
|
-
|
3282
|
-
}
|
2997
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
2998
|
+
<< "chand=" << chand() << " lb_call=" << this
|
2999
|
+
<< ": recording cancel_error=" << StatusToString(cancel_error_).c_str();
|
3283
3000
|
// Fail all pending batches.
|
3284
3001
|
PendingBatchesFail(cancel_error_, NoYieldCallCombiner);
|
3285
3002
|
// Note: This will release the call combiner.
|
@@ -3295,11 +3012,9 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3295
3012
|
TryPick(/*was_queued=*/false);
|
3296
3013
|
} else {
|
3297
3014
|
// For all other batches, release the call combiner.
|
3298
|
-
|
3299
|
-
|
3300
|
-
|
3301
|
-
chand(), this);
|
3302
|
-
}
|
3015
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
3016
|
+
<< "chand=" << chand() << " lb_call=" << this
|
3017
|
+
<< ": saved batch, yielding call combiner";
|
3303
3018
|
GRPC_CALL_COMBINER_STOP(call_combiner_,
|
3304
3019
|
"batch does not include send_initial_metadata");
|
3305
3020
|
}
|
@@ -3308,11 +3023,9 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3308
3023
|
void ClientChannelFilter::FilterBasedLoadBalancedCall::RecvInitialMetadataReady(
|
3309
3024
|
void* arg, grpc_error_handle error) {
|
3310
3025
|
auto* self = static_cast<FilterBasedLoadBalancedCall*>(arg);
|
3311
|
-
|
3312
|
-
|
3313
|
-
|
3314
|
-
self->chand(), self, StatusToString(error).c_str());
|
3315
|
-
}
|
3026
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
3027
|
+
<< "chand=" << self->chand() << " lb_call=" << self
|
3028
|
+
<< ": got recv_initial_metadata_ready: error=" << StatusToString(error);
|
3316
3029
|
if (error.ok()) {
|
3317
3030
|
// recv_initial_metadata_flags is not populated for clients
|
3318
3031
|
self->call_attempt_tracer()->RecordReceivedInitialMetadata(
|
@@ -3327,15 +3040,12 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::RecvInitialMetadataReady(
|
|
3327
3040
|
void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
3328
3041
|
RecvTrailingMetadataReady(void* arg, grpc_error_handle error) {
|
3329
3042
|
auto* self = static_cast<FilterBasedLoadBalancedCall*>(arg);
|
3330
|
-
|
3331
|
-
|
3332
|
-
|
3333
|
-
|
3334
|
-
|
3335
|
-
|
3336
|
-
self->call_attempt_tracer(), self->lb_subchannel_call_tracker(),
|
3337
|
-
StatusToString(self->failure_error_).c_str());
|
3338
|
-
}
|
3043
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
3044
|
+
<< "chand=" << self->chand() << " lb_call=" << self
|
3045
|
+
<< ": got recv_trailing_metadata_ready: error=" << StatusToString(error)
|
3046
|
+
<< " call_attempt_tracer()=" << self->call_attempt_tracer()
|
3047
|
+
<< " lb_subchannel_call_tracker_=" << self->lb_subchannel_call_tracker()
|
3048
|
+
<< " failure_error_=" << StatusToString(self->failure_error_);
|
3339
3049
|
// Check if we have a tracer or an LB callback to invoke.
|
3340
3050
|
if (self->call_attempt_tracer() != nullptr ||
|
3341
3051
|
self->lb_subchannel_call_tracker() != nullptr) {
|
@@ -3346,10 +3056,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
3346
3056
|
grpc_status_code code;
|
3347
3057
|
std::string message;
|
3348
3058
|
grpc_error_get_status(
|
3349
|
-
error,
|
3350
|
-
static_cast<Call*>(self->call_context()[GRPC_CONTEXT_CALL].value)
|
3351
|
-
->deadline(),
|
3352
|
-
&code, &message,
|
3059
|
+
error, self->arena()->GetContext<Call>()->deadline(), &code, &message,
|
3353
3060
|
/*http_error=*/nullptr, /*error_string=*/nullptr);
|
3354
3061
|
status = absl::Status(static_cast<absl::StatusCode>(code), message);
|
3355
3062
|
} else {
|
@@ -3406,13 +3113,11 @@ class ClientChannelFilter::FilterBasedLoadBalancedCall::LbQueuedCallCanceller
|
|
3406
3113
|
auto* chand = lb_call->chand();
|
3407
3114
|
{
|
3408
3115
|
MutexLock lock(&chand->lb_mu_);
|
3409
|
-
|
3410
|
-
|
3411
|
-
|
3412
|
-
|
3413
|
-
|
3414
|
-
lb_call->lb_call_canceller_);
|
3415
|
-
}
|
3116
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
3117
|
+
<< "chand=" << chand << " lb_call=" << lb_call
|
3118
|
+
<< ": cancelling queued pick: error=" << StatusToString(error)
|
3119
|
+
<< " self=" << self
|
3120
|
+
<< " calld->pick_canceller=" << lb_call->lb_call_canceller_;
|
3416
3121
|
if (lb_call->lb_call_canceller_ == self && !error.ok()) {
|
3417
3122
|
lb_call->Commit();
|
3418
3123
|
// Remove pick from list of queued picks.
|
@@ -3488,18 +3193,16 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::CreateSubchannelCall() {
|
|
3488
3193
|
CHECK_NE(path, nullptr);
|
3489
3194
|
SubchannelCall::Args call_args = {
|
3490
3195
|
connected_subchannel()->Ref(), pollent_, path->Ref(), /*start_time=*/0,
|
3491
|
-
|
3492
|
-
arena_,
|
3196
|
+
arena()->GetContext<Call>()->deadline(),
|
3493
3197
|
// TODO(roth): When we implement hedging support, we will probably
|
3494
|
-
// need to use a separate call
|
3495
|
-
|
3198
|
+
// need to use a separate call arena for each subchannel call.
|
3199
|
+
arena(), call_combiner_};
|
3496
3200
|
grpc_error_handle error;
|
3497
3201
|
subchannel_call_ = SubchannelCall::Create(std::move(call_args), &error);
|
3498
|
-
|
3499
|
-
|
3500
|
-
|
3501
|
-
|
3502
|
-
}
|
3202
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
3203
|
+
<< "chand=" << chand() << " lb_call=" << this
|
3204
|
+
<< ": create subchannel_call=" << subchannel_call_.get()
|
3205
|
+
<< ": error=" << StatusToString(error);
|
3503
3206
|
if (on_call_destruction_complete_ != nullptr) {
|
3504
3207
|
subchannel_call_->SetAfterCallStackDestroy(on_call_destruction_complete_);
|
3505
3208
|
on_call_destruction_complete_ = nullptr;
|
@@ -3511,150 +3214,4 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::CreateSubchannelCall() {
|
|
3511
3214
|
}
|
3512
3215
|
}
|
3513
3216
|
|
3514
|
-
//
|
3515
|
-
// ClientChannelFilter::PromiseBasedLoadBalancedCall
|
3516
|
-
//
|
3517
|
-
|
3518
|
-
ClientChannelFilter::PromiseBasedLoadBalancedCall::PromiseBasedLoadBalancedCall(
|
3519
|
-
ClientChannelFilter* chand, absl::AnyInvocable<void()> on_commit,
|
3520
|
-
bool is_transparent_retry)
|
3521
|
-
: LoadBalancedCall(chand, GetContext<grpc_call_context_element>(),
|
3522
|
-
std::move(on_commit), is_transparent_retry) {}
|
3523
|
-
|
3524
|
-
ArenaPromise<ServerMetadataHandle>
|
3525
|
-
ClientChannelFilter::PromiseBasedLoadBalancedCall::MakeCallPromise(
|
3526
|
-
CallArgs call_args, OrphanablePtr<PromiseBasedLoadBalancedCall> lb_call) {
|
3527
|
-
pollent_ = NowOrNever(call_args.polling_entity->WaitAndCopy()).value();
|
3528
|
-
// Record ops in tracer.
|
3529
|
-
if (call_attempt_tracer() != nullptr) {
|
3530
|
-
call_attempt_tracer()->RecordSendInitialMetadata(
|
3531
|
-
call_args.client_initial_metadata.get());
|
3532
|
-
// TODO(ctiller): Find a way to do this without registering a no-op mapper.
|
3533
|
-
call_args.client_to_server_messages->InterceptAndMapWithHalfClose(
|
3534
|
-
[](MessageHandle message) { return message; }, // No-op.
|
3535
|
-
[this]() {
|
3536
|
-
// TODO(roth): Change CallTracer API to not pass metadata
|
3537
|
-
// batch to this method, since the batch is always empty.
|
3538
|
-
grpc_metadata_batch metadata;
|
3539
|
-
call_attempt_tracer()->RecordSendTrailingMetadata(&metadata);
|
3540
|
-
});
|
3541
|
-
}
|
3542
|
-
// Extract peer name from server initial metadata.
|
3543
|
-
call_args.server_initial_metadata->InterceptAndMap(
|
3544
|
-
[self = lb_call->RefAsSubclass<PromiseBasedLoadBalancedCall>()](
|
3545
|
-
ServerMetadataHandle metadata) {
|
3546
|
-
if (self->call_attempt_tracer() != nullptr) {
|
3547
|
-
self->call_attempt_tracer()->RecordReceivedInitialMetadata(
|
3548
|
-
metadata.get());
|
3549
|
-
}
|
3550
|
-
Slice* peer_string = metadata->get_pointer(PeerString());
|
3551
|
-
if (peer_string != nullptr) self->peer_string_ = peer_string->Ref();
|
3552
|
-
return metadata;
|
3553
|
-
});
|
3554
|
-
client_initial_metadata_ = std::move(call_args.client_initial_metadata);
|
3555
|
-
return OnCancel(
|
3556
|
-
Map(TrySeq(
|
3557
|
-
// LB pick.
|
3558
|
-
[this]() -> Poll<absl::Status> {
|
3559
|
-
auto result = PickSubchannel(was_queued_);
|
3560
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
3561
|
-
grpc_client_channel_lb_call_trace)) {
|
3562
|
-
gpr_log(GPR_INFO,
|
3563
|
-
"chand=%p lb_call=%p: %sPickSubchannel() returns %s",
|
3564
|
-
chand(), this,
|
3565
|
-
GetContext<Activity>()->DebugTag().c_str(),
|
3566
|
-
result.has_value() ? result->ToString().c_str()
|
3567
|
-
: "Pending");
|
3568
|
-
}
|
3569
|
-
if (result == absl::nullopt) return Pending{};
|
3570
|
-
return std::move(*result);
|
3571
|
-
},
|
3572
|
-
[this, call_args = std::move(call_args)]() mutable
|
3573
|
-
-> ArenaPromise<ServerMetadataHandle> {
|
3574
|
-
call_args.client_initial_metadata =
|
3575
|
-
std::move(client_initial_metadata_);
|
3576
|
-
return connected_subchannel()->MakeCallPromise(
|
3577
|
-
std::move(call_args));
|
3578
|
-
}),
|
3579
|
-
// Record call completion.
|
3580
|
-
[this](ServerMetadataHandle metadata) {
|
3581
|
-
if (call_attempt_tracer() != nullptr ||
|
3582
|
-
lb_subchannel_call_tracker() != nullptr) {
|
3583
|
-
absl::Status status;
|
3584
|
-
grpc_status_code code = metadata->get(GrpcStatusMetadata())
|
3585
|
-
.value_or(GRPC_STATUS_UNKNOWN);
|
3586
|
-
if (code != GRPC_STATUS_OK) {
|
3587
|
-
absl::string_view message;
|
3588
|
-
if (const auto* grpc_message =
|
3589
|
-
metadata->get_pointer(GrpcMessageMetadata())) {
|
3590
|
-
message = grpc_message->as_string_view();
|
3591
|
-
}
|
3592
|
-
status =
|
3593
|
-
absl::Status(static_cast<absl::StatusCode>(code), message);
|
3594
|
-
}
|
3595
|
-
RecordCallCompletion(status, metadata.get(),
|
3596
|
-
&GetContext<CallContext>()
|
3597
|
-
->call_stats()
|
3598
|
-
->transport_stream_stats,
|
3599
|
-
peer_string_.as_string_view());
|
3600
|
-
}
|
3601
|
-
RecordLatency();
|
3602
|
-
return metadata;
|
3603
|
-
}),
|
3604
|
-
[lb_call = std::move(lb_call)]() {
|
3605
|
-
// If the waker is pending, then we need to remove ourself from
|
3606
|
-
// the list of queued LB calls.
|
3607
|
-
if (!lb_call->waker_.is_unwakeable()) {
|
3608
|
-
MutexLock lock(&lb_call->chand()->lb_mu_);
|
3609
|
-
lb_call->Commit();
|
3610
|
-
// Remove pick from list of queued picks.
|
3611
|
-
lb_call->RemoveCallFromLbQueuedCallsLocked();
|
3612
|
-
// Remove from queued picks list.
|
3613
|
-
lb_call->chand()->lb_queued_calls_.erase(lb_call.get());
|
3614
|
-
}
|
3615
|
-
// TODO(ctiller): We don't have access to the call's actual status
|
3616
|
-
// here, so we just assume CANCELLED. We could change this to use
|
3617
|
-
// CallFinalization instead of OnCancel() so that we can get the
|
3618
|
-
// actual status. But we should also have access to the trailing
|
3619
|
-
// metadata, which we don't have in either case. Ultimately, we
|
3620
|
-
// need a better story for code that needs to run at the end of a
|
3621
|
-
// call in both cancellation and non-cancellation cases that needs
|
3622
|
-
// access to server trailing metadata and the call's real status.
|
3623
|
-
if (lb_call->call_attempt_tracer() != nullptr) {
|
3624
|
-
lb_call->call_attempt_tracer()->RecordCancel(
|
3625
|
-
absl::CancelledError("call cancelled"));
|
3626
|
-
}
|
3627
|
-
if (lb_call->call_attempt_tracer() != nullptr ||
|
3628
|
-
lb_call->lb_subchannel_call_tracker() != nullptr) {
|
3629
|
-
// If we were cancelled without recording call completion, then
|
3630
|
-
// record call completion here, as best we can. We assume status
|
3631
|
-
// CANCELLED in this case.
|
3632
|
-
lb_call->RecordCallCompletion(absl::CancelledError("call cancelled"),
|
3633
|
-
nullptr, nullptr, "");
|
3634
|
-
}
|
3635
|
-
});
|
3636
|
-
}
|
3637
|
-
|
3638
|
-
Arena* ClientChannelFilter::PromiseBasedLoadBalancedCall::arena() const {
|
3639
|
-
return GetContext<Arena>();
|
3640
|
-
}
|
3641
|
-
|
3642
|
-
grpc_metadata_batch*
|
3643
|
-
ClientChannelFilter::PromiseBasedLoadBalancedCall::send_initial_metadata()
|
3644
|
-
const {
|
3645
|
-
return client_initial_metadata_.get();
|
3646
|
-
}
|
3647
|
-
|
3648
|
-
void ClientChannelFilter::PromiseBasedLoadBalancedCall::OnAddToQueueLocked() {
|
3649
|
-
waker_ = GetContext<Activity>()->MakeNonOwningWaker();
|
3650
|
-
was_queued_ = true;
|
3651
|
-
}
|
3652
|
-
|
3653
|
-
void ClientChannelFilter::PromiseBasedLoadBalancedCall::RetryPickLocked() {
|
3654
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_lb_call_trace)) {
|
3655
|
-
gpr_log(GPR_INFO, "chand=%p lb_call=%p: RetryPickLocked()", chand(), this);
|
3656
|
-
}
|
3657
|
-
waker_.WakeupAsync();
|
3658
|
-
}
|
3659
|
-
|
3660
3217
|
} // namespace grpc_core
|