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
@@ -23,72 +23,69 @@
|
|
23
23
|
|
24
24
|
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
25
25
|
#include "src/core/ext/filters/client_channel/connector.h"
|
26
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
27
|
+
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
|
28
|
+
#include "src/core/lib/backoff/backoff.h"
|
26
29
|
#include "src/core/lib/channel/channel_stack.h"
|
27
|
-
#include "src/core/lib/
|
30
|
+
#include "src/core/lib/gprpp/arena.h"
|
31
|
+
#include "src/core/lib/gprpp/map.h"
|
28
32
|
#include "src/core/lib/gprpp/ref_counted.h"
|
29
33
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
34
|
+
#include "src/core/lib/gprpp/sync.h"
|
30
35
|
#include "src/core/lib/iomgr/polling_entity.h"
|
36
|
+
#include "src/core/lib/iomgr/timer.h"
|
31
37
|
#include "src/core/lib/transport/connectivity_state.h"
|
32
38
|
#include "src/core/lib/transport/metadata.h"
|
33
39
|
|
34
40
|
// Channel arg containing a grpc_resolved_address to connect to.
|
35
41
|
#define GRPC_ARG_SUBCHANNEL_ADDRESS "grpc.subchannel_address"
|
36
42
|
|
37
|
-
|
38
|
-
address. Provides a target for load balancing. */
|
39
|
-
typedef struct grpc_subchannel grpc_subchannel;
|
40
|
-
typedef struct grpc_subchannel_call grpc_subchannel_call;
|
41
|
-
typedef struct grpc_subchannel_args grpc_subchannel_args;
|
42
|
-
typedef struct grpc_subchannel_key grpc_subchannel_key;
|
43
|
-
|
43
|
+
// For debugging refcounting.
|
44
44
|
#ifndef NDEBUG
|
45
|
-
#define GRPC_SUBCHANNEL_REF(p, r)
|
46
|
-
grpc_subchannel_ref((p), __FILE__, __LINE__, (r))
|
45
|
+
#define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref(__FILE__, __LINE__, (r))
|
47
46
|
#define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) \
|
48
|
-
|
49
|
-
#define GRPC_SUBCHANNEL_UNREF(p, r)
|
50
|
-
|
51
|
-
#define
|
52
|
-
grpc_subchannel_weak_ref((p), __FILE__, __LINE__, (r))
|
53
|
-
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) \
|
54
|
-
grpc_subchannel_weak_unref((p), __FILE__, __LINE__, (r))
|
55
|
-
#define GRPC_SUBCHANNEL_CALL_REF(p, r) \
|
56
|
-
grpc_subchannel_call_ref((p), __FILE__, __LINE__, (r))
|
57
|
-
#define GRPC_SUBCHANNEL_CALL_UNREF(p, r) \
|
58
|
-
grpc_subchannel_call_unref((p), __FILE__, __LINE__, (r))
|
47
|
+
(p)->RefFromWeakRef(__FILE__, __LINE__, (r))
|
48
|
+
#define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref(__FILE__, __LINE__, (r))
|
49
|
+
#define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef(__FILE__, __LINE__, (r))
|
50
|
+
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref(__FILE__, __LINE__, (r))
|
59
51
|
#define GRPC_SUBCHANNEL_REF_EXTRA_ARGS \
|
60
|
-
|
52
|
+
const char *file, int line, const char *reason
|
53
|
+
#define GRPC_SUBCHANNEL_REF_REASON reason
|
54
|
+
#define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS \
|
55
|
+
, GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char* purpose
|
56
|
+
#define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x) , file, line, reason, x
|
61
57
|
#else
|
62
|
-
#define GRPC_SUBCHANNEL_REF(p, r)
|
63
|
-
#define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r)
|
64
|
-
|
65
|
-
#define
|
66
|
-
#define
|
67
|
-
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) grpc_subchannel_weak_unref((p))
|
68
|
-
#define GRPC_SUBCHANNEL_CALL_REF(p, r) grpc_subchannel_call_ref((p))
|
69
|
-
#define GRPC_SUBCHANNEL_CALL_UNREF(p, r) grpc_subchannel_call_unref((p))
|
58
|
+
#define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref()
|
59
|
+
#define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
|
60
|
+
#define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref()
|
61
|
+
#define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef()
|
62
|
+
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref()
|
70
63
|
#define GRPC_SUBCHANNEL_REF_EXTRA_ARGS
|
64
|
+
#define GRPC_SUBCHANNEL_REF_REASON ""
|
65
|
+
#define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS
|
66
|
+
#define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x)
|
71
67
|
#endif
|
72
68
|
|
73
69
|
namespace grpc_core {
|
74
70
|
|
75
|
-
class
|
71
|
+
class SubchannelCall;
|
72
|
+
|
73
|
+
class ConnectedSubchannel : public ConnectedSubchannelInterface {
|
76
74
|
public:
|
77
75
|
struct CallArgs {
|
78
76
|
grpc_polling_entity* pollent;
|
79
77
|
grpc_slice path;
|
80
78
|
gpr_timespec start_time;
|
81
79
|
grpc_millis deadline;
|
82
|
-
|
80
|
+
Arena* arena;
|
83
81
|
grpc_call_context_element* context;
|
84
|
-
|
82
|
+
CallCombiner* call_combiner;
|
85
83
|
size_t parent_data_size;
|
86
84
|
};
|
87
85
|
|
88
86
|
ConnectedSubchannel(
|
89
87
|
grpc_channel_stack* channel_stack, const grpc_channel_args* args,
|
90
|
-
|
91
|
-
channelz_subchannel,
|
88
|
+
RefCountedPtr<channelz::SubchannelNode> channelz_subchannel,
|
92
89
|
intptr_t socket_uuid);
|
93
90
|
~ConnectedSubchannel();
|
94
91
|
|
@@ -96,10 +93,11 @@ class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
|
|
96
93
|
grpc_connectivity_state* state,
|
97
94
|
grpc_closure* closure);
|
98
95
|
void Ping(grpc_closure* on_initiate, grpc_closure* on_ack);
|
99
|
-
|
96
|
+
RefCountedPtr<SubchannelCall> CreateCall(const CallArgs& args,
|
97
|
+
grpc_error** error);
|
100
98
|
|
101
99
|
grpc_channel_stack* channel_stack() const { return channel_stack_; }
|
102
|
-
const grpc_channel_args* args() const { return args_; }
|
100
|
+
const grpc_channel_args* args() const override { return args_; }
|
103
101
|
channelz::SubchannelNode* channelz_subchannel() const {
|
104
102
|
return channelz_subchannel_.get();
|
105
103
|
}
|
@@ -112,107 +110,276 @@ class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
|
|
112
110
|
grpc_channel_args* args_;
|
113
111
|
// ref counted pointer to the channelz node in this connected subchannel's
|
114
112
|
// owning subchannel.
|
115
|
-
|
116
|
-
channelz_subchannel_;
|
113
|
+
RefCountedPtr<channelz::SubchannelNode> channelz_subchannel_;
|
117
114
|
// uuid of this subchannel's socket. 0 if this subchannel is not connected.
|
118
115
|
const intptr_t socket_uuid_;
|
119
116
|
};
|
120
117
|
|
121
|
-
|
118
|
+
// Implements the interface of RefCounted<>.
|
119
|
+
class SubchannelCall {
|
120
|
+
public:
|
121
|
+
SubchannelCall(RefCountedPtr<ConnectedSubchannel> connected_subchannel,
|
122
|
+
const ConnectedSubchannel::CallArgs& args)
|
123
|
+
: connected_subchannel_(std::move(connected_subchannel)),
|
124
|
+
deadline_(args.deadline) {}
|
125
|
+
|
126
|
+
// Continues processing a transport stream op batch.
|
127
|
+
void StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch);
|
128
|
+
|
129
|
+
// Returns a pointer to the parent data associated with the subchannel call.
|
130
|
+
// The data will be of the size specified in \a parent_data_size field of
|
131
|
+
// the args passed to \a ConnectedSubchannel::CreateCall().
|
132
|
+
void* GetParentData();
|
122
133
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
void
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
grpc_subchannel_get_connected_subchannel(grpc_subchannel* c);
|
165
|
-
|
166
|
-
/** return the subchannel index key for \a subchannel */
|
167
|
-
const grpc_subchannel_key* grpc_subchannel_get_key(
|
168
|
-
const grpc_subchannel* subchannel);
|
169
|
-
|
170
|
-
// Resets the connection backoff of the subchannel.
|
171
|
-
// TODO(roth): Move connection backoff out of subchannels and up into LB
|
172
|
-
// policy code (probably by adding a SubchannelGroup between
|
173
|
-
// SubchannelList and SubchannelData), at which point this method can
|
174
|
-
// go away.
|
175
|
-
void grpc_subchannel_reset_backoff(grpc_subchannel* subchannel);
|
176
|
-
|
177
|
-
/** continue processing a transport op */
|
178
|
-
void grpc_subchannel_call_process_op(grpc_subchannel_call* subchannel_call,
|
179
|
-
grpc_transport_stream_op_batch* op);
|
180
|
-
|
181
|
-
/** Must be called once per call. Sets the 'then_schedule_closure' argument for
|
182
|
-
call stack destruction. */
|
183
|
-
void grpc_subchannel_call_set_cleanup_closure(
|
184
|
-
grpc_subchannel_call* subchannel_call, grpc_closure* closure);
|
185
|
-
|
186
|
-
grpc_call_stack* grpc_subchannel_call_get_call_stack(
|
187
|
-
grpc_subchannel_call* subchannel_call);
|
188
|
-
|
189
|
-
struct grpc_subchannel_args {
|
190
|
-
/* When updating this struct, also update subchannel_index.c */
|
191
|
-
|
192
|
-
/** Channel filters for this channel - wrapped factories will likely
|
193
|
-
want to mutate this */
|
194
|
-
const grpc_channel_filter** filters;
|
195
|
-
/** The number of filters in the above array */
|
196
|
-
size_t filter_count;
|
197
|
-
/** Channel arguments to be supplied to the newly created channel */
|
198
|
-
const grpc_channel_args* args;
|
134
|
+
// Returns the call stack of the subchannel call.
|
135
|
+
grpc_call_stack* GetCallStack();
|
136
|
+
|
137
|
+
// Sets the 'then_schedule_closure' argument for call stack destruction.
|
138
|
+
// Must be called once per call.
|
139
|
+
void SetAfterCallStackDestroy(grpc_closure* closure);
|
140
|
+
|
141
|
+
// Interface of RefCounted<>.
|
142
|
+
RefCountedPtr<SubchannelCall> Ref() GRPC_MUST_USE_RESULT;
|
143
|
+
RefCountedPtr<SubchannelCall> Ref(const DebugLocation& location,
|
144
|
+
const char* reason) GRPC_MUST_USE_RESULT;
|
145
|
+
// When refcount drops to 0, destroys itself and the associated call stack,
|
146
|
+
// but does NOT free the memory because it's in the call arena.
|
147
|
+
void Unref();
|
148
|
+
void Unref(const DebugLocation& location, const char* reason);
|
149
|
+
|
150
|
+
static void Destroy(void* arg, grpc_error* error);
|
151
|
+
|
152
|
+
private:
|
153
|
+
// Allow RefCountedPtr<> to access IncrementRefCount().
|
154
|
+
template <typename T>
|
155
|
+
friend class RefCountedPtr;
|
156
|
+
|
157
|
+
// If channelz is enabled, intercepts recv_trailing so that we may check the
|
158
|
+
// status and associate it to a subchannel.
|
159
|
+
void MaybeInterceptRecvTrailingMetadata(
|
160
|
+
grpc_transport_stream_op_batch* batch);
|
161
|
+
|
162
|
+
static void RecvTrailingMetadataReady(void* arg, grpc_error* error);
|
163
|
+
|
164
|
+
// Interface of RefCounted<>.
|
165
|
+
void IncrementRefCount();
|
166
|
+
void IncrementRefCount(const DebugLocation& location, const char* reason);
|
167
|
+
|
168
|
+
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
169
|
+
grpc_closure* after_call_stack_destroy_ = nullptr;
|
170
|
+
// State needed to support channelz interception of recv trailing metadata.
|
171
|
+
grpc_closure recv_trailing_metadata_ready_;
|
172
|
+
grpc_closure* original_recv_trailing_metadata_ = nullptr;
|
173
|
+
grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
|
174
|
+
grpc_millis deadline_;
|
199
175
|
};
|
200
176
|
|
201
|
-
|
202
|
-
|
203
|
-
|
177
|
+
// A subchannel that knows how to connect to exactly one target address. It
|
178
|
+
// provides a target for load balancing.
|
179
|
+
class Subchannel {
|
180
|
+
public:
|
181
|
+
typedef SubchannelInterface::ConnectivityStateWatcher
|
182
|
+
ConnectivityStateWatcher;
|
183
|
+
|
184
|
+
// The ctor and dtor are not intended to use directly.
|
185
|
+
Subchannel(SubchannelKey* key, grpc_connector* connector,
|
186
|
+
const grpc_channel_args* args);
|
187
|
+
~Subchannel();
|
188
|
+
|
189
|
+
// Creates a subchannel given \a connector and \a args.
|
190
|
+
static Subchannel* Create(grpc_connector* connector,
|
191
|
+
const grpc_channel_args* args);
|
192
|
+
|
193
|
+
// Strong and weak refcounting.
|
194
|
+
Subchannel* Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
195
|
+
void Unref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
196
|
+
Subchannel* WeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
197
|
+
void WeakUnref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
198
|
+
// Attempts to return a strong ref when only the weak refcount is guaranteed
|
199
|
+
// non-zero. If the strong refcount is zero, does not alter the refcount and
|
200
|
+
// returns null.
|
201
|
+
Subchannel* RefFromWeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
202
|
+
|
203
|
+
intptr_t GetChildSocketUuid();
|
204
|
+
|
205
|
+
// Gets the string representing the subchannel address.
|
206
|
+
// Caller doesn't take ownership.
|
207
|
+
const char* GetTargetAddress();
|
208
|
+
|
209
|
+
channelz::SubchannelNode* channelz_node();
|
210
|
+
|
211
|
+
// Returns the current connectivity state of the subchannel.
|
212
|
+
// If health_check_service_name is non-null, the returned connectivity
|
213
|
+
// state will be based on the state reported by the backend for that
|
214
|
+
// service name.
|
215
|
+
// If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel.
|
216
|
+
grpc_connectivity_state CheckConnectivityState(
|
217
|
+
const char* health_check_service_name,
|
218
|
+
RefCountedPtr<ConnectedSubchannel>* connected_subchannel);
|
219
|
+
|
220
|
+
// Starts watching the subchannel's connectivity state.
|
221
|
+
// The first callback to the watcher will be delivered when the
|
222
|
+
// subchannel's connectivity state becomes a value other than
|
223
|
+
// initial_state, which may happen immediately.
|
224
|
+
// Subsequent callbacks will be delivered as the subchannel's state
|
225
|
+
// changes.
|
226
|
+
// The watcher will be destroyed either when the subchannel is
|
227
|
+
// destroyed or when CancelConnectivityStateWatch() is called.
|
228
|
+
void WatchConnectivityState(grpc_connectivity_state initial_state,
|
229
|
+
UniquePtr<char> health_check_service_name,
|
230
|
+
UniquePtr<ConnectivityStateWatcher> watcher);
|
231
|
+
|
232
|
+
// Cancels a connectivity state watch.
|
233
|
+
// If the watcher has already been destroyed, this is a no-op.
|
234
|
+
void CancelConnectivityStateWatch(const char* health_check_service_name,
|
235
|
+
ConnectivityStateWatcher* watcher);
|
236
|
+
|
237
|
+
// Attempt to connect to the backend. Has no effect if already connected.
|
238
|
+
void AttemptToConnect();
|
239
|
+
|
240
|
+
// Resets the connection backoff of the subchannel.
|
241
|
+
// TODO(roth): Move connection backoff out of subchannels and up into LB
|
242
|
+
// policy code (probably by adding a SubchannelGroup between
|
243
|
+
// SubchannelList and SubchannelData), at which point this method can
|
244
|
+
// go away.
|
245
|
+
void ResetBackoff();
|
246
|
+
|
247
|
+
// Returns a new channel arg encoding the subchannel address as a URI
|
248
|
+
// string. Caller is responsible for freeing the string.
|
249
|
+
static grpc_arg CreateSubchannelAddressArg(const grpc_resolved_address* addr);
|
250
|
+
|
251
|
+
// Returns the URI string from the subchannel address arg in \a args.
|
252
|
+
static const char* GetUriFromSubchannelAddressArg(
|
253
|
+
const grpc_channel_args* args);
|
254
|
+
|
255
|
+
// Sets \a addr from the subchannel address arg in \a args.
|
256
|
+
static void GetAddressFromSubchannelAddressArg(const grpc_channel_args* args,
|
257
|
+
grpc_resolved_address* addr);
|
258
|
+
|
259
|
+
private:
|
260
|
+
// A linked list of ConnectivityStateWatchers that are monitoring the
|
261
|
+
// subchannel's state.
|
262
|
+
class ConnectivityStateWatcherList {
|
263
|
+
public:
|
264
|
+
~ConnectivityStateWatcherList() { Clear(); }
|
265
|
+
|
266
|
+
void AddWatcherLocked(UniquePtr<ConnectivityStateWatcher> watcher);
|
267
|
+
void RemoveWatcherLocked(ConnectivityStateWatcher* watcher);
|
268
|
+
|
269
|
+
// Notifies all watchers in the list about a change to state.
|
270
|
+
void NotifyLocked(Subchannel* subchannel, grpc_connectivity_state state);
|
271
|
+
|
272
|
+
void Clear() { watchers_.clear(); }
|
273
|
+
|
274
|
+
bool empty() const { return watchers_.empty(); }
|
275
|
+
|
276
|
+
private:
|
277
|
+
// TODO(roth): This could be a set instead of a map if we had a set
|
278
|
+
// implementation.
|
279
|
+
Map<ConnectivityStateWatcher*, UniquePtr<ConnectivityStateWatcher>>
|
280
|
+
watchers_;
|
281
|
+
};
|
204
282
|
|
205
|
-
|
206
|
-
|
207
|
-
|
283
|
+
// A map that tracks ConnectivityStateWatchers using a particular health
|
284
|
+
// check service name.
|
285
|
+
//
|
286
|
+
// There is one entry in the map for each health check service name.
|
287
|
+
// Entries exist only as long as there are watchers using the
|
288
|
+
// corresponding service name.
|
289
|
+
//
|
290
|
+
// A health check client is maintained only while the subchannel is in
|
291
|
+
// state READY.
|
292
|
+
class HealthWatcherMap {
|
293
|
+
public:
|
294
|
+
void AddWatcherLocked(Subchannel* subchannel,
|
295
|
+
grpc_connectivity_state initial_state,
|
296
|
+
UniquePtr<char> health_check_service_name,
|
297
|
+
UniquePtr<ConnectivityStateWatcher> watcher);
|
298
|
+
void RemoveWatcherLocked(const char* health_check_service_name,
|
299
|
+
ConnectivityStateWatcher* watcher);
|
300
|
+
|
301
|
+
// Notifies the watcher when the subchannel's state changes.
|
302
|
+
void NotifyLocked(grpc_connectivity_state state);
|
303
|
+
|
304
|
+
grpc_connectivity_state CheckConnectivityStateLocked(
|
305
|
+
Subchannel* subchannel, const char* health_check_service_name);
|
306
|
+
|
307
|
+
void ShutdownLocked();
|
308
|
+
|
309
|
+
private:
|
310
|
+
class HealthWatcher;
|
311
|
+
|
312
|
+
Map<const char*, OrphanablePtr<HealthWatcher>, StringLess> map_;
|
313
|
+
};
|
314
|
+
|
315
|
+
class ConnectedSubchannelStateWatcher;
|
208
316
|
|
209
|
-
|
317
|
+
// Sets the subchannel's connectivity state to \a state.
|
318
|
+
void SetConnectivityStateLocked(grpc_connectivity_state state);
|
210
319
|
|
211
|
-
|
212
|
-
|
320
|
+
// Methods for connection.
|
321
|
+
void MaybeStartConnectingLocked();
|
322
|
+
static void OnRetryAlarm(void* arg, grpc_error* error);
|
323
|
+
void ContinueConnectingLocked();
|
324
|
+
static void OnConnectingFinished(void* arg, grpc_error* error);
|
325
|
+
bool PublishTransportLocked();
|
326
|
+
void Disconnect();
|
213
327
|
|
214
|
-
|
215
|
-
|
216
|
-
|
328
|
+
gpr_atm RefMutate(gpr_atm delta,
|
329
|
+
int barrier GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS);
|
330
|
+
|
331
|
+
// The subchannel pool this subchannel is in.
|
332
|
+
RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
|
333
|
+
// TODO(juanlishen): Consider using args_ as key_ directly.
|
334
|
+
// Subchannel key that identifies this subchannel in the subchannel pool.
|
335
|
+
SubchannelKey* key_;
|
336
|
+
// Channel args.
|
337
|
+
grpc_channel_args* args_;
|
338
|
+
// pollset_set tracking who's interested in a connection being setup.
|
339
|
+
grpc_pollset_set* pollset_set_;
|
340
|
+
// Protects the other members.
|
341
|
+
Mutex mu_;
|
342
|
+
// Refcount
|
343
|
+
// - lower INTERNAL_REF_BITS bits are for internal references:
|
344
|
+
// these do not keep the subchannel open.
|
345
|
+
// - upper remaining bits are for public references: these do
|
346
|
+
// keep the subchannel open
|
347
|
+
gpr_atm ref_pair_;
|
348
|
+
|
349
|
+
// Connection states.
|
350
|
+
grpc_connector* connector_ = nullptr;
|
351
|
+
// Set during connection.
|
352
|
+
grpc_connect_out_args connecting_result_;
|
353
|
+
grpc_closure on_connecting_finished_;
|
354
|
+
// Active connection, or null.
|
355
|
+
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
356
|
+
bool connecting_ = false;
|
357
|
+
bool disconnected_ = false;
|
358
|
+
|
359
|
+
// Connectivity state tracking.
|
360
|
+
grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
|
361
|
+
// The list of watchers without a health check service name.
|
362
|
+
ConnectivityStateWatcherList watcher_list_;
|
363
|
+
// The map of watchers with health check service names.
|
364
|
+
HealthWatcherMap health_watcher_map_;
|
365
|
+
|
366
|
+
// Backoff state.
|
367
|
+
BackOff backoff_;
|
368
|
+
grpc_millis next_attempt_deadline_;
|
369
|
+
grpc_millis min_connect_timeout_ms_;
|
370
|
+
bool backoff_begun_ = false;
|
371
|
+
|
372
|
+
// Retry alarm.
|
373
|
+
grpc_timer retry_alarm_;
|
374
|
+
grpc_closure on_retry_alarm_;
|
375
|
+
bool have_retry_alarm_ = false;
|
376
|
+
// reset_backoff() was called while alarm was pending.
|
377
|
+
bool retry_immediately_ = false;
|
378
|
+
|
379
|
+
// Channelz tracking.
|
380
|
+
RefCountedPtr<channelz::SubchannelNode> channelz_node_;
|
381
|
+
};
|
382
|
+
|
383
|
+
} // namespace grpc_core
|
217
384
|
|
218
385
|
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_H */
|
@@ -0,0 +1,113 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2019 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_SUBCHANNEL_INTERFACE_H
|
20
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_INTERFACE_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include "src/core/lib/debug/trace.h"
|
25
|
+
#include "src/core/lib/gprpp/ref_counted.h"
|
26
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
27
|
+
|
28
|
+
namespace grpc_core {
|
29
|
+
|
30
|
+
// TODO(roth): In a subsequent PR, remove this from this API.
|
31
|
+
class ConnectedSubchannelInterface
|
32
|
+
: public RefCounted<ConnectedSubchannelInterface> {
|
33
|
+
public:
|
34
|
+
virtual const grpc_channel_args* args() const GRPC_ABSTRACT;
|
35
|
+
|
36
|
+
protected:
|
37
|
+
template <typename TraceFlagT = TraceFlag>
|
38
|
+
explicit ConnectedSubchannelInterface(TraceFlagT* trace_flag = nullptr)
|
39
|
+
: RefCounted<ConnectedSubchannelInterface>(trace_flag) {}
|
40
|
+
};
|
41
|
+
|
42
|
+
class SubchannelInterface : public RefCounted<SubchannelInterface> {
|
43
|
+
public:
|
44
|
+
class ConnectivityStateWatcher {
|
45
|
+
public:
|
46
|
+
virtual ~ConnectivityStateWatcher() = default;
|
47
|
+
|
48
|
+
// Will be invoked whenever the subchannel's connectivity state
|
49
|
+
// changes. There will be only one invocation of this method on a
|
50
|
+
// given watcher instance at any given time.
|
51
|
+
//
|
52
|
+
// When the state changes to READY, connected_subchannel will
|
53
|
+
// contain a ref to the connected subchannel. When it changes from
|
54
|
+
// READY to some other state, the implementation must release its
|
55
|
+
// ref to the connected subchannel.
|
56
|
+
virtual void OnConnectivityStateChange(
|
57
|
+
grpc_connectivity_state new_state,
|
58
|
+
RefCountedPtr<ConnectedSubchannelInterface>
|
59
|
+
connected_subchannel) // NOLINT
|
60
|
+
GRPC_ABSTRACT;
|
61
|
+
|
62
|
+
// TODO(roth): Remove this as soon as we move to EventManager-based
|
63
|
+
// polling.
|
64
|
+
virtual grpc_pollset_set* interested_parties() GRPC_ABSTRACT;
|
65
|
+
|
66
|
+
GRPC_ABSTRACT_BASE_CLASS
|
67
|
+
};
|
68
|
+
|
69
|
+
virtual ~SubchannelInterface() = default;
|
70
|
+
|
71
|
+
// Returns the current connectivity state of the subchannel.
|
72
|
+
virtual grpc_connectivity_state CheckConnectivityState(
|
73
|
+
RefCountedPtr<ConnectedSubchannelInterface>* connected_subchannel)
|
74
|
+
GRPC_ABSTRACT;
|
75
|
+
|
76
|
+
// Starts watching the subchannel's connectivity state.
|
77
|
+
// The first callback to the watcher will be delivered when the
|
78
|
+
// subchannel's connectivity state becomes a value other than
|
79
|
+
// initial_state, which may happen immediately.
|
80
|
+
// Subsequent callbacks will be delivered as the subchannel's state
|
81
|
+
// changes.
|
82
|
+
// The watcher will be destroyed either when the subchannel is
|
83
|
+
// destroyed or when CancelConnectivityStateWatch() is called.
|
84
|
+
// There can be only one watcher of a given subchannel. It is not
|
85
|
+
// valid to call this method a second time without first cancelling
|
86
|
+
// the previous watcher using CancelConnectivityStateWatch().
|
87
|
+
virtual void WatchConnectivityState(
|
88
|
+
grpc_connectivity_state initial_state,
|
89
|
+
UniquePtr<ConnectivityStateWatcher> watcher) GRPC_ABSTRACT;
|
90
|
+
|
91
|
+
// Cancels a connectivity state watch.
|
92
|
+
// If the watcher has already been destroyed, this is a no-op.
|
93
|
+
virtual void CancelConnectivityStateWatch(ConnectivityStateWatcher* watcher)
|
94
|
+
GRPC_ABSTRACT;
|
95
|
+
|
96
|
+
// Attempt to connect to the backend. Has no effect if already connected.
|
97
|
+
// If the subchannel is currently in backoff delay due to a previously
|
98
|
+
// failed attempt, the new connection attempt will not start until the
|
99
|
+
// backoff delay has elapsed.
|
100
|
+
virtual void AttemptToConnect() GRPC_ABSTRACT;
|
101
|
+
|
102
|
+
// Resets the subchannel's connection backoff state. If AttemptToConnect()
|
103
|
+
// has been called since the subchannel entered TRANSIENT_FAILURE state,
|
104
|
+
// starts a new connection attempt immediately; otherwise, a new connection
|
105
|
+
// attempt will be started as soon as AttemptToConnect() is called.
|
106
|
+
virtual void ResetBackoff() GRPC_ABSTRACT;
|
107
|
+
|
108
|
+
GRPC_ABSTRACT_BASE_CLASS
|
109
|
+
};
|
110
|
+
|
111
|
+
} // namespace grpc_core
|
112
|
+
|
113
|
+
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_INTERFACE_H */
|