grpc 1.41.1 → 1.42.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +55 -43
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +78 -66
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -25,6 +25,7 @@
|
|
25
25
|
#include "src/core/lib/channel/channel_args.h"
|
26
26
|
#include "src/core/lib/debug/trace.h"
|
27
27
|
#include "src/core/lib/gprpp/ref_counted.h"
|
28
|
+
#include "src/core/lib/iomgr/resolve_address.h"
|
28
29
|
|
29
30
|
namespace grpc_core {
|
30
31
|
|
@@ -35,7 +36,8 @@ extern TraceFlag grpc_subchannel_pool_trace;
|
|
35
36
|
// A key that can uniquely identify a subchannel.
|
36
37
|
class SubchannelKey {
|
37
38
|
public:
|
38
|
-
|
39
|
+
SubchannelKey(const grpc_resolved_address& address,
|
40
|
+
const grpc_channel_args* args);
|
39
41
|
~SubchannelKey();
|
40
42
|
|
41
43
|
// Copyable.
|
@@ -47,13 +49,20 @@ class SubchannelKey {
|
|
47
49
|
|
48
50
|
bool operator<(const SubchannelKey& other) const;
|
49
51
|
|
52
|
+
const grpc_resolved_address& address() const { return address_; }
|
53
|
+
const grpc_channel_args* args() const { return args_; }
|
54
|
+
|
55
|
+
// Human-readable string suitable for logging.
|
56
|
+
std::string ToString() const;
|
57
|
+
|
50
58
|
private:
|
51
59
|
// Initializes the subchannel key with the given \a args and the function to
|
52
60
|
// copy channel args.
|
53
61
|
void Init(
|
54
|
-
const grpc_channel_args* args,
|
62
|
+
const grpc_resolved_address& address, const grpc_channel_args* args,
|
55
63
|
grpc_channel_args* (*copy_channel_args)(const grpc_channel_args* args));
|
56
64
|
|
65
|
+
grpc_resolved_address address_;
|
57
66
|
const grpc_channel_args* args_;
|
58
67
|
};
|
59
68
|
|
@@ -22,10 +22,11 @@
|
|
22
22
|
|
23
23
|
#include <atomic>
|
24
24
|
|
25
|
+
#include "src/core/ext/filters/client_idle/idle_filter_state.h"
|
25
26
|
#include "src/core/lib/channel/channel_args.h"
|
26
27
|
#include "src/core/lib/channel/channel_stack_builder.h"
|
28
|
+
#include "src/core/lib/config/core_configuration.h"
|
27
29
|
#include "src/core/lib/iomgr/timer.h"
|
28
|
-
#include "src/core/lib/surface/channel_init.h"
|
29
30
|
#include "src/core/lib/transport/http2_errors.h"
|
30
31
|
|
31
32
|
// TODO(juanlishen): The idle filter is disabled in client channel by default
|
@@ -47,78 +48,8 @@ TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
|
|
47
48
|
|
48
49
|
namespace {
|
49
50
|
|
50
|
-
/*
|
51
|
-
client_idle_filter maintains a state tracking if there are active calls in the
|
52
|
-
channel and its internal idle_timer_. The states are specified as following:
|
53
|
-
|
54
|
-
+--------------------------------------------+-------------+---------+
|
55
|
-
| ChannelState | idle_timer_ | channel |
|
56
|
-
+--------------------------------------------+-------------+---------+
|
57
|
-
| IDLE | unset | idle |
|
58
|
-
| CALLS_ACTIVE | unset | busy |
|
59
|
-
| TIMER_PENDING | set-valid | idle |
|
60
|
-
| TIMER_PENDING_CALLS_ACTIVE | set-invalid | busy |
|
61
|
-
| TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START | set-invalid | idle |
|
62
|
-
+--------------------------------------------+-------------+---------+
|
63
|
-
|
64
|
-
IDLE: The initial state of the client_idle_filter, indicating the channel is
|
65
|
-
in IDLE.
|
66
|
-
|
67
|
-
CALLS_ACTIVE: The channel has 1 or 1+ active calls and the timer is not set.
|
68
|
-
|
69
|
-
TIMER_PENDING: The state after the timer is set and no calls have arrived
|
70
|
-
after the timer is set. The channel must have 0 active call in this state. If
|
71
|
-
the timer is fired in this state, the channel will go into IDLE state.
|
72
|
-
|
73
|
-
TIMER_PENDING_CALLS_ACTIVE: The state after the timer is set and at least one
|
74
|
-
call has arrived after the timer is set. The channel must have 1 or 1+ active
|
75
|
-
calls in this state. If the timer is fired in this state, we won't reschedule
|
76
|
-
it.
|
77
|
-
|
78
|
-
TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START: The state after the timer is set
|
79
|
-
and at least one call has arrived after the timer is set, BUT the channel
|
80
|
-
currently has 0 active call. If the timer is fired in this state, we will
|
81
|
-
reschedule it according to the finish time of the latest call.
|
82
|
-
|
83
|
-
PROCESSING: The state set to block other threads when the setting thread is
|
84
|
-
doing some work to keep state consistency.
|
85
|
-
|
86
|
-
idle_timer_ will not be cancelled (unless the channel is shutting down).
|
87
|
-
If the timer callback is called when the idle_timer_ is valid (i.e. idle_state
|
88
|
-
is TIMER_PENDING), the channel will enter IDLE, otherwise the channel won't be
|
89
|
-
changed.
|
90
|
-
|
91
|
-
State transitions:
|
92
|
-
IDLE
|
93
|
-
| ^
|
94
|
-
--------------------------------- *
|
95
|
-
| *
|
96
|
-
v *
|
97
|
-
CALLS_ACTIVE =================> TIMER_PENDING
|
98
|
-
^ | ^
|
99
|
-
* ------------------------------ *
|
100
|
-
* | *
|
101
|
-
* v *
|
102
|
-
TIMER_PENDING_CALLS_ACTIVE ===> TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START
|
103
|
-
^ |
|
104
|
-
| |
|
105
|
-
---------------------------------
|
106
|
-
|
107
|
-
---> Triggered by IncreaseCallCount()
|
108
|
-
===> Triggered by DecreaseCallCount()
|
109
|
-
***> Triggered by IdleTimerCallback()
|
110
|
-
*/
|
111
|
-
enum ChannelState {
|
112
|
-
IDLE,
|
113
|
-
CALLS_ACTIVE,
|
114
|
-
TIMER_PENDING,
|
115
|
-
TIMER_PENDING_CALLS_ACTIVE,
|
116
|
-
TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START,
|
117
|
-
PROCESSING
|
118
|
-
};
|
119
|
-
|
120
51
|
grpc_millis GetClientIdleTimeout(const grpc_channel_args* args) {
|
121
|
-
return
|
52
|
+
return std::max(
|
122
53
|
grpc_channel_arg_get_integer(
|
123
54
|
grpc_channel_args_find(args, GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS),
|
124
55
|
{DEFAULT_IDLE_TIMEOUT_MS, 0, INT_MAX}),
|
@@ -159,9 +90,7 @@ class ChannelData {
|
|
159
90
|
const grpc_millis client_idle_timeout_;
|
160
91
|
|
161
92
|
// Member data used to track the state of channel.
|
162
|
-
|
163
|
-
std::atomic<intptr_t> call_count_{0};
|
164
|
-
std::atomic<ChannelState> state_{IDLE};
|
93
|
+
IdleFilterState idle_filter_state_{false};
|
165
94
|
|
166
95
|
// Idle timer and its callback closure.
|
167
96
|
grpc_timer idle_timer_;
|
@@ -202,86 +131,13 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
|
|
202
131
|
}
|
203
132
|
|
204
133
|
void ChannelData::IncreaseCallCount() {
|
205
|
-
|
206
|
-
call_count_.fetch_add(1, std::memory_order_relaxed);
|
207
|
-
GRPC_IDLE_FILTER_LOG("call counter has increased to %" PRIuPTR,
|
208
|
-
previous_value + 1);
|
209
|
-
if (previous_value == 0) {
|
210
|
-
// This call is the one that makes the channel busy.
|
211
|
-
// Loop here to make sure the previous decrease operation has finished.
|
212
|
-
ChannelState state = state_.load(std::memory_order_relaxed);
|
213
|
-
while (true) {
|
214
|
-
switch (state) {
|
215
|
-
// Timer has not been set. Switch to CALLS_ACTIVE.
|
216
|
-
case IDLE:
|
217
|
-
// In this case, no other threads will modify the state, so we can
|
218
|
-
// just store the value.
|
219
|
-
state_.store(CALLS_ACTIVE, std::memory_order_relaxed);
|
220
|
-
return;
|
221
|
-
// Timer has been set. Switch to TIMER_PENDING_CALLS_ACTIVE.
|
222
|
-
case TIMER_PENDING:
|
223
|
-
case TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START:
|
224
|
-
// At this point, the state may have been switched to IDLE by the
|
225
|
-
// idle timer callback. Therefore, use CAS operation to change the
|
226
|
-
// state atomically.
|
227
|
-
// Use std::memory_order_acquire on success to ensure last_idle_time_
|
228
|
-
// has been properly set in DecreaseCallCount().
|
229
|
-
if (state_.compare_exchange_weak(state, TIMER_PENDING_CALLS_ACTIVE,
|
230
|
-
std::memory_order_acquire,
|
231
|
-
std::memory_order_relaxed)) {
|
232
|
-
return;
|
233
|
-
}
|
234
|
-
break;
|
235
|
-
default:
|
236
|
-
// The state has not been switched to desired value yet, try again.
|
237
|
-
state = state_.load(std::memory_order_relaxed);
|
238
|
-
break;
|
239
|
-
}
|
240
|
-
}
|
241
|
-
}
|
134
|
+
idle_filter_state_.IncreaseCallCount();
|
242
135
|
}
|
243
136
|
|
244
137
|
void ChannelData::DecreaseCallCount() {
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
previous_value - 1);
|
249
|
-
if (previous_value == 1) {
|
250
|
-
// This call is the one that makes the channel idle.
|
251
|
-
// last_idle_time_ does not need to be std::atomic<> because busy-loops in
|
252
|
-
// IncreaseCallCount(), DecreaseCallCount() and IdleTimerCallback() will
|
253
|
-
// prevent multiple threads from simultaneously accessing this variable.
|
254
|
-
last_idle_time_ = ExecCtx::Get()->Now();
|
255
|
-
ChannelState state = state_.load(std::memory_order_relaxed);
|
256
|
-
while (true) {
|
257
|
-
switch (state) {
|
258
|
-
// Timer has not been set. Set the timer and switch to TIMER_PENDING
|
259
|
-
case CALLS_ACTIVE:
|
260
|
-
// Release store here to make other threads see the updated value of
|
261
|
-
// last_idle_time_.
|
262
|
-
StartIdleTimer();
|
263
|
-
state_.store(TIMER_PENDING, std::memory_order_release);
|
264
|
-
return;
|
265
|
-
// Timer has been set. Switch to
|
266
|
-
// TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START
|
267
|
-
case TIMER_PENDING_CALLS_ACTIVE:
|
268
|
-
// At this point, the state may have been switched to CALLS_ACTIVE by
|
269
|
-
// the idle timer callback. Therefore, use CAS operation to change the
|
270
|
-
// state atomically.
|
271
|
-
// Release store here to make the idle timer callback see the updated
|
272
|
-
// value of last_idle_time_ to properly reset the idle timer.
|
273
|
-
if (state_.compare_exchange_weak(
|
274
|
-
state, TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START,
|
275
|
-
std::memory_order_release, std::memory_order_relaxed)) {
|
276
|
-
return;
|
277
|
-
}
|
278
|
-
break;
|
279
|
-
default:
|
280
|
-
// The state has not been switched to desired value yet, try again.
|
281
|
-
state = state_.load(std::memory_order_relaxed);
|
282
|
-
break;
|
283
|
-
}
|
284
|
-
}
|
138
|
+
if (idle_filter_state_.DecreaseCallCount()) {
|
139
|
+
// If there are no more calls in progress, start the idle timer.
|
140
|
+
StartIdleTimer();
|
285
141
|
}
|
286
142
|
}
|
287
143
|
|
@@ -315,44 +171,10 @@ void ChannelData::IdleTimerCallback(void* arg, grpc_error_handle error) {
|
|
315
171
|
GRPC_CHANNEL_STACK_UNREF(chand->channel_stack_, "max idle timer callback");
|
316
172
|
return;
|
317
173
|
}
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
case TIMER_PENDING:
|
323
|
-
// Change the state to PROCESSING to block IncreaseCallCout() until the
|
324
|
-
// EnterIdle() operation finishes, preventing mistakenly entering IDLE
|
325
|
-
// when active RPC exists.
|
326
|
-
finished = chand->state_.compare_exchange_weak(
|
327
|
-
state, PROCESSING, std::memory_order_acquire,
|
328
|
-
std::memory_order_relaxed);
|
329
|
-
if (finished) {
|
330
|
-
chand->EnterIdle();
|
331
|
-
chand->state_.store(IDLE, std::memory_order_relaxed);
|
332
|
-
}
|
333
|
-
break;
|
334
|
-
case TIMER_PENDING_CALLS_ACTIVE:
|
335
|
-
finished = chand->state_.compare_exchange_weak(
|
336
|
-
state, CALLS_ACTIVE, std::memory_order_relaxed,
|
337
|
-
std::memory_order_relaxed);
|
338
|
-
break;
|
339
|
-
case TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START:
|
340
|
-
// Change the state to PROCESSING to block IncreaseCallCount() until the
|
341
|
-
// StartIdleTimer() operation finishes, preventing mistakenly restarting
|
342
|
-
// the timer after grpc_timer_cancel() when shutdown.
|
343
|
-
finished = chand->state_.compare_exchange_weak(
|
344
|
-
state, PROCESSING, std::memory_order_acquire,
|
345
|
-
std::memory_order_relaxed);
|
346
|
-
if (finished) {
|
347
|
-
chand->StartIdleTimer();
|
348
|
-
chand->state_.store(TIMER_PENDING, std::memory_order_relaxed);
|
349
|
-
}
|
350
|
-
break;
|
351
|
-
default:
|
352
|
-
// The state has not been switched to desired value yet, try again.
|
353
|
-
state = chand->state_.load(std::memory_order_relaxed);
|
354
|
-
break;
|
355
|
-
}
|
174
|
+
if (chand->idle_filter_state_.CheckTimer()) {
|
175
|
+
chand->StartIdleTimer();
|
176
|
+
} else {
|
177
|
+
chand->EnterIdle();
|
356
178
|
}
|
357
179
|
GRPC_IDLE_FILTER_LOG("timer finishes");
|
358
180
|
GRPC_CHANNEL_STACK_UNREF(chand->channel_stack_, "max idle timer callback");
|
@@ -368,7 +190,7 @@ void ChannelData::StartIdleTimer() {
|
|
368
190
|
GRPC_IDLE_FILTER_LOG("timer has started");
|
369
191
|
// Hold a ref to the channel stack for the timer callback.
|
370
192
|
GRPC_CHANNEL_STACK_REF(channel_stack_, "max idle timer callback");
|
371
|
-
grpc_timer_init(&idle_timer_,
|
193
|
+
grpc_timer_init(&idle_timer_, ExecCtx::Get()->Now() + client_idle_timeout_,
|
372
194
|
&idle_timer_callback_);
|
373
195
|
}
|
374
196
|
|
@@ -422,26 +244,21 @@ const grpc_channel_filter grpc_client_idle_filter = {
|
|
422
244
|
grpc_channel_next_get_info,
|
423
245
|
"client_idle"};
|
424
246
|
|
425
|
-
static bool MaybeAddClientIdleFilter(grpc_channel_stack_builder* builder,
|
426
|
-
void* /*arg*/) {
|
427
|
-
const grpc_channel_args* channel_args =
|
428
|
-
grpc_channel_stack_builder_get_channel_arguments(builder);
|
429
|
-
if (!grpc_channel_args_want_minimal_stack(channel_args) &&
|
430
|
-
GetClientIdleTimeout(channel_args) != INT_MAX) {
|
431
|
-
return grpc_channel_stack_builder_prepend_filter(
|
432
|
-
builder, &grpc_client_idle_filter, nullptr, nullptr);
|
433
|
-
} else {
|
434
|
-
return true;
|
435
|
-
}
|
436
|
-
}
|
437
|
-
|
438
247
|
} // namespace
|
439
|
-
} // namespace grpc_core
|
440
248
|
|
441
|
-
void
|
442
|
-
|
249
|
+
void RegisterClientIdleFilter(CoreConfiguration::Builder* builder) {
|
250
|
+
builder->channel_init()->RegisterStage(
|
443
251
|
GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
|
444
|
-
|
252
|
+
[](grpc_channel_stack_builder* builder) {
|
253
|
+
const grpc_channel_args* channel_args =
|
254
|
+
grpc_channel_stack_builder_get_channel_arguments(builder);
|
255
|
+
if (!grpc_channel_args_want_minimal_stack(channel_args) &&
|
256
|
+
GetClientIdleTimeout(channel_args) != INT_MAX) {
|
257
|
+
return grpc_channel_stack_builder_prepend_filter(
|
258
|
+
builder, &grpc_client_idle_filter, nullptr, nullptr);
|
259
|
+
} else {
|
260
|
+
return true;
|
261
|
+
}
|
262
|
+
});
|
445
263
|
}
|
446
|
-
|
447
|
-
void grpc_client_idle_filter_shutdown(void) {}
|
264
|
+
} // namespace grpc_core
|
@@ -0,0 +1,96 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/ext/filters/client_idle/idle_filter_state.h"
|
18
|
+
|
19
|
+
#include <assert.h>
|
20
|
+
|
21
|
+
namespace grpc_core {
|
22
|
+
|
23
|
+
IdleFilterState::IdleFilterState(bool start_timer)
|
24
|
+
: state_(start_timer ? kTimerStarted : 0) {}
|
25
|
+
|
26
|
+
void IdleFilterState::IncreaseCallCount() {
|
27
|
+
uintptr_t state = state_.load(std::memory_order_relaxed);
|
28
|
+
uintptr_t new_state;
|
29
|
+
do {
|
30
|
+
// Increment the counter, and flag that there's been activity.
|
31
|
+
new_state = state;
|
32
|
+
new_state |= kCallsStartedSinceLastTimerCheck;
|
33
|
+
new_state += kCallIncrement;
|
34
|
+
} while (!state_.compare_exchange_weak(
|
35
|
+
state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
|
36
|
+
}
|
37
|
+
|
38
|
+
bool IdleFilterState::DecreaseCallCount() {
|
39
|
+
uintptr_t state = state_.load(std::memory_order_relaxed);
|
40
|
+
uintptr_t new_state;
|
41
|
+
bool start_timer;
|
42
|
+
do {
|
43
|
+
start_timer = false;
|
44
|
+
new_state = state;
|
45
|
+
// Decrement call count (and assert there's at least one call outstanding!)
|
46
|
+
assert(new_state >= kCallIncrement);
|
47
|
+
new_state -= kCallIncrement;
|
48
|
+
// If that decrement reaches a call count of zero and we have not started a
|
49
|
+
// timer
|
50
|
+
if ((new_state >> kCallsInProgressShift) == 0 &&
|
51
|
+
(new_state & kTimerStarted) == 0) {
|
52
|
+
// Flag that we will start a timer, and mark it started so nobody else
|
53
|
+
// does.
|
54
|
+
start_timer = true;
|
55
|
+
new_state |= kTimerStarted;
|
56
|
+
new_state &= ~kCallsInProgressShift;
|
57
|
+
}
|
58
|
+
} while (!state_.compare_exchange_weak(
|
59
|
+
state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
|
60
|
+
return start_timer;
|
61
|
+
}
|
62
|
+
|
63
|
+
bool IdleFilterState::CheckTimer() {
|
64
|
+
uintptr_t state = state_.load(std::memory_order_relaxed);
|
65
|
+
uintptr_t new_state;
|
66
|
+
bool start_timer;
|
67
|
+
do {
|
68
|
+
if ((state >> kCallsInProgressShift) != 0) {
|
69
|
+
// Still calls in progress: nothing needs updating, just return
|
70
|
+
// and keep the timer going!
|
71
|
+
return true;
|
72
|
+
}
|
73
|
+
new_state = state;
|
74
|
+
bool is_active = false;
|
75
|
+
if (new_state & kCallsStartedSinceLastTimerCheck) {
|
76
|
+
// If any calls started since the last time we checked, then consider the
|
77
|
+
// channel still active and try again.
|
78
|
+
is_active = true;
|
79
|
+
new_state &= ~kCallsStartedSinceLastTimerCheck;
|
80
|
+
}
|
81
|
+
if (is_active) {
|
82
|
+
// If we are still active, we should signal that the timer should start
|
83
|
+
// again.
|
84
|
+
start_timer = true;
|
85
|
+
} else {
|
86
|
+
// Otherwise, we should not start the timer again, and we should signal
|
87
|
+
// that in the updated state.
|
88
|
+
start_timer = false;
|
89
|
+
new_state &= ~kTimerStarted;
|
90
|
+
}
|
91
|
+
} while (!state_.compare_exchange_weak(
|
92
|
+
state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
|
93
|
+
return start_timer;
|
94
|
+
}
|
95
|
+
|
96
|
+
} // namespace grpc_core
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
|
16
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <atomic>
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
|
24
|
+
// State machine for the idle filter.
|
25
|
+
// Keeps track of how many calls are in progress, whether there is a timer
|
26
|
+
// started, and whether we've seen calls since the previous timer fired.
|
27
|
+
class IdleFilterState {
|
28
|
+
public:
|
29
|
+
explicit IdleFilterState(bool start_timer);
|
30
|
+
~IdleFilterState() = default;
|
31
|
+
|
32
|
+
IdleFilterState(const IdleFilterState&);
|
33
|
+
IdleFilterState& operator=(const IdleFilterState&);
|
34
|
+
|
35
|
+
// Increment the number of calls in progress.
|
36
|
+
void IncreaseCallCount();
|
37
|
+
|
38
|
+
// Decrement the number of calls in progress.
|
39
|
+
// Return true if we reached idle with no timer started.
|
40
|
+
GRPC_MUST_USE_RESULT bool DecreaseCallCount();
|
41
|
+
|
42
|
+
// Check if there's been any activity since the last timer check.
|
43
|
+
// If there was, reset the activity flag and return true to indicated that
|
44
|
+
// a new timer should be started.
|
45
|
+
// If there was not, reset the timer flag and return false - in this case
|
46
|
+
// we know that the channel is idle and has been for one full cycle.
|
47
|
+
GRPC_MUST_USE_RESULT bool CheckTimer();
|
48
|
+
|
49
|
+
private:
|
50
|
+
// Bit in state_ indicating that the timer has been started.
|
51
|
+
static constexpr uintptr_t kTimerStarted = 1;
|
52
|
+
// Bit in state_ indicating that we've seen a call start or stop since the
|
53
|
+
// last timer.
|
54
|
+
static constexpr uintptr_t kCallsStartedSinceLastTimerCheck = 2;
|
55
|
+
// How much should we shift to get the number of calls in progress.
|
56
|
+
static constexpr uintptr_t kCallsInProgressShift = 2;
|
57
|
+
// How much to increment/decrement the state_ when a call is started/stopped.
|
58
|
+
// Ensures we don't clobber the preceding bits.
|
59
|
+
static constexpr uintptr_t kCallIncrement = uintptr_t(1)
|
60
|
+
<< kCallsInProgressShift;
|
61
|
+
std::atomic<uintptr_t> state_;
|
62
|
+
};
|
63
|
+
|
64
|
+
} // namespace grpc_core
|
65
|
+
|
66
|
+
#endif // GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
|
@@ -27,10 +27,10 @@
|
|
27
27
|
#include <grpc/support/time.h>
|
28
28
|
|
29
29
|
#include "src/core/lib/channel/channel_stack_builder.h"
|
30
|
+
#include "src/core/lib/config/core_configuration.h"
|
30
31
|
#include "src/core/lib/gprpp/memory.h"
|
31
32
|
#include "src/core/lib/iomgr/timer.h"
|
32
33
|
#include "src/core/lib/slice/slice_internal.h"
|
33
|
-
#include "src/core/lib/surface/channel_init.h"
|
34
34
|
|
35
35
|
namespace grpc_core {
|
36
36
|
|
@@ -114,9 +114,7 @@ class TimerState {
|
|
114
114
|
// synchronized.
|
115
115
|
static void start_timer_if_needed(grpc_call_element* elem,
|
116
116
|
grpc_millis deadline) {
|
117
|
-
if (deadline == GRPC_MILLIS_INF_FUTURE)
|
118
|
-
return;
|
119
|
-
}
|
117
|
+
if (deadline == GRPC_MILLIS_INF_FUTURE) return;
|
120
118
|
grpc_deadline_state* deadline_state =
|
121
119
|
static_cast<grpc_deadline_state*>(elem->call_data);
|
122
120
|
GPR_ASSERT(deadline_state->timer_state == nullptr);
|
@@ -295,7 +293,9 @@ static void deadline_client_start_transport_stream_op_batch(
|
|
295
293
|
static void recv_initial_metadata_ready(void* arg, grpc_error_handle error) {
|
296
294
|
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
|
297
295
|
server_call_data* calld = static_cast<server_call_data*>(elem->call_data);
|
298
|
-
start_timer_if_needed(
|
296
|
+
start_timer_if_needed(
|
297
|
+
elem, calld->recv_initial_metadata->get(grpc_core::GrpcTimeoutMetadata())
|
298
|
+
.value_or(GRPC_MILLIS_INF_FUTURE));
|
299
299
|
// Invoke the next callback.
|
300
300
|
grpc_core::Closure::Run(DEBUG_LOCATION,
|
301
301
|
calld->next_recv_initial_metadata_ready,
|
@@ -370,25 +370,22 @@ bool grpc_deadline_checking_enabled(const grpc_channel_args* channel_args) {
|
|
370
370
|
!grpc_channel_args_want_minimal_stack(channel_args));
|
371
371
|
}
|
372
372
|
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
maybe_add_deadline_filter,
|
391
|
-
const_cast<grpc_channel_filter*>(&grpc_server_deadline_filter));
|
373
|
+
namespace grpc_core {
|
374
|
+
void RegisterDeadlineFilter(CoreConfiguration::Builder* builder) {
|
375
|
+
auto register_filter = [builder](grpc_channel_stack_type type,
|
376
|
+
const grpc_channel_filter* filter) {
|
377
|
+
builder->channel_init()->RegisterStage(
|
378
|
+
type, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
|
379
|
+
[filter](grpc_channel_stack_builder* builder) {
|
380
|
+
if (grpc_deadline_checking_enabled(
|
381
|
+
grpc_channel_stack_builder_get_channel_arguments(builder))) {
|
382
|
+
return grpc_channel_stack_builder_prepend_filter(builder, filter,
|
383
|
+
nullptr, nullptr);
|
384
|
+
}
|
385
|
+
return true;
|
386
|
+
});
|
387
|
+
};
|
388
|
+
register_filter(GRPC_CLIENT_DIRECT_CHANNEL, &grpc_client_deadline_filter);
|
389
|
+
register_filter(GRPC_SERVER_CHANNEL, &grpc_server_deadline_filter);
|
392
390
|
}
|
393
|
-
|
394
|
-
void grpc_deadline_filter_shutdown(void) {}
|
391
|
+
} // namespace grpc_core
|
@@ -25,9 +25,8 @@
|
|
25
25
|
#include <grpc/support/alloc.h>
|
26
26
|
#include <grpc/support/log.h>
|
27
27
|
|
28
|
-
#include "src/core/ext/filters/client_channel/service_config.h"
|
29
|
-
#include "src/core/ext/filters/client_channel/service_config_call_data.h"
|
30
28
|
#include "src/core/ext/filters/fault_injection/service_config_parser.h"
|
29
|
+
#include "src/core/ext/service_config/service_config_call_data.h"
|
31
30
|
#include "src/core/lib/channel/channel_stack.h"
|
32
31
|
#include "src/core/lib/channel/status_util.h"
|
33
32
|
#include "src/core/lib/gprpp/sync.h"
|
@@ -46,27 +45,27 @@ static_assert(
|
|
46
45
|
std::is_trivially_destructible<std::atomic<uint32_t>>::value,
|
47
46
|
"the active fault counter needs to have a trivially destructible type");
|
48
47
|
|
49
|
-
inline int
|
48
|
+
inline int GetMetadatumValueInt(grpc_mdelem md) {
|
50
49
|
int res;
|
51
|
-
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md
|
50
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
|
52
51
|
return res;
|
53
52
|
} else {
|
54
53
|
return -1;
|
55
54
|
}
|
56
55
|
}
|
57
56
|
|
58
|
-
inline uint32_t
|
57
|
+
inline uint32_t GetMetadatumValueUnsignedInt(grpc_mdelem md) {
|
59
58
|
uint32_t res;
|
60
|
-
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md
|
59
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
|
61
60
|
return res;
|
62
61
|
} else {
|
63
62
|
return -1;
|
64
63
|
}
|
65
64
|
}
|
66
65
|
|
67
|
-
inline int64_t
|
66
|
+
inline int64_t GetMetadatumValueInt64(grpc_mdelem md) {
|
68
67
|
int64_t res;
|
69
|
-
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md
|
68
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
|
70
69
|
return res;
|
71
70
|
} else {
|
72
71
|
return -1;
|
@@ -347,9 +346,8 @@ void CallData::DecideWhetherToInjectFaults(
|
|
347
346
|
*fi_policy_);
|
348
347
|
}
|
349
348
|
};
|
350
|
-
|
351
|
-
|
352
|
-
absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
|
349
|
+
initial_metadata->ForEach([&](grpc_mdelem md) {
|
350
|
+
absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md));
|
353
351
|
// Only perform string comparison if:
|
354
352
|
// 1. Needs to check this header;
|
355
353
|
// 2. The value is not been filled before.
|
@@ -358,31 +356,31 @@ void CallData::DecideWhetherToInjectFaults(
|
|
358
356
|
copied_policy->abort_code == GRPC_STATUS_OK) &&
|
359
357
|
key == fi_policy_->abort_code_header) {
|
360
358
|
maybe_copy_policy_func();
|
361
|
-
grpc_status_code_from_int(
|
359
|
+
grpc_status_code_from_int(GetMetadatumValueInt(md),
|
362
360
|
&copied_policy->abort_code);
|
363
361
|
}
|
364
362
|
if (!fi_policy_->abort_percentage_header.empty() &&
|
365
363
|
key == fi_policy_->abort_percentage_header) {
|
366
364
|
maybe_copy_policy_func();
|
367
365
|
copied_policy->abort_percentage_numerator =
|
368
|
-
|
369
|
-
|
366
|
+
std::min(GetMetadatumValueUnsignedInt(md),
|
367
|
+
fi_policy_->abort_percentage_numerator);
|
370
368
|
}
|
371
369
|
if (!fi_policy_->delay_header.empty() &&
|
372
370
|
(copied_policy == nullptr || copied_policy->delay == 0) &&
|
373
371
|
key == fi_policy_->delay_header) {
|
374
372
|
maybe_copy_policy_func();
|
375
373
|
copied_policy->delay = static_cast<grpc_millis>(
|
376
|
-
|
374
|
+
std::max(GetMetadatumValueInt64(md), int64_t(0)));
|
377
375
|
}
|
378
376
|
if (!fi_policy_->delay_percentage_header.empty() &&
|
379
377
|
key == fi_policy_->delay_percentage_header) {
|
380
378
|
maybe_copy_policy_func();
|
381
379
|
copied_policy->delay_percentage_numerator =
|
382
|
-
|
383
|
-
|
380
|
+
std::min(GetMetadatumValueUnsignedInt(md),
|
381
|
+
fi_policy_->delay_percentage_numerator);
|
384
382
|
}
|
385
|
-
}
|
383
|
+
});
|
386
384
|
if (copied_policy != nullptr) fi_policy_ = copied_policy;
|
387
385
|
}
|
388
386
|
// Roll the dice
|
@@ -456,8 +454,10 @@ void CallData::ResumeBatch(void* arg, grpc_error_handle error) {
|
|
456
454
|
// Abort if needed.
|
457
455
|
error = calld->MaybeAbort();
|
458
456
|
if (error != GRPC_ERROR_NONE) {
|
457
|
+
calld->abort_error_ = error;
|
459
458
|
grpc_transport_stream_op_batch_finish_with_failure(
|
460
|
-
calld->delayed_batch_,
|
459
|
+
calld->delayed_batch_, GRPC_ERROR_REF(calld->abort_error_),
|
460
|
+
calld->call_combiner_);
|
461
461
|
return;
|
462
462
|
}
|
463
463
|
// Chain to the next filter.
|