grpc 1.75.0 → 1.78.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 +24 -5
- data/include/grpc/credentials.h +27 -6
- data/include/grpc/event_engine/memory_allocator.h +2 -0
- data/include/grpc/event_engine/memory_request.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +5 -0
- data/include/grpc/support/metrics.h +7 -1
- data/src/core/call/call_filters.cc +5 -5
- data/src/core/call/call_filters.h +211 -37
- data/src/core/call/call_spine.cc +1 -1
- data/src/core/call/call_spine.h +54 -32
- data/src/core/call/channelz_context.h +30 -0
- data/src/core/call/client_call.cc +49 -10
- data/src/core/call/client_call.h +6 -3
- data/src/core/call/filter_fusion.h +9 -9
- data/src/core/call/interception_chain.h +7 -6
- data/src/core/call/metadata_batch.cc +49 -55
- data/src/core/call/metadata_batch.h +10 -9
- data/src/core/call/metadata_info.cc +1 -1
- data/src/core/call/parsed_metadata.h +2 -2
- data/src/core/call/request_buffer.cc +1 -1
- data/src/core/call/security_context.cc +2 -2
- data/src/core/call/security_context.h +1 -1
- data/src/core/call/server_call.cc +5 -5
- data/src/core/call/server_call.h +6 -4
- data/src/core/call/simple_slice_based_metadata.h +1 -1
- data/src/core/call/status_util.cc +1 -1
- data/src/core/channelz/channel_trace.cc +1 -1
- data/src/core/channelz/channel_trace.h +3 -3
- data/src/core/channelz/channelz.cc +25 -29
- data/src/core/channelz/channelz.h +73 -22
- data/src/core/channelz/channelz_registry.cc +2 -2
- data/src/core/channelz/channelz_registry.h +53 -2
- data/src/core/channelz/property_list.cc +18 -0
- data/src/core/channelz/property_list.h +15 -4
- data/src/core/channelz/text_encode.cc +66 -0
- data/src/core/channelz/text_encode.h +29 -0
- data/src/core/channelz/v2tov1/convert.cc +17 -6
- data/src/core/channelz/v2tov1/legacy_api.cc +18 -12
- data/src/core/channelz/v2tov1/property_list.cc +2 -1
- data/src/core/channelz/ztrace_collector.h +260 -87
- data/src/core/client_channel/backup_poller.cc +7 -8
- data/src/core/client_channel/buffered_call.cc +140 -0
- data/src/core/client_channel/buffered_call.h +104 -0
- data/src/core/client_channel/client_channel.cc +144 -84
- data/src/core/client_channel/client_channel.h +8 -11
- data/src/core/client_channel/client_channel_factory.h +1 -1
- data/src/core/client_channel/client_channel_filter.cc +424 -686
- data/src/core/client_channel/client_channel_filter.h +57 -150
- data/src/core/client_channel/client_channel_internal.h +8 -5
- data/src/core/client_channel/client_channel_service_config.cc +43 -3
- data/src/core/client_channel/client_channel_service_config.h +12 -1
- data/src/core/client_channel/config_selector.h +5 -5
- data/src/core/client_channel/connector.h +2 -0
- data/src/core/client_channel/dynamic_filters.cc +5 -5
- data/src/core/client_channel/global_subchannel_pool.cc +0 -37
- data/src/core/client_channel/global_subchannel_pool.h +1 -28
- data/src/core/client_channel/lb_metadata.h +1 -1
- data/src/core/client_channel/load_balanced_call_destination.cc +10 -12
- data/src/core/client_channel/load_balanced_call_destination.h +1 -1
- data/src/core/client_channel/local_subchannel_pool.cc +4 -4
- data/src/core/client_channel/retry_filter.cc +2 -2
- data/src/core/client_channel/retry_filter.h +3 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +11 -12
- data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
- data/src/core/client_channel/retry_service_config.cc +3 -3
- data/src/core/client_channel/retry_service_config.h +1 -1
- data/src/core/client_channel/subchannel.cc +114 -25
- data/src/core/client_channel/subchannel.h +24 -8
- data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
- data/src/core/client_channel/subchannel_pool_interface.h +1 -1
- data/src/core/client_channel/subchannel_stream_client.cc +5 -5
- data/src/core/client_channel/subchannel_stream_client.h +3 -3
- data/src/core/config/config_vars.cc +38 -3
- data/src/core/config/config_vars.h +26 -0
- data/src/core/config/core_configuration.cc +5 -5
- data/src/core/config/core_configuration.h +8 -8
- data/src/core/config/load_config.cc +13 -1
- data/src/core/config/load_config.h +2 -0
- data/src/core/credentials/call/call_credentials.h +4 -4
- data/src/core/credentials/call/call_creds_registry.h +1 -1
- data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
- data/src/core/credentials/call/call_creds_util.cc +7 -6
- data/src/core/credentials/call/composite/composite_call_credentials.cc +6 -6
- data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +9 -9
- data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
- data/src/core/credentials/call/external/external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
- data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +7 -7
- data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
- data/src/core/credentials/call/iam/iam_credentials.cc +6 -6
- data/src/core/credentials/call/iam/iam_credentials.h +1 -1
- data/src/core/credentials/call/json_util.cc +1 -1
- data/src/core/credentials/call/jwt/json_token.cc +7 -7
- data/src/core/credentials/call/jwt/jwt_credentials.cc +5 -5
- data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
- data/src/core/credentials/call/jwt/jwt_verifier.cc +19 -18
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
- data/src/core/credentials/call/jwt_util.cc +3 -3
- data/src/core/credentials/call/jwt_util.h +1 -1
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +49 -72
- data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
- data/src/core/credentials/call/plugin/plugin_credentials.cc +6 -6
- data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
- data/src/core/credentials/transport/alts/alts_credentials.cc +5 -5
- data/src/core/credentials/transport/alts/alts_security_connector.cc +17 -15
- data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
- data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +23 -3
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
- data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
- data/src/core/credentials/transport/channel_creds_registry.h +1 -1
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/composite/composite_channel_credentials.cc +7 -7
- data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
- data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
- data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
- data/src/core/credentials/transport/fake/fake_security_connector.cc +7 -7
- data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +83 -39
- data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
- data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
- data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
- data/src/core/credentials/transport/local/local_security_connector.cc +13 -13
- data/src/core/credentials/transport/security_connector.cc +6 -6
- data/src/core/credentials/transport/security_connector.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +13 -13
- data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -8
- data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
- data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
- data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -25
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +8 -8
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +4 -4
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +18 -18
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
- data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
- data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
- data/src/core/credentials/transport/tls/ssl_utils.cc +18 -13
- data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
- data/src/core/credentials/transport/tls/tls_credentials.cc +3 -3
- data/src/core/credentials/transport/tls/tls_security_connector.cc +15 -15
- data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
- data/src/core/credentials/transport/transport_credentials.cc +3 -3
- data/src/core/credentials/transport/transport_credentials.h +4 -4
- data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
- data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -4
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
- data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
- data/src/core/ext/filters/http/client_authority_filter.h +4 -1
- data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +11 -11
- data/src/core/ext/filters/http/message_compress/compression_filter.h +24 -5
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
- data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
- data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +14 -14
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +58 -44
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +25 -24
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +306 -148
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -7
- data/src/core/ext/transport/chttp2/transport/flow_control.h +223 -83
- data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +105 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +175 -27
- data/src/core/ext/transport/chttp2/transport/frame.h +58 -10
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
- data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +194 -54
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +5 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +34 -34
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1475 -632
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +384 -373
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -5
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +417 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +337 -30
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +196 -21
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +172 -72
- data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +31 -19
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
- data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +30 -21
- data/src/core/ext/transport/chttp2/transport/parsing.cc +25 -23
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +70 -28
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +63 -23
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
- data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
- data/src/core/ext/transport/chttp2/transport/stream.h +287 -0
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +476 -208
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.h +57 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +202 -84
- data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
- data/src/core/ext/transport/inproc/inproc_transport.cc +9 -3
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +11 -8
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
- data/src/core/filter/auth/auth_filters.h +7 -1
- data/src/core/filter/auth/client_auth_filter.cc +2 -2
- data/src/core/filter/auth/server_auth_filter.cc +5 -5
- data/src/core/filter/blackboard.h +2 -2
- data/src/core/filter/filter_args.h +40 -2
- data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
- data/src/core/handshaker/handshaker.cc +8 -8
- data/src/core/handshaker/handshaker.h +2 -2
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +12 -12
- data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
- data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
- data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
- data/src/core/handshaker/proxy_mapper.h +1 -1
- data/src/core/handshaker/proxy_mapper_registry.h +1 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -6
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +38 -15
- data/src/core/handshaker/security/secure_endpoint.cc +31 -11
- data/src/core/handshaker/security/security_handshaker.cc +11 -8
- data/src/core/handshaker/security/security_handshaker.h +1 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +6 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -5
- data/src/core/lib/address_utils/parse_address.h +2 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
- data/src/core/lib/channel/channel_args.cc +1 -1
- data/src/core/lib/channel/channel_args.h +2 -2
- data/src/core/lib/channel/channel_stack.cc +29 -25
- data/src/core/lib/channel/channel_stack.h +8 -3
- data/src/core/lib/channel/channel_stack_builder.cc +8 -4
- data/src/core/lib/channel/channel_stack_builder.h +10 -9
- data/src/core/lib/channel/channel_stack_builder_impl.cc +8 -13
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +4 -4
- data/src/core/lib/channel/promise_based_filter.cc +132 -72
- data/src/core/lib/channel/promise_based_filter.h +39 -23
- data/src/core/lib/compression/compression_internal.cc +6 -6
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/message_compress.cc +8 -8
- data/src/core/lib/debug/trace.cc +2 -5
- data/src/core/lib/debug/trace.h +10 -0
- data/src/core/lib/debug/trace_flags.cc +2 -2
- data/src/core/lib/debug/trace_flags.h +1 -1
- data/src/core/lib/event_engine/ares_resolver.cc +30 -28
- data/src/core/lib/event_engine/ares_resolver.h +4 -4
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +4 -4
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +3 -3
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
- data/src/core/lib/event_engine/default_event_engine.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +1 -1
- data/src/core/lib/event_engine/extensions/channelz.h +3 -3
- data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
- data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
- data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
- data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
- data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -12
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +28 -27
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +17 -17
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +175 -177
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +40 -61
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +11 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +9 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
- data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -4
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
- data/src/core/lib/event_engine/resolved_address.cc +3 -3
- data/src/core/lib/event_engine/shim.cc +8 -11
- data/src/core/lib/event_engine/shim.h +2 -1
- data/src/core/lib/event_engine/slice.cc +2 -2
- data/src/core/lib/event_engine/tcp_socket_utils.cc +15 -15
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +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 +11 -11
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
- data/src/core/lib/event_engine/utils.cc +3 -3
- data/src/core/lib/event_engine/utils.h +1 -1
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +32 -32
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
- data/src/core/lib/event_engine/windows/iocp.cc +11 -11
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/win_socket.h +2 -2
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +16 -16
- data/src/core/lib/event_engine/windows/windows_engine.cc +20 -18
- data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +10 -10
- data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
- data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
- data/src/core/lib/experiments/config.cc +4 -4
- data/src/core/lib/experiments/experiments.cc +255 -42
- data/src/core/lib/experiments/experiments.h +105 -21
- data/src/core/lib/iomgr/buffer_list.cc +1 -1
- data/src/core/lib/iomgr/call_combiner.cc +4 -4
- data/src/core/lib/iomgr/call_combiner.h +2 -2
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
- data/src/core/lib/iomgr/closure.h +2 -2
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -7
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +6 -6
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +16 -15
- data/src/core/lib/iomgr/error.cc +1 -1
- data/src/core/lib/iomgr/error.h +2 -2
- data/src/core/lib/iomgr/error_cfstream.cc +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
- data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
- data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +10 -9
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +3 -3
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
- data/src/core/lib/iomgr/iocp_windows.cc +9 -9
- data/src/core/lib/iomgr/iomgr.cc +1 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
- data/src/core/lib/iomgr/lockfree_event.cc +3 -3
- data/src/core/lib/iomgr/polling_entity.cc +4 -4
- data/src/core/lib/iomgr/resolve_address.cc +1 -1
- data/src/core/lib/iomgr/resolve_address.h +2 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -4
- data/src/core/lib/iomgr/socket_windows.cc +6 -6
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_posix.cc +47 -47
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +7 -0
- data/src/core/lib/iomgr/tcp_server_posix.cc +62 -31
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +4 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +70 -31
- data/src/core/lib/iomgr/tcp_windows.cc +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +5 -5
- data/src/core/lib/iomgr/timer_manager.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
- data/src/core/lib/iomgr/vsock.cc +1 -1
- data/src/core/lib/iomgr/vsock.h +1 -1
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
- data/src/core/lib/promise/activity.cc +3 -3
- data/src/core/lib/promise/activity.h +11 -10
- data/src/core/lib/promise/all_ok.h +3 -3
- data/src/core/lib/promise/arena_promise.h +47 -6
- data/src/core/lib/promise/context.h +3 -3
- data/src/core/lib/promise/detail/join_state.h +10 -10
- data/src/core/lib/promise/detail/promise_factory.h +1 -1
- data/src/core/lib/promise/detail/promise_like.h +1 -1
- data/src/core/lib/promise/detail/seq_state.h +16 -16
- data/src/core/lib/promise/detail/status.h +2 -2
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
- data/src/core/lib/promise/for_each.h +8 -8
- data/src/core/lib/promise/if.h +1 -1
- data/src/core/lib/promise/inter_activity_latch.h +3 -3
- data/src/core/lib/promise/inter_activity_mutex.h +1 -1
- data/src/core/lib/promise/interceptor_list.h +5 -5
- data/src/core/lib/promise/latch.h +9 -9
- data/src/core/lib/promise/loop.h +2 -2
- data/src/core/lib/promise/map.h +2 -2
- data/src/core/lib/promise/mpsc.cc +31 -30
- data/src/core/lib/promise/mpsc.h +2 -2
- data/src/core/lib/promise/observable.h +6 -6
- data/src/core/lib/promise/party.cc +43 -30
- data/src/core/lib/promise/party.h +27 -23
- data/src/core/lib/promise/pipe.h +31 -17
- data/src/core/lib/promise/poll.h +6 -5
- data/src/core/lib/promise/promise.h +2 -4
- data/src/core/lib/promise/sleep.cc +3 -1
- data/src/core/lib/promise/sleep.h +1 -1
- data/src/core/lib/promise/status_flag.h +8 -8
- data/src/core/lib/promise/try_join.h +5 -5
- data/src/core/lib/promise/try_seq.h +5 -5
- data/src/core/lib/promise/wait_set.h +2 -2
- data/src/core/lib/resource_quota/api.cc +1 -1
- data/src/core/lib/resource_quota/arena.cc +1 -1
- data/src/core/lib/resource_quota/arena.h +15 -2
- data/src/core/lib/resource_quota/connection_quota.cc +9 -7
- data/src/core/lib/resource_quota/connection_quota.h +1 -1
- data/src/core/lib/resource_quota/memory_quota.cc +48 -27
- data/src/core/lib/resource_quota/memory_quota.h +56 -20
- data/src/core/lib/resource_quota/periodic_update.h +1 -1
- data/src/core/lib/resource_quota/resource_quota.cc +8 -0
- data/src/core/lib/resource_quota/resource_quota.h +2 -1
- data/src/core/lib/resource_quota/stream_quota.cc +22 -0
- data/src/core/lib/resource_quota/stream_quota.h +31 -0
- data/src/core/lib/resource_quota/telemetry.h +55 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -2
- data/src/core/lib/resource_quota/thread_quota.h +1 -1
- data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
- data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
- data/src/core/lib/security/authorization/audit_logging.cc +7 -7
- data/src/core/lib/security/authorization/audit_logging.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
- data/src/core/lib/security/authorization/evaluate_args.h +1 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
- data/src/core/lib/security/authorization/matchers.cc +2 -2
- data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
- data/src/core/lib/slice/percent_encoding.cc +1 -1
- data/src/core/lib/slice/slice.cc +1 -1
- data/src/core/lib/slice/slice.h +2 -2
- data/src/core/lib/slice/slice_buffer.cc +1 -1
- data/src/core/lib/slice/slice_internal.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
- data/src/core/lib/surface/call.cc +58 -28
- data/src/core/lib/surface/call.h +13 -6
- data/src/core/lib/surface/call_log_batch.cc +2 -2
- data/src/core/lib/surface/call_utils.cc +7 -7
- data/src/core/lib/surface/call_utils.h +85 -20
- data/src/core/lib/surface/channel.cc +6 -5
- data/src/core/lib/surface/channel.h +13 -3
- data/src/core/lib/surface/channel_create.cc +12 -8
- data/src/core/lib/surface/channel_create.h +1 -1
- data/src/core/lib/surface/channel_init.cc +84 -27
- data/src/core/lib/surface/channel_init.h +30 -13
- data/src/core/lib/surface/completion_queue.cc +21 -20
- data/src/core/lib/surface/completion_queue_factory.cc +7 -7
- data/src/core/lib/surface/connection_context.h +45 -2
- data/src/core/lib/surface/filter_stack_call.cc +25 -31
- data/src/core/lib/surface/filter_stack_call.h +6 -7
- data/src/core/lib/surface/init.cc +4 -4
- data/src/core/lib/surface/lame_client.cc +2 -2
- data/src/core/lib/surface/lame_client.h +3 -3
- data/src/core/lib/surface/legacy_channel.cc +10 -10
- data/src/core/lib/surface/legacy_channel.h +1 -1
- data/src/core/lib/surface/validate_metadata.cc +2 -2
- data/src/core/lib/surface/validate_metadata.h +3 -3
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.h +5 -5
- data/src/core/lib/transport/connectivity_state.cc +1 -1
- data/src/core/lib/transport/connectivity_state.h +2 -2
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/promise_endpoint.cc +4 -4
- data/src/core/lib/transport/promise_endpoint.h +11 -11
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/lib/transport/transport.cc +3 -3
- data/src/core/lib/transport/transport.h +62 -4
- data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +2 -2
- data/src/core/load_balancing/address_filtering.cc +1 -1
- data/src/core/load_balancing/address_filtering.h +2 -2
- data/src/core/load_balancing/backend_metric_parser.cc +1 -1
- data/src/core/load_balancing/backend_metric_parser.h +1 -1
- data/src/core/load_balancing/child_policy_handler.cc +8 -8
- data/src/core/load_balancing/child_policy_handler.h +2 -2
- data/src/core/load_balancing/delegating_helper.h +2 -2
- data/src/core/load_balancing/endpoint_list.cc +6 -6
- data/src/core/load_balancing/endpoint_list.h +2 -2
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
- data/src/core/load_balancing/grpclb/grpclb.cc +37 -48
- data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
- data/src/core/load_balancing/health_check_client.cc +13 -9
- data/src/core/load_balancing/health_check_client_internal.h +5 -5
- data/src/core/load_balancing/lb_policy.h +11 -8
- data/src/core/load_balancing/lb_policy_factory.h +2 -2
- data/src/core/load_balancing/lb_policy_registry.cc +3 -3
- data/src/core/load_balancing/lb_policy_registry.h +2 -2
- data/src/core/load_balancing/oob_backend_metric.cc +11 -7
- data/src/core/load_balancing/oob_backend_metric_internal.h +4 -4
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +9 -17
- data/src/core/load_balancing/pick_first/pick_first.cc +62 -32
- data/src/core/load_balancing/priority/priority.cc +29 -30
- data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -11
- data/src/core/load_balancing/rls/rls.cc +23 -23
- data/src/core/load_balancing/round_robin/round_robin.cc +16 -16
- data/src/core/load_balancing/subchannel_interface.h +2 -2
- data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +42 -41
- data/src/core/load_balancing/weighted_target/weighted_target.cc +14 -14
- data/src/core/load_balancing/xds/cds.cc +81 -37
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +24 -41
- data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
- data/src/core/load_balancing/xds/xds_override_host.cc +14 -14
- data/src/core/load_balancing/xds/xds_override_host.h +1 -1
- data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +35 -35
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +16 -16
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
- data/src/core/resolver/dns/dns_resolver_plugin.cc +8 -5
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +10 -10
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
- data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
- data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
- data/src/core/resolver/endpoint_addresses.cc +6 -6
- data/src/core/resolver/endpoint_addresses.h +4 -1
- data/src/core/resolver/fake/fake_resolver.cc +3 -3
- data/src/core/resolver/fake/fake_resolver.h +3 -3
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +46 -59
- data/src/core/resolver/polling_resolver.cc +8 -8
- data/src/core/resolver/polling_resolver.h +1 -1
- data/src/core/resolver/resolver.h +2 -2
- data/src/core/resolver/resolver_factory.h +2 -2
- data/src/core/resolver/resolver_registry.cc +5 -4
- data/src/core/resolver/resolver_registry.h +1 -1
- data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
- data/src/core/resolver/xds/xds_config.cc +1 -1
- data/src/core/resolver/xds/xds_config.h +3 -3
- data/src/core/resolver/xds/xds_dependency_manager.cc +7 -7
- data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
- data/src/core/resolver/xds/xds_resolver.cc +25 -22
- data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
- data/src/core/server/add_port.cc +2 -2
- data/src/core/server/server.cc +47 -43
- data/src/core/server/server.h +8 -7
- data/src/core/server/server_call_tracer_filter.cc +1 -1
- data/src/core/server/server_call_tracer_filter.h +9 -5
- data/src/core/server/server_config_selector.h +2 -2
- data/src/core/server/server_config_selector_filter.cc +5 -5
- data/src/core/server/xds_channel_stack_modifier.cc +3 -2
- data/src/core/server/xds_channel_stack_modifier.h +1 -1
- data/src/core/server/xds_server_config_fetcher.cc +19 -18
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
- data/src/core/service_config/service_config_impl.cc +3 -3
- data/src/core/service_config/service_config_impl.h +4 -4
- data/src/core/service_config/service_config_parser.h +1 -1
- data/src/core/telemetry/call_tracer.cc +39 -49
- data/src/core/telemetry/call_tracer.h +201 -24
- data/src/core/telemetry/default_tcp_tracer.h +3 -3
- data/src/core/telemetry/histogram.h +205 -0
- data/src/core/telemetry/instrument.cc +999 -0
- data/src/core/telemetry/instrument.h +1105 -0
- data/src/core/telemetry/metrics.cc +15 -5
- data/src/core/telemetry/metrics.h +36 -5
- data/src/core/telemetry/stats.h +2 -2
- data/src/core/telemetry/stats_data.cc +1 -20
- data/src/core/telemetry/stats_data.h +2 -21
- data/src/core/transport/auth_context.cc +3 -3
- data/src/core/transport/auth_context.h +2 -1
- data/src/core/transport/auth_context_comparator_registry.h +1 -1
- data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +81 -48
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +46 -36
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -4
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +4 -4
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +16 -8
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +18 -5
- data/src/core/tsi/fake_transport_security.cc +6 -5
- data/src/core/tsi/local_transport_security.cc +1 -1
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +10 -10
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +4 -4
- data/src/core/tsi/ssl_transport_security.cc +30 -30
- data/src/core/tsi/ssl_transport_security.h +1 -1
- data/src/core/tsi/ssl_transport_security_utils.cc +10 -10
- data/src/core/tsi/ssl_transport_security_utils.h +2 -2
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/alloc.cc +1 -1
- data/src/core/util/backoff.h +1 -1
- data/src/core/util/chunked_vector.h +4 -4
- data/src/core/util/crash.h +1 -1
- data/src/core/util/dual_ref_counted.h +2 -2
- data/src/core/util/event_log.cc +2 -2
- data/src/core/util/event_log.h +3 -3
- data/src/core/util/gcp_metadata_query.cc +7 -7
- data/src/core/util/gcp_metadata_query.h +2 -2
- data/src/core/util/glob.cc +2 -0
- data/src/core/util/grpc_check.cc +24 -0
- data/src/core/util/grpc_check.h +103 -0
- data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
- data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
- data/src/core/util/http_client/format_request.cc +1 -1
- data/src/core/util/http_client/httpcli.cc +6 -6
- data/src/core/util/http_client/httpcli.h +4 -4
- data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
- data/src/core/util/http_client/parser.cc +4 -4
- data/src/core/util/json/json_channel_args.h +1 -1
- data/src/core/util/json/json_object_loader.h +6 -6
- data/src/core/util/json/json_reader.cc +2 -2
- data/src/core/util/json/json_reader.h +1 -1
- data/src/core/util/json/json_util.h +3 -3
- data/src/core/util/json/json_writer.cc +1 -1
- data/src/core/util/latent_see.cc +45 -24
- data/src/core/util/latent_see.h +199 -28
- data/src/core/util/linux/cpu.cc +1 -1
- data/src/core/util/load_file.cc +1 -1
- data/src/core/util/load_file.h +1 -1
- data/src/core/util/log.cc +3 -3
- data/src/core/util/lru_cache.h +4 -4
- data/src/core/util/matchers.h +1 -1
- data/src/core/util/memory_usage.h +17 -1
- data/src/core/util/mpscq.h +1 -1
- data/src/core/util/notification.h +1 -1
- data/src/core/util/posix/cpu.cc +1 -1
- data/src/core/util/posix/directory_reader.cc +3 -2
- data/src/core/util/posix/stat.cc +2 -2
- data/src/core/util/posix/sync.cc +24 -24
- data/src/core/util/posix/thd.cc +2 -2
- data/src/core/util/posix/tmpfile.cc +2 -2
- data/src/core/util/postmortem_emit.cc +52 -0
- data/src/core/util/postmortem_emit.h +30 -0
- data/src/core/util/ref_counted.h +2 -2
- data/src/core/util/ref_counted_ptr.h +6 -1
- data/src/core/util/ref_counted_string.h +1 -1
- data/src/core/util/single_set_ptr.h +3 -1
- data/src/core/util/status_helper.cc +8 -8
- data/src/core/util/status_helper.h +1 -1
- data/src/core/util/string.cc +2 -2
- data/src/core/util/sync_abseil.cc +1 -1
- data/src/core/util/table.h +1 -1
- data/src/core/util/time.cc +1 -1
- data/src/core/util/time_precise.cc +1 -1
- data/src/core/util/trie_lookup.h +170 -0
- data/src/core/util/unique_ptr_with_bitset.h +5 -5
- data/src/core/util/unique_type_name.h +1 -1
- data/src/core/util/upb_utils.h +6 -1
- data/src/core/util/validation_errors.cc +2 -2
- data/src/core/util/validation_errors.h +2 -3
- data/src/core/util/wait_for_single_owner.h +2 -2
- data/src/core/util/windows/directory_reader.cc +1 -1
- data/src/core/util/windows/stat.cc +2 -2
- data/src/core/util/windows/thd.cc +2 -2
- data/src/core/util/windows/time.cc +1 -1
- data/src/core/util/work_serializer.cc +3 -3
- data/src/core/util/work_serializer.h +2 -2
- data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
- data/src/core/xds/grpc/certificate_provider_store.h +2 -2
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
- data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
- data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -3
- data/src/core/xds/grpc/xds_certificate_provider.cc +4 -4
- data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
- data/src/core/xds/grpc/xds_client_grpc.cc +39 -20
- data/src/core/xds/grpc/xds_client_grpc.h +6 -3
- data/src/core/xds/grpc/xds_cluster.cc +2 -2
- data/src/core/xds/grpc/xds_cluster.h +1 -1
- data/src/core/xds/grpc/xds_cluster_parser.cc +7 -7
- data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +4 -4
- 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_common_types_parser.cc +5 -5
- data/src/core/xds/grpc/xds_endpoint.h +2 -2
- data/src/core/xds/grpc/xds_endpoint_parser.cc +7 -7
- data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
- data/src/core/xds/grpc/xds_health_status.cc +1 -1
- data/src/core/xds/grpc/xds_health_status.h +1 -1
- data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
- data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_filter.h +3 -3
- data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
- data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
- data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
- data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
- data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
- data/src/core/xds/grpc/xds_listener.cc +2 -2
- data/src/core/xds/grpc/xds_listener_parser.cc +9 -9
- data/src/core/xds/grpc/xds_listener_parser.h +1 -1
- data/src/core/xds/grpc/xds_matcher.cc +277 -0
- data/src/core/xds/grpc/xds_matcher.h +432 -0
- data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
- data/src/core/xds/grpc/xds_matcher_action.h +48 -0
- data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
- data/src/core/xds/grpc/xds_matcher_context.h +46 -0
- data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
- data/src/core/xds/grpc/xds_matcher_input.h +105 -0
- data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
- data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
- data/src/core/xds/grpc/xds_metadata.cc +4 -3
- data/src/core/xds/grpc/xds_metadata.h +3 -3
- data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
- data/src/core/xds/grpc/xds_route_config.cc +3 -3
- data/src/core/xds/grpc/xds_route_config_parser.cc +14 -14
- data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
- data/src/core/xds/grpc/xds_routing.cc +6 -6
- data/src/core/xds/grpc/xds_routing.h +2 -2
- data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.cc +11 -11
- data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
- data/src/core/xds/xds_client/lrs_client.cc +9 -9
- data/src/core/xds/xds_client/lrs_client.h +4 -4
- data/src/core/xds/xds_client/xds_api.h +1 -1
- data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
- data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
- data/src/core/xds/xds_client/xds_client.cc +17 -17
- data/src/core/xds/xds_client/xds_client.h +5 -5
- data/src/core/xds/xds_client/xds_locality.h +2 -2
- data/src/core/xds/xds_client/xds_resource_type.h +2 -2
- data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
- data/src/core/xds/xds_client/xds_transport.h +2 -2
- data/src/ruby/ext/grpc/extconf.rb +14 -12
- data/src/ruby/ext/grpc/rb_call.c +0 -1
- data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
- data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
- metadata +51 -6
|
@@ -37,16 +37,6 @@
|
|
|
37
37
|
#include <variant>
|
|
38
38
|
#include <vector>
|
|
39
39
|
|
|
40
|
-
#include "absl/cleanup/cleanup.h"
|
|
41
|
-
#include "absl/log/check.h"
|
|
42
|
-
#include "absl/log/log.h"
|
|
43
|
-
#include "absl/status/status.h"
|
|
44
|
-
#include "absl/status/statusor.h"
|
|
45
|
-
#include "absl/strings/cord.h"
|
|
46
|
-
#include "absl/strings/numbers.h"
|
|
47
|
-
#include "absl/strings/str_cat.h"
|
|
48
|
-
#include "absl/strings/str_join.h"
|
|
49
|
-
#include "absl/strings/string_view.h"
|
|
50
40
|
#include "src/core/call/metadata_batch.h"
|
|
51
41
|
#include "src/core/call/status_util.h"
|
|
52
42
|
#include "src/core/channelz/channel_trace.h"
|
|
@@ -96,6 +86,7 @@
|
|
|
96
86
|
#include "src/core/service_config/service_config_impl.h"
|
|
97
87
|
#include "src/core/util/crash.h"
|
|
98
88
|
#include "src/core/util/debug_location.h"
|
|
89
|
+
#include "src/core/util/grpc_check.h"
|
|
99
90
|
#include "src/core/util/json/json.h"
|
|
100
91
|
#include "src/core/util/manual_constructor.h"
|
|
101
92
|
#include "src/core/util/status_helper.h"
|
|
@@ -103,6 +94,15 @@
|
|
|
103
94
|
#include "src/core/util/unique_type_name.h"
|
|
104
95
|
#include "src/core/util/useful.h"
|
|
105
96
|
#include "src/core/util/work_serializer.h"
|
|
97
|
+
#include "absl/cleanup/cleanup.h"
|
|
98
|
+
#include "absl/log/log.h"
|
|
99
|
+
#include "absl/status/status.h"
|
|
100
|
+
#include "absl/status/statusor.h"
|
|
101
|
+
#include "absl/strings/cord.h"
|
|
102
|
+
#include "absl/strings/numbers.h"
|
|
103
|
+
#include "absl/strings/str_cat.h"
|
|
104
|
+
#include "absl/strings/str_join.h"
|
|
105
|
+
#include "absl/strings/string_view.h"
|
|
106
106
|
|
|
107
107
|
//
|
|
108
108
|
// Client channel filter
|
|
@@ -118,6 +118,15 @@ using internal::ClientChannelMethodParsedConfig;
|
|
|
118
118
|
|
|
119
119
|
class ClientChannelFilter::CallData {
|
|
120
120
|
public:
|
|
121
|
+
static grpc_error_handle Init(grpc_call_element* elem,
|
|
122
|
+
const grpc_call_element_args* args);
|
|
123
|
+
static void Destroy(grpc_call_element* elem,
|
|
124
|
+
const grpc_call_final_info* final_info,
|
|
125
|
+
grpc_closure* then_schedule_closure);
|
|
126
|
+
static void StartTransportStreamOpBatch(
|
|
127
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
|
|
128
|
+
static void SetPollent(grpc_call_element* elem, grpc_polling_entity* pollent);
|
|
129
|
+
|
|
121
130
|
// Removes the call from the channel's list of calls queued
|
|
122
131
|
// for name resolution.
|
|
123
132
|
void RemoveCallFromResolverQueuedCallsLocked()
|
|
@@ -125,16 +134,21 @@ class ClientChannelFilter::CallData {
|
|
|
125
134
|
|
|
126
135
|
// Called by the channel for each queued call when a new resolution
|
|
127
136
|
// result becomes available.
|
|
128
|
-
|
|
129
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_)
|
|
137
|
+
void RetryCheckResolutionLocked()
|
|
138
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_);
|
|
139
|
+
|
|
140
|
+
private:
|
|
141
|
+
class ResolverQueuedCallCanceller;
|
|
142
|
+
|
|
143
|
+
CallData(grpc_call_element* elem, const grpc_call_element_args& args);
|
|
130
144
|
|
|
131
|
-
|
|
132
|
-
return
|
|
145
|
+
ClientChannelFilter* chand() const {
|
|
146
|
+
return static_cast<ClientChannelFilter*>(elem_->channel_data);
|
|
133
147
|
}
|
|
134
148
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
149
|
+
grpc_metadata_batch* send_initial_metadata() {
|
|
150
|
+
return buffered_call_.send_initial_metadata();
|
|
151
|
+
}
|
|
138
152
|
|
|
139
153
|
// Checks whether a resolver result is available. The following
|
|
140
154
|
// outcomes are possible:
|
|
@@ -148,13 +162,6 @@ class ClientChannelFilter::CallData {
|
|
|
148
162
|
// stored in the call context and an OK status will be returned.
|
|
149
163
|
std::optional<absl::Status> CheckResolution(bool was_queued);
|
|
150
164
|
|
|
151
|
-
private:
|
|
152
|
-
// Accessors for data stored in the subclass.
|
|
153
|
-
virtual ClientChannelFilter* chand() const = 0;
|
|
154
|
-
virtual Arena* arena() const = 0;
|
|
155
|
-
virtual grpc_polling_entity* pollent() = 0;
|
|
156
|
-
virtual grpc_metadata_batch* send_initial_metadata() = 0;
|
|
157
|
-
|
|
158
165
|
// Helper function for CheckResolution(). Returns true if the call
|
|
159
166
|
// can continue (i.e., there is a valid resolution result, or there is
|
|
160
167
|
// an invalid resolution result but the call is not wait_for_ready).
|
|
@@ -166,10 +173,6 @@ class ClientChannelFilter::CallData {
|
|
|
166
173
|
void AddCallToResolverQueuedCallsLocked()
|
|
167
174
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_);
|
|
168
175
|
|
|
169
|
-
// Called when adding the call to the resolver queue.
|
|
170
|
-
virtual void OnAddToQueueLocked()
|
|
171
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_) {}
|
|
172
|
-
|
|
173
176
|
// Applies service config to the call. Must be invoked once we know
|
|
174
177
|
// that the resolver has returned results to the channel.
|
|
175
178
|
// If an error is returned, the error indicates the status with which
|
|
@@ -179,90 +182,19 @@ class ClientChannelFilter::CallData {
|
|
|
179
182
|
|
|
180
183
|
// Called to reset the deadline based on the service config obtained
|
|
181
184
|
// from the resolver.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
: public ClientChannelFilter::CallData {
|
|
189
|
-
public:
|
|
190
|
-
static grpc_error_handle Init(grpc_call_element* elem,
|
|
191
|
-
const grpc_call_element_args* args);
|
|
192
|
-
static void Destroy(grpc_call_element* elem,
|
|
193
|
-
const grpc_call_final_info* final_info,
|
|
194
|
-
grpc_closure* then_schedule_closure);
|
|
195
|
-
static void StartTransportStreamOpBatch(
|
|
196
|
-
grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
|
|
197
|
-
static void SetPollent(grpc_call_element* elem, grpc_polling_entity* pollent);
|
|
198
|
-
|
|
199
|
-
private:
|
|
200
|
-
class ResolverQueuedCallCanceller;
|
|
201
|
-
|
|
202
|
-
FilterBasedCallData(grpc_call_element* elem,
|
|
203
|
-
const grpc_call_element_args& args);
|
|
204
|
-
~FilterBasedCallData() override;
|
|
205
|
-
|
|
206
|
-
grpc_call_element* elem() const { return elem_; }
|
|
207
|
-
grpc_call_stack* owning_call() const { return owning_call_; }
|
|
208
|
-
CallCombiner* call_combiner() const { return call_combiner_; }
|
|
209
|
-
|
|
210
|
-
ClientChannelFilter* chand() const override {
|
|
211
|
-
return static_cast<ClientChannelFilter*>(elem()->channel_data);
|
|
212
|
-
}
|
|
213
|
-
Arena* arena() const override { return arena_; }
|
|
214
|
-
grpc_polling_entity* pollent() override { return pollent_; }
|
|
215
|
-
grpc_metadata_batch* send_initial_metadata() override {
|
|
216
|
-
return pending_batches_[0]
|
|
217
|
-
->payload->send_initial_metadata.send_initial_metadata;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Returns the index into pending_batches_ to be used for batch.
|
|
221
|
-
static size_t GetBatchIndex(grpc_transport_stream_op_batch* batch);
|
|
222
|
-
void PendingBatchesAdd(grpc_transport_stream_op_batch* batch);
|
|
223
|
-
static void FailPendingBatchInCallCombiner(void* arg,
|
|
224
|
-
grpc_error_handle error);
|
|
225
|
-
// A predicate type and some useful implementations for PendingBatchesFail().
|
|
226
|
-
typedef bool (*YieldCallCombinerPredicate)(
|
|
227
|
-
const CallCombinerClosureList& closures);
|
|
228
|
-
static bool YieldCallCombiner(const CallCombinerClosureList& /*closures*/) {
|
|
229
|
-
return true;
|
|
230
|
-
}
|
|
231
|
-
static bool NoYieldCallCombiner(const CallCombinerClosureList& /*closures*/) {
|
|
232
|
-
return false;
|
|
185
|
+
void ResetDeadline(Duration timeout) {
|
|
186
|
+
const Timestamp per_method_deadline =
|
|
187
|
+
Timestamp::FromCycleCounterRoundUp(call_start_time_) + timeout;
|
|
188
|
+
arena_->GetContext<Call>()
|
|
189
|
+
->UpdateDeadline(per_method_deadline)
|
|
190
|
+
.IgnoreError();
|
|
233
191
|
}
|
|
234
|
-
static bool YieldCallCombinerIfPendingBatchesFound(
|
|
235
|
-
const CallCombinerClosureList& closures) {
|
|
236
|
-
return closures.size() > 0;
|
|
237
|
-
}
|
|
238
|
-
// Fails all pending batches.
|
|
239
|
-
// If yield_call_combiner_predicate returns true, assumes responsibility for
|
|
240
|
-
// yielding the call combiner.
|
|
241
|
-
void PendingBatchesFail(
|
|
242
|
-
grpc_error_handle error,
|
|
243
|
-
YieldCallCombinerPredicate yield_call_combiner_predicate);
|
|
244
|
-
static void ResumePendingBatchInCallCombiner(void* arg,
|
|
245
|
-
grpc_error_handle ignored);
|
|
246
|
-
// Resumes all pending batches on dynamic_call_.
|
|
247
|
-
void PendingBatchesResume();
|
|
248
192
|
|
|
249
193
|
// Called to check for a resolution result, both when the call is
|
|
250
194
|
// initially started and when it is queued and the channel gets a new
|
|
251
195
|
// resolution result.
|
|
252
196
|
void TryCheckResolution(bool was_queued);
|
|
253
197
|
|
|
254
|
-
void OnAddToQueueLocked() override
|
|
255
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_);
|
|
256
|
-
|
|
257
|
-
void RetryCheckResolutionLocked() override
|
|
258
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannelFilter::resolution_mu_);
|
|
259
|
-
|
|
260
|
-
void ResetDeadline(Duration timeout) override {
|
|
261
|
-
const Timestamp per_method_deadline =
|
|
262
|
-
Timestamp::FromCycleCounterRoundUp(call_start_time_) + timeout;
|
|
263
|
-
arena_->GetContext<Call>()->UpdateDeadline(per_method_deadline);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
198
|
void CreateDynamicCall();
|
|
267
199
|
|
|
268
200
|
static void RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
|
|
@@ -285,14 +217,10 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
|
285
217
|
grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
|
|
286
218
|
grpc_closure recv_trailing_metadata_ready_;
|
|
287
219
|
|
|
220
|
+
RefCountedPtr<DynamicFilters> dynamic_filters_;
|
|
288
221
|
RefCountedPtr<DynamicFilters::Call> dynamic_call_;
|
|
289
222
|
|
|
290
|
-
|
|
291
|
-
// They are removed when we are done handling the batch (i.e., when
|
|
292
|
-
// either we have invoked all of the batch's callbacks or we have
|
|
293
|
-
// passed the batch down to the LB call and are not intercepting any of
|
|
294
|
-
// its callbacks).
|
|
295
|
-
grpc_transport_stream_op_batch* pending_batches_[MAX_PENDING_BATCHES] = {};
|
|
223
|
+
BufferedCall buffered_call_;
|
|
296
224
|
|
|
297
225
|
// Set when we get a cancel_stream op.
|
|
298
226
|
grpc_error_handle cancel_error_;
|
|
@@ -303,12 +231,12 @@ class ClientChannelFilter::FilterBasedCallData final
|
|
|
303
231
|
//
|
|
304
232
|
|
|
305
233
|
const grpc_channel_filter ClientChannelFilter::kFilter = {
|
|
306
|
-
ClientChannelFilter::
|
|
234
|
+
ClientChannelFilter::CallData::StartTransportStreamOpBatch,
|
|
307
235
|
ClientChannelFilter::StartTransportOp,
|
|
308
|
-
sizeof(ClientChannelFilter::
|
|
309
|
-
ClientChannelFilter::
|
|
310
|
-
ClientChannelFilter::
|
|
311
|
-
ClientChannelFilter::
|
|
236
|
+
sizeof(ClientChannelFilter::CallData),
|
|
237
|
+
ClientChannelFilter::CallData::Init,
|
|
238
|
+
ClientChannelFilter::CallData::SetPollent,
|
|
239
|
+
ClientChannelFilter::CallData::Destroy,
|
|
312
240
|
sizeof(ClientChannelFilter),
|
|
313
241
|
ClientChannelFilter::Init,
|
|
314
242
|
grpc_channel_stack_no_post_init,
|
|
@@ -336,8 +264,8 @@ class DynamicTerminationFilter final {
|
|
|
336
264
|
|
|
337
265
|
static grpc_error_handle Init(grpc_channel_element* elem,
|
|
338
266
|
grpc_channel_element_args* args) {
|
|
339
|
-
|
|
340
|
-
|
|
267
|
+
GRPC_CHECK(args->is_last);
|
|
268
|
+
GRPC_CHECK(elem->filter == &kFilterVtable);
|
|
341
269
|
new (elem->channel_data) DynamicTerminationFilter(args->channel_args);
|
|
342
270
|
return absl::OkStatus();
|
|
343
271
|
}
|
|
@@ -421,7 +349,7 @@ class DynamicTerminationFilter::CallData final {
|
|
|
421
349
|
grpc_call_stack* owning_call_;
|
|
422
350
|
CallCombiner* call_combiner_;
|
|
423
351
|
|
|
424
|
-
OrphanablePtr<ClientChannelFilter::
|
|
352
|
+
OrphanablePtr<ClientChannelFilter::LoadBalancedCall> lb_call_;
|
|
425
353
|
};
|
|
426
354
|
|
|
427
355
|
const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
|
|
@@ -483,32 +411,31 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
483
411
|
: public SubchannelInterface {
|
|
484
412
|
public:
|
|
485
413
|
SubchannelWrapper(ClientChannelFilter* chand,
|
|
486
|
-
RefCountedPtr<Subchannel> subchannel
|
|
414
|
+
RefCountedPtr<Subchannel> subchannel,
|
|
415
|
+
uint32_t max_connections_per_subchannel)
|
|
487
416
|
: SubchannelInterface(GRPC_TRACE_FLAG_ENABLED(client_channel)
|
|
488
417
|
? "SubchannelWrapper"
|
|
489
418
|
: nullptr),
|
|
490
419
|
chand_(chand),
|
|
491
|
-
subchannel_(std::move(subchannel))
|
|
420
|
+
subchannel_(std::move(subchannel)),
|
|
421
|
+
max_connections_per_subchannel_(max_connections_per_subchannel) {
|
|
492
422
|
GRPC_TRACE_LOG(client_channel, INFO)
|
|
493
423
|
<< "chand=" << chand << ": creating subchannel wrapper " << this
|
|
494
|
-
<< " for subchannel " << subchannel_.get()
|
|
424
|
+
<< " for subchannel " << subchannel_.get()
|
|
425
|
+
<< ", max_connections_per_subchannel="
|
|
426
|
+
<< max_connections_per_subchannel;
|
|
495
427
|
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "SubchannelWrapper");
|
|
496
428
|
#ifndef NDEBUG
|
|
497
|
-
|
|
429
|
+
GRPC_DCHECK(chand_->work_serializer_->RunningInWorkSerializer());
|
|
498
430
|
#endif
|
|
499
|
-
|
|
431
|
+
auto& subchannel_wrappers = chand_->subchannel_map_[subchannel_.get()];
|
|
432
|
+
if (subchannel_wrappers.empty() && chand_->channelz_node_ != nullptr) {
|
|
500
433
|
auto* subchannel_node = subchannel_->channelz_node();
|
|
501
434
|
if (subchannel_node != nullptr) {
|
|
502
|
-
|
|
503
|
-
if (it == chand_->subchannel_refcount_map_.end()) {
|
|
504
|
-
subchannel_node->AddParent(chand_->channelz_node_);
|
|
505
|
-
it = chand_->subchannel_refcount_map_.emplace(subchannel_.get(), 0)
|
|
506
|
-
.first;
|
|
507
|
-
}
|
|
508
|
-
++it->second;
|
|
435
|
+
subchannel_node->AddParent(chand_->channelz_node_);
|
|
509
436
|
}
|
|
510
437
|
}
|
|
511
|
-
|
|
438
|
+
subchannel_wrappers.insert(this);
|
|
512
439
|
}
|
|
513
440
|
|
|
514
441
|
~SubchannelWrapper() override {
|
|
@@ -523,33 +450,47 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
523
450
|
// WorkSerializer.
|
|
524
451
|
// Ref held by callback.
|
|
525
452
|
WeakRef(DEBUG_LOCATION, "subchannel map cleanup").release();
|
|
526
|
-
chand_->work_serializer_->Run(
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
453
|
+
chand_->work_serializer_->Run(
|
|
454
|
+
[this]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
|
455
|
+
auto it = chand_->subchannel_map_.find(subchannel_.get());
|
|
456
|
+
GRPC_CHECK(it != chand_->subchannel_map_.end());
|
|
457
|
+
auto& subchannel_wrappers = it->second;
|
|
458
|
+
subchannel_wrappers.erase(this);
|
|
459
|
+
if (subchannel_wrappers.empty()) {
|
|
460
|
+
if (chand_->channelz_node_ != nullptr) {
|
|
461
|
+
auto* subchannel_node = subchannel_->channelz_node();
|
|
462
|
+
if (subchannel_node != nullptr) {
|
|
463
|
+
subchannel_node->RemoveParent(chand_->channelz_node_);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
chand_->subchannel_map_.erase(it);
|
|
538
467
|
}
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
468
|
+
if (IsSubchannelWrapperCleanupOnOrphanEnabled()) {
|
|
469
|
+
// We need to make sure that the internal subchannel gets unreffed
|
|
470
|
+
// inside of the WorkSerializer, so that updates to the local
|
|
471
|
+
// subchannel pool are properly synchronized. To that end, we
|
|
472
|
+
// drop our ref to the internal subchannel here. We also cancel
|
|
473
|
+
// any watchers that were not properly cancelled, in case any of
|
|
474
|
+
// them are holding a ref to the internal subchannel.
|
|
475
|
+
for (const auto& [_, watcher] : watcher_map_) {
|
|
476
|
+
subchannel_->CancelConnectivityStateWatch(watcher);
|
|
477
|
+
}
|
|
478
|
+
watcher_map_.clear();
|
|
479
|
+
data_watchers_.clear();
|
|
480
|
+
subchannel_.reset();
|
|
481
|
+
}
|
|
482
|
+
WeakUnref(DEBUG_LOCATION, "subchannel map cleanup");
|
|
483
|
+
});
|
|
543
484
|
}
|
|
544
485
|
|
|
545
486
|
void WatchConnectivityState(
|
|
546
487
|
std::unique_ptr<ConnectivityStateWatcherInterface> watcher) override
|
|
547
488
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
|
548
489
|
auto& watcher_wrapper = watcher_map_[watcher.get()];
|
|
549
|
-
|
|
490
|
+
GRPC_CHECK_EQ(watcher_wrapper, nullptr);
|
|
550
491
|
watcher_wrapper = new WatcherWrapper(
|
|
551
492
|
std::move(watcher),
|
|
552
|
-
|
|
493
|
+
WeakRefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION, "WatcherWrapper"));
|
|
553
494
|
subchannel_->WatchConnectivityState(
|
|
554
495
|
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
|
|
555
496
|
watcher_wrapper));
|
|
@@ -558,7 +499,7 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
558
499
|
void CancelConnectivityStateWatch(ConnectivityStateWatcherInterface* watcher)
|
|
559
500
|
override ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
|
560
501
|
auto it = watcher_map_.find(watcher);
|
|
561
|
-
|
|
502
|
+
GRPC_CHECK(it != watcher_map_.end());
|
|
562
503
|
subchannel_->CancelConnectivityStateWatch(it->second);
|
|
563
504
|
watcher_map_.erase(it);
|
|
564
505
|
}
|
|
@@ -575,7 +516,7 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
575
516
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
|
576
517
|
static_cast<InternalSubchannelDataWatcherInterface*>(watcher.get())
|
|
577
518
|
->SetSubchannel(subchannel_.get());
|
|
578
|
-
|
|
519
|
+
GRPC_CHECK(data_watchers_.insert(std::move(watcher)).second);
|
|
579
520
|
}
|
|
580
521
|
|
|
581
522
|
void CancelDataWatcher(DataWatcherInterface* watcher) override
|
|
@@ -584,10 +525,6 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
584
525
|
if (it != data_watchers_.end()) data_watchers_.erase(it);
|
|
585
526
|
}
|
|
586
527
|
|
|
587
|
-
void ThrottleKeepaliveTime(int new_keepalive_time) {
|
|
588
|
-
subchannel_->ThrottleKeepaliveTime(new_keepalive_time);
|
|
589
|
-
}
|
|
590
|
-
|
|
591
528
|
std::string address() const override { return subchannel_->address(); }
|
|
592
529
|
|
|
593
530
|
private:
|
|
@@ -609,7 +546,7 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
609
546
|
WatcherWrapper(
|
|
610
547
|
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
|
611
548
|
watcher,
|
|
612
|
-
|
|
549
|
+
WeakRefCountedPtr<SubchannelWrapper> parent)
|
|
613
550
|
: watcher_(std::move(watcher)), parent_(std::move(parent)) {}
|
|
614
551
|
|
|
615
552
|
~WatcherWrapper() override {
|
|
@@ -621,7 +558,6 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
621
558
|
GRPC_TRACE_LOG(client_channel, INFO)
|
|
622
559
|
<< "chand=" << parent_->chand_
|
|
623
560
|
<< ": connectivity change for subchannel wrapper " << parent_.get()
|
|
624
|
-
<< " subchannel " << parent_->subchannel_.get()
|
|
625
561
|
<< "hopping into work_serializer";
|
|
626
562
|
auto self = RefAsSubclass<WatcherWrapper>();
|
|
627
563
|
parent_->chand_->work_serializer_->Run(
|
|
@@ -631,6 +567,23 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
631
567
|
});
|
|
632
568
|
}
|
|
633
569
|
|
|
570
|
+
void OnKeepaliveUpdate(Duration new_keepalive_time) override {
|
|
571
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
|
572
|
+
<< "chand=" << parent_->chand_
|
|
573
|
+
<< ": keepalive update for subchannel wrapper " << parent_.get()
|
|
574
|
+
<< "hopping into work_serializer";
|
|
575
|
+
auto self = RefAsSubclass<WatcherWrapper>();
|
|
576
|
+
parent_->chand_->work_serializer_->Run(
|
|
577
|
+
[self, new_keepalive_time]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
|
|
578
|
+
*self->parent_->chand_->work_serializer_) {
|
|
579
|
+
self->ApplyKeepaliveThrottlingInWorkSerializer(new_keepalive_time);
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
uint32_t max_connections_per_subchannel() const override {
|
|
584
|
+
return parent_->max_connections_per_subchannel_;
|
|
585
|
+
}
|
|
586
|
+
|
|
634
587
|
grpc_pollset_set* interested_parties() override {
|
|
635
588
|
return watcher_->interested_parties();
|
|
636
589
|
}
|
|
@@ -646,29 +599,33 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
646
599
|
<< parent_.get() << " subchannel " << parent_->subchannel_.get()
|
|
647
600
|
<< " watcher=" << watcher_.get()
|
|
648
601
|
<< " state=" << ConnectivityStateName(state) << " status=" << status;
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
602
|
+
if (!IsTransportStateWatcherEnabled()) {
|
|
603
|
+
auto keepalive_throttling = status.GetPayload(kKeepaliveThrottlingKey);
|
|
604
|
+
if (keepalive_throttling.has_value()) {
|
|
605
|
+
int new_keepalive_time_ms = -1;
|
|
606
|
+
if (absl::SimpleAtoi(std::string(keepalive_throttling.value()),
|
|
607
|
+
&new_keepalive_time_ms)) {
|
|
608
|
+
Duration new_keepalive_time =
|
|
609
|
+
Duration::Milliseconds(new_keepalive_time_ms);
|
|
610
|
+
if (new_keepalive_time > parent_->chand_->keepalive_time_) {
|
|
611
|
+
parent_->chand_->keepalive_time_ = new_keepalive_time;
|
|
612
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
|
613
|
+
<< "chand=" << parent_->chand_
|
|
614
|
+
<< ": throttling keepalive time to "
|
|
615
|
+
<< parent_->chand_->keepalive_time_;
|
|
616
|
+
// Propagate the new keepalive time to all subchannels. This is
|
|
617
|
+
// so that new transports created by any subchannel (and not
|
|
618
|
+
// just the subchannel that received the GOAWAY), use the new
|
|
619
|
+
// keepalive time.
|
|
620
|
+
for (auto& [subchannel, _] : parent_->chand_->subchannel_map_) {
|
|
621
|
+
subchannel->ThrottleKeepaliveTime(new_keepalive_time);
|
|
622
|
+
}
|
|
666
623
|
}
|
|
624
|
+
} else {
|
|
625
|
+
LOG(ERROR) << "chand=" << parent_->chand_
|
|
626
|
+
<< ": Illegal keepalive throttling value "
|
|
627
|
+
<< std::string(keepalive_throttling.value());
|
|
667
628
|
}
|
|
668
|
-
} else {
|
|
669
|
-
LOG(ERROR) << "chand=" << parent_->chand_
|
|
670
|
-
<< ": Illegal keepalive throttling value "
|
|
671
|
-
<< std::string(keepalive_throttling.value());
|
|
672
629
|
}
|
|
673
630
|
}
|
|
674
631
|
// Propagate status only in state TF.
|
|
@@ -680,9 +637,26 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
680
637
|
state == GRPC_CHANNEL_TRANSIENT_FAILURE ? status : absl::OkStatus());
|
|
681
638
|
}
|
|
682
639
|
|
|
640
|
+
void ApplyKeepaliveThrottlingInWorkSerializer(Duration new_keepalive_time)
|
|
641
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*parent_->chand_->work_serializer_) {
|
|
642
|
+
if (new_keepalive_time > parent_->chand_->keepalive_time_) {
|
|
643
|
+
parent_->chand_->keepalive_time_ = new_keepalive_time;
|
|
644
|
+
GRPC_TRACE_LOG(client_channel, INFO)
|
|
645
|
+
<< "chand=" << parent_->chand_ << ": throttling keepalive time to "
|
|
646
|
+
<< parent_->chand_->keepalive_time_;
|
|
647
|
+
// Propagate the new keepalive time to all subchannels. This is so
|
|
648
|
+
// that new transports created by any subchannel (and not just the
|
|
649
|
+
// subchannel that received the GOAWAY), use the new keepalive time.
|
|
650
|
+
for (auto& [subchannel, _] : parent_->chand_->subchannel_map_) {
|
|
651
|
+
if (parent_->subchannel_ == subchannel) continue;
|
|
652
|
+
subchannel->ThrottleKeepaliveTime(new_keepalive_time);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
683
657
|
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
|
684
658
|
watcher_;
|
|
685
|
-
|
|
659
|
+
WeakRefCountedPtr<SubchannelWrapper> parent_;
|
|
686
660
|
};
|
|
687
661
|
|
|
688
662
|
// A heterogenous lookup comparator for data watchers that allows
|
|
@@ -705,6 +679,7 @@ class ClientChannelFilter::SubchannelWrapper final
|
|
|
705
679
|
|
|
706
680
|
ClientChannelFilter* chand_;
|
|
707
681
|
RefCountedPtr<Subchannel> subchannel_;
|
|
682
|
+
const uint32_t max_connections_per_subchannel_;
|
|
708
683
|
// Maps from the address of the watcher passed to us by the LB policy
|
|
709
684
|
// to the address of the WrapperWatcher that we passed to the underlying
|
|
710
685
|
// subchannel. This is needed so that when the LB policy calls
|
|
@@ -736,7 +711,7 @@ ClientChannelFilter::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
|
|
|
736
711
|
{
|
|
737
712
|
MutexLock lock(&chand_->external_watchers_mu_);
|
|
738
713
|
// Will be deleted when the watch is complete.
|
|
739
|
-
|
|
714
|
+
GRPC_CHECK(chand->external_watchers_[on_complete] == nullptr);
|
|
740
715
|
// Store a ref to the watcher in the external_watchers_ map.
|
|
741
716
|
chand->external_watchers_[on_complete] =
|
|
742
717
|
RefAsSubclass<ExternalConnectivityWatcher>(
|
|
@@ -916,6 +891,17 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
|
916
891
|
const ChannelArgs& args) override
|
|
917
892
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
|
918
893
|
if (chand_->resolver_ == nullptr) return nullptr; // Shutting down.
|
|
894
|
+
// Determine max_connections_per_subchannel.
|
|
895
|
+
const uint32_t cap =
|
|
896
|
+
args.GetInt(GRPC_ARG_MAX_CONNECTIONS_PER_SUBCHANNEL_CAP).value_or(10);
|
|
897
|
+
uint32_t max_connections_per_subchannel =
|
|
898
|
+
args.GetInt(GRPC_ARG_MAX_CONNECTIONS_PER_SUBCHANNEL)
|
|
899
|
+
.value_or(
|
|
900
|
+
per_address_args.GetInt(GRPC_ARG_MAX_CONNECTIONS_PER_SUBCHANNEL)
|
|
901
|
+
.value_or(1));
|
|
902
|
+
max_connections_per_subchannel =
|
|
903
|
+
std::min(max_connections_per_subchannel, cap);
|
|
904
|
+
// Modify args for subchannel.
|
|
919
905
|
ChannelArgs subchannel_args = Subchannel::MakeSubchannelArgs(
|
|
920
906
|
args, per_address_args, chand_->subchannel_pool_,
|
|
921
907
|
chand_->default_authority_);
|
|
@@ -927,7 +913,8 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
|
927
913
|
// Make sure the subchannel has updated keepalive time.
|
|
928
914
|
subchannel->ThrottleKeepaliveTime(chand_->keepalive_time_);
|
|
929
915
|
// Create and return wrapper for the subchannel.
|
|
930
|
-
return MakeRefCounted<SubchannelWrapper>(chand_, std::move(subchannel)
|
|
916
|
+
return MakeRefCounted<SubchannelWrapper>(chand_, std::move(subchannel),
|
|
917
|
+
max_connections_per_subchannel);
|
|
931
918
|
}
|
|
932
919
|
|
|
933
920
|
void UpdateState(grpc_connectivity_state state, const absl::Status& status,
|
|
@@ -996,8 +983,8 @@ class ClientChannelFilter::ClientChannelControlHelper final
|
|
|
996
983
|
|
|
997
984
|
grpc_error_handle ClientChannelFilter::Init(grpc_channel_element* elem,
|
|
998
985
|
grpc_channel_element_args* args) {
|
|
999
|
-
|
|
1000
|
-
|
|
986
|
+
GRPC_CHECK(args->is_last);
|
|
987
|
+
GRPC_CHECK(elem->filter == &kFilter);
|
|
1001
988
|
grpc_error_handle error;
|
|
1002
989
|
new (elem->channel_data) ClientChannelFilter(args, &error);
|
|
1003
990
|
return error;
|
|
@@ -1015,11 +1002,7 @@ RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
|
|
|
1015
1002
|
if (args.GetBool(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL).value_or(false)) {
|
|
1016
1003
|
return MakeRefCounted<LocalSubchannelPool>();
|
|
1017
1004
|
}
|
|
1018
|
-
|
|
1019
|
-
return GlobalSubchannelPool::instance();
|
|
1020
|
-
} else {
|
|
1021
|
-
return LegacyGlobalSubchannelPool::instance();
|
|
1022
|
-
}
|
|
1005
|
+
return GlobalSubchannelPool::instance();
|
|
1023
1006
|
}
|
|
1024
1007
|
|
|
1025
1008
|
} // namespace
|
|
@@ -1089,9 +1072,7 @@ ClientChannelFilter::ClientChannelFilter(grpc_channel_element_args* args,
|
|
|
1089
1072
|
// Set initial keepalive time.
|
|
1090
1073
|
auto keepalive_arg = channel_args_.GetInt(GRPC_ARG_KEEPALIVE_TIME_MS);
|
|
1091
1074
|
if (keepalive_arg.has_value()) {
|
|
1092
|
-
keepalive_time_ = Clamp(*keepalive_arg, 1, INT_MAX);
|
|
1093
|
-
} else {
|
|
1094
|
-
keepalive_time_ = -1; // unset
|
|
1075
|
+
keepalive_time_ = Duration::Milliseconds(Clamp(*keepalive_arg, 1, INT_MAX));
|
|
1095
1076
|
}
|
|
1096
1077
|
// Set default authority.
|
|
1097
1078
|
std::optional<std::string> default_authority =
|
|
@@ -1116,16 +1097,15 @@ ClientChannelFilter::~ClientChannelFilter() {
|
|
|
1116
1097
|
grpc_pollset_set_destroy(interested_parties_);
|
|
1117
1098
|
}
|
|
1118
1099
|
|
|
1119
|
-
OrphanablePtr<ClientChannelFilter::
|
|
1100
|
+
OrphanablePtr<ClientChannelFilter::LoadBalancedCall>
|
|
1120
1101
|
ClientChannelFilter::CreateLoadBalancedCall(
|
|
1121
1102
|
const grpc_call_element_args& args, grpc_polling_entity* pollent,
|
|
1122
1103
|
grpc_closure* on_call_destruction_complete,
|
|
1123
1104
|
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry) {
|
|
1124
1105
|
promise_detail::Context<Arena> arena_ctx(args.arena);
|
|
1125
|
-
return OrphanablePtr<
|
|
1126
|
-
args
|
|
1127
|
-
|
|
1128
|
-
std::move(on_commit), is_transparent_retry));
|
|
1106
|
+
return OrphanablePtr<LoadBalancedCall>(args.arena->New<LoadBalancedCall>(
|
|
1107
|
+
this, args, pollent, on_call_destruction_complete, std::move(on_commit),
|
|
1108
|
+
is_transparent_retry));
|
|
1129
1109
|
}
|
|
1130
1110
|
|
|
1131
1111
|
void ClientChannelFilter::ReprocessQueuedResolverCalls() {
|
|
@@ -1189,7 +1169,7 @@ RefCountedPtr<LoadBalancingPolicy::Config> ChooseLbPolicy(
|
|
|
1189
1169
|
// - A channel arg, in which case we check that the specified policy exists
|
|
1190
1170
|
// and accepts an empty config. If not, we revert to using pick_first
|
|
1191
1171
|
// lb_policy
|
|
1192
|
-
|
|
1172
|
+
GRPC_CHECK(lb_policy_config.ok());
|
|
1193
1173
|
return std::move(*lb_policy_config);
|
|
1194
1174
|
}
|
|
1195
1175
|
|
|
@@ -1280,6 +1260,12 @@ void ClientChannelFilter::OnResolverResultChangedLocked(
|
|
|
1280
1260
|
static_cast<const internal::ClientChannelGlobalParsedConfig*>(
|
|
1281
1261
|
service_config->GetGlobalParsedConfig(
|
|
1282
1262
|
service_config_parser_index_));
|
|
1263
|
+
// Set max_connections_per_subchannel from service config.
|
|
1264
|
+
if (parsed_service_config->max_connections_per_subchannel() != 0) {
|
|
1265
|
+
result.args = result.args.Set(
|
|
1266
|
+
GRPC_ARG_MAX_CONNECTIONS_PER_SUBCHANNEL,
|
|
1267
|
+
parsed_service_config->max_connections_per_subchannel());
|
|
1268
|
+
}
|
|
1283
1269
|
// Choose LB policy config.
|
|
1284
1270
|
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config =
|
|
1285
1271
|
ChooseLbPolicy(result, parsed_service_config);
|
|
@@ -1458,7 +1444,7 @@ void ClientChannelFilter::UpdateServiceConfigInDataPlaneLocked(
|
|
|
1458
1444
|
blackboard_ = std::move(new_blackboard);
|
|
1459
1445
|
RefCountedPtr<DynamicFilters> dynamic_filters =
|
|
1460
1446
|
DynamicFilters::Create(new_args, std::move(filters), blackboard_.get());
|
|
1461
|
-
|
|
1447
|
+
GRPC_CHECK(dynamic_filters != nullptr);
|
|
1462
1448
|
// Grab data plane lock to update service config.
|
|
1463
1449
|
//
|
|
1464
1450
|
// We defer unreffing the old values (and deallocating memory) until
|
|
@@ -1488,7 +1474,7 @@ void ClientChannelFilter::CreateResolverLocked() {
|
|
|
1488
1474
|
std::make_unique<ResolverResultHandler>(this));
|
|
1489
1475
|
// Since the validity of the args was checked when the channel was created,
|
|
1490
1476
|
// CreateResolver() must return a non-null result.
|
|
1491
|
-
|
|
1477
|
+
GRPC_CHECK(resolver_ != nullptr);
|
|
1492
1478
|
UpdateStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status(),
|
|
1493
1479
|
"started resolving");
|
|
1494
1480
|
resolver_->StartLocked();
|
|
@@ -1598,7 +1584,7 @@ T HandlePickResult(
|
|
|
1598
1584
|
}
|
|
1599
1585
|
auto* drop_pick =
|
|
1600
1586
|
std::get_if<LoadBalancingPolicy::PickResult::Drop>(&result->result);
|
|
1601
|
-
|
|
1587
|
+
GRPC_CHECK_NE(drop_pick, nullptr);
|
|
1602
1588
|
return drop_func(drop_pick);
|
|
1603
1589
|
}
|
|
1604
1590
|
|
|
@@ -1691,7 +1677,7 @@ void ClientChannelFilter::StartTransportOpLocked(grpc_transport_op* op) {
|
|
|
1691
1677
|
}
|
|
1692
1678
|
} else {
|
|
1693
1679
|
// Disconnect.
|
|
1694
|
-
|
|
1680
|
+
GRPC_CHECK(disconnect_error_.ok());
|
|
1695
1681
|
disconnect_error_ = op->disconnect_with_error;
|
|
1696
1682
|
UpdateStateAndPickerLocked(
|
|
1697
1683
|
GRPC_CHANNEL_SHUTDOWN, absl::Status(), "shutdown from API",
|
|
@@ -1709,7 +1695,7 @@ void ClientChannelFilter::StartTransportOpLocked(grpc_transport_op* op) {
|
|
|
1709
1695
|
void ClientChannelFilter::StartTransportOp(grpc_channel_element* elem,
|
|
1710
1696
|
grpc_transport_op* op) {
|
|
1711
1697
|
auto* chand = static_cast<ClientChannelFilter*>(elem->channel_data);
|
|
1712
|
-
|
|
1698
|
+
GRPC_CHECK(op->set_accept_stream == false);
|
|
1713
1699
|
// Handle bind_pollset.
|
|
1714
1700
|
if (op->bind_pollset != nullptr) {
|
|
1715
1701
|
grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset);
|
|
@@ -1772,6 +1758,52 @@ void ClientChannelFilter::RemoveConnectivityWatcher(
|
|
|
1772
1758
|
new ConnectivityWatcherRemover(this, watcher);
|
|
1773
1759
|
}
|
|
1774
1760
|
|
|
1761
|
+
//
|
|
1762
|
+
// ClientChannelFilter::CallData::ResolverQueuedCallCanceller
|
|
1763
|
+
//
|
|
1764
|
+
|
|
1765
|
+
// A class to handle the call combiner cancellation callback for a
|
|
1766
|
+
// queued pick.
|
|
1767
|
+
class ClientChannelFilter::CallData::ResolverQueuedCallCanceller final {
|
|
1768
|
+
public:
|
|
1769
|
+
explicit ResolverQueuedCallCanceller(CallData* calld) : calld_(calld) {
|
|
1770
|
+
GRPC_CALL_STACK_REF(calld->owning_call_, "ResolverQueuedCallCanceller");
|
|
1771
|
+
GRPC_CLOSURE_INIT(&closure_, &CancelLocked, this,
|
|
1772
|
+
grpc_schedule_on_exec_ctx);
|
|
1773
|
+
calld->call_combiner_->SetNotifyOnCancel(&closure_);
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
private:
|
|
1777
|
+
static void CancelLocked(void* arg, grpc_error_handle error) {
|
|
1778
|
+
auto* self = static_cast<ResolverQueuedCallCanceller*>(arg);
|
|
1779
|
+
auto* calld = self->calld_;
|
|
1780
|
+
auto* chand = calld->chand();
|
|
1781
|
+
{
|
|
1782
|
+
MutexLock lock(&chand->resolution_mu_);
|
|
1783
|
+
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
1784
|
+
<< "chand=" << chand << " calld=" << calld
|
|
1785
|
+
<< ": cancelling resolver queued pick: "
|
|
1786
|
+
"error="
|
|
1787
|
+
<< StatusToString(error) << " self=" << self
|
|
1788
|
+
<< " calld->resolver_pick_canceller="
|
|
1789
|
+
<< calld->resolver_call_canceller_;
|
|
1790
|
+
if (calld->resolver_call_canceller_ == self && !error.ok()) {
|
|
1791
|
+
// Remove pick from list of queued picks.
|
|
1792
|
+
calld->RemoveCallFromResolverQueuedCallsLocked();
|
|
1793
|
+
chand->resolver_queued_calls_.erase(calld);
|
|
1794
|
+
// Fail pending batches on the call.
|
|
1795
|
+
calld->buffered_call_.Fail(
|
|
1796
|
+
error, BufferedCall::YieldCallCombinerIfPendingBatchesFound);
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
GRPC_CALL_STACK_UNREF(calld->owning_call_, "ResolvingQueuedCallCanceller");
|
|
1800
|
+
delete self;
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1803
|
+
CallData* calld_;
|
|
1804
|
+
grpc_closure closure_;
|
|
1805
|
+
};
|
|
1806
|
+
|
|
1775
1807
|
//
|
|
1776
1808
|
// CallData implementation
|
|
1777
1809
|
//
|
|
@@ -1781,7 +1813,7 @@ void ClientChannelFilter::CallData::RemoveCallFromResolverQueuedCallsLocked() {
|
|
|
1781
1813
|
<< "chand=" << chand() << " calld=" << this
|
|
1782
1814
|
<< ": removing from resolver queued picks list";
|
|
1783
1815
|
// Remove call's pollent from channel's interested_parties.
|
|
1784
|
-
grpc_polling_entity_del_from_pollset_set(
|
|
1816
|
+
grpc_polling_entity_del_from_pollset_set(pollent_,
|
|
1785
1817
|
chand()->interested_parties_);
|
|
1786
1818
|
// Note: There's no need to actually remove the call from the queue
|
|
1787
1819
|
// here, because that will be done in
|
|
@@ -1793,14 +1825,15 @@ void ClientChannelFilter::CallData::AddCallToResolverQueuedCallsLocked() {
|
|
|
1793
1825
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
1794
1826
|
<< "chand=" << chand() << " calld=" << this
|
|
1795
1827
|
<< ": adding to resolver queued picks list; pollent="
|
|
1796
|
-
<< grpc_polling_entity_string(
|
|
1828
|
+
<< grpc_polling_entity_string(pollent_);
|
|
1797
1829
|
// Add call's pollent to channel's interested_parties, so that I/O
|
|
1798
1830
|
// can be done under the call's CQ.
|
|
1799
|
-
grpc_polling_entity_add_to_pollset_set(
|
|
1831
|
+
grpc_polling_entity_add_to_pollset_set(pollent_,
|
|
1800
1832
|
chand()->interested_parties_);
|
|
1801
1833
|
// Add to queue.
|
|
1802
1834
|
chand()->resolver_queued_calls_.insert(this);
|
|
1803
|
-
|
|
1835
|
+
// Register call combiner cancellation callback.
|
|
1836
|
+
resolver_call_canceller_ = new ResolverQueuedCallCanceller(this);
|
|
1804
1837
|
}
|
|
1805
1838
|
|
|
1806
1839
|
grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked(
|
|
@@ -1815,12 +1848,12 @@ grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked(
|
|
|
1815
1848
|
// itself in the call context, so that it can be accessed by filters
|
|
1816
1849
|
// below us in the stack, and it will be cleaned up when the call ends.
|
|
1817
1850
|
auto* service_config_call_data =
|
|
1818
|
-
|
|
1851
|
+
arena_->New<ClientChannelServiceConfigCallData>(arena_);
|
|
1819
1852
|
// Use the ConfigSelector to determine the config for the call.
|
|
1820
1853
|
absl::Status call_config_status =
|
|
1821
1854
|
(*config_selector)
|
|
1822
1855
|
->GetCallConfig(
|
|
1823
|
-
{send_initial_metadata(),
|
|
1856
|
+
{send_initial_metadata(), arena_, service_config_call_data});
|
|
1824
1857
|
if (!call_config_status.ok()) {
|
|
1825
1858
|
return absl_status_to_grpc_error(
|
|
1826
1859
|
MaybeRewriteIllegalStatusCode(call_config_status, "ConfigSelector"));
|
|
@@ -1871,7 +1904,7 @@ std::optional<absl::Status> ClientChannelFilter::CallData::CheckResolution(
|
|
|
1871
1904
|
}
|
|
1872
1905
|
// If the call was queued, add trace annotation.
|
|
1873
1906
|
if (was_queued) {
|
|
1874
|
-
auto* call_tracer =
|
|
1907
|
+
auto* call_tracer = arena_->GetContext<CallSpan>();
|
|
1875
1908
|
if (call_tracer != nullptr) {
|
|
1876
1909
|
call_tracer->RecordAnnotation("Delayed name resolution complete.");
|
|
1877
1910
|
}
|
|
@@ -1909,42 +1942,32 @@ bool ClientChannelFilter::CallData::CheckResolutionLocked(
|
|
|
1909
1942
|
return true;
|
|
1910
1943
|
}
|
|
1911
1944
|
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
//
|
|
1915
|
-
|
|
1916
|
-
ClientChannelFilter::FilterBasedCallData::FilterBasedCallData(
|
|
1917
|
-
grpc_call_element* elem, const grpc_call_element_args& args)
|
|
1945
|
+
ClientChannelFilter::CallData::CallData(grpc_call_element* elem,
|
|
1946
|
+
const grpc_call_element_args& args)
|
|
1918
1947
|
: call_start_time_(args.start_time),
|
|
1919
1948
|
deadline_(args.deadline),
|
|
1920
1949
|
arena_(args.arena),
|
|
1921
1950
|
elem_(elem),
|
|
1922
1951
|
owning_call_(args.call_stack),
|
|
1923
|
-
call_combiner_(args.call_combiner)
|
|
1952
|
+
call_combiner_(args.call_combiner),
|
|
1953
|
+
buffered_call_(call_combiner_, &client_channel_call_trace) {
|
|
1924
1954
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
1925
1955
|
<< "chand=" << chand() << " calld=" << this << ": created call";
|
|
1926
1956
|
}
|
|
1927
1957
|
|
|
1928
|
-
ClientChannelFilter::
|
|
1929
|
-
// Make sure there are no remaining pending batches.
|
|
1930
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
1931
|
-
CHECK_EQ(pending_batches_[i], nullptr);
|
|
1932
|
-
}
|
|
1933
|
-
}
|
|
1934
|
-
|
|
1935
|
-
grpc_error_handle ClientChannelFilter::FilterBasedCallData::Init(
|
|
1958
|
+
grpc_error_handle ClientChannelFilter::CallData::Init(
|
|
1936
1959
|
grpc_call_element* elem, const grpc_call_element_args* args) {
|
|
1937
|
-
new (elem->call_data)
|
|
1960
|
+
new (elem->call_data) CallData(elem, *args);
|
|
1938
1961
|
return absl::OkStatus();
|
|
1939
1962
|
}
|
|
1940
1963
|
|
|
1941
|
-
void ClientChannelFilter::
|
|
1964
|
+
void ClientChannelFilter::CallData::Destroy(
|
|
1942
1965
|
grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
|
|
1943
1966
|
grpc_closure* then_schedule_closure) {
|
|
1944
|
-
auto* calld = static_cast<
|
|
1967
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
|
1945
1968
|
RefCountedPtr<DynamicFilters::Call> dynamic_call =
|
|
1946
1969
|
std::move(calld->dynamic_call_);
|
|
1947
|
-
calld->~
|
|
1970
|
+
calld->~CallData();
|
|
1948
1971
|
if (GPR_LIKELY(dynamic_call != nullptr)) {
|
|
1949
1972
|
dynamic_call->SetAfterCallStackDestroy(then_schedule_closure);
|
|
1950
1973
|
} else {
|
|
@@ -1953,9 +1976,9 @@ void ClientChannelFilter::FilterBasedCallData::Destroy(
|
|
|
1953
1976
|
}
|
|
1954
1977
|
}
|
|
1955
1978
|
|
|
1956
|
-
void ClientChannelFilter::
|
|
1979
|
+
void ClientChannelFilter::CallData::StartTransportStreamOpBatch(
|
|
1957
1980
|
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
|
1958
|
-
auto* calld = static_cast<
|
|
1981
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
|
1959
1982
|
auto* chand = static_cast<ClientChannelFilter*>(elem->channel_data);
|
|
1960
1983
|
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call) &&
|
|
1961
1984
|
!GRPC_TRACE_FLAG_ENABLED(channel)) {
|
|
@@ -1994,7 +2017,7 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
|
1994
2017
|
<< StatusToString(calld->cancel_error_);
|
|
1995
2018
|
// Note: This will release the call combiner.
|
|
1996
2019
|
grpc_transport_stream_op_batch_finish_with_failure(
|
|
1997
|
-
batch, calld->cancel_error_, calld->
|
|
2020
|
+
batch, calld->cancel_error_, calld->call_combiner_);
|
|
1998
2021
|
return;
|
|
1999
2022
|
}
|
|
2000
2023
|
// Handle cancellation.
|
|
@@ -2009,14 +2032,15 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
|
2009
2032
|
<< "chand=" << chand << " calld=" << calld
|
|
2010
2033
|
<< ": recording cancel_error=" << StatusToString(calld->cancel_error_);
|
|
2011
2034
|
// Fail all pending batches.
|
|
2012
|
-
calld->
|
|
2035
|
+
calld->buffered_call_.Fail(calld->cancel_error_,
|
|
2036
|
+
BufferedCall::NoYieldCallCombiner);
|
|
2013
2037
|
// Note: This will release the call combiner.
|
|
2014
2038
|
grpc_transport_stream_op_batch_finish_with_failure(
|
|
2015
|
-
batch, calld->cancel_error_, calld->
|
|
2039
|
+
batch, calld->cancel_error_, calld->call_combiner_);
|
|
2016
2040
|
return;
|
|
2017
2041
|
}
|
|
2018
2042
|
// Add the batch to the pending list.
|
|
2019
|
-
calld->
|
|
2043
|
+
calld->buffered_call_.EnqueueBatch(batch);
|
|
2020
2044
|
// For batches containing a send_initial_metadata op, acquire the
|
|
2021
2045
|
// channel's resolution mutex to apply the service config to the call,
|
|
2022
2046
|
// after which we will create a dynamic call.
|
|
@@ -2044,188 +2068,29 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch(
|
|
|
2044
2068
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
2045
2069
|
<< "chand=" << chand << " calld=" << calld
|
|
2046
2070
|
<< ": saved batch, yielding call combiner";
|
|
2047
|
-
GRPC_CALL_COMBINER_STOP(calld->
|
|
2071
|
+
GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
|
|
2048
2072
|
"batch does not include send_initial_metadata");
|
|
2049
2073
|
}
|
|
2050
2074
|
}
|
|
2051
2075
|
|
|
2052
|
-
void ClientChannelFilter::
|
|
2053
|
-
|
|
2054
|
-
auto* calld = static_cast<
|
|
2076
|
+
void ClientChannelFilter::CallData::SetPollent(grpc_call_element* elem,
|
|
2077
|
+
grpc_polling_entity* pollent) {
|
|
2078
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
|
2055
2079
|
calld->pollent_ = pollent;
|
|
2056
2080
|
}
|
|
2057
2081
|
|
|
2058
|
-
|
|
2059
|
-
grpc_transport_stream_op_batch* batch) {
|
|
2060
|
-
// Note: It is important the send_initial_metadata be the first entry
|
|
2061
|
-
// here, since the code in CheckResolution() assumes it will be.
|
|
2062
|
-
if (batch->send_initial_metadata) return 0;
|
|
2063
|
-
if (batch->send_message) return 1;
|
|
2064
|
-
if (batch->send_trailing_metadata) return 2;
|
|
2065
|
-
if (batch->recv_initial_metadata) return 3;
|
|
2066
|
-
if (batch->recv_message) return 4;
|
|
2067
|
-
if (batch->recv_trailing_metadata) return 5;
|
|
2068
|
-
GPR_UNREACHABLE_CODE(return (size_t)-1);
|
|
2069
|
-
}
|
|
2070
|
-
|
|
2071
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2072
|
-
void ClientChannelFilter::FilterBasedCallData::PendingBatchesAdd(
|
|
2073
|
-
grpc_transport_stream_op_batch* batch) {
|
|
2074
|
-
const size_t idx = GetBatchIndex(batch);
|
|
2075
|
-
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
2076
|
-
<< "chand=" << chand() << " calld=" << this
|
|
2077
|
-
<< ": adding pending batch at index " << idx;
|
|
2078
|
-
grpc_transport_stream_op_batch*& pending = pending_batches_[idx];
|
|
2079
|
-
CHECK_EQ(pending, nullptr);
|
|
2080
|
-
pending = batch;
|
|
2081
|
-
}
|
|
2082
|
-
|
|
2083
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2084
|
-
void ClientChannelFilter::FilterBasedCallData::FailPendingBatchInCallCombiner(
|
|
2085
|
-
void* arg, grpc_error_handle error) {
|
|
2086
|
-
grpc_transport_stream_op_batch* batch =
|
|
2087
|
-
static_cast<grpc_transport_stream_op_batch*>(arg);
|
|
2088
|
-
auto* calld =
|
|
2089
|
-
static_cast<FilterBasedCallData*>(batch->handler_private.extra_arg);
|
|
2090
|
-
// Note: This will release the call combiner.
|
|
2091
|
-
grpc_transport_stream_op_batch_finish_with_failure(batch, error,
|
|
2092
|
-
calld->call_combiner());
|
|
2093
|
-
}
|
|
2094
|
-
|
|
2095
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2096
|
-
void ClientChannelFilter::FilterBasedCallData::PendingBatchesFail(
|
|
2097
|
-
grpc_error_handle error,
|
|
2098
|
-
YieldCallCombinerPredicate yield_call_combiner_predicate) {
|
|
2099
|
-
CHECK(!error.ok());
|
|
2100
|
-
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call)) {
|
|
2101
|
-
size_t num_batches = 0;
|
|
2102
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2103
|
-
if (pending_batches_[i] != nullptr) ++num_batches;
|
|
2104
|
-
}
|
|
2105
|
-
LOG(INFO) << "chand=" << chand() << " calld=" << this << ": failing "
|
|
2106
|
-
<< num_batches << " pending batches: " << StatusToString(error);
|
|
2107
|
-
}
|
|
2108
|
-
CallCombinerClosureList closures;
|
|
2109
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2110
|
-
grpc_transport_stream_op_batch*& batch = pending_batches_[i];
|
|
2111
|
-
if (batch != nullptr) {
|
|
2112
|
-
batch->handler_private.extra_arg = this;
|
|
2113
|
-
GRPC_CLOSURE_INIT(&batch->handler_private.closure,
|
|
2114
|
-
FailPendingBatchInCallCombiner, batch,
|
|
2115
|
-
grpc_schedule_on_exec_ctx);
|
|
2116
|
-
closures.Add(&batch->handler_private.closure, error,
|
|
2117
|
-
"PendingBatchesFail");
|
|
2118
|
-
batch = nullptr;
|
|
2119
|
-
}
|
|
2120
|
-
}
|
|
2121
|
-
if (yield_call_combiner_predicate(closures)) {
|
|
2122
|
-
closures.RunClosures(call_combiner());
|
|
2123
|
-
} else {
|
|
2124
|
-
closures.RunClosuresWithoutYielding(call_combiner());
|
|
2125
|
-
}
|
|
2126
|
-
}
|
|
2127
|
-
|
|
2128
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2129
|
-
void ClientChannelFilter::FilterBasedCallData::ResumePendingBatchInCallCombiner(
|
|
2130
|
-
void* arg, grpc_error_handle /*ignored*/) {
|
|
2131
|
-
grpc_transport_stream_op_batch* batch =
|
|
2132
|
-
static_cast<grpc_transport_stream_op_batch*>(arg);
|
|
2133
|
-
auto* calld =
|
|
2134
|
-
static_cast<FilterBasedCallData*>(batch->handler_private.extra_arg);
|
|
2135
|
-
// Note: This will release the call combiner.
|
|
2136
|
-
calld->dynamic_call_->StartTransportStreamOpBatch(batch);
|
|
2137
|
-
}
|
|
2138
|
-
|
|
2139
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2140
|
-
void ClientChannelFilter::FilterBasedCallData::PendingBatchesResume() {
|
|
2141
|
-
// Retries not enabled; send down batches as-is.
|
|
2142
|
-
if (GRPC_TRACE_FLAG_ENABLED(client_channel_call)) {
|
|
2143
|
-
size_t num_batches = 0;
|
|
2144
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2145
|
-
if (pending_batches_[i] != nullptr) ++num_batches;
|
|
2146
|
-
}
|
|
2147
|
-
LOG(INFO) << "chand=" << chand() << " calld=" << this << ": starting "
|
|
2148
|
-
<< num_batches
|
|
2149
|
-
<< " pending batches on dynamic_call=" << dynamic_call_.get();
|
|
2150
|
-
}
|
|
2151
|
-
CallCombinerClosureList closures;
|
|
2152
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2153
|
-
grpc_transport_stream_op_batch*& batch = pending_batches_[i];
|
|
2154
|
-
if (batch != nullptr) {
|
|
2155
|
-
batch->handler_private.extra_arg = this;
|
|
2156
|
-
GRPC_CLOSURE_INIT(&batch->handler_private.closure,
|
|
2157
|
-
ResumePendingBatchInCallCombiner, batch, nullptr);
|
|
2158
|
-
closures.Add(&batch->handler_private.closure, absl::OkStatus(),
|
|
2159
|
-
"resuming pending batch from client channel call");
|
|
2160
|
-
batch = nullptr;
|
|
2161
|
-
}
|
|
2162
|
-
}
|
|
2163
|
-
// Note: This will release the call combiner.
|
|
2164
|
-
closures.RunClosures(call_combiner());
|
|
2165
|
-
}
|
|
2166
|
-
|
|
2167
|
-
// A class to handle the call combiner cancellation callback for a
|
|
2168
|
-
// queued pick.
|
|
2169
|
-
class ClientChannelFilter::FilterBasedCallData::ResolverQueuedCallCanceller
|
|
2170
|
-
final {
|
|
2171
|
-
public:
|
|
2172
|
-
explicit ResolverQueuedCallCanceller(FilterBasedCallData* calld)
|
|
2173
|
-
: calld_(calld) {
|
|
2174
|
-
GRPC_CALL_STACK_REF(calld->owning_call(), "ResolverQueuedCallCanceller");
|
|
2175
|
-
GRPC_CLOSURE_INIT(&closure_, &CancelLocked, this,
|
|
2176
|
-
grpc_schedule_on_exec_ctx);
|
|
2177
|
-
calld->call_combiner()->SetNotifyOnCancel(&closure_);
|
|
2178
|
-
}
|
|
2179
|
-
|
|
2180
|
-
private:
|
|
2181
|
-
static void CancelLocked(void* arg, grpc_error_handle error) {
|
|
2182
|
-
auto* self = static_cast<ResolverQueuedCallCanceller*>(arg);
|
|
2183
|
-
auto* calld = self->calld_;
|
|
2184
|
-
auto* chand = calld->chand();
|
|
2185
|
-
{
|
|
2186
|
-
MutexLock lock(&chand->resolution_mu_);
|
|
2187
|
-
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
2188
|
-
<< "chand=" << chand << " calld=" << calld
|
|
2189
|
-
<< ": cancelling resolver queued pick: "
|
|
2190
|
-
"error="
|
|
2191
|
-
<< StatusToString(error) << " self=" << self
|
|
2192
|
-
<< " calld->resolver_pick_canceller="
|
|
2193
|
-
<< calld->resolver_call_canceller_;
|
|
2194
|
-
if (calld->resolver_call_canceller_ == self && !error.ok()) {
|
|
2195
|
-
// Remove pick from list of queued picks.
|
|
2196
|
-
calld->RemoveCallFromResolverQueuedCallsLocked();
|
|
2197
|
-
chand->resolver_queued_calls_.erase(calld);
|
|
2198
|
-
// Fail pending batches on the call.
|
|
2199
|
-
calld->PendingBatchesFail(error,
|
|
2200
|
-
YieldCallCombinerIfPendingBatchesFound);
|
|
2201
|
-
}
|
|
2202
|
-
}
|
|
2203
|
-
GRPC_CALL_STACK_UNREF(calld->owning_call(), "ResolvingQueuedCallCanceller");
|
|
2204
|
-
delete self;
|
|
2205
|
-
}
|
|
2206
|
-
|
|
2207
|
-
FilterBasedCallData* calld_;
|
|
2208
|
-
grpc_closure closure_;
|
|
2209
|
-
};
|
|
2210
|
-
|
|
2211
|
-
void ClientChannelFilter::FilterBasedCallData::TryCheckResolution(
|
|
2212
|
-
bool was_queued) {
|
|
2082
|
+
void ClientChannelFilter::CallData::TryCheckResolution(bool was_queued) {
|
|
2213
2083
|
auto result = CheckResolution(was_queued);
|
|
2214
2084
|
if (result.has_value()) {
|
|
2215
2085
|
if (!result->ok()) {
|
|
2216
|
-
|
|
2086
|
+
buffered_call_.Fail(*result, BufferedCall::YieldCallCombiner);
|
|
2217
2087
|
return;
|
|
2218
2088
|
}
|
|
2219
2089
|
CreateDynamicCall();
|
|
2220
2090
|
}
|
|
2221
2091
|
}
|
|
2222
2092
|
|
|
2223
|
-
void ClientChannelFilter::
|
|
2224
|
-
// Register call combiner cancellation callback.
|
|
2225
|
-
resolver_call_canceller_ = new ResolverQueuedCallCanceller(this);
|
|
2226
|
-
}
|
|
2227
|
-
|
|
2228
|
-
void ClientChannelFilter::FilterBasedCallData::RetryCheckResolutionLocked() {
|
|
2093
|
+
void ClientChannelFilter::CallData::RetryCheckResolutionLocked() {
|
|
2229
2094
|
// Lame the call combiner canceller.
|
|
2230
2095
|
resolver_call_canceller_ = nullptr;
|
|
2231
2096
|
// Do an async callback to resume call processing, so that we're not
|
|
@@ -2236,10 +2101,10 @@ void ClientChannelFilter::FilterBasedCallData::RetryCheckResolutionLocked() {
|
|
|
2236
2101
|
});
|
|
2237
2102
|
}
|
|
2238
2103
|
|
|
2239
|
-
void ClientChannelFilter::
|
|
2240
|
-
DynamicFilters::Call::Args args = {
|
|
2241
|
-
call_start_time_,
|
|
2242
|
-
|
|
2104
|
+
void ClientChannelFilter::CallData::CreateDynamicCall() {
|
|
2105
|
+
DynamicFilters::Call::Args args = {dynamic_filters_, pollent_,
|
|
2106
|
+
call_start_time_, deadline_,
|
|
2107
|
+
arena_, call_combiner_};
|
|
2243
2108
|
grpc_error_handle error;
|
|
2244
2109
|
DynamicFilters* channel_stack = args.channel_stack.get();
|
|
2245
2110
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
@@ -2250,18 +2115,21 @@ void ClientChannelFilter::FilterBasedCallData::CreateDynamicCall() {
|
|
|
2250
2115
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
2251
2116
|
<< "chand=" << chand() << " calld=" << this
|
|
2252
2117
|
<< ": failed to create dynamic call: error=" << StatusToString(error);
|
|
2253
|
-
|
|
2118
|
+
buffered_call_.Fail(error, BufferedCall::YieldCallCombiner);
|
|
2254
2119
|
return;
|
|
2255
2120
|
}
|
|
2256
|
-
|
|
2121
|
+
buffered_call_.Resume(
|
|
2122
|
+
[dynamic_call = dynamic_call_](grpc_transport_stream_op_batch* batch) {
|
|
2123
|
+
dynamic_call->StartTransportStreamOpBatch(batch);
|
|
2124
|
+
});
|
|
2257
2125
|
}
|
|
2258
2126
|
|
|
2259
|
-
void ClientChannelFilter::
|
|
2127
|
+
void ClientChannelFilter::CallData::
|
|
2260
2128
|
RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
|
|
2261
2129
|
void* arg, grpc_error_handle error) {
|
|
2262
|
-
auto* calld = static_cast<
|
|
2130
|
+
auto* calld = static_cast<CallData*>(arg);
|
|
2263
2131
|
auto* chand = calld->chand();
|
|
2264
|
-
auto* service_config_call_data = GetServiceConfigCallData(calld->
|
|
2132
|
+
auto* service_config_call_data = GetServiceConfigCallData(calld->arena_);
|
|
2265
2133
|
GRPC_TRACE_LOG(client_channel_call, INFO)
|
|
2266
2134
|
<< "chand=" << chand << " calld=" << calld
|
|
2267
2135
|
<< ": got recv_trailing_metadata_ready: error=" << StatusToString(error)
|
|
@@ -2290,8 +2158,7 @@ class ClientChannelFilter::LoadBalancedCall::LbCallState final
|
|
|
2290
2158
|
ServiceConfigCallData::CallAttributeInterface* GetCallAttribute(
|
|
2291
2159
|
UniqueTypeName type) const override;
|
|
2292
2160
|
|
|
2293
|
-
|
|
2294
|
-
const override;
|
|
2161
|
+
CallAttemptTracer* GetCallAttemptTracer() const override;
|
|
2295
2162
|
|
|
2296
2163
|
private:
|
|
2297
2164
|
LoadBalancedCall* lb_call_;
|
|
@@ -2308,10 +2175,10 @@ ClientChannelFilter::LoadBalancedCall::LbCallState::GetCallAttribute(
|
|
|
2308
2175
|
return service_config_call_data->GetCallAttribute(type);
|
|
2309
2176
|
}
|
|
2310
2177
|
|
|
2311
|
-
|
|
2178
|
+
CallAttemptTracer*
|
|
2312
2179
|
ClientChannelFilter::LoadBalancedCall::LbCallState::GetCallAttemptTracer()
|
|
2313
2180
|
const {
|
|
2314
|
-
return lb_call_->
|
|
2181
|
+
return lb_call_->call_attempt_tracer_;
|
|
2315
2182
|
}
|
|
2316
2183
|
|
|
2317
2184
|
//
|
|
@@ -2359,35 +2226,96 @@ class ClientChannelFilter::LoadBalancedCall::BackendMetricAccessor final
|
|
|
2359
2226
|
grpc_metadata_batch* recv_trailing_metadata_;
|
|
2360
2227
|
};
|
|
2361
2228
|
|
|
2229
|
+
//
|
|
2230
|
+
// ClientChannelFilter::LoadBalancedCall::LbQueuedCallCanceller
|
|
2231
|
+
//
|
|
2232
|
+
|
|
2233
|
+
// A class to handle the call combiner cancellation callback for a
|
|
2234
|
+
// queued pick.
|
|
2235
|
+
// TODO(roth): When we implement hedging support, we won't be able to
|
|
2236
|
+
// register a call combiner cancellation closure for each LB pick,
|
|
2237
|
+
// because there may be multiple LB picks happening in parallel.
|
|
2238
|
+
// Instead, we will probably need to maintain a list in the CallData
|
|
2239
|
+
// object of pending LB picks to be cancelled when the closure runs.
|
|
2240
|
+
class ClientChannelFilter::LoadBalancedCall::LbQueuedCallCanceller final {
|
|
2241
|
+
public:
|
|
2242
|
+
explicit LbQueuedCallCanceller(RefCountedPtr<LoadBalancedCall> lb_call)
|
|
2243
|
+
: lb_call_(std::move(lb_call)) {
|
|
2244
|
+
GRPC_CALL_STACK_REF(lb_call_->owning_call_, "LbQueuedCallCanceller");
|
|
2245
|
+
GRPC_CLOSURE_INIT(&closure_, &CancelLocked, this, nullptr);
|
|
2246
|
+
lb_call_->call_combiner_->SetNotifyOnCancel(&closure_);
|
|
2247
|
+
}
|
|
2248
|
+
|
|
2249
|
+
private:
|
|
2250
|
+
static void CancelLocked(void* arg, grpc_error_handle error) {
|
|
2251
|
+
auto* self = static_cast<LbQueuedCallCanceller*>(arg);
|
|
2252
|
+
auto* lb_call = self->lb_call_.get();
|
|
2253
|
+
auto* chand = lb_call->chand_;
|
|
2254
|
+
{
|
|
2255
|
+
MutexLock lock(&chand->lb_mu_);
|
|
2256
|
+
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2257
|
+
<< "chand=" << chand << " lb_call=" << lb_call
|
|
2258
|
+
<< ": cancelling queued pick: error=" << StatusToString(error)
|
|
2259
|
+
<< " self=" << self
|
|
2260
|
+
<< " calld->pick_canceller=" << lb_call->lb_call_canceller_;
|
|
2261
|
+
if (lb_call->lb_call_canceller_ == self && !error.ok()) {
|
|
2262
|
+
lb_call->Commit();
|
|
2263
|
+
// Remove pick from list of queued picks.
|
|
2264
|
+
lb_call->RemoveCallFromLbQueuedCallsLocked();
|
|
2265
|
+
// Remove from queued picks list.
|
|
2266
|
+
chand->lb_queued_calls_.erase(self->lb_call_);
|
|
2267
|
+
// Fail pending batches on the call.
|
|
2268
|
+
lb_call->buffered_call_.Fail(
|
|
2269
|
+
error, BufferedCall::YieldCallCombinerIfPendingBatchesFound);
|
|
2270
|
+
}
|
|
2271
|
+
}
|
|
2272
|
+
// Unref lb_call before unreffing the call stack, since unreffing
|
|
2273
|
+
// the call stack may destroy the arena in which lb_call is allocated.
|
|
2274
|
+
auto* owning_call = lb_call->owning_call_;
|
|
2275
|
+
self->lb_call_.reset();
|
|
2276
|
+
GRPC_CALL_STACK_UNREF(owning_call, "LbQueuedCallCanceller");
|
|
2277
|
+
delete self;
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
RefCountedPtr<LoadBalancedCall> lb_call_;
|
|
2281
|
+
grpc_closure closure_;
|
|
2282
|
+
};
|
|
2283
|
+
|
|
2362
2284
|
//
|
|
2363
2285
|
// ClientChannelFilter::LoadBalancedCall
|
|
2364
2286
|
//
|
|
2365
2287
|
|
|
2366
2288
|
namespace {
|
|
2367
2289
|
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
auto* call_tracer =
|
|
2371
|
-
arena->GetContext<CallTracerAnnotationInterface>());
|
|
2290
|
+
CallAttemptTracer* CreateCallAttemptTracer(Arena* arena,
|
|
2291
|
+
bool is_transparent_retry) {
|
|
2292
|
+
auto* call_tracer = arena->GetContext<ClientCallTracer>();
|
|
2372
2293
|
if (call_tracer == nullptr) return nullptr;
|
|
2373
|
-
auto* tracer =
|
|
2374
|
-
|
|
2294
|
+
auto* tracer = WrapCallAttemptTracer(
|
|
2295
|
+
call_tracer->StartNewAttempt(is_transparent_retry), arena);
|
|
2296
|
+
arena->SetContext<CallTracer>(tracer);
|
|
2375
2297
|
return tracer;
|
|
2376
2298
|
}
|
|
2377
2299
|
|
|
2378
2300
|
} // namespace
|
|
2379
2301
|
|
|
2380
2302
|
ClientChannelFilter::LoadBalancedCall::LoadBalancedCall(
|
|
2381
|
-
ClientChannelFilter* chand,
|
|
2303
|
+
ClientChannelFilter* chand, const grpc_call_element_args& args,
|
|
2304
|
+
grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
|
|
2382
2305
|
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
|
|
2383
2306
|
: InternallyRefCounted(GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)
|
|
2384
2307
|
? "LoadBalancedCall"
|
|
2385
2308
|
: nullptr),
|
|
2386
2309
|
chand_(chand),
|
|
2387
2310
|
call_attempt_tracer_(
|
|
2388
|
-
CreateCallAttemptTracer(arena, is_transparent_retry)),
|
|
2311
|
+
CreateCallAttemptTracer(args.arena, is_transparent_retry)),
|
|
2312
|
+
owning_call_(args.call_stack),
|
|
2313
|
+
call_combiner_(args.call_combiner),
|
|
2314
|
+
pollent_(pollent),
|
|
2315
|
+
on_call_destruction_complete_(on_call_destruction_complete),
|
|
2316
|
+
arena_(args.arena),
|
|
2389
2317
|
on_commit_(std::move(on_commit)),
|
|
2390
|
-
|
|
2318
|
+
buffered_call_(call_combiner_, &client_channel_lb_call_trace) {
|
|
2391
2319
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2392
2320
|
<< "chand=" << chand_ << " lb_call=" << this << ": created";
|
|
2393
2321
|
}
|
|
@@ -2396,6 +2324,22 @@ ClientChannelFilter::LoadBalancedCall::~LoadBalancedCall() {
|
|
|
2396
2324
|
if (backend_metric_data_ != nullptr) {
|
|
2397
2325
|
backend_metric_data_->BackendMetricData::~BackendMetricData();
|
|
2398
2326
|
}
|
|
2327
|
+
if (on_call_destruction_complete_ != nullptr) {
|
|
2328
|
+
ExecCtx::Run(DEBUG_LOCATION, on_call_destruction_complete_,
|
|
2329
|
+
absl::OkStatus());
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
|
|
2333
|
+
void ClientChannelFilter::LoadBalancedCall::Orphan() {
|
|
2334
|
+
// If the recv_trailing_metadata op was never started, then notify
|
|
2335
|
+
// about call completion here, as best we can. We assume status
|
|
2336
|
+
// CANCELLED in this case.
|
|
2337
|
+
if (recv_trailing_metadata_ == nullptr) {
|
|
2338
|
+
RecordCallCompletion(absl::CancelledError("call cancelled"), nullptr,
|
|
2339
|
+
nullptr, "");
|
|
2340
|
+
}
|
|
2341
|
+
RecordLatency();
|
|
2342
|
+
Unref();
|
|
2399
2343
|
}
|
|
2400
2344
|
|
|
2401
2345
|
void ClientChannelFilter::LoadBalancedCall::RecordCallCompletion(
|
|
@@ -2403,8 +2347,8 @@ void ClientChannelFilter::LoadBalancedCall::RecordCallCompletion(
|
|
|
2403
2347
|
grpc_transport_stream_stats* transport_stream_stats,
|
|
2404
2348
|
absl::string_view peer_address) {
|
|
2405
2349
|
// If we have a tracer, notify it.
|
|
2406
|
-
if (
|
|
2407
|
-
|
|
2350
|
+
if (call_attempt_tracer_ != nullptr) {
|
|
2351
|
+
call_attempt_tracer_->RecordReceivedTrailingMetadata(
|
|
2408
2352
|
status, recv_trailing_metadata, transport_stream_stats);
|
|
2409
2353
|
}
|
|
2410
2354
|
// If the LB policy requested a callback for trailing metadata, invoke
|
|
@@ -2421,8 +2365,8 @@ void ClientChannelFilter::LoadBalancedCall::RecordCallCompletion(
|
|
|
2421
2365
|
|
|
2422
2366
|
void ClientChannelFilter::LoadBalancedCall::RecordLatency() {
|
|
2423
2367
|
// Compute latency and report it to the tracer.
|
|
2424
|
-
if (
|
|
2425
|
-
|
|
2368
|
+
if (call_attempt_tracer_ != nullptr) {
|
|
2369
|
+
call_attempt_tracer_->RecordEnd();
|
|
2426
2370
|
}
|
|
2427
2371
|
}
|
|
2428
2372
|
|
|
@@ -2432,7 +2376,7 @@ void ClientChannelFilter::LoadBalancedCall::
|
|
|
2432
2376
|
<< "chand=" << chand_ << " lb_call=" << this
|
|
2433
2377
|
<< ": removing from queued picks list";
|
|
2434
2378
|
// Remove pollset_set linkage.
|
|
2435
|
-
grpc_polling_entity_del_from_pollset_set(
|
|
2379
|
+
grpc_polling_entity_del_from_pollset_set(pollent_,
|
|
2436
2380
|
chand_->interested_parties_);
|
|
2437
2381
|
// Note: There's no need to actually remove the call from the queue
|
|
2438
2382
|
// here, because that will be done in either
|
|
@@ -2446,11 +2390,12 @@ void ClientChannelFilter::LoadBalancedCall::AddCallToLbQueuedCallsLocked() {
|
|
|
2446
2390
|
<< ": adding to queued picks list";
|
|
2447
2391
|
// Add call's pollent to channel's interested_parties, so that I/O
|
|
2448
2392
|
// can be done under the call's CQ.
|
|
2449
|
-
grpc_polling_entity_add_to_pollset_set(
|
|
2450
|
-
chand_->interested_parties_);
|
|
2393
|
+
grpc_polling_entity_add_to_pollset_set(pollent_, chand_->interested_parties_);
|
|
2451
2394
|
// Add to queue.
|
|
2452
2395
|
chand_->lb_queued_calls_.insert(Ref());
|
|
2453
|
-
|
|
2396
|
+
// Register call combiner cancellation callback.
|
|
2397
|
+
lb_call_canceller_ =
|
|
2398
|
+
new LbQueuedCallCanceller(RefAsSubclass<LoadBalancedCall>());
|
|
2454
2399
|
}
|
|
2455
2400
|
|
|
2456
2401
|
std::optional<absl::Status>
|
|
@@ -2498,8 +2443,8 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
|
2498
2443
|
}
|
|
2499
2444
|
// Pick is complete.
|
|
2500
2445
|
// If it was queued, add a trace annotation.
|
|
2501
|
-
if (was_queued &&
|
|
2502
|
-
|
|
2446
|
+
if (was_queued && call_attempt_tracer_ != nullptr) {
|
|
2447
|
+
call_attempt_tracer_->RecordAnnotation("Delayed LB pick complete.");
|
|
2503
2448
|
}
|
|
2504
2449
|
// If the pick failed, fail the call.
|
|
2505
2450
|
if (!error.ok()) {
|
|
@@ -2516,11 +2461,11 @@ ClientChannelFilter::LoadBalancedCall::PickSubchannel(bool was_queued) {
|
|
|
2516
2461
|
|
|
2517
2462
|
bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
2518
2463
|
LoadBalancingPolicy::SubchannelPicker* picker, grpc_error_handle* error) {
|
|
2519
|
-
|
|
2464
|
+
GRPC_CHECK(connected_subchannel_ == nullptr);
|
|
2520
2465
|
// Perform LB pick.
|
|
2521
2466
|
LoadBalancingPolicy::PickArgs pick_args;
|
|
2522
2467
|
Slice* path = send_initial_metadata()->get_pointer(HttpPathMetadata());
|
|
2523
|
-
|
|
2468
|
+
GRPC_CHECK_NE(path, nullptr);
|
|
2524
2469
|
pick_args.path = path->as_string_view();
|
|
2525
2470
|
LbCallState lb_call_state(this);
|
|
2526
2471
|
pick_args.call_state = &lb_call_state;
|
|
@@ -2535,7 +2480,7 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
|
2535
2480
|
<< "chand=" << chand_ << " lb_call=" << this
|
|
2536
2481
|
<< ": LB pick succeeded: subchannel="
|
|
2537
2482
|
<< complete_pick->subchannel.get();
|
|
2538
|
-
|
|
2483
|
+
GRPC_CHECK(complete_pick->subchannel != nullptr);
|
|
2539
2484
|
// Grab a ref to the connected subchannel while we're still
|
|
2540
2485
|
// holding the data plane mutex.
|
|
2541
2486
|
SubchannelWrapper* subchannel =
|
|
@@ -2554,9 +2499,6 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
|
2554
2499
|
}
|
|
2555
2500
|
lb_subchannel_call_tracker_ =
|
|
2556
2501
|
std::move(complete_pick->subchannel_call_tracker);
|
|
2557
|
-
if (lb_subchannel_call_tracker_ != nullptr) {
|
|
2558
|
-
lb_subchannel_call_tracker_->Start();
|
|
2559
|
-
}
|
|
2560
2502
|
// Handle metadata mutations.
|
|
2561
2503
|
MetadataMutationHandler::Apply(complete_pick->metadata_mutations,
|
|
2562
2504
|
send_initial_metadata());
|
|
@@ -2601,177 +2543,28 @@ bool ClientChannelFilter::LoadBalancedCall::PickSubchannelImpl(
|
|
|
2601
2543
|
});
|
|
2602
2544
|
}
|
|
2603
2545
|
|
|
2604
|
-
|
|
2605
|
-
// ClientChannelFilter::FilterBasedLoadBalancedCall
|
|
2606
|
-
//
|
|
2607
|
-
|
|
2608
|
-
ClientChannelFilter::FilterBasedLoadBalancedCall::FilterBasedLoadBalancedCall(
|
|
2609
|
-
ClientChannelFilter* chand, const grpc_call_element_args& args,
|
|
2610
|
-
grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
|
|
2611
|
-
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
|
|
2612
|
-
: LoadBalancedCall(chand, args.arena, std::move(on_commit),
|
|
2613
|
-
is_transparent_retry),
|
|
2614
|
-
owning_call_(args.call_stack),
|
|
2615
|
-
call_combiner_(args.call_combiner),
|
|
2616
|
-
pollent_(pollent),
|
|
2617
|
-
on_call_destruction_complete_(on_call_destruction_complete) {}
|
|
2618
|
-
|
|
2619
|
-
ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
2620
|
-
~FilterBasedLoadBalancedCall() {
|
|
2621
|
-
// Make sure there are no remaining pending batches.
|
|
2622
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2623
|
-
CHECK_EQ(pending_batches_[i], nullptr);
|
|
2624
|
-
}
|
|
2625
|
-
if (on_call_destruction_complete_ != nullptr) {
|
|
2626
|
-
ExecCtx::Run(DEBUG_LOCATION, on_call_destruction_complete_,
|
|
2627
|
-
absl::OkStatus());
|
|
2628
|
-
}
|
|
2629
|
-
}
|
|
2630
|
-
|
|
2631
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::Orphan() {
|
|
2632
|
-
// If the recv_trailing_metadata op was never started, then notify
|
|
2633
|
-
// about call completion here, as best we can. We assume status
|
|
2634
|
-
// CANCELLED in this case.
|
|
2635
|
-
if (recv_trailing_metadata_ == nullptr) {
|
|
2636
|
-
RecordCallCompletion(absl::CancelledError("call cancelled"), nullptr,
|
|
2637
|
-
nullptr, "");
|
|
2638
|
-
}
|
|
2639
|
-
RecordLatency();
|
|
2640
|
-
// Delegate to parent.
|
|
2641
|
-
LoadBalancedCall::Orphan();
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
size_t ClientChannelFilter::FilterBasedLoadBalancedCall::GetBatchIndex(
|
|
2645
|
-
grpc_transport_stream_op_batch* batch) {
|
|
2646
|
-
// Note: It is important the send_initial_metadata be the first entry
|
|
2647
|
-
// here, since the code in PickSubchannelImpl() assumes it will be.
|
|
2648
|
-
if (batch->send_initial_metadata) return 0;
|
|
2649
|
-
if (batch->send_message) return 1;
|
|
2650
|
-
if (batch->send_trailing_metadata) return 2;
|
|
2651
|
-
if (batch->recv_initial_metadata) return 3;
|
|
2652
|
-
if (batch->recv_message) return 4;
|
|
2653
|
-
if (batch->recv_trailing_metadata) return 5;
|
|
2654
|
-
GPR_UNREACHABLE_CODE(return (size_t)-1);
|
|
2655
|
-
}
|
|
2656
|
-
|
|
2657
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2658
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesAdd(
|
|
2546
|
+
void ClientChannelFilter::LoadBalancedCall::StartTransportStreamOpBatch(
|
|
2659
2547
|
grpc_transport_stream_op_batch* batch) {
|
|
2660
|
-
const size_t idx = GetBatchIndex(batch);
|
|
2661
|
-
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2662
|
-
<< "chand=" << chand() << " lb_call=" << this
|
|
2663
|
-
<< ": adding pending batch at index " << idx;
|
|
2664
|
-
CHECK_EQ(pending_batches_[idx], nullptr);
|
|
2665
|
-
pending_batches_[idx] = batch;
|
|
2666
|
-
}
|
|
2667
|
-
|
|
2668
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2669
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
2670
|
-
FailPendingBatchInCallCombiner(void* arg, grpc_error_handle error) {
|
|
2671
|
-
grpc_transport_stream_op_batch* batch =
|
|
2672
|
-
static_cast<grpc_transport_stream_op_batch*>(arg);
|
|
2673
|
-
auto* self = static_cast<FilterBasedLoadBalancedCall*>(
|
|
2674
|
-
batch->handler_private.extra_arg);
|
|
2675
|
-
// Note: This will release the call combiner.
|
|
2676
|
-
grpc_transport_stream_op_batch_finish_with_failure(batch, error,
|
|
2677
|
-
self->call_combiner_);
|
|
2678
|
-
}
|
|
2679
|
-
|
|
2680
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2681
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesFail(
|
|
2682
|
-
grpc_error_handle error,
|
|
2683
|
-
YieldCallCombinerPredicate yield_call_combiner_predicate) {
|
|
2684
|
-
CHECK(!error.ok());
|
|
2685
|
-
failure_error_ = error;
|
|
2686
|
-
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)) {
|
|
2687
|
-
size_t num_batches = 0;
|
|
2688
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2689
|
-
if (pending_batches_[i] != nullptr) ++num_batches;
|
|
2690
|
-
}
|
|
2691
|
-
LOG(INFO) << "chand=" << chand() << " lb_call=" << this << ": failing "
|
|
2692
|
-
<< num_batches << " pending batches: " << StatusToString(error);
|
|
2693
|
-
}
|
|
2694
|
-
CallCombinerClosureList closures;
|
|
2695
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2696
|
-
grpc_transport_stream_op_batch*& batch = pending_batches_[i];
|
|
2697
|
-
if (batch != nullptr) {
|
|
2698
|
-
batch->handler_private.extra_arg = this;
|
|
2699
|
-
GRPC_CLOSURE_INIT(&batch->handler_private.closure,
|
|
2700
|
-
FailPendingBatchInCallCombiner, batch,
|
|
2701
|
-
grpc_schedule_on_exec_ctx);
|
|
2702
|
-
closures.Add(&batch->handler_private.closure, error,
|
|
2703
|
-
"PendingBatchesFail");
|
|
2704
|
-
batch = nullptr;
|
|
2705
|
-
}
|
|
2706
|
-
}
|
|
2707
|
-
if (yield_call_combiner_predicate(closures)) {
|
|
2708
|
-
closures.RunClosures(call_combiner_);
|
|
2709
|
-
} else {
|
|
2710
|
-
closures.RunClosuresWithoutYielding(call_combiner_);
|
|
2711
|
-
}
|
|
2712
|
-
}
|
|
2713
|
-
|
|
2714
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2715
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
2716
|
-
ResumePendingBatchInCallCombiner(void* arg, grpc_error_handle /*ignored*/) {
|
|
2717
|
-
grpc_transport_stream_op_batch* batch =
|
|
2718
|
-
static_cast<grpc_transport_stream_op_batch*>(arg);
|
|
2719
|
-
SubchannelCall* subchannel_call =
|
|
2720
|
-
static_cast<SubchannelCall*>(batch->handler_private.extra_arg);
|
|
2721
|
-
// Note: This will release the call combiner.
|
|
2722
|
-
subchannel_call->StartTransportStreamOpBatch(batch);
|
|
2723
|
-
}
|
|
2724
|
-
|
|
2725
|
-
// This is called via the call combiner, so access to calld is synchronized.
|
|
2726
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::PendingBatchesResume() {
|
|
2727
|
-
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call)) {
|
|
2728
|
-
size_t num_batches = 0;
|
|
2729
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2730
|
-
if (pending_batches_[i] != nullptr) ++num_batches;
|
|
2731
|
-
}
|
|
2732
|
-
LOG(INFO) << "chand=" << chand() << " lb_call=" << this << ": starting "
|
|
2733
|
-
<< num_batches << " pending batches on subchannel_call="
|
|
2734
|
-
<< subchannel_call_.get();
|
|
2735
|
-
}
|
|
2736
|
-
CallCombinerClosureList closures;
|
|
2737
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
|
|
2738
|
-
grpc_transport_stream_op_batch*& batch = pending_batches_[i];
|
|
2739
|
-
if (batch != nullptr) {
|
|
2740
|
-
batch->handler_private.extra_arg = subchannel_call_.get();
|
|
2741
|
-
GRPC_CLOSURE_INIT(&batch->handler_private.closure,
|
|
2742
|
-
ResumePendingBatchInCallCombiner, batch,
|
|
2743
|
-
grpc_schedule_on_exec_ctx);
|
|
2744
|
-
closures.Add(&batch->handler_private.closure, absl::OkStatus(),
|
|
2745
|
-
"resuming pending batch from LB call");
|
|
2746
|
-
batch = nullptr;
|
|
2747
|
-
}
|
|
2748
|
-
}
|
|
2749
|
-
// Note: This will release the call combiner.
|
|
2750
|
-
closures.RunClosures(call_combiner_);
|
|
2751
|
-
}
|
|
2752
|
-
|
|
2753
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
2754
|
-
StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch) {
|
|
2755
2548
|
if (GRPC_TRACE_FLAG_ENABLED(client_channel_lb_call) ||
|
|
2756
2549
|
GRPC_TRACE_FLAG_ENABLED(channel)) {
|
|
2757
|
-
LOG(INFO) << "chand=" <<
|
|
2550
|
+
LOG(INFO) << "chand=" << chand_ << " lb_call=" << this
|
|
2758
2551
|
<< ": batch started from above: "
|
|
2759
2552
|
<< grpc_transport_stream_op_batch_string(batch, false)
|
|
2760
|
-
<< ",
|
|
2553
|
+
<< ", call_attempt_tracer_=" << call_attempt_tracer_;
|
|
2761
2554
|
}
|
|
2762
2555
|
// Handle call tracing.
|
|
2763
|
-
if (
|
|
2556
|
+
if (call_attempt_tracer_ != nullptr) {
|
|
2764
2557
|
// Record send ops in tracer.
|
|
2765
2558
|
if (batch->cancel_stream) {
|
|
2766
|
-
|
|
2559
|
+
call_attempt_tracer_->RecordCancel(
|
|
2767
2560
|
batch->payload->cancel_stream.cancel_error);
|
|
2768
2561
|
}
|
|
2769
2562
|
if (batch->send_initial_metadata) {
|
|
2770
|
-
|
|
2563
|
+
call_attempt_tracer_->RecordSendInitialMetadata(
|
|
2771
2564
|
batch->payload->send_initial_metadata.send_initial_metadata);
|
|
2772
2565
|
}
|
|
2773
2566
|
if (batch->send_trailing_metadata) {
|
|
2774
|
-
|
|
2567
|
+
call_attempt_tracer_->RecordSendTrailingMetadata(
|
|
2775
2568
|
batch->payload->send_trailing_metadata.send_trailing_metadata);
|
|
2776
2569
|
}
|
|
2777
2570
|
// Intercept recv ops.
|
|
@@ -2806,7 +2599,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
|
2806
2599
|
// streaming calls).
|
|
2807
2600
|
if (subchannel_call_ != nullptr) {
|
|
2808
2601
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2809
|
-
<< "chand=" <<
|
|
2602
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
|
2810
2603
|
<< ": starting batch on subchannel_call=" << subchannel_call_.get();
|
|
2811
2604
|
subchannel_call_->StartTransportStreamOpBatch(batch);
|
|
2812
2605
|
return;
|
|
@@ -2816,7 +2609,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
|
2816
2609
|
// If we've previously been cancelled, immediately fail any new batches.
|
|
2817
2610
|
if (GPR_UNLIKELY(!cancel_error_.ok())) {
|
|
2818
2611
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2819
|
-
<< "chand=" <<
|
|
2612
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
|
2820
2613
|
<< ": failing batch with error: " << StatusToString(cancel_error_);
|
|
2821
2614
|
// Note: This will release the call combiner.
|
|
2822
2615
|
grpc_transport_stream_op_batch_finish_with_failure(batch, cancel_error_,
|
|
@@ -2832,17 +2625,17 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
|
2832
2625
|
// error to the caller when the first batch does get passed down.
|
|
2833
2626
|
cancel_error_ = batch->payload->cancel_stream.cancel_error;
|
|
2834
2627
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2835
|
-
<< "chand=" <<
|
|
2628
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
|
2836
2629
|
<< ": recording cancel_error=" << StatusToString(cancel_error_).c_str();
|
|
2837
2630
|
// Fail all pending batches.
|
|
2838
|
-
|
|
2631
|
+
buffered_call_.Fail(cancel_error_, BufferedCall::NoYieldCallCombiner);
|
|
2839
2632
|
// Note: This will release the call combiner.
|
|
2840
2633
|
grpc_transport_stream_op_batch_finish_with_failure(batch, cancel_error_,
|
|
2841
2634
|
call_combiner_);
|
|
2842
2635
|
return;
|
|
2843
2636
|
}
|
|
2844
2637
|
// Add the batch to the pending list.
|
|
2845
|
-
|
|
2638
|
+
buffered_call_.EnqueueBatch(batch);
|
|
2846
2639
|
// For batches containing a send_initial_metadata op, acquire the
|
|
2847
2640
|
// channel's LB mutex to pick a subchannel.
|
|
2848
2641
|
if (GPR_LIKELY(batch->send_initial_metadata)) {
|
|
@@ -2850,22 +2643,22 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
|
2850
2643
|
} else {
|
|
2851
2644
|
// For all other batches, release the call combiner.
|
|
2852
2645
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2853
|
-
<< "chand=" <<
|
|
2646
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
|
2854
2647
|
<< ": saved batch, yielding call combiner";
|
|
2855
2648
|
GRPC_CALL_COMBINER_STOP(call_combiner_,
|
|
2856
2649
|
"batch does not include send_initial_metadata");
|
|
2857
2650
|
}
|
|
2858
2651
|
}
|
|
2859
2652
|
|
|
2860
|
-
void ClientChannelFilter::
|
|
2653
|
+
void ClientChannelFilter::LoadBalancedCall::RecvInitialMetadataReady(
|
|
2861
2654
|
void* arg, grpc_error_handle error) {
|
|
2862
|
-
auto* self = static_cast<
|
|
2655
|
+
auto* self = static_cast<LoadBalancedCall*>(arg);
|
|
2863
2656
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2864
|
-
<< "chand=" << self->
|
|
2657
|
+
<< "chand=" << self->chand_ << " lb_call=" << self
|
|
2865
2658
|
<< ": got recv_initial_metadata_ready: error=" << StatusToString(error);
|
|
2866
2659
|
if (error.ok()) {
|
|
2867
2660
|
// recv_initial_metadata_flags is not populated for clients
|
|
2868
|
-
self->
|
|
2661
|
+
self->call_attempt_tracer_->RecordReceivedInitialMetadata(
|
|
2869
2662
|
self->recv_initial_metadata_);
|
|
2870
2663
|
auto* peer_string = self->recv_initial_metadata_->get_pointer(PeerString());
|
|
2871
2664
|
if (peer_string != nullptr) self->peer_string_ = peer_string->Ref();
|
|
@@ -2874,27 +2667,28 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::RecvInitialMetadataReady(
|
|
|
2874
2667
|
error);
|
|
2875
2668
|
}
|
|
2876
2669
|
|
|
2877
|
-
void ClientChannelFilter::
|
|
2878
|
-
|
|
2879
|
-
auto* self = static_cast<
|
|
2670
|
+
void ClientChannelFilter::LoadBalancedCall::RecvTrailingMetadataReady(
|
|
2671
|
+
void* arg, grpc_error_handle error) {
|
|
2672
|
+
auto* self = static_cast<LoadBalancedCall*>(arg);
|
|
2880
2673
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2881
|
-
<< "chand=" << self->
|
|
2674
|
+
<< "chand=" << self->chand_ << " lb_call=" << self
|
|
2882
2675
|
<< ": got recv_trailing_metadata_ready: error=" << StatusToString(error)
|
|
2883
|
-
<< "
|
|
2884
|
-
<< " lb_subchannel_call_tracker_="
|
|
2676
|
+
<< " call_attempt_tracer_=" << self->call_attempt_tracer_
|
|
2677
|
+
<< " lb_subchannel_call_tracker_="
|
|
2678
|
+
<< self->lb_subchannel_call_tracker_.get()
|
|
2885
2679
|
<< " failure_error_=" << StatusToString(self->failure_error_);
|
|
2886
2680
|
// Check if we have a tracer or an LB callback to invoke.
|
|
2887
|
-
if (self->
|
|
2888
|
-
self->
|
|
2681
|
+
if (self->call_attempt_tracer_ != nullptr ||
|
|
2682
|
+
self->lb_subchannel_call_tracker_ != nullptr) {
|
|
2889
2683
|
// Get the call's status.
|
|
2890
2684
|
absl::Status status;
|
|
2891
2685
|
if (!error.ok()) {
|
|
2892
2686
|
// Get status from error.
|
|
2893
2687
|
grpc_status_code code;
|
|
2894
2688
|
std::string message;
|
|
2895
|
-
grpc_error_get_status(
|
|
2896
|
-
|
|
2897
|
-
|
|
2689
|
+
grpc_error_get_status(error, self->arena_->GetContext<Call>()->deadline(),
|
|
2690
|
+
&code, &message,
|
|
2691
|
+
/*http_error=*/nullptr, /*error_string=*/nullptr);
|
|
2898
2692
|
status = absl::Status(static_cast<absl::StatusCode>(code), message);
|
|
2899
2693
|
} else {
|
|
2900
2694
|
// Get status from headers.
|
|
@@ -2925,78 +2719,18 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
|
|
|
2925
2719
|
error);
|
|
2926
2720
|
}
|
|
2927
2721
|
|
|
2928
|
-
|
|
2929
|
-
// queued pick.
|
|
2930
|
-
// TODO(roth): When we implement hedging support, we won't be able to
|
|
2931
|
-
// register a call combiner cancellation closure for each LB pick,
|
|
2932
|
-
// because there may be multiple LB picks happening in parallel.
|
|
2933
|
-
// Instead, we will probably need to maintain a list in the CallData
|
|
2934
|
-
// object of pending LB picks to be cancelled when the closure runs.
|
|
2935
|
-
class ClientChannelFilter::FilterBasedLoadBalancedCall::LbQueuedCallCanceller
|
|
2936
|
-
final {
|
|
2937
|
-
public:
|
|
2938
|
-
explicit LbQueuedCallCanceller(
|
|
2939
|
-
RefCountedPtr<FilterBasedLoadBalancedCall> lb_call)
|
|
2940
|
-
: lb_call_(std::move(lb_call)) {
|
|
2941
|
-
GRPC_CALL_STACK_REF(lb_call_->owning_call_, "LbQueuedCallCanceller");
|
|
2942
|
-
GRPC_CLOSURE_INIT(&closure_, &CancelLocked, this, nullptr);
|
|
2943
|
-
lb_call_->call_combiner_->SetNotifyOnCancel(&closure_);
|
|
2944
|
-
}
|
|
2945
|
-
|
|
2946
|
-
private:
|
|
2947
|
-
static void CancelLocked(void* arg, grpc_error_handle error) {
|
|
2948
|
-
auto* self = static_cast<LbQueuedCallCanceller*>(arg);
|
|
2949
|
-
auto* lb_call = self->lb_call_.get();
|
|
2950
|
-
auto* chand = lb_call->chand();
|
|
2951
|
-
{
|
|
2952
|
-
MutexLock lock(&chand->lb_mu_);
|
|
2953
|
-
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
2954
|
-
<< "chand=" << chand << " lb_call=" << lb_call
|
|
2955
|
-
<< ": cancelling queued pick: error=" << StatusToString(error)
|
|
2956
|
-
<< " self=" << self
|
|
2957
|
-
<< " calld->pick_canceller=" << lb_call->lb_call_canceller_;
|
|
2958
|
-
if (lb_call->lb_call_canceller_ == self && !error.ok()) {
|
|
2959
|
-
lb_call->Commit();
|
|
2960
|
-
// Remove pick from list of queued picks.
|
|
2961
|
-
lb_call->RemoveCallFromLbQueuedCallsLocked();
|
|
2962
|
-
// Remove from queued picks list.
|
|
2963
|
-
chand->lb_queued_calls_.erase(self->lb_call_);
|
|
2964
|
-
// Fail pending batches on the call.
|
|
2965
|
-
lb_call->PendingBatchesFail(error,
|
|
2966
|
-
YieldCallCombinerIfPendingBatchesFound);
|
|
2967
|
-
}
|
|
2968
|
-
}
|
|
2969
|
-
// Unref lb_call before unreffing the call stack, since unreffing
|
|
2970
|
-
// the call stack may destroy the arena in which lb_call is allocated.
|
|
2971
|
-
auto* owning_call = lb_call->owning_call_;
|
|
2972
|
-
self->lb_call_.reset();
|
|
2973
|
-
GRPC_CALL_STACK_UNREF(owning_call, "LbQueuedCallCanceller");
|
|
2974
|
-
delete self;
|
|
2975
|
-
}
|
|
2976
|
-
|
|
2977
|
-
RefCountedPtr<FilterBasedLoadBalancedCall> lb_call_;
|
|
2978
|
-
grpc_closure closure_;
|
|
2979
|
-
};
|
|
2980
|
-
|
|
2981
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::TryPick(
|
|
2982
|
-
bool was_queued) {
|
|
2722
|
+
void ClientChannelFilter::LoadBalancedCall::TryPick(bool was_queued) {
|
|
2983
2723
|
auto result = PickSubchannel(was_queued);
|
|
2984
2724
|
if (result.has_value()) {
|
|
2985
2725
|
if (!result->ok()) {
|
|
2986
|
-
|
|
2726
|
+
buffered_call_.Fail(*result, BufferedCall::YieldCallCombiner);
|
|
2987
2727
|
return;
|
|
2988
2728
|
}
|
|
2989
2729
|
CreateSubchannelCall();
|
|
2990
2730
|
}
|
|
2991
2731
|
}
|
|
2992
2732
|
|
|
2993
|
-
void ClientChannelFilter::
|
|
2994
|
-
// Register call combiner cancellation callback.
|
|
2995
|
-
lb_call_canceller_ =
|
|
2996
|
-
new LbQueuedCallCanceller(RefAsSubclass<FilterBasedLoadBalancedCall>());
|
|
2997
|
-
}
|
|
2998
|
-
|
|
2999
|
-
void ClientChannelFilter::FilterBasedLoadBalancedCall::RetryPickLocked() {
|
|
2733
|
+
void ClientChannelFilter::LoadBalancedCall::RetryPickLocked() {
|
|
3000
2734
|
// Lame the call combiner canceller.
|
|
3001
2735
|
lb_call_canceller_ = nullptr;
|
|
3002
2736
|
// Do an async callback to resume call processing, so that we're not
|
|
@@ -3025,17 +2759,17 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::RetryPickLocked() {
|
|
|
3025
2759
|
absl::OkStatus());
|
|
3026
2760
|
}
|
|
3027
2761
|
|
|
3028
|
-
void ClientChannelFilter::
|
|
2762
|
+
void ClientChannelFilter::LoadBalancedCall::CreateSubchannelCall() {
|
|
3029
2763
|
SubchannelCall::Args call_args = {
|
|
3030
|
-
|
|
3031
|
-
|
|
2764
|
+
connected_subchannel_->Ref(), pollent_, /*start_time=*/0,
|
|
2765
|
+
arena_->GetContext<Call>()->deadline(),
|
|
3032
2766
|
// TODO(roth): When we implement hedging support, we will probably
|
|
3033
2767
|
// need to use a separate call arena for each subchannel call.
|
|
3034
|
-
|
|
2768
|
+
arena_, call_combiner_};
|
|
3035
2769
|
grpc_error_handle error;
|
|
3036
2770
|
subchannel_call_ = SubchannelCall::Create(std::move(call_args), &error);
|
|
3037
2771
|
GRPC_TRACE_LOG(client_channel_lb_call, INFO)
|
|
3038
|
-
<< "chand=" <<
|
|
2772
|
+
<< "chand=" << chand_ << " lb_call=" << this
|
|
3039
2773
|
<< ": create subchannel_call=" << subchannel_call_.get()
|
|
3040
2774
|
<< ": error=" << StatusToString(error);
|
|
3041
2775
|
if (on_call_destruction_complete_ != nullptr) {
|
|
@@ -3043,9 +2777,13 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::CreateSubchannelCall() {
|
|
|
3043
2777
|
on_call_destruction_complete_ = nullptr;
|
|
3044
2778
|
}
|
|
3045
2779
|
if (GPR_UNLIKELY(!error.ok())) {
|
|
3046
|
-
|
|
2780
|
+
buffered_call_.Fail(error, BufferedCall::YieldCallCombiner);
|
|
3047
2781
|
} else {
|
|
3048
|
-
|
|
2782
|
+
buffered_call_.Resume([subchannel_call = subchannel_call_](
|
|
2783
|
+
grpc_transport_stream_op_batch* batch) {
|
|
2784
|
+
// Note: This will release the call combiner.
|
|
2785
|
+
subchannel_call->StartTransportStreamOpBatch(batch);
|
|
2786
|
+
});
|
|
3049
2787
|
}
|
|
3050
2788
|
}
|
|
3051
2789
|
|