grpc 1.18.0 → 1.22.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 +4731 -7404
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +297 -4
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +30 -7
- data/include/grpc/impl/codegen/port_platform.h +88 -7
- data/include/grpc/impl/codegen/slice.h +2 -22
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/include/grpc/slice.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
- data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
- data/src/core/ext/filters/client_channel/client_channel.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
- data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +52 -23
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -54
- data/src/core/ext/filters/client_channel/server_address.h +1 -13
- data/src/core/ext/filters/client_channel/service_config.cc +329 -0
- data/src/core/ext/filters/client_channel/service_config.h +205 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
- data/src/core/ext/filters/client_channel/subchannel.h +295 -128
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
- data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
- data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
- data/src/core/lib/channel/channel_args.cc +2 -101
- data/src/core/lib/channel/channel_args.h +3 -37
- data/src/core/lib/channel/channel_stack.h +10 -6
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +168 -38
- data/src/core/lib/channel/channelz.h +40 -44
- data/src/core/lib/channel/channelz_registry.cc +75 -107
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/handshaker.cc +151 -218
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +67 -51
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +14 -9
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/compression/compression_internal.cc +16 -12
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +14 -1
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/env.h +3 -6
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/string.cc +20 -7
- data/src/core/lib/gpr/string.h +10 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +21 -2
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +13 -32
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +96 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +436 -0
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/optional.h +48 -0
- data/src/core/lib/gprpp/orphanable.h +6 -5
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +36 -17
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +13 -15
- data/src/core/lib/http/parser.cc +3 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +72 -10
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
- data/src/core/lib/iomgr/cfstream_handle.h +86 -0
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.cc +21 -17
- data/src/core/lib/iomgr/error.h +36 -6
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
- data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
- data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
- data/src/core/lib/iomgr/ev_posix.cc +29 -19
- data/src/core/lib/iomgr/ev_posix.h +19 -3
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +147 -95
- data/src/core/lib/iomgr/executor.h +55 -49
- data/src/core/lib/iomgr/fork_posix.cc +6 -5
- data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +20 -13
- data/src/core/lib/iomgr/iomgr.h +15 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
- data/src/core/lib/iomgr/iomgr_internal.h +12 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
- data/src/core/lib/iomgr/lockfree_event.cc +4 -4
- data/src/core/lib/iomgr/port.h +35 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
- data/src/core/lib/iomgr/tcp_custom.cc +10 -14
- data/src/core/lib/iomgr/tcp_posix.cc +256 -140
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
- data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
- data/src/core/lib/iomgr/tcp_uv.cc +5 -7
- data/src/core/lib/iomgr/tcp_windows.cc +8 -14
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +20 -11
- data/src/core/lib/iomgr/udp_server.cc +8 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
- data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +5 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
- data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
- data/src/core/lib/security/transport/security_handshaker.cc +271 -303
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +174 -122
- data/src/core/lib/slice/slice_buffer.cc +54 -21
- data/src/core/lib/slice/slice_hash_table.h +4 -4
- data/src/core/lib/slice/slice_intern.cc +49 -107
- data/src/core/lib/slice/slice_internal.h +264 -3
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +67 -46
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +221 -216
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +82 -33
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +5 -7
- data/src/core/lib/surface/server.cc +42 -47
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +258 -267
- data/src/core/lib/transport/metadata.h +227 -16
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/static_metadata.cc +477 -399
- data/src/core/lib/transport/static_metadata.h +273 -182
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.cc +39 -72
- data/src/core/lib/transport/transport.h +59 -24
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +12 -10
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +23 -24
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/src/ruby/spec/errors_spec.rb +141 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +83 -48
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
- data/src/core/ext/filters/client_channel/request_routing.h +0 -177
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
- data/src/core/lib/gpr/arena.cc +0 -192
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
- data/src/core/lib/transport/service_config.cc +0 -106
- data/src/core/lib/transport/service_config.h +0 -249
@@ -40,14 +40,6 @@ extern grpc_core::TraceFlag grpc_client_channel_trace;
|
|
40
40
|
|
41
41
|
extern const grpc_channel_filter grpc_client_channel_filter;
|
42
42
|
|
43
|
-
void grpc_client_channel_set_channelz_node(
|
44
|
-
grpc_channel_element* elem, grpc_core::channelz::ClientChannelNode* node);
|
45
|
-
|
46
|
-
void grpc_client_channel_populate_child_refs(
|
47
|
-
grpc_channel_element* elem,
|
48
|
-
grpc_core::channelz::ChildRefsList* child_subchannels,
|
49
|
-
grpc_core::channelz::ChildRefsList* child_channels);
|
50
|
-
|
51
43
|
grpc_connectivity_state grpc_client_channel_check_connectivity_state(
|
52
44
|
grpc_channel_element* elem, int try_to_connect);
|
53
45
|
|
@@ -60,7 +52,7 @@ void grpc_client_channel_watch_connectivity_state(
|
|
60
52
|
grpc_closure* watcher_timer_init);
|
61
53
|
|
62
54
|
/* Debug helper: pull the subchannel call from a call stack element */
|
63
|
-
|
64
|
-
|
55
|
+
grpc_core::RefCountedPtr<grpc_core::SubchannelCall>
|
56
|
+
grpc_client_channel_get_subchannel_call(grpc_call_element* elem);
|
65
57
|
|
66
58
|
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_H */
|
@@ -29,96 +29,12 @@
|
|
29
29
|
|
30
30
|
namespace grpc_core {
|
31
31
|
namespace channelz {
|
32
|
-
namespace {
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
void client_channel_channelz_destroy(void* p) {}
|
37
|
-
|
38
|
-
int client_channel_channelz_cmp(void* a, void* b) { return GPR_ICMP(a, b); }
|
39
|
-
|
40
|
-
} // namespace
|
41
|
-
|
42
|
-
static const grpc_arg_pointer_vtable client_channel_channelz_vtable = {
|
43
|
-
client_channel_channelz_copy, client_channel_channelz_destroy,
|
44
|
-
client_channel_channelz_cmp};
|
45
|
-
|
46
|
-
ClientChannelNode::ClientChannelNode(grpc_channel* channel,
|
47
|
-
size_t channel_tracer_max_nodes,
|
48
|
-
bool is_top_level_channel)
|
49
|
-
: ChannelNode(channel, channel_tracer_max_nodes, is_top_level_channel) {
|
50
|
-
client_channel_ =
|
51
|
-
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
52
|
-
grpc_client_channel_set_channelz_node(client_channel_, this);
|
53
|
-
GPR_ASSERT(client_channel_->filter == &grpc_client_channel_filter);
|
54
|
-
}
|
55
|
-
|
56
|
-
void ClientChannelNode::PopulateConnectivityState(grpc_json* json) {
|
57
|
-
grpc_connectivity_state state;
|
58
|
-
if (ChannelIsDestroyed()) {
|
59
|
-
state = GRPC_CHANNEL_SHUTDOWN;
|
60
|
-
} else {
|
61
|
-
state =
|
62
|
-
grpc_client_channel_check_connectivity_state(client_channel_, false);
|
63
|
-
}
|
64
|
-
json = grpc_json_create_child(nullptr, json, "state", nullptr,
|
65
|
-
GRPC_JSON_OBJECT, false);
|
66
|
-
grpc_json_create_child(nullptr, json, "state",
|
67
|
-
grpc_connectivity_state_name(state), GRPC_JSON_STRING,
|
68
|
-
false);
|
69
|
-
}
|
70
|
-
|
71
|
-
void ClientChannelNode::PopulateChildRefs(grpc_json* json) {
|
72
|
-
ChildRefsList child_subchannels;
|
73
|
-
ChildRefsList child_channels;
|
74
|
-
grpc_json* json_iterator = nullptr;
|
75
|
-
grpc_client_channel_populate_child_refs(client_channel_, &child_subchannels,
|
76
|
-
&child_channels);
|
77
|
-
if (!child_subchannels.empty()) {
|
78
|
-
grpc_json* array_parent = grpc_json_create_child(
|
79
|
-
nullptr, json, "subchannelRef", nullptr, GRPC_JSON_ARRAY, false);
|
80
|
-
for (size_t i = 0; i < child_subchannels.size(); ++i) {
|
81
|
-
json_iterator =
|
82
|
-
grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
|
83
|
-
GRPC_JSON_OBJECT, false);
|
84
|
-
grpc_json_add_number_string_child(json_iterator, nullptr, "subchannelId",
|
85
|
-
child_subchannels[i]);
|
86
|
-
}
|
87
|
-
}
|
88
|
-
if (!child_channels.empty()) {
|
89
|
-
grpc_json* array_parent = grpc_json_create_child(
|
90
|
-
nullptr, json, "channelRef", nullptr, GRPC_JSON_ARRAY, false);
|
91
|
-
json_iterator = nullptr;
|
92
|
-
for (size_t i = 0; i < child_channels.size(); ++i) {
|
93
|
-
json_iterator =
|
94
|
-
grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
|
95
|
-
GRPC_JSON_OBJECT, false);
|
96
|
-
grpc_json_add_number_string_child(json_iterator, nullptr, "channelId",
|
97
|
-
child_channels[i]);
|
98
|
-
}
|
99
|
-
}
|
100
|
-
}
|
101
|
-
|
102
|
-
grpc_arg ClientChannelNode::CreateChannelArg() {
|
103
|
-
return grpc_channel_arg_pointer_create(
|
104
|
-
const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_NODE_CREATION_FUNC),
|
105
|
-
reinterpret_cast<void*>(MakeClientChannelNode),
|
106
|
-
&client_channel_channelz_vtable);
|
107
|
-
}
|
108
|
-
|
109
|
-
RefCountedPtr<ChannelNode> ClientChannelNode::MakeClientChannelNode(
|
110
|
-
grpc_channel* channel, size_t channel_tracer_max_nodes,
|
111
|
-
bool is_top_level_channel) {
|
112
|
-
return MakeRefCounted<ClientChannelNode>(channel, channel_tracer_max_nodes,
|
113
|
-
is_top_level_channel);
|
114
|
-
}
|
115
|
-
|
116
|
-
SubchannelNode::SubchannelNode(grpc_subchannel* subchannel,
|
33
|
+
SubchannelNode::SubchannelNode(Subchannel* subchannel,
|
117
34
|
size_t channel_tracer_max_nodes)
|
118
35
|
: BaseNode(EntityType::kSubchannel),
|
119
36
|
subchannel_(subchannel),
|
120
|
-
target_(
|
121
|
-
UniquePtr<char>(gpr_strdup(grpc_subchannel_get_target(subchannel_)))),
|
37
|
+
target_(UniquePtr<char>(gpr_strdup(subchannel_->GetTargetAddress()))),
|
122
38
|
trace_(channel_tracer_max_nodes) {}
|
123
39
|
|
124
40
|
SubchannelNode::~SubchannelNode() {}
|
@@ -128,8 +44,9 @@ void SubchannelNode::PopulateConnectivityState(grpc_json* json) {
|
|
128
44
|
if (subchannel_ == nullptr) {
|
129
45
|
state = GRPC_CHANNEL_SHUTDOWN;
|
130
46
|
} else {
|
131
|
-
state =
|
132
|
-
|
47
|
+
state = subchannel_->CheckConnectivityState(
|
48
|
+
nullptr /* health_check_service_name */,
|
49
|
+
nullptr /* connected_subchannel */);
|
133
50
|
}
|
134
51
|
json = grpc_json_create_child(nullptr, json, "state", nullptr,
|
135
52
|
GRPC_JSON_OBJECT, false);
|
@@ -170,7 +87,7 @@ grpc_json* SubchannelNode::RenderJson() {
|
|
170
87
|
call_counter_.PopulateCallCounts(json);
|
171
88
|
json = top_level_json;
|
172
89
|
// populate the child socket.
|
173
|
-
intptr_t socket_uuid =
|
90
|
+
intptr_t socket_uuid = subchannel_->GetChildSocketUuid();
|
174
91
|
if (socket_uuid != 0) {
|
175
92
|
grpc_json* array_parent = grpc_json_create_child(
|
176
93
|
nullptr, json, "socketRef", nullptr, GRPC_JSON_ARRAY, false);
|
@@ -26,40 +26,15 @@
|
|
26
26
|
#include "src/core/lib/channel/channel_trace.h"
|
27
27
|
#include "src/core/lib/channel/channelz.h"
|
28
28
|
|
29
|
-
typedef struct grpc_subchannel grpc_subchannel;
|
30
|
-
|
31
29
|
namespace grpc_core {
|
32
|
-
namespace channelz {
|
33
|
-
|
34
|
-
// Subtype of ChannelNode that overrides and provides client_channel specific
|
35
|
-
// functionality like querying for connectivity_state and subchannel data.
|
36
|
-
class ClientChannelNode : public ChannelNode {
|
37
|
-
public:
|
38
|
-
static RefCountedPtr<ChannelNode> MakeClientChannelNode(
|
39
|
-
grpc_channel* channel, size_t channel_tracer_max_nodes,
|
40
|
-
bool is_top_level_channel);
|
41
30
|
|
42
|
-
|
43
|
-
bool is_top_level_channel);
|
44
|
-
virtual ~ClientChannelNode() {}
|
31
|
+
class Subchannel;
|
45
32
|
|
46
|
-
|
47
|
-
// only ClientChannelNode knows about.
|
48
|
-
void PopulateConnectivityState(grpc_json* json) override;
|
49
|
-
void PopulateChildRefs(grpc_json* json) override;
|
50
|
-
|
51
|
-
// Helper to create a channel arg to ensure this type of ChannelNode is
|
52
|
-
// created.
|
53
|
-
static grpc_arg CreateChannelArg();
|
54
|
-
|
55
|
-
private:
|
56
|
-
grpc_channel_element* client_channel_;
|
57
|
-
};
|
33
|
+
namespace channelz {
|
58
34
|
|
59
|
-
// Handles channelz bookkeeping for sockets
|
60
35
|
class SubchannelNode : public BaseNode {
|
61
36
|
public:
|
62
|
-
SubchannelNode(
|
37
|
+
SubchannelNode(Subchannel* subchannel, size_t channel_tracer_max_nodes);
|
63
38
|
~SubchannelNode() override;
|
64
39
|
|
65
40
|
void MarkSubchannelDestroyed() {
|
@@ -70,11 +45,11 @@ class SubchannelNode : public BaseNode {
|
|
70
45
|
grpc_json* RenderJson() override;
|
71
46
|
|
72
47
|
// proxy methods to composed classes.
|
73
|
-
void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
|
48
|
+
void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
|
74
49
|
trace_.AddTraceEvent(severity, data);
|
75
50
|
}
|
76
51
|
void AddTraceEventWithReference(ChannelTrace::Severity severity,
|
77
|
-
grpc_slice data,
|
52
|
+
const grpc_slice& data,
|
78
53
|
RefCountedPtr<BaseNode> referenced_channel) {
|
79
54
|
trace_.AddTraceEventWithReference(severity, data,
|
80
55
|
std::move(referenced_channel));
|
@@ -84,12 +59,12 @@ class SubchannelNode : public BaseNode {
|
|
84
59
|
void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
|
85
60
|
|
86
61
|
private:
|
87
|
-
|
62
|
+
void PopulateConnectivityState(grpc_json* json);
|
63
|
+
|
64
|
+
Subchannel* subchannel_;
|
88
65
|
UniquePtr<char> target_;
|
89
66
|
CallCountingHelper call_counter_;
|
90
67
|
ChannelTrace trace_;
|
91
|
-
|
92
|
-
void PopulateConnectivityState(grpc_json* json);
|
93
68
|
};
|
94
69
|
|
95
70
|
} // namespace channelz
|
@@ -21,47 +21,35 @@
|
|
21
21
|
#include "src/core/ext/filters/client_channel/client_channel_factory.h"
|
22
22
|
#include "src/core/lib/channel/channel_args.h"
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
}
|
24
|
+
// Channel arg key for client channel factory.
|
25
|
+
#define GRPC_ARG_CLIENT_CHANNEL_FACTORY "grpc.client_channel_factory"
|
27
26
|
|
28
|
-
|
29
|
-
factory->vtable->unref(factory);
|
30
|
-
}
|
27
|
+
namespace grpc_core {
|
31
28
|
|
32
|
-
|
33
|
-
grpc_client_channel_factory* factory, const grpc_subchannel_args* args) {
|
34
|
-
return factory->vtable->create_subchannel(factory, args);
|
35
|
-
}
|
29
|
+
namespace {
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
return
|
31
|
+
void* factory_arg_copy(void* f) { return f; }
|
32
|
+
void factory_arg_destroy(void* f) {}
|
33
|
+
int factory_arg_cmp(void* factory1, void* factory2) {
|
34
|
+
return GPR_ICMP(factory1, factory2);
|
41
35
|
}
|
36
|
+
const grpc_arg_pointer_vtable factory_arg_vtable = {
|
37
|
+
factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
|
42
38
|
|
43
|
-
|
44
|
-
grpc_client_channel_factory_ref(
|
45
|
-
static_cast<grpc_client_channel_factory*>(factory));
|
46
|
-
return factory;
|
47
|
-
}
|
39
|
+
} // namespace
|
48
40
|
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
grpc_arg ClientChannelFactory::CreateChannelArg(ClientChannelFactory* factory) {
|
42
|
+
return grpc_channel_arg_pointer_create(
|
43
|
+
const_cast<char*>(GRPC_ARG_CLIENT_CHANNEL_FACTORY), factory,
|
44
|
+
&factory_arg_vtable);
|
52
45
|
}
|
53
46
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
47
|
+
ClientChannelFactory* ClientChannelFactory::GetFromChannelArgs(
|
48
|
+
const grpc_channel_args* args) {
|
49
|
+
const grpc_arg* arg =
|
50
|
+
grpc_channel_args_find(args, GRPC_ARG_CLIENT_CHANNEL_FACTORY);
|
51
|
+
if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return nullptr;
|
52
|
+
return static_cast<ClientChannelFactory*>(arg->value.pointer.p);
|
58
53
|
}
|
59
54
|
|
60
|
-
|
61
|
-
factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
|
62
|
-
|
63
|
-
grpc_arg grpc_client_channel_factory_create_channel_arg(
|
64
|
-
grpc_client_channel_factory* factory) {
|
65
|
-
return grpc_channel_arg_pointer_create((char*)GRPC_ARG_CLIENT_CHANNEL_FACTORY,
|
66
|
-
factory, &factory_arg_vtable);
|
67
|
-
}
|
55
|
+
} // namespace grpc_core
|
@@ -24,51 +24,32 @@
|
|
24
24
|
#include <grpc/impl/codegen/grpc_types.h>
|
25
25
|
|
26
26
|
#include "src/core/ext/filters/client_channel/subchannel.h"
|
27
|
-
#include "src/core/lib/
|
27
|
+
#include "src/core/lib/gprpp/abstract.h"
|
28
28
|
|
29
|
-
|
30
|
-
#define GRPC_ARG_CLIENT_CHANNEL_FACTORY "grpc.client_channel_factory"
|
29
|
+
namespace grpc_core {
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
class ClientChannelFactory {
|
32
|
+
public:
|
33
|
+
virtual ~ClientChannelFactory() = default;
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
balancing service */
|
40
|
-
} grpc_client_channel_type;
|
35
|
+
// Creates a subchannel with the specified args.
|
36
|
+
virtual Subchannel* CreateSubchannel(const grpc_channel_args* args)
|
37
|
+
GRPC_ABSTRACT;
|
41
38
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
const grpc_client_channel_factory_vtable* vtable;
|
46
|
-
};
|
47
|
-
|
48
|
-
struct grpc_client_channel_factory_vtable {
|
49
|
-
void (*ref)(grpc_client_channel_factory* factory);
|
50
|
-
void (*unref)(grpc_client_channel_factory* factory);
|
51
|
-
grpc_subchannel* (*create_subchannel)(grpc_client_channel_factory* factory,
|
52
|
-
const grpc_subchannel_args* args);
|
53
|
-
grpc_channel* (*create_client_channel)(grpc_client_channel_factory* factory,
|
54
|
-
const char* target,
|
55
|
-
grpc_client_channel_type type,
|
56
|
-
const grpc_channel_args* args);
|
57
|
-
};
|
39
|
+
// Creates a channel for the specified target with the specified args.
|
40
|
+
virtual grpc_channel* CreateChannel(
|
41
|
+
const char* target, const grpc_channel_args* args) GRPC_ABSTRACT;
|
58
42
|
|
59
|
-
|
60
|
-
|
43
|
+
// Returns a channel arg containing the specified factory.
|
44
|
+
static grpc_arg CreateChannelArg(ClientChannelFactory* factory);
|
61
45
|
|
62
|
-
|
63
|
-
|
64
|
-
|
46
|
+
// Returns the factory from args, or null if not found.
|
47
|
+
static ClientChannelFactory* GetFromChannelArgs(
|
48
|
+
const grpc_channel_args* args);
|
65
49
|
|
66
|
-
|
67
|
-
|
68
|
-
grpc_client_channel_factory* factory, const char* target,
|
69
|
-
grpc_client_channel_type type, const grpc_channel_args* args);
|
50
|
+
GRPC_ABSTRACT_BASE_CLASS
|
51
|
+
};
|
70
52
|
|
71
|
-
|
72
|
-
grpc_client_channel_factory* factory);
|
53
|
+
} // namespace grpc_core
|
73
54
|
|
74
55
|
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H */
|
@@ -24,48 +24,46 @@
|
|
24
24
|
|
25
25
|
#include <grpc/support/alloc.h>
|
26
26
|
|
27
|
+
#include "src/core/ext/filters/client_channel/backup_poller.h"
|
27
28
|
#include "src/core/ext/filters/client_channel/client_channel.h"
|
28
29
|
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
30
|
+
#include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
|
29
31
|
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
30
32
|
#include "src/core/ext/filters/client_channel/http_proxy.h"
|
31
33
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
32
34
|
#include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
|
33
35
|
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
36
|
+
#include "src/core/ext/filters/client_channel/resolver_result_parsing.h"
|
34
37
|
#include "src/core/ext/filters/client_channel/retry_throttle.h"
|
35
|
-
#include "src/core/ext/filters/client_channel/subchannel_index.h"
|
36
38
|
#include "src/core/lib/surface/channel_init.h"
|
37
39
|
|
38
40
|
static bool append_filter(grpc_channel_stack_builder* builder, void* arg) {
|
39
|
-
const grpc_channel_args* args =
|
40
|
-
grpc_channel_stack_builder_get_channel_arguments(builder);
|
41
|
-
grpc_arg args_to_add[] = {
|
42
|
-
grpc_core::channelz::ClientChannelNode::CreateChannelArg()};
|
43
|
-
grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
|
44
|
-
args, args_to_add, GPR_ARRAY_SIZE(args_to_add));
|
45
|
-
grpc_channel_stack_builder_set_channel_arguments(builder, new_args);
|
46
|
-
grpc_channel_args_destroy(new_args);
|
47
41
|
return grpc_channel_stack_builder_append_filter(
|
48
42
|
builder, static_cast<const grpc_channel_filter*>(arg), nullptr, nullptr);
|
49
43
|
}
|
50
44
|
|
51
45
|
void grpc_client_channel_init(void) {
|
46
|
+
grpc_core::ServiceConfig::Init();
|
47
|
+
grpc_core::internal::ClientChannelServiceConfigParser::Register();
|
52
48
|
grpc_core::LoadBalancingPolicyRegistry::Builder::InitRegistry();
|
53
49
|
grpc_core::ResolverRegistry::Builder::InitRegistry();
|
54
50
|
grpc_core::internal::ServerRetryThrottleMap::Init();
|
55
51
|
grpc_proxy_mapper_registry_init();
|
56
52
|
grpc_register_http_proxy_mapper();
|
57
|
-
|
53
|
+
grpc_core::GlobalSubchannelPool::Init();
|
58
54
|
grpc_channel_init_register_stage(
|
59
55
|
GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, append_filter,
|
60
56
|
(void*)&grpc_client_channel_filter);
|
61
57
|
grpc_http_connect_register_handshaker_factory();
|
58
|
+
grpc_client_channel_global_init_backup_polling();
|
62
59
|
}
|
63
60
|
|
64
61
|
void grpc_client_channel_shutdown(void) {
|
65
|
-
|
62
|
+
grpc_core::GlobalSubchannelPool::Shutdown();
|
66
63
|
grpc_channel_init_shutdown();
|
67
64
|
grpc_proxy_mapper_registry_shutdown();
|
68
65
|
grpc_core::internal::ServerRetryThrottleMap::Shutdown();
|
69
66
|
grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
|
70
67
|
grpc_core::LoadBalancingPolicyRegistry::Builder::ShutdownRegistry();
|
68
|
+
grpc_core::ServiceConfig::Shutdown();
|
71
69
|
}
|
@@ -0,0 +1,179 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2018 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/ext/filters/client_channel/global_subchannel_pool.h"
|
22
|
+
|
23
|
+
#include "src/core/ext/filters/client_channel/subchannel.h"
|
24
|
+
|
25
|
+
namespace grpc_core {
|
26
|
+
|
27
|
+
GlobalSubchannelPool::GlobalSubchannelPool() {
|
28
|
+
subchannel_map_ = grpc_avl_create(&subchannel_avl_vtable_);
|
29
|
+
gpr_mu_init(&mu_);
|
30
|
+
}
|
31
|
+
|
32
|
+
GlobalSubchannelPool::~GlobalSubchannelPool() {
|
33
|
+
gpr_mu_destroy(&mu_);
|
34
|
+
grpc_avl_unref(subchannel_map_, nullptr);
|
35
|
+
}
|
36
|
+
|
37
|
+
void GlobalSubchannelPool::Init() {
|
38
|
+
instance_ = New<RefCountedPtr<GlobalSubchannelPool>>(
|
39
|
+
MakeRefCounted<GlobalSubchannelPool>());
|
40
|
+
}
|
41
|
+
|
42
|
+
void GlobalSubchannelPool::Shutdown() {
|
43
|
+
// To ensure Init() was called before.
|
44
|
+
GPR_ASSERT(instance_ != nullptr);
|
45
|
+
// To ensure Shutdown() was not called before.
|
46
|
+
GPR_ASSERT(*instance_ != nullptr);
|
47
|
+
instance_->reset();
|
48
|
+
Delete(instance_);
|
49
|
+
}
|
50
|
+
|
51
|
+
RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
|
52
|
+
GPR_ASSERT(instance_ != nullptr);
|
53
|
+
GPR_ASSERT(*instance_ != nullptr);
|
54
|
+
return *instance_;
|
55
|
+
}
|
56
|
+
|
57
|
+
Subchannel* GlobalSubchannelPool::RegisterSubchannel(SubchannelKey* key,
|
58
|
+
Subchannel* constructed) {
|
59
|
+
Subchannel* c = nullptr;
|
60
|
+
// Compare and swap (CAS) loop:
|
61
|
+
while (c == nullptr) {
|
62
|
+
// Ref the shared map to have a local copy.
|
63
|
+
gpr_mu_lock(&mu_);
|
64
|
+
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
65
|
+
gpr_mu_unlock(&mu_);
|
66
|
+
// Check to see if a subchannel already exists.
|
67
|
+
c = static_cast<Subchannel*>(grpc_avl_get(old_map, key, nullptr));
|
68
|
+
if (c != nullptr) {
|
69
|
+
// The subchannel already exists. Try to reuse it.
|
70
|
+
c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "subchannel_register+reuse");
|
71
|
+
if (c != nullptr) {
|
72
|
+
GRPC_SUBCHANNEL_UNREF(constructed,
|
73
|
+
"subchannel_register+found_existing");
|
74
|
+
// Exit the CAS loop without modifying the shared map.
|
75
|
+
} // Else, reuse failed, so retry CAS loop.
|
76
|
+
} else {
|
77
|
+
// There hasn't been such subchannel. Add one.
|
78
|
+
// Note that we should ref the old map first because grpc_avl_add() will
|
79
|
+
// unref it while we still need to access it later.
|
80
|
+
grpc_avl new_map = grpc_avl_add(
|
81
|
+
grpc_avl_ref(old_map, nullptr), New<SubchannelKey>(*key),
|
82
|
+
GRPC_SUBCHANNEL_WEAK_REF(constructed, "subchannel_register+new"),
|
83
|
+
nullptr);
|
84
|
+
// Try to publish the change to the shared map. It may happen (but
|
85
|
+
// unlikely) that some other thread has changed the shared map, so compare
|
86
|
+
// to make sure it's unchanged before swapping. Retry if it's changed.
|
87
|
+
gpr_mu_lock(&mu_);
|
88
|
+
if (old_map.root == subchannel_map_.root) {
|
89
|
+
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
90
|
+
c = constructed;
|
91
|
+
}
|
92
|
+
gpr_mu_unlock(&mu_);
|
93
|
+
grpc_avl_unref(new_map, nullptr);
|
94
|
+
}
|
95
|
+
grpc_avl_unref(old_map, nullptr);
|
96
|
+
}
|
97
|
+
return c;
|
98
|
+
}
|
99
|
+
|
100
|
+
void GlobalSubchannelPool::UnregisterSubchannel(SubchannelKey* key) {
|
101
|
+
bool done = false;
|
102
|
+
// Compare and swap (CAS) loop:
|
103
|
+
while (!done) {
|
104
|
+
// Ref the shared map to have a local copy.
|
105
|
+
gpr_mu_lock(&mu_);
|
106
|
+
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
107
|
+
gpr_mu_unlock(&mu_);
|
108
|
+
// Remove the subchannel.
|
109
|
+
// Note that we should ref the old map first because grpc_avl_remove() will
|
110
|
+
// unref it while we still need to access it later.
|
111
|
+
grpc_avl new_map =
|
112
|
+
grpc_avl_remove(grpc_avl_ref(old_map, nullptr), key, nullptr);
|
113
|
+
// Try to publish the change to the shared map. It may happen (but
|
114
|
+
// unlikely) that some other thread has changed the shared map, so compare
|
115
|
+
// to make sure it's unchanged before swapping. Retry if it's changed.
|
116
|
+
gpr_mu_lock(&mu_);
|
117
|
+
if (old_map.root == subchannel_map_.root) {
|
118
|
+
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
119
|
+
done = true;
|
120
|
+
}
|
121
|
+
gpr_mu_unlock(&mu_);
|
122
|
+
grpc_avl_unref(new_map, nullptr);
|
123
|
+
grpc_avl_unref(old_map, nullptr);
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
Subchannel* GlobalSubchannelPool::FindSubchannel(SubchannelKey* key) {
|
128
|
+
// Lock, and take a reference to the subchannel map.
|
129
|
+
// We don't need to do the search under a lock as AVL's are immutable.
|
130
|
+
gpr_mu_lock(&mu_);
|
131
|
+
grpc_avl index = grpc_avl_ref(subchannel_map_, nullptr);
|
132
|
+
gpr_mu_unlock(&mu_);
|
133
|
+
Subchannel* c = static_cast<Subchannel*>(grpc_avl_get(index, key, nullptr));
|
134
|
+
if (c != nullptr) c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "found_from_pool");
|
135
|
+
grpc_avl_unref(index, nullptr);
|
136
|
+
return c;
|
137
|
+
}
|
138
|
+
|
139
|
+
RefCountedPtr<GlobalSubchannelPool>* GlobalSubchannelPool::instance_ = nullptr;
|
140
|
+
|
141
|
+
namespace {
|
142
|
+
|
143
|
+
void sck_avl_destroy(void* p, void* user_data) {
|
144
|
+
SubchannelKey* key = static_cast<SubchannelKey*>(p);
|
145
|
+
Delete(key);
|
146
|
+
}
|
147
|
+
|
148
|
+
void* sck_avl_copy(void* p, void* unused) {
|
149
|
+
const SubchannelKey* key = static_cast<const SubchannelKey*>(p);
|
150
|
+
auto* new_key = New<SubchannelKey>(*key);
|
151
|
+
return static_cast<void*>(new_key);
|
152
|
+
}
|
153
|
+
|
154
|
+
long sck_avl_compare(void* a, void* b, void* unused) {
|
155
|
+
const SubchannelKey* key_a = static_cast<const SubchannelKey*>(a);
|
156
|
+
const SubchannelKey* key_b = static_cast<const SubchannelKey*>(b);
|
157
|
+
return key_a->Cmp(*key_b);
|
158
|
+
}
|
159
|
+
|
160
|
+
void scv_avl_destroy(void* p, void* user_data) {
|
161
|
+
GRPC_SUBCHANNEL_WEAK_UNREF((Subchannel*)p, "global_subchannel_pool");
|
162
|
+
}
|
163
|
+
|
164
|
+
void* scv_avl_copy(void* p, void* unused) {
|
165
|
+
GRPC_SUBCHANNEL_WEAK_REF((Subchannel*)p, "global_subchannel_pool");
|
166
|
+
return p;
|
167
|
+
}
|
168
|
+
|
169
|
+
} // namespace
|
170
|
+
|
171
|
+
const grpc_avl_vtable GlobalSubchannelPool::subchannel_avl_vtable_ = {
|
172
|
+
sck_avl_destroy, // destroy_key
|
173
|
+
sck_avl_copy, // copy_key
|
174
|
+
sck_avl_compare, // compare_keys
|
175
|
+
scv_avl_destroy, // destroy_value
|
176
|
+
scv_avl_copy // copy_value
|
177
|
+
};
|
178
|
+
|
179
|
+
} // namespace grpc_core
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 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
|
+
#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H
|
20
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
|
25
|
+
|
26
|
+
namespace grpc_core {
|
27
|
+
|
28
|
+
// The global subchannel pool. It shares subchannels among channels. There
|
29
|
+
// should be only one instance of this class. Init() should be called once at
|
30
|
+
// the filter initialization time; Shutdown() should be called once at the
|
31
|
+
// filter shutdown time.
|
32
|
+
// TODO(juanlishen): Enable subchannel retention.
|
33
|
+
class GlobalSubchannelPool final : public SubchannelPoolInterface {
|
34
|
+
public:
|
35
|
+
// The ctor and dtor are not intended to use directly.
|
36
|
+
GlobalSubchannelPool();
|
37
|
+
~GlobalSubchannelPool() override;
|
38
|
+
|
39
|
+
// Should be called exactly once at filter initialization time.
|
40
|
+
static void Init();
|
41
|
+
// Should be called exactly once at filter shutdown time.
|
42
|
+
static void Shutdown();
|
43
|
+
|
44
|
+
// Gets the singleton instance.
|
45
|
+
static RefCountedPtr<GlobalSubchannelPool> instance();
|
46
|
+
|
47
|
+
// Implements interface methods.
|
48
|
+
Subchannel* RegisterSubchannel(SubchannelKey* key,
|
49
|
+
Subchannel* constructed) override;
|
50
|
+
void UnregisterSubchannel(SubchannelKey* key) override;
|
51
|
+
Subchannel* FindSubchannel(SubchannelKey* key) override;
|
52
|
+
|
53
|
+
private:
|
54
|
+
// The singleton instance. (It's a pointer to RefCountedPtr so that this
|
55
|
+
// non-local static object can be trivially destructible.)
|
56
|
+
static RefCountedPtr<GlobalSubchannelPool>* instance_;
|
57
|
+
|
58
|
+
// The vtable for subchannel operations in an AVL tree.
|
59
|
+
static const grpc_avl_vtable subchannel_avl_vtable_;
|
60
|
+
// A map from subchannel key to subchannel.
|
61
|
+
grpc_avl subchannel_map_;
|
62
|
+
// To protect subchannel_map_.
|
63
|
+
gpr_mu mu_;
|
64
|
+
};
|
65
|
+
|
66
|
+
} // namespace grpc_core
|
67
|
+
|
68
|
+
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H */
|