grpc 1.43.1 → 1.44.0.pre2
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 +84 -64
- data/include/grpc/grpc_security.h +10 -0
- data/include/grpc/impl/codegen/compression_types.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +6 -0
- data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
- data/src/core/ext/filters/client_channel/client_channel.h +8 -8
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
- data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
- data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
- data/src/core/ext/filters/client_channel/subchannel.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
- data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
- data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
- data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
- data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
- data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
- data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
- data/src/core/ext/xds/upb_utils.h +65 -0
- data/src/core/ext/xds/xds_api.cc +81 -3458
- data/src/core/ext/xds/xds_api.h +56 -611
- data/src/core/ext/xds/xds_bootstrap.cc +189 -125
- data/src/core/ext/xds/xds_bootstrap.h +20 -15
- data/src/core/ext/xds/xds_certificate_provider.h +1 -0
- data/src/core/ext/xds/xds_channel_creds.cc +108 -0
- data/src/core/ext/xds/xds_channel_creds.h +50 -0
- data/src/core/ext/xds/xds_client.cc +584 -994
- data/src/core/ext/xds/xds_client.h +78 -135
- data/src/core/ext/xds/xds_cluster.cc +451 -0
- data/src/core/ext/xds/xds_cluster.h +111 -0
- data/src/core/ext/xds/xds_common_types.cc +388 -0
- data/src/core/ext/xds/xds_common_types.h +110 -0
- data/src/core/ext/xds/xds_endpoint.cc +364 -0
- data/src/core/ext/xds/xds_endpoint.h +135 -0
- data/src/core/ext/xds/xds_http_filters.cc +5 -0
- data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
- data/src/core/ext/xds/xds_listener.cc +1036 -0
- data/src/core/ext/xds/xds_listener.h +220 -0
- data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
- data/src/core/ext/xds/xds_resource_type.h +98 -0
- data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
- data/src/core/ext/xds/xds_route_config.cc +993 -0
- data/src/core/ext/xds/xds_route_config.h +215 -0
- data/src/core/ext/xds/xds_routing.cc +11 -8
- data/src/core/ext/xds/xds_routing.h +8 -5
- data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
- data/src/core/lib/address_utils/parse_address.cc +20 -0
- data/src/core/lib/address_utils/parse_address.h +5 -0
- data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
- data/src/core/lib/backoff/backoff.cc +4 -30
- data/src/core/lib/backoff/backoff.h +3 -3
- data/src/core/lib/channel/channel_args.cc +0 -1
- data/src/core/lib/channel/channel_stack.cc +8 -0
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_stack_builder.cc +5 -9
- data/src/core/lib/channel/channel_stack_builder.h +4 -7
- data/src/core/lib/channel/channelz.cc +1 -0
- data/src/core/lib/compression/compression.cc +19 -111
- data/src/core/lib/compression/compression_internal.cc +142 -202
- data/src/core/lib/compression/compression_internal.h +64 -69
- data/src/core/lib/compression/message_compress.cc +11 -11
- data/src/core/lib/compression/message_compress.h +2 -2
- data/src/core/lib/gpr/useful.h +4 -0
- data/src/core/lib/gprpp/bitset.h +7 -0
- data/src/core/lib/gprpp/chunked_vector.h +45 -3
- data/src/core/lib/gprpp/status_helper.cc +20 -28
- data/src/core/lib/gprpp/status_helper.h +6 -19
- data/src/core/lib/gprpp/table.h +11 -0
- data/src/core/lib/http/httpcli.cc +37 -46
- data/src/core/lib/http/httpcli.h +3 -15
- data/src/core/lib/iomgr/call_combiner.cc +15 -4
- data/src/core/lib/iomgr/closure.h +29 -9
- data/src/core/lib/iomgr/combiner.cc +25 -3
- data/src/core/lib/iomgr/error.cc +2 -0
- data/src/core/lib/iomgr/error.h +3 -0
- data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
- data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
- data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
- data/src/core/lib/iomgr/exec_ctx.cc +22 -9
- data/src/core/lib/iomgr/executor.cc +10 -1
- data/src/core/lib/iomgr/fork_posix.cc +3 -2
- data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
- data/src/core/lib/iomgr/port.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +5 -24
- data/src/core/lib/iomgr/resolve_address.h +47 -44
- data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
- data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
- data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
- data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
- data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
- data/src/core/lib/iomgr/resolved_address.h +39 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
- data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
- data/src/core/lib/matchers/matchers.cc +1 -1
- data/src/core/lib/promise/activity.h +49 -20
- data/src/core/lib/promise/detail/status.h +5 -0
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.h +0 -1
- data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
- data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
- data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
- data/src/core/lib/security/authorization/evaluate_args.h +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
- data/src/core/lib/security/authorization/matchers.cc +227 -0
- data/src/core/lib/security/authorization/matchers.h +211 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
- data/src/core/lib/security/authorization/rbac_policy.h +170 -0
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/context/security_context.h +1 -1
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
- data/src/core/lib/security/credentials/credentials.h +10 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
- data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
- data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +0 -4
- data/src/core/lib/security/security_connector/security_connector.h +5 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
- data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
- data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
- data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
- data/src/core/{ext → lib}/service_config/service_config.h +4 -4
- data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
- data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
- data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
- data/src/core/lib/slice/slice.cc +3 -1
- data/src/core/lib/slice/slice.h +43 -13
- data/src/core/lib/slice/slice_intern.cc +3 -101
- data/src/core/lib/slice/slice_internal.h +1 -2
- data/src/core/lib/slice/slice_refcount.h +4 -13
- data/src/core/lib/slice/slice_refcount_base.h +0 -16
- data/src/core/lib/surface/call.cc +140 -382
- data/src/core/lib/surface/call.h +4 -4
- data/src/core/lib/surface/channel.cc +42 -44
- data/src/core/lib/surface/channel.h +4 -4
- data/src/core/lib/surface/init.cc +0 -2
- data/src/core/lib/surface/lame_client.cc +0 -1
- data/src/core/lib/surface/server.cc +12 -29
- data/src/core/lib/surface/server.h +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.h +14 -0
- data/src/core/lib/transport/metadata_batch.h +799 -717
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +95 -92
- data/src/core/lib/transport/timeout_encoding.cc +200 -66
- data/src/core/lib/transport/timeout_encoding.h +40 -10
- data/src/core/lib/transport/transport.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +6 -39
- data/src/core/lib/uri/uri_parser.cc +223 -53
- data/src/core/lib/uri/uri_parser.h +36 -23
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
- data/src/core/tsi/ssl_transport_security.cc +53 -13
- data/src/core/tsi/ssl_transport_security.h +18 -6
- data/src/ruby/ext/grpc/extconf.rb +10 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
- data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
- data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
- data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
- data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
- data/third_party/abseil-cpp/absl/random/random.h +189 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
- data/third_party/xxhash/xxhash.h +607 -352
- metadata +149 -77
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
- data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
- data/src/core/lib/compression/algorithm_metadata.h +0 -62
- data/src/core/lib/compression/compression_args.cc +0 -140
- data/src/core/lib/compression/compression_args.h +0 -58
- data/src/core/lib/compression/stream_compression.cc +0 -81
- data/src/core/lib/compression/stream_compression.h +0 -117
- data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
- data/src/core/lib/compression/stream_compression_gzip.h +0 -28
- data/src/core/lib/compression/stream_compression_identity.cc +0 -91
- data/src/core/lib/compression/stream_compression_identity.h +0 -29
- data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
- data/src/core/lib/slice/static_slice.cc +0 -377
- data/src/core/lib/slice/static_slice.h +0 -300
- data/src/core/lib/transport/metadata.cc +0 -714
- data/src/core/lib/transport/metadata.h +0 -449
- data/src/core/lib/transport/metadata_batch.cc +0 -99
- data/src/core/lib/transport/static_metadata.cc +0 -1032
- data/src/core/lib/transport/static_metadata.h +0 -322
- data/src/core/lib/transport/status_metadata.cc +0 -63
- data/src/core/lib/transport/status_metadata.h +0 -48
@@ -1,714 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
*
|
3
|
-
* Copyright 2015 gRPC authors.
|
4
|
-
*
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
* you may not use this file except in compliance with the License.
|
7
|
-
* You may obtain a copy of the License at
|
8
|
-
*
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
*
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
* See the License for the specific language governing permissions and
|
15
|
-
* limitations under the License.
|
16
|
-
*
|
17
|
-
*/
|
18
|
-
|
19
|
-
#include <grpc/support/port_platform.h>
|
20
|
-
|
21
|
-
#include "src/core/lib/transport/metadata.h"
|
22
|
-
|
23
|
-
#include <assert.h>
|
24
|
-
#include <inttypes.h>
|
25
|
-
#include <stddef.h>
|
26
|
-
#include <string.h>
|
27
|
-
|
28
|
-
#include <grpc/compression.h>
|
29
|
-
#include <grpc/grpc.h>
|
30
|
-
#include <grpc/support/alloc.h>
|
31
|
-
#include <grpc/support/atm.h>
|
32
|
-
#include <grpc/support/log.h>
|
33
|
-
#include <grpc/support/string_util.h>
|
34
|
-
#include <grpc/support/time.h>
|
35
|
-
|
36
|
-
#include "src/core/lib/gpr/murmur_hash.h"
|
37
|
-
#include "src/core/lib/gpr/string.h"
|
38
|
-
#include "src/core/lib/iomgr/iomgr_internal.h"
|
39
|
-
#include "src/core/lib/profiling/timers.h"
|
40
|
-
#include "src/core/lib/slice/slice_internal.h"
|
41
|
-
#include "src/core/lib/slice/slice_string_helpers.h"
|
42
|
-
#include "src/core/lib/transport/static_metadata.h"
|
43
|
-
|
44
|
-
using grpc_core::AllocatedMetadata;
|
45
|
-
using grpc_core::InternedMetadata;
|
46
|
-
using grpc_core::StaticMetadata;
|
47
|
-
using grpc_core::UserData;
|
48
|
-
|
49
|
-
/* There are two kinds of mdelem and mdstr instances.
|
50
|
-
* Static instances are declared in static_metadata.{h,c} and
|
51
|
-
* are initialized by grpc_mdctx_global_init().
|
52
|
-
* Dynamic instances are stored in hash tables on grpc_mdctx, and are backed
|
53
|
-
* by internal_string and internal_element structures.
|
54
|
-
* Internal helper functions here-in (is_mdstr_static, is_mdelem_static) are
|
55
|
-
* used to determine which kind of element a pointer refers to.
|
56
|
-
*/
|
57
|
-
|
58
|
-
grpc_core::DebugOnlyTraceFlag grpc_trace_metadata(false, "metadata");
|
59
|
-
|
60
|
-
#ifndef NDEBUG
|
61
|
-
#define DEBUG_ARGS , const char *file, int line
|
62
|
-
#define FWD_DEBUG_ARGS file, line
|
63
|
-
|
64
|
-
void grpc_mdelem_trace_ref(void* md, const grpc_slice& key,
|
65
|
-
const grpc_slice& value, intptr_t refcnt,
|
66
|
-
const char* file, int line) {
|
67
|
-
if (grpc_trace_metadata.enabled()) {
|
68
|
-
char* key_str = grpc_slice_to_c_string(key);
|
69
|
-
char* value_str = grpc_slice_to_c_string(value);
|
70
|
-
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
71
|
-
"mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
|
72
|
-
refcnt, refcnt + 1, key_str, value_str);
|
73
|
-
gpr_free(key_str);
|
74
|
-
gpr_free(value_str);
|
75
|
-
}
|
76
|
-
}
|
77
|
-
|
78
|
-
void grpc_mdelem_trace_unref(void* md, const grpc_slice& key,
|
79
|
-
const grpc_slice& value, intptr_t refcnt,
|
80
|
-
const char* file, int line) {
|
81
|
-
if (grpc_trace_metadata.enabled()) {
|
82
|
-
char* key_str = grpc_slice_to_c_string(key);
|
83
|
-
char* value_str = grpc_slice_to_c_string(value);
|
84
|
-
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
85
|
-
"mdelem UNREF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
|
86
|
-
refcnt, refcnt - 1, key_str, value_str);
|
87
|
-
gpr_free(key_str);
|
88
|
-
gpr_free(value_str);
|
89
|
-
}
|
90
|
-
}
|
91
|
-
|
92
|
-
#else // ifndef NDEBUG
|
93
|
-
#define DEBUG_ARGS
|
94
|
-
#define FWD_DEBUG_ARGS
|
95
|
-
#endif // ifndef NDEBUG
|
96
|
-
|
97
|
-
#define INITIAL_SHARD_CAPACITY 8
|
98
|
-
#define LOG2_SHARD_COUNT 4
|
99
|
-
#define SHARD_COUNT ((size_t)(1 << LOG2_SHARD_COUNT))
|
100
|
-
|
101
|
-
#define TABLE_IDX(hash, capacity) (((hash) >> (LOG2_SHARD_COUNT)) % (capacity))
|
102
|
-
#define SHARD_IDX(hash) ((hash) & ((1 << (LOG2_SHARD_COUNT)) - 1))
|
103
|
-
|
104
|
-
void StaticMetadata::HashInit() {
|
105
|
-
uint32_t k_hash = grpc_slice_hash_internal(kv_.key);
|
106
|
-
uint32_t v_hash = grpc_slice_hash_internal(kv_.value);
|
107
|
-
hash_ = GRPC_MDSTR_KV_HASH(k_hash, v_hash);
|
108
|
-
}
|
109
|
-
|
110
|
-
AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
|
111
|
-
const grpc_slice& value)
|
112
|
-
: RefcountedMdBase(grpc_slice_ref_internal(key),
|
113
|
-
grpc_slice_ref_internal(value)) {
|
114
|
-
#ifndef NDEBUG
|
115
|
-
TraceAtStart("ALLOC_MD");
|
116
|
-
#endif
|
117
|
-
}
|
118
|
-
|
119
|
-
AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
|
120
|
-
const grpc_slice& value, const NoRefKey*)
|
121
|
-
: RefcountedMdBase(key, grpc_slice_ref_internal(value)) {
|
122
|
-
#ifndef NDEBUG
|
123
|
-
TraceAtStart("ALLOC_MD_NOREF_KEY");
|
124
|
-
#endif
|
125
|
-
}
|
126
|
-
|
127
|
-
AllocatedMetadata::AllocatedMetadata(
|
128
|
-
const grpc_core::ManagedMemorySlice& key,
|
129
|
-
const grpc_core::UnmanagedMemorySlice& value)
|
130
|
-
: RefcountedMdBase(key, value) {
|
131
|
-
#ifndef NDEBUG
|
132
|
-
TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
|
133
|
-
#endif
|
134
|
-
}
|
135
|
-
|
136
|
-
AllocatedMetadata::AllocatedMetadata(
|
137
|
-
const grpc_core::ExternallyManagedSlice& key,
|
138
|
-
const grpc_core::UnmanagedMemorySlice& value)
|
139
|
-
: RefcountedMdBase(key, value) {
|
140
|
-
#ifndef NDEBUG
|
141
|
-
TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
|
142
|
-
#endif
|
143
|
-
}
|
144
|
-
|
145
|
-
AllocatedMetadata::~AllocatedMetadata() {
|
146
|
-
grpc_slice_unref_internal(key());
|
147
|
-
grpc_slice_unref_internal(value());
|
148
|
-
void* user_data = user_data_.data.load(std::memory_order_relaxed);
|
149
|
-
if (user_data) {
|
150
|
-
destroy_user_data_func destroy_user_data =
|
151
|
-
user_data_.destroy_user_data.load(std::memory_order_relaxed);
|
152
|
-
destroy_user_data(user_data);
|
153
|
-
}
|
154
|
-
}
|
155
|
-
|
156
|
-
#ifndef NDEBUG
|
157
|
-
void grpc_core::RefcountedMdBase::TraceAtStart(const char* tag) {
|
158
|
-
if (grpc_trace_metadata.enabled()) {
|
159
|
-
char* key_str = grpc_slice_to_c_string(key());
|
160
|
-
char* value_str = grpc_slice_to_c_string(value());
|
161
|
-
gpr_log(GPR_DEBUG, "mdelem %s:%p:%" PRIdPTR ": '%s' = '%s'", tag, this,
|
162
|
-
RefValue(), key_str, value_str);
|
163
|
-
gpr_free(key_str);
|
164
|
-
gpr_free(value_str);
|
165
|
-
}
|
166
|
-
}
|
167
|
-
#endif
|
168
|
-
|
169
|
-
InternedMetadata::InternedMetadata(const grpc_slice& key,
|
170
|
-
const grpc_slice& value, uint32_t hash,
|
171
|
-
InternedMetadata* next)
|
172
|
-
: RefcountedMdBase(grpc_slice_ref_internal(key),
|
173
|
-
grpc_slice_ref_internal(value), hash),
|
174
|
-
link_(next) {
|
175
|
-
#ifndef NDEBUG
|
176
|
-
TraceAtStart("INTERNED_MD");
|
177
|
-
#endif
|
178
|
-
}
|
179
|
-
|
180
|
-
InternedMetadata::InternedMetadata(const grpc_slice& key,
|
181
|
-
const grpc_slice& value, uint32_t hash,
|
182
|
-
InternedMetadata* next, const NoRefKey*)
|
183
|
-
: RefcountedMdBase(key, grpc_slice_ref_internal(value), hash), link_(next) {
|
184
|
-
#ifndef NDEBUG
|
185
|
-
TraceAtStart("INTERNED_MD_NOREF_KEY");
|
186
|
-
#endif
|
187
|
-
}
|
188
|
-
|
189
|
-
InternedMetadata::~InternedMetadata() {
|
190
|
-
grpc_slice_unref_internal(key());
|
191
|
-
grpc_slice_unref_internal(value());
|
192
|
-
void* user_data = user_data_.data.load(std::memory_order_relaxed);
|
193
|
-
if (user_data) {
|
194
|
-
destroy_user_data_func destroy_user_data =
|
195
|
-
user_data_.destroy_user_data.load(std::memory_order_relaxed);
|
196
|
-
destroy_user_data(user_data);
|
197
|
-
}
|
198
|
-
}
|
199
|
-
|
200
|
-
size_t InternedMetadata::CleanupLinkedMetadata(
|
201
|
-
InternedMetadata::BucketLink* head) {
|
202
|
-
size_t num_freed = 0;
|
203
|
-
InternedMetadata::BucketLink* prev_next = head;
|
204
|
-
InternedMetadata *md, *next;
|
205
|
-
|
206
|
-
for (md = head->next; md; md = next) {
|
207
|
-
next = md->link_.next;
|
208
|
-
if (md->AllRefsDropped()) {
|
209
|
-
prev_next->next = next;
|
210
|
-
delete md;
|
211
|
-
num_freed++;
|
212
|
-
} else {
|
213
|
-
prev_next = &md->link_;
|
214
|
-
}
|
215
|
-
}
|
216
|
-
return num_freed;
|
217
|
-
}
|
218
|
-
|
219
|
-
typedef struct mdtab_shard {
|
220
|
-
gpr_mu mu;
|
221
|
-
InternedMetadata::BucketLink* elems;
|
222
|
-
size_t count;
|
223
|
-
size_t capacity;
|
224
|
-
/** Estimate of the number of unreferenced mdelems in the hash table.
|
225
|
-
This will eventually converge to the exact number, but it's instantaneous
|
226
|
-
accuracy is not guaranteed */
|
227
|
-
gpr_atm free_estimate;
|
228
|
-
} mdtab_shard;
|
229
|
-
|
230
|
-
static mdtab_shard g_shards[SHARD_COUNT];
|
231
|
-
|
232
|
-
static void gc_mdtab(mdtab_shard* shard);
|
233
|
-
|
234
|
-
void grpc_mdctx_global_init(void) {
|
235
|
-
/* initialize shards */
|
236
|
-
for (size_t i = 0; i < SHARD_COUNT; i++) {
|
237
|
-
mdtab_shard* shard = &g_shards[i];
|
238
|
-
gpr_mu_init(&shard->mu);
|
239
|
-
shard->count = 0;
|
240
|
-
gpr_atm_no_barrier_store(&shard->free_estimate, 0);
|
241
|
-
shard->capacity = INITIAL_SHARD_CAPACITY;
|
242
|
-
shard->elems = static_cast<InternedMetadata::BucketLink*>(
|
243
|
-
gpr_zalloc(sizeof(*shard->elems) * shard->capacity));
|
244
|
-
}
|
245
|
-
}
|
246
|
-
|
247
|
-
void grpc_mdctx_global_shutdown() {
|
248
|
-
for (size_t i = 0; i < SHARD_COUNT; i++) {
|
249
|
-
mdtab_shard* shard = &g_shards[i];
|
250
|
-
gpr_mu_destroy(&shard->mu);
|
251
|
-
gc_mdtab(shard);
|
252
|
-
if (shard->count != 0) {
|
253
|
-
gpr_log(GPR_ERROR, "WARNING: %" PRIuPTR " metadata elements were leaked",
|
254
|
-
shard->count);
|
255
|
-
for (size_t i = 0; i < shard->capacity; i++) {
|
256
|
-
for (InternedMetadata* md = shard->elems[i].next; md;
|
257
|
-
md = md->bucket_next()) {
|
258
|
-
char* key_str = grpc_slice_to_c_string(md->key());
|
259
|
-
char* value_str = grpc_slice_to_c_string(md->value());
|
260
|
-
gpr_log(GPR_ERROR, "mdelem '%s' = '%s'", key_str, value_str);
|
261
|
-
gpr_free(key_str);
|
262
|
-
gpr_free(value_str);
|
263
|
-
}
|
264
|
-
}
|
265
|
-
if (grpc_iomgr_abort_on_leaks()) {
|
266
|
-
abort();
|
267
|
-
}
|
268
|
-
}
|
269
|
-
// For ASAN builds, we don't want to crash here, because that will
|
270
|
-
// prevent ASAN from providing leak detection information, which is
|
271
|
-
// far more useful than this simple assertion.
|
272
|
-
#ifndef GRPC_ASAN_ENABLED
|
273
|
-
GPR_DEBUG_ASSERT(shard->count == 0);
|
274
|
-
#endif
|
275
|
-
gpr_free(shard->elems);
|
276
|
-
}
|
277
|
-
}
|
278
|
-
|
279
|
-
#ifndef NDEBUG
|
280
|
-
static int is_mdelem_static(grpc_mdelem e) {
|
281
|
-
return reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) >=
|
282
|
-
&grpc_core::g_static_mdelem_table[0] &&
|
283
|
-
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) <
|
284
|
-
&grpc_core::g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
|
285
|
-
}
|
286
|
-
#endif
|
287
|
-
|
288
|
-
void InternedMetadata::RefWithShardLocked(mdtab_shard* shard) {
|
289
|
-
#ifndef NDEBUG
|
290
|
-
if (grpc_trace_metadata.enabled()) {
|
291
|
-
char* key_str = grpc_slice_to_c_string(key());
|
292
|
-
char* value_str = grpc_slice_to_c_string(value());
|
293
|
-
intptr_t value = RefValue();
|
294
|
-
gpr_log(__FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG,
|
295
|
-
"mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", this,
|
296
|
-
value, value + 1, key_str, value_str);
|
297
|
-
gpr_free(key_str);
|
298
|
-
gpr_free(value_str);
|
299
|
-
}
|
300
|
-
#endif
|
301
|
-
if (FirstRef()) {
|
302
|
-
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, -1);
|
303
|
-
}
|
304
|
-
}
|
305
|
-
|
306
|
-
static void gc_mdtab(mdtab_shard* shard) {
|
307
|
-
GPR_TIMER_SCOPE("gc_mdtab", 0);
|
308
|
-
size_t num_freed = 0;
|
309
|
-
for (size_t i = 0; i < shard->capacity; ++i) {
|
310
|
-
intptr_t freed = InternedMetadata::CleanupLinkedMetadata(&shard->elems[i]);
|
311
|
-
num_freed += freed;
|
312
|
-
shard->count -= freed;
|
313
|
-
}
|
314
|
-
gpr_atm_no_barrier_fetch_add(&shard->free_estimate,
|
315
|
-
-static_cast<intptr_t>(num_freed));
|
316
|
-
}
|
317
|
-
|
318
|
-
static void grow_mdtab(mdtab_shard* shard) {
|
319
|
-
GPR_TIMER_SCOPE("grow_mdtab", 0);
|
320
|
-
|
321
|
-
size_t capacity = shard->capacity * 2;
|
322
|
-
size_t i;
|
323
|
-
InternedMetadata::BucketLink* mdtab;
|
324
|
-
InternedMetadata *md, *next;
|
325
|
-
uint32_t hash;
|
326
|
-
|
327
|
-
mdtab = static_cast<InternedMetadata::BucketLink*>(
|
328
|
-
gpr_zalloc(sizeof(InternedMetadata::BucketLink) * capacity));
|
329
|
-
|
330
|
-
for (i = 0; i < shard->capacity; i++) {
|
331
|
-
for (md = shard->elems[i].next; md; md = next) {
|
332
|
-
size_t idx;
|
333
|
-
hash = md->hash();
|
334
|
-
next = md->bucket_next();
|
335
|
-
idx = TABLE_IDX(hash, capacity);
|
336
|
-
md->set_bucket_next(mdtab[idx].next);
|
337
|
-
mdtab[idx].next = md;
|
338
|
-
}
|
339
|
-
}
|
340
|
-
gpr_free(shard->elems);
|
341
|
-
shard->elems = mdtab;
|
342
|
-
shard->capacity = capacity;
|
343
|
-
}
|
344
|
-
|
345
|
-
static void rehash_mdtab(mdtab_shard* shard) {
|
346
|
-
if (gpr_atm_no_barrier_load(&shard->free_estimate) >
|
347
|
-
static_cast<gpr_atm>(shard->capacity / 4)) {
|
348
|
-
gc_mdtab(shard);
|
349
|
-
} else {
|
350
|
-
grow_mdtab(shard);
|
351
|
-
}
|
352
|
-
}
|
353
|
-
|
354
|
-
template <bool key_definitely_static, bool value_definitely_static = false>
|
355
|
-
static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
|
356
|
-
const grpc_slice& value);
|
357
|
-
template <bool key_definitely_static>
|
358
|
-
static grpc_mdelem md_create_must_intern(const grpc_slice& key,
|
359
|
-
const grpc_slice& value,
|
360
|
-
uint32_t hash);
|
361
|
-
|
362
|
-
template <bool key_definitely_static, bool value_definitely_static = false>
|
363
|
-
static grpc_mdelem md_create(
|
364
|
-
const grpc_slice& key, const grpc_slice& value,
|
365
|
-
grpc_mdelem_data* compatible_external_backing_store) {
|
366
|
-
// Ensure slices are, in fact, static if we claimed they were.
|
367
|
-
GPR_DEBUG_ASSERT(!key_definitely_static ||
|
368
|
-
GRPC_IS_STATIC_METADATA_STRING(key));
|
369
|
-
GPR_DEBUG_ASSERT(!value_definitely_static ||
|
370
|
-
GRPC_IS_STATIC_METADATA_STRING(value));
|
371
|
-
const bool key_is_interned =
|
372
|
-
key_definitely_static || grpc_slice_is_interned(key);
|
373
|
-
const bool value_is_interned =
|
374
|
-
value_definitely_static || grpc_slice_is_interned(value);
|
375
|
-
// External storage if either slice is not interned and the caller already
|
376
|
-
// created a backing store. If no backing store, we allocate one.
|
377
|
-
if (!key_is_interned || !value_is_interned) {
|
378
|
-
if (compatible_external_backing_store != nullptr) {
|
379
|
-
// Caller provided backing store.
|
380
|
-
return GRPC_MAKE_MDELEM(compatible_external_backing_store,
|
381
|
-
GRPC_MDELEM_STORAGE_EXTERNAL);
|
382
|
-
} else {
|
383
|
-
// We allocate backing store.
|
384
|
-
return key_definitely_static
|
385
|
-
? GRPC_MAKE_MDELEM(
|
386
|
-
new AllocatedMetadata(
|
387
|
-
key, value,
|
388
|
-
static_cast<const AllocatedMetadata::NoRefKey*>(
|
389
|
-
nullptr)),
|
390
|
-
GRPC_MDELEM_STORAGE_ALLOCATED)
|
391
|
-
: GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
|
392
|
-
GRPC_MDELEM_STORAGE_ALLOCATED);
|
393
|
-
}
|
394
|
-
}
|
395
|
-
return md_create_maybe_static<key_definitely_static, value_definitely_static>(
|
396
|
-
key, value);
|
397
|
-
}
|
398
|
-
|
399
|
-
template <bool key_definitely_static, bool value_definitely_static>
|
400
|
-
static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
|
401
|
-
const grpc_slice& value) {
|
402
|
-
// Ensure slices are, in fact, static if we claimed they were.
|
403
|
-
GPR_DEBUG_ASSERT(!key_definitely_static ||
|
404
|
-
GRPC_IS_STATIC_METADATA_STRING(key));
|
405
|
-
GPR_DEBUG_ASSERT(!value_definitely_static ||
|
406
|
-
GRPC_IS_STATIC_METADATA_STRING(value));
|
407
|
-
GPR_DEBUG_ASSERT(key.refcount != nullptr);
|
408
|
-
GPR_DEBUG_ASSERT(value.refcount != nullptr);
|
409
|
-
|
410
|
-
const bool key_is_static_mdstr =
|
411
|
-
key_definitely_static ||
|
412
|
-
key.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
|
413
|
-
const bool value_is_static_mdstr =
|
414
|
-
value_definitely_static ||
|
415
|
-
value.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
|
416
|
-
|
417
|
-
const intptr_t kidx = GRPC_STATIC_METADATA_INDEX(key);
|
418
|
-
|
419
|
-
// Not all static slice input yields a statically stored metadata element.
|
420
|
-
if (key_is_static_mdstr && value_is_static_mdstr) {
|
421
|
-
grpc_mdelem static_elem = grpc_static_mdelem_for_static_strings(
|
422
|
-
kidx, GRPC_STATIC_METADATA_INDEX(value));
|
423
|
-
if (!GRPC_MDISNULL(static_elem)) {
|
424
|
-
return static_elem;
|
425
|
-
}
|
426
|
-
}
|
427
|
-
|
428
|
-
uint32_t khash = key_definitely_static
|
429
|
-
? grpc_static_metadata_hash_values[kidx]
|
430
|
-
: grpc_slice_hash_refcounted(key);
|
431
|
-
|
432
|
-
uint32_t hash = GRPC_MDSTR_KV_HASH(khash, grpc_slice_hash_refcounted(value));
|
433
|
-
return md_create_must_intern<key_definitely_static>(key, value, hash);
|
434
|
-
}
|
435
|
-
|
436
|
-
template <bool key_definitely_static>
|
437
|
-
static grpc_mdelem md_create_must_intern(const grpc_slice& key,
|
438
|
-
const grpc_slice& value,
|
439
|
-
uint32_t hash) {
|
440
|
-
// Here, we know both key and value are both at least interned, and both
|
441
|
-
// possibly static. We know that anything inside the shared interned table is
|
442
|
-
// also at least interned (and maybe static). Note that equality for a static
|
443
|
-
// and interned slice implies that they are both the same exact slice.
|
444
|
-
// The same applies to a pair of interned slices, or a pair of static slices.
|
445
|
-
// Rather than run the full equality check, we can therefore just do a pointer
|
446
|
-
// comparison of the refcounts.
|
447
|
-
InternedMetadata* md;
|
448
|
-
mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
|
449
|
-
size_t idx;
|
450
|
-
|
451
|
-
GPR_TIMER_SCOPE("grpc_mdelem_from_metadata_strings", 0);
|
452
|
-
|
453
|
-
gpr_mu_lock(&shard->mu);
|
454
|
-
|
455
|
-
idx = TABLE_IDX(hash, shard->capacity);
|
456
|
-
/* search for an existing pair */
|
457
|
-
for (md = shard->elems[idx].next; md; md = md->bucket_next()) {
|
458
|
-
if (grpc_slice_static_interned_equal(key, md->key()) &&
|
459
|
-
grpc_slice_static_interned_equal(value, md->value())) {
|
460
|
-
md->RefWithShardLocked(shard);
|
461
|
-
gpr_mu_unlock(&shard->mu);
|
462
|
-
return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
|
463
|
-
}
|
464
|
-
}
|
465
|
-
|
466
|
-
/* not found: create a new pair */
|
467
|
-
md = key_definitely_static
|
468
|
-
? new InternedMetadata(
|
469
|
-
key, value, hash, shard->elems[idx].next,
|
470
|
-
static_cast<const InternedMetadata::NoRefKey*>(nullptr))
|
471
|
-
: new InternedMetadata(key, value, hash, shard->elems[idx].next);
|
472
|
-
shard->elems[idx].next = md;
|
473
|
-
shard->count++;
|
474
|
-
|
475
|
-
if (shard->count > shard->capacity * 2) {
|
476
|
-
rehash_mdtab(shard);
|
477
|
-
}
|
478
|
-
|
479
|
-
gpr_mu_unlock(&shard->mu);
|
480
|
-
|
481
|
-
return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
|
482
|
-
}
|
483
|
-
|
484
|
-
grpc_mdelem grpc_mdelem_create(
|
485
|
-
const grpc_slice& key, const grpc_slice& value,
|
486
|
-
grpc_mdelem_data* compatible_external_backing_store) {
|
487
|
-
return md_create<false>(key, value, compatible_external_backing_store);
|
488
|
-
}
|
489
|
-
|
490
|
-
grpc_mdelem grpc_mdelem_create(
|
491
|
-
const grpc_core::StaticMetadataSlice& key, const grpc_slice& value,
|
492
|
-
grpc_mdelem_data* compatible_external_backing_store) {
|
493
|
-
return md_create<true>(key, value, compatible_external_backing_store);
|
494
|
-
}
|
495
|
-
|
496
|
-
/* Create grpc_mdelem from provided slices. We specify via template parameter
|
497
|
-
whether we know that the input key is static or not. If it is, we short
|
498
|
-
circuit various comparisons and a no-op unref. */
|
499
|
-
template <bool key_definitely_static>
|
500
|
-
static grpc_mdelem md_from_slices(const grpc_slice& key,
|
501
|
-
const grpc_slice& value) {
|
502
|
-
// Ensure key is, in fact, static if we claimed it was.
|
503
|
-
GPR_DEBUG_ASSERT(!key_definitely_static ||
|
504
|
-
GRPC_IS_STATIC_METADATA_STRING(key));
|
505
|
-
grpc_mdelem out = md_create<key_definitely_static>(key, value, nullptr);
|
506
|
-
if (!key_definitely_static) {
|
507
|
-
grpc_slice_unref_internal(key);
|
508
|
-
}
|
509
|
-
grpc_slice_unref_internal(value);
|
510
|
-
return out;
|
511
|
-
}
|
512
|
-
|
513
|
-
grpc_mdelem grpc_mdelem_from_slices(const grpc_slice& key,
|
514
|
-
const grpc_slice& value) {
|
515
|
-
return md_from_slices</*key_definitely_static=*/false>(key, value);
|
516
|
-
}
|
517
|
-
|
518
|
-
grpc_mdelem grpc_mdelem_from_slices(const grpc_core::StaticMetadataSlice& key,
|
519
|
-
const grpc_slice& value) {
|
520
|
-
return md_from_slices</*key_definitely_static=*/true>(key, value);
|
521
|
-
}
|
522
|
-
|
523
|
-
grpc_mdelem grpc_mdelem_from_slices(
|
524
|
-
const grpc_core::StaticMetadataSlice& key,
|
525
|
-
const grpc_core::StaticMetadataSlice& value) {
|
526
|
-
grpc_mdelem out = md_create_maybe_static<true, true>(key, value);
|
527
|
-
return out;
|
528
|
-
}
|
529
|
-
|
530
|
-
grpc_mdelem grpc_mdelem_from_slices(
|
531
|
-
const grpc_core::StaticMetadataSlice& key,
|
532
|
-
const grpc_core::ManagedMemorySlice& value) {
|
533
|
-
// TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
|
534
|
-
// creating a new interned metadata. But otherwise - we need this here.
|
535
|
-
grpc_mdelem out = md_create_maybe_static<true>(key, value);
|
536
|
-
grpc_slice_unref_internal(value);
|
537
|
-
return out;
|
538
|
-
}
|
539
|
-
|
540
|
-
grpc_mdelem grpc_mdelem_from_slices(
|
541
|
-
const grpc_core::ManagedMemorySlice& key,
|
542
|
-
const grpc_core::ManagedMemorySlice& value) {
|
543
|
-
grpc_mdelem out = md_create_maybe_static<false>(key, value);
|
544
|
-
// TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
|
545
|
-
// creating a new interned metadata. But otherwise - we need this here.
|
546
|
-
grpc_slice_unref_internal(key);
|
547
|
-
grpc_slice_unref_internal(value);
|
548
|
-
return out;
|
549
|
-
}
|
550
|
-
|
551
|
-
grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata) {
|
552
|
-
bool key_changed = false;
|
553
|
-
grpc_slice key_slice =
|
554
|
-
grpc_slice_maybe_static_intern(metadata->key, &key_changed);
|
555
|
-
bool value_changed = false;
|
556
|
-
grpc_slice* unref_slice = nullptr;
|
557
|
-
grpc_slice value_slice =
|
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;
|
581
|
-
}
|
582
|
-
|
583
|
-
static void* get_user_data(UserData* user_data, void (*destroy_func)(void*)) {
|
584
|
-
if (user_data->destroy_user_data.load(std::memory_order_acquire) ==
|
585
|
-
destroy_func) {
|
586
|
-
return user_data->data.load(std::memory_order_relaxed);
|
587
|
-
} else {
|
588
|
-
return nullptr;
|
589
|
-
}
|
590
|
-
}
|
591
|
-
|
592
|
-
void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*destroy_func)(void*)) {
|
593
|
-
switch (GRPC_MDELEM_STORAGE(md)) {
|
594
|
-
case GRPC_MDELEM_STORAGE_EXTERNAL:
|
595
|
-
return nullptr;
|
596
|
-
case GRPC_MDELEM_STORAGE_STATIC:
|
597
|
-
return reinterpret_cast<void*>(
|
598
|
-
grpc_static_mdelem_user_data
|
599
|
-
[reinterpret_cast<grpc_core::StaticMetadata*>(
|
600
|
-
GRPC_MDELEM_DATA(md)) -
|
601
|
-
grpc_core::g_static_mdelem_table]);
|
602
|
-
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
603
|
-
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
|
604
|
-
return get_user_data(am->user_data(), destroy_func);
|
605
|
-
}
|
606
|
-
case GRPC_MDELEM_STORAGE_INTERNED: {
|
607
|
-
auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
|
608
|
-
return get_user_data(im->user_data(), destroy_func);
|
609
|
-
}
|
610
|
-
}
|
611
|
-
GPR_UNREACHABLE_CODE(return nullptr);
|
612
|
-
}
|
613
|
-
|
614
|
-
static void* set_user_data(UserData* ud, void (*destroy_func)(void*),
|
615
|
-
void* data) {
|
616
|
-
GPR_ASSERT((data == nullptr) == (destroy_func == nullptr));
|
617
|
-
grpc_core::ReleasableMutexLock lock(&ud->mu_user_data);
|
618
|
-
if (ud->destroy_user_data.load(std::memory_order_relaxed)) {
|
619
|
-
/* user data can only be set once */
|
620
|
-
lock.Release();
|
621
|
-
if (destroy_func != nullptr) {
|
622
|
-
destroy_func(data);
|
623
|
-
}
|
624
|
-
return ud->data.load(std::memory_order_relaxed);
|
625
|
-
}
|
626
|
-
ud->data.store(data, std::memory_order_relaxed);
|
627
|
-
ud->destroy_user_data.store(destroy_func, std::memory_order_release);
|
628
|
-
return data;
|
629
|
-
}
|
630
|
-
|
631
|
-
void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
|
632
|
-
void* data) {
|
633
|
-
switch (GRPC_MDELEM_STORAGE(md)) {
|
634
|
-
case GRPC_MDELEM_STORAGE_EXTERNAL:
|
635
|
-
destroy_func(data);
|
636
|
-
return nullptr;
|
637
|
-
case GRPC_MDELEM_STORAGE_STATIC:
|
638
|
-
destroy_func(data);
|
639
|
-
return reinterpret_cast<void*>(
|
640
|
-
grpc_static_mdelem_user_data
|
641
|
-
[reinterpret_cast<grpc_core::StaticMetadata*>(
|
642
|
-
GRPC_MDELEM_DATA(md)) -
|
643
|
-
grpc_core::g_static_mdelem_table]);
|
644
|
-
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
645
|
-
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
|
646
|
-
return set_user_data(am->user_data(), destroy_func, data);
|
647
|
-
}
|
648
|
-
case GRPC_MDELEM_STORAGE_INTERNED: {
|
649
|
-
auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
|
650
|
-
GPR_DEBUG_ASSERT(!is_mdelem_static(md));
|
651
|
-
return set_user_data(im->user_data(), destroy_func, data);
|
652
|
-
}
|
653
|
-
}
|
654
|
-
GPR_UNREACHABLE_CODE(return nullptr);
|
655
|
-
}
|
656
|
-
|
657
|
-
bool grpc_mdelem_eq(grpc_mdelem a, grpc_mdelem b) {
|
658
|
-
if (a.payload == b.payload) return true;
|
659
|
-
if (GRPC_MDELEM_IS_INTERNED(a) && GRPC_MDELEM_IS_INTERNED(b)) return false;
|
660
|
-
if (GRPC_MDISNULL(a) || GRPC_MDISNULL(b)) return false;
|
661
|
-
return grpc_slice_eq(GRPC_MDKEY(a), GRPC_MDKEY(b)) &&
|
662
|
-
grpc_slice_eq(GRPC_MDVALUE(a), GRPC_MDVALUE(b));
|
663
|
-
}
|
664
|
-
|
665
|
-
static void note_disposed_interned_metadata(uint32_t hash) {
|
666
|
-
mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
|
667
|
-
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, 1);
|
668
|
-
}
|
669
|
-
|
670
|
-
void grpc_mdelem_do_unref(grpc_mdelem gmd DEBUG_ARGS) {
|
671
|
-
switch (GRPC_MDELEM_STORAGE(gmd)) {
|
672
|
-
case GRPC_MDELEM_STORAGE_EXTERNAL:
|
673
|
-
case GRPC_MDELEM_STORAGE_STATIC:
|
674
|
-
return;
|
675
|
-
case GRPC_MDELEM_STORAGE_INTERNED: {
|
676
|
-
auto* md = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(gmd);
|
677
|
-
uint32_t hash = md->hash();
|
678
|
-
if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
|
679
|
-
/* once the refcount hits zero, some other thread can come along and
|
680
|
-
free md at any time: it's unsafe from this point on to access it */
|
681
|
-
note_disposed_interned_metadata(hash);
|
682
|
-
}
|
683
|
-
break;
|
684
|
-
}
|
685
|
-
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
686
|
-
auto* md = reinterpret_cast<AllocatedMetadata*> GRPC_MDELEM_DATA(gmd);
|
687
|
-
if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
|
688
|
-
delete md;
|
689
|
-
}
|
690
|
-
break;
|
691
|
-
}
|
692
|
-
}
|
693
|
-
}
|
694
|
-
|
695
|
-
void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
|
696
|
-
uint32_t hash DEBUG_ARGS) {
|
697
|
-
#ifndef NDEBUG
|
698
|
-
(void)file;
|
699
|
-
(void)line;
|
700
|
-
#endif
|
701
|
-
switch (storage) {
|
702
|
-
case GRPC_MDELEM_STORAGE_EXTERNAL:
|
703
|
-
case GRPC_MDELEM_STORAGE_STATIC:
|
704
|
-
return;
|
705
|
-
case GRPC_MDELEM_STORAGE_INTERNED: {
|
706
|
-
note_disposed_interned_metadata(hash);
|
707
|
-
break;
|
708
|
-
}
|
709
|
-
case GRPC_MDELEM_STORAGE_ALLOCATED: {
|
710
|
-
delete reinterpret_cast<AllocatedMetadata*>(ptr);
|
711
|
-
break;
|
712
|
-
}
|
713
|
-
}
|
714
|
-
}
|