grpc 1.41.1 → 1.42.0
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 +75 -63
- 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
@@ -24,6 +24,7 @@
|
|
24
24
|
#include <vector>
|
25
25
|
|
26
26
|
#include "absl/status/statusor.h"
|
27
|
+
#include "absl/synchronization/notification.h"
|
27
28
|
#include "absl/types/optional.h"
|
28
29
|
|
29
30
|
#include <grpc/grpc.h>
|
@@ -364,7 +365,7 @@ class Server : public InternallyRefCounted<Server> {
|
|
364
365
|
std::vector<grpc_channel*> GetChannelsLocked() const;
|
365
366
|
|
366
367
|
// Take a shutdown ref for a request (increment by 2) and return if shutdown
|
367
|
-
// has
|
368
|
+
// has not been called.
|
368
369
|
bool ShutdownRefOnRequest() {
|
369
370
|
int old_value = shutdown_refs_.fetch_add(2, std::memory_order_acq_rel);
|
370
371
|
return (old_value & 1) != 0;
|
@@ -377,12 +378,24 @@ class Server : public InternallyRefCounted<Server> {
|
|
377
378
|
if (shutdown_refs_.fetch_sub(2, std::memory_order_acq_rel) == 2) {
|
378
379
|
MutexLock lock(&mu_global_);
|
379
380
|
MaybeFinishShutdown();
|
381
|
+
// The last request in-flight during shutdown is now complete.
|
382
|
+
if (requests_complete_ != nullptr) {
|
383
|
+
GPR_ASSERT(!requests_complete_->HasBeenNotified());
|
384
|
+
requests_complete_->Notify();
|
385
|
+
}
|
380
386
|
}
|
381
387
|
}
|
382
|
-
|
388
|
+
// Returns a notification pointer to wait on if there are requests in-flight,
|
389
|
+
// or null.
|
390
|
+
absl::Notification* ShutdownUnrefOnShutdownCall()
|
391
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) GRPC_MUST_USE_RESULT {
|
383
392
|
if (shutdown_refs_.fetch_sub(1, std::memory_order_acq_rel) == 1) {
|
393
|
+
// There is no request in-flight.
|
384
394
|
MaybeFinishShutdown();
|
395
|
+
return nullptr;
|
385
396
|
}
|
397
|
+
requests_complete_ = absl::make_unique<absl::Notification>();
|
398
|
+
return requests_complete_.get();
|
386
399
|
}
|
387
400
|
|
388
401
|
bool ShutdownCalled() const {
|
@@ -433,6 +446,8 @@ class Server : public InternallyRefCounted<Server> {
|
|
433
446
|
std::atomic<int> shutdown_refs_{1};
|
434
447
|
bool shutdown_published_ ABSL_GUARDED_BY(mu_global_) = false;
|
435
448
|
std::vector<ShutdownTag> shutdown_tags_ ABSL_GUARDED_BY(mu_global_);
|
449
|
+
std::unique_ptr<absl::Notification> requests_complete_
|
450
|
+
ABSL_GUARDED_BY(mu_global_);
|
436
451
|
|
437
452
|
std::list<ChannelData*> channels_;
|
438
453
|
|
@@ -449,12 +464,6 @@ struct grpc_server {
|
|
449
464
|
grpc_core::OrphanablePtr<grpc_core::Server> core_server;
|
450
465
|
};
|
451
466
|
|
452
|
-
// TODO(roth): Eventually, will need a way to modify configuration even after
|
453
|
-
// a connection is established (e.g., to change things like L7 rate
|
454
|
-
// limiting, RBAC, and fault injection configs). One possible option
|
455
|
-
// would be to do something like ServiceConfig and ConfigSelector, but
|
456
|
-
// that might add unnecessary per-call overhead. Need to consider other
|
457
|
-
// approaches here.
|
458
467
|
struct grpc_server_config_fetcher {
|
459
468
|
public:
|
460
469
|
class ConnectionManager : public grpc_core::RefCounted<ConnectionManager> {
|
@@ -479,9 +488,7 @@ struct grpc_server_config_fetcher {
|
|
479
488
|
|
480
489
|
virtual ~grpc_server_config_fetcher() = default;
|
481
490
|
|
482
|
-
// Ownership of \a args is transferred.
|
483
491
|
virtual void StartWatch(std::string listening_address,
|
484
|
-
grpc_channel_args* args,
|
485
492
|
std::unique_ptr<WatcherInterface> watcher) = 0;
|
486
493
|
virtual void CancelWatch(WatcherInterface* watcher) = 0;
|
487
494
|
virtual grpc_pollset_set* interested_parties() = 0;
|
@@ -47,12 +47,15 @@ static grpc_error_handle conforms_to(const grpc_slice& slice,
|
|
47
47
|
const uint8_t* e = GRPC_SLICE_END_PTR(slice);
|
48
48
|
for (; p != e; p++) {
|
49
49
|
if (!legal_bits.is_set(*p)) {
|
50
|
+
size_t len;
|
51
|
+
grpc_core::UniquePtr<char> ptr(gpr_dump_return_len(
|
52
|
+
reinterpret_cast<const char*> GRPC_SLICE_START_PTR(slice),
|
53
|
+
GRPC_SLICE_LENGTH(slice), GPR_DUMP_HEX | GPR_DUMP_ASCII, &len));
|
50
54
|
grpc_error_handle error = grpc_error_set_str(
|
51
55
|
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_desc),
|
52
56
|
GRPC_ERROR_INT_OFFSET,
|
53
57
|
p - GRPC_SLICE_START_PTR(slice)),
|
54
|
-
GRPC_ERROR_STR_RAW_BYTES,
|
55
|
-
grpc_dump_slice_to_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII));
|
58
|
+
GRPC_ERROR_STR_RAW_BYTES, absl::string_view(ptr.get(), len));
|
56
59
|
return error;
|
57
60
|
}
|
58
61
|
}
|
@@ -23,6 +23,6 @@
|
|
23
23
|
|
24
24
|
#include <grpc/grpc.h>
|
25
25
|
|
26
|
-
const char* grpc_version_string(void) { return "
|
26
|
+
const char* grpc_version_string(void) { return "20.0.0"; }
|
27
27
|
|
28
|
-
const char* grpc_g_stands_for(void) { return "
|
28
|
+
const char* grpc_g_stands_for(void) { return "granola"; }
|
@@ -55,7 +55,7 @@ grpc_millis BdpEstimator::CompletePing() {
|
|
55
55
|
}
|
56
56
|
GPR_ASSERT(ping_state_ == PingState::STARTED);
|
57
57
|
if (accumulator_ > 2 * estimate_ / 3 && bw > bw_est_) {
|
58
|
-
estimate_ =
|
58
|
+
estimate_ = std::max(accumulator_, estimate_ * 2);
|
59
59
|
bw_est_ = bw;
|
60
60
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
|
61
61
|
gpr_log(GPR_INFO, "bdp[%s]: estimate increased to %" PRId64, name_,
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
#include <grpc/support/string_util.h>
|
24
24
|
|
25
|
+
#include "src/core/lib/gprpp/status_helper.h"
|
25
26
|
#include "src/core/lib/iomgr/error_internal.h"
|
26
27
|
#include "src/core/lib/slice/slice_internal.h"
|
27
28
|
#include "src/core/lib/transport/status_conversion.h"
|
@@ -33,7 +34,14 @@ static grpc_error_handle recursively_find_error_with_field(
|
|
33
34
|
if (grpc_error_get_int(error, which, &unused)) {
|
34
35
|
return error;
|
35
36
|
}
|
36
|
-
|
37
|
+
#ifdef GRPC_ERROR_IS_ABSEIL_STATUS
|
38
|
+
std::vector<absl::Status> children = grpc_core::StatusGetChildren(error);
|
39
|
+
for (const absl::Status& child : children) {
|
40
|
+
grpc_error_handle result = recursively_find_error_with_field(child, which);
|
41
|
+
if (result != GRPC_ERROR_NONE) return result;
|
42
|
+
}
|
43
|
+
#else
|
44
|
+
if (grpc_error_is_special(error)) return GRPC_ERROR_NONE;
|
37
45
|
// Otherwise, search through its children.
|
38
46
|
uint8_t slot = error->first_err;
|
39
47
|
while (slot != UINT8_MAX) {
|
@@ -44,26 +52,27 @@ static grpc_error_handle recursively_find_error_with_field(
|
|
44
52
|
if (result) return result;
|
45
53
|
slot = lerr->next;
|
46
54
|
}
|
47
|
-
|
55
|
+
#endif
|
56
|
+
return GRPC_ERROR_NONE;
|
48
57
|
}
|
49
58
|
|
50
59
|
void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
|
51
|
-
grpc_status_code* code,
|
60
|
+
grpc_status_code* code, std::string* message,
|
52
61
|
grpc_http2_error_code* http_error,
|
53
62
|
const char** error_string) {
|
54
63
|
// Fast path: We expect no error.
|
55
64
|
if (GPR_LIKELY(error == GRPC_ERROR_NONE)) {
|
56
65
|
if (code != nullptr) *code = GRPC_STATUS_OK;
|
57
|
-
if (
|
66
|
+
if (message != nullptr) {
|
58
67
|
// Normally, we call grpc_error_get_str(
|
59
|
-
// error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
68
|
+
// error, GRPC_ERROR_STR_GRPC_MESSAGE, message).
|
60
69
|
// We can fastpath since we know that:
|
61
70
|
// 1) Error is null
|
62
71
|
// 2) which == GRPC_ERROR_STR_GRPC_MESSAGE
|
63
|
-
// 3) The resulting
|
64
|
-
// 4) Said resulting
|
72
|
+
// 3) The resulting message is statically known.
|
73
|
+
// 4) Said resulting message is "".
|
65
74
|
// This means 3 movs, instead of 10s of instructions and a strlen.
|
66
|
-
*
|
75
|
+
*message = "";
|
67
76
|
}
|
68
77
|
if (http_error != nullptr) {
|
69
78
|
*http_error = GRPC_HTTP2_NO_ERROR;
|
@@ -94,6 +103,10 @@ void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
|
|
94
103
|
&integer)) {
|
95
104
|
status = grpc_http2_error_to_grpc_status(
|
96
105
|
static_cast<grpc_http2_error_code>(integer), deadline);
|
106
|
+
} else {
|
107
|
+
#ifdef GRPC_ERROR_IS_ABSEIL_STATUS
|
108
|
+
status = static_cast<grpc_status_code>(found_error.code());
|
109
|
+
#endif
|
97
110
|
}
|
98
111
|
if (code != nullptr) *code = status;
|
99
112
|
|
@@ -116,10 +129,16 @@ void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
|
|
116
129
|
|
117
130
|
// If the error has a status message, use it. Otherwise, fall back to
|
118
131
|
// the error description.
|
119
|
-
if (
|
120
|
-
if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
121
|
-
|
122
|
-
|
132
|
+
if (message != nullptr) {
|
133
|
+
if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
134
|
+
message)) {
|
135
|
+
if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_DESCRIPTION,
|
136
|
+
message)) {
|
137
|
+
#ifdef GRPC_ERROR_IS_ABSEIL_STATUS
|
138
|
+
*message = grpc_error_std_string(error);
|
139
|
+
#else
|
140
|
+
*message = "unknown error";
|
141
|
+
#endif
|
123
142
|
}
|
124
143
|
}
|
125
144
|
}
|
@@ -129,13 +148,10 @@ absl::Status grpc_error_to_absl_status(grpc_error_handle error) {
|
|
129
148
|
grpc_status_code status;
|
130
149
|
// TODO(yashykt): This should be updated once we decide on how to use the
|
131
150
|
// absl::Status payload to capture all the contents of grpc_error.
|
132
|
-
|
151
|
+
std::string message;
|
133
152
|
grpc_error_get_status(error, GRPC_MILLIS_INF_FUTURE, &status, &message,
|
134
153
|
nullptr /* http_error */, nullptr /* error_string */);
|
135
|
-
return absl::Status(static_cast<absl::StatusCode>(status),
|
136
|
-
absl::string_view(reinterpret_cast<const char*>(
|
137
|
-
GRPC_SLICE_START_PTR(message)),
|
138
|
-
GRPC_SLICE_LENGTH(message)));
|
154
|
+
return absl::Status(static_cast<absl::StatusCode>(status), message);
|
139
155
|
}
|
140
156
|
|
141
157
|
grpc_error_handle absl_status_to_grpc_error(absl::Status status) {
|
@@ -153,6 +169,14 @@ bool grpc_error_has_clear_grpc_status(grpc_error_handle error) {
|
|
153
169
|
if (grpc_error_get_int(error, GRPC_ERROR_INT_GRPC_STATUS, &unused)) {
|
154
170
|
return true;
|
155
171
|
}
|
172
|
+
#ifdef GRPC_ERROR_IS_ABSEIL_STATUS
|
173
|
+
std::vector<absl::Status> children = grpc_core::StatusGetChildren(error);
|
174
|
+
for (const absl::Status& child : children) {
|
175
|
+
if (grpc_error_has_clear_grpc_status(child)) {
|
176
|
+
return true;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
#else
|
156
180
|
uint8_t slot = error->first_err;
|
157
181
|
while (slot != UINT8_MAX) {
|
158
182
|
grpc_linked_error* lerr =
|
@@ -162,5 +186,6 @@ bool grpc_error_has_clear_grpc_status(grpc_error_handle error) {
|
|
162
186
|
}
|
163
187
|
slot = lerr->next;
|
164
188
|
}
|
189
|
+
#endif
|
165
190
|
return false;
|
166
191
|
}
|
@@ -35,7 +35,7 @@
|
|
35
35
|
/// msg, http_status, error_string) are unneeded, they can be passed as
|
36
36
|
/// NULL.
|
37
37
|
void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
|
38
|
-
grpc_status_code* code,
|
38
|
+
grpc_status_code* code, std::string* message,
|
39
39
|
grpc_http2_error_code* http_error,
|
40
40
|
const char** error_string);
|
41
41
|
|
@@ -279,9 +279,9 @@ void grpc_mdctx_global_shutdown() {
|
|
279
279
|
#ifndef NDEBUG
|
280
280
|
static int is_mdelem_static(grpc_mdelem e) {
|
281
281
|
return reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) >=
|
282
|
-
&
|
282
|
+
&grpc_core::g_static_mdelem_table[0] &&
|
283
283
|
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) <
|
284
|
-
&
|
284
|
+
&grpc_core::g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
|
285
285
|
}
|
286
286
|
#endif
|
287
287
|
|
@@ -549,14 +549,35 @@ grpc_mdelem grpc_mdelem_from_slices(
|
|
549
549
|
}
|
550
550
|
|
551
551
|
grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata) {
|
552
|
-
bool
|
552
|
+
bool key_changed = false;
|
553
553
|
grpc_slice key_slice =
|
554
|
-
grpc_slice_maybe_static_intern(metadata->key, &
|
554
|
+
grpc_slice_maybe_static_intern(metadata->key, &key_changed);
|
555
|
+
bool value_changed = false;
|
556
|
+
grpc_slice* unref_slice = nullptr;
|
555
557
|
grpc_slice value_slice =
|
556
|
-
grpc_slice_maybe_static_intern(metadata->value, &
|
557
|
-
|
558
|
-
|
559
|
-
|
558
|
+
grpc_slice_maybe_static_intern(metadata->value, &value_changed);
|
559
|
+
// If key or value changed, but the other didn't.... AND the other is a NOP
|
560
|
+
// refcount, then we need to convert it to a slice with a refcount else we run
|
561
|
+
// the risk of leaving a dangling reference to that metadata on the heap via
|
562
|
+
// this mdelem.
|
563
|
+
if (key_changed && !value_changed && value_slice.refcount != nullptr &&
|
564
|
+
value_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
|
565
|
+
value_slice = grpc_slice_copy(value_slice);
|
566
|
+
unref_slice = &value_slice;
|
567
|
+
value_changed = true;
|
568
|
+
} else if (!key_changed && value_changed && key_slice.refcount != nullptr &&
|
569
|
+
key_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
|
570
|
+
key_slice = grpc_slice_copy(key_slice);
|
571
|
+
unref_slice = &key_slice;
|
572
|
+
key_changed = true;
|
573
|
+
}
|
574
|
+
auto mdelem =
|
575
|
+
grpc_mdelem_create(key_slice, value_slice,
|
576
|
+
key_changed || value_changed
|
577
|
+
? nullptr
|
578
|
+
: reinterpret_cast<grpc_mdelem_data*>(metadata));
|
579
|
+
if (unref_slice != nullptr) grpc_slice_unref_internal(*unref_slice);
|
580
|
+
return mdelem;
|
560
581
|
}
|
561
582
|
|
562
583
|
static void* get_user_data(UserData* user_data, void (*destroy_func)(void*)) {
|
@@ -577,7 +598,7 @@ void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*destroy_func)(void*)) {
|
|
577
598
|
grpc_static_mdelem_user_data
|
578
599
|
[reinterpret_cast<grpc_core::StaticMetadata*>(
|
579
600
|
GRPC_MDELEM_DATA(md)) -
|
580
|
-
|
601
|
+
grpc_core::g_static_mdelem_table]);
|
581
602
|
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
582
603
|
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
|
583
604
|
return get_user_data(am->user_data(), destroy_func);
|
@@ -619,7 +640,7 @@ void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
|
|
619
640
|
grpc_static_mdelem_user_data
|
620
641
|
[reinterpret_cast<grpc_core::StaticMetadata*>(
|
621
642
|
GRPC_MDELEM_DATA(md)) -
|
622
|
-
|
643
|
+
grpc_core::g_static_mdelem_table]);
|
623
644
|
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
624
645
|
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
|
625
646
|
return set_user_data(am->user_data(), destroy_func, data);
|
@@ -409,7 +409,8 @@ inline void grpc_mdelem_unref(grpc_mdelem gmd) {
|
|
409
409
|
(GRPC_SLICE_LENGTH(GRPC_MDKEY((e))) + GRPC_SLICE_LENGTH(GRPC_MDVALUE((e))) + \
|
410
410
|
32)
|
411
411
|
|
412
|
-
#define GRPC_MDSTR_KV_HASH(k_hash, v_hash)
|
412
|
+
#define GRPC_MDSTR_KV_HASH(k_hash, v_hash) \
|
413
|
+
(::grpc_core::RotateLeft(size_t(k_hash), size_t(2)) ^ (v_hash))
|
413
414
|
|
414
415
|
void grpc_mdctx_global_init(void);
|
415
416
|
void grpc_mdctx_global_shutdown();
|