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
@@ -0,0 +1,543 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/ext/filters/client_channel/resolving_lb_policy.h"
|
22
|
+
|
23
|
+
#include <inttypes.h>
|
24
|
+
#include <limits.h>
|
25
|
+
#include <stdbool.h>
|
26
|
+
#include <stdio.h>
|
27
|
+
#include <string.h>
|
28
|
+
|
29
|
+
#include <grpc/support/alloc.h>
|
30
|
+
#include <grpc/support/log.h>
|
31
|
+
#include <grpc/support/string_util.h>
|
32
|
+
#include <grpc/support/sync.h>
|
33
|
+
|
34
|
+
#include "src/core/ext/filters/client_channel/backup_poller.h"
|
35
|
+
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
36
|
+
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
37
|
+
#include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
|
38
|
+
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
39
|
+
#include "src/core/ext/filters/client_channel/retry_throttle.h"
|
40
|
+
#include "src/core/ext/filters/client_channel/server_address.h"
|
41
|
+
#include "src/core/ext/filters/client_channel/service_config.h"
|
42
|
+
#include "src/core/ext/filters/client_channel/subchannel.h"
|
43
|
+
#include "src/core/ext/filters/deadline/deadline_filter.h"
|
44
|
+
#include "src/core/lib/backoff/backoff.h"
|
45
|
+
#include "src/core/lib/channel/channel_args.h"
|
46
|
+
#include "src/core/lib/channel/connected_channel.h"
|
47
|
+
#include "src/core/lib/channel/status_util.h"
|
48
|
+
#include "src/core/lib/gpr/string.h"
|
49
|
+
#include "src/core/lib/gprpp/inlined_vector.h"
|
50
|
+
#include "src/core/lib/gprpp/manual_constructor.h"
|
51
|
+
#include "src/core/lib/gprpp/sync.h"
|
52
|
+
#include "src/core/lib/iomgr/combiner.h"
|
53
|
+
#include "src/core/lib/iomgr/iomgr.h"
|
54
|
+
#include "src/core/lib/iomgr/polling_entity.h"
|
55
|
+
#include "src/core/lib/profiling/timers.h"
|
56
|
+
#include "src/core/lib/slice/slice_internal.h"
|
57
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
58
|
+
#include "src/core/lib/surface/channel.h"
|
59
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
60
|
+
#include "src/core/lib/transport/error_utils.h"
|
61
|
+
#include "src/core/lib/transport/metadata.h"
|
62
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
63
|
+
#include "src/core/lib/transport/static_metadata.h"
|
64
|
+
#include "src/core/lib/transport/status_metadata.h"
|
65
|
+
|
66
|
+
namespace grpc_core {
|
67
|
+
|
68
|
+
//
|
69
|
+
// ResolvingLoadBalancingPolicy::ResolverResultHandler
|
70
|
+
//
|
71
|
+
|
72
|
+
class ResolvingLoadBalancingPolicy::ResolverResultHandler
|
73
|
+
: public Resolver::ResultHandler {
|
74
|
+
public:
|
75
|
+
explicit ResolverResultHandler(
|
76
|
+
RefCountedPtr<ResolvingLoadBalancingPolicy> parent)
|
77
|
+
: parent_(std::move(parent)) {}
|
78
|
+
|
79
|
+
~ResolverResultHandler() {
|
80
|
+
if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
|
81
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: resolver shutdown complete",
|
82
|
+
parent_.get());
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
void ReturnResult(Resolver::Result result) override {
|
87
|
+
parent_->OnResolverResultChangedLocked(std::move(result));
|
88
|
+
}
|
89
|
+
|
90
|
+
void ReturnError(grpc_error* error) override {
|
91
|
+
parent_->OnResolverError(error);
|
92
|
+
}
|
93
|
+
|
94
|
+
private:
|
95
|
+
RefCountedPtr<ResolvingLoadBalancingPolicy> parent_;
|
96
|
+
};
|
97
|
+
|
98
|
+
//
|
99
|
+
// ResolvingLoadBalancingPolicy::ResolvingControlHelper
|
100
|
+
//
|
101
|
+
|
102
|
+
class ResolvingLoadBalancingPolicy::ResolvingControlHelper
|
103
|
+
: public LoadBalancingPolicy::ChannelControlHelper {
|
104
|
+
public:
|
105
|
+
explicit ResolvingControlHelper(
|
106
|
+
RefCountedPtr<ResolvingLoadBalancingPolicy> parent)
|
107
|
+
: parent_(std::move(parent)) {}
|
108
|
+
|
109
|
+
RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
110
|
+
const grpc_channel_args& args) override {
|
111
|
+
if (parent_->resolver_ == nullptr) return nullptr; // Shutting down.
|
112
|
+
if (!CalledByCurrentChild() && !CalledByPendingChild()) return nullptr;
|
113
|
+
return parent_->channel_control_helper()->CreateSubchannel(args);
|
114
|
+
}
|
115
|
+
|
116
|
+
grpc_channel* CreateChannel(const char* target,
|
117
|
+
const grpc_channel_args& args) override {
|
118
|
+
if (parent_->resolver_ == nullptr) return nullptr; // Shutting down.
|
119
|
+
if (!CalledByCurrentChild() && !CalledByPendingChild()) return nullptr;
|
120
|
+
return parent_->channel_control_helper()->CreateChannel(target, args);
|
121
|
+
}
|
122
|
+
|
123
|
+
void UpdateState(grpc_connectivity_state state,
|
124
|
+
UniquePtr<SubchannelPicker> picker) override {
|
125
|
+
if (parent_->resolver_ == nullptr) return; // Shutting down.
|
126
|
+
// If this request is from the pending child policy, ignore it until
|
127
|
+
// it reports READY, at which point we swap it into place.
|
128
|
+
if (CalledByPendingChild()) {
|
129
|
+
if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
|
130
|
+
gpr_log(GPR_INFO,
|
131
|
+
"resolving_lb=%p helper=%p: pending child policy %p reports "
|
132
|
+
"state=%s",
|
133
|
+
parent_.get(), this, child_,
|
134
|
+
grpc_connectivity_state_name(state));
|
135
|
+
}
|
136
|
+
if (state != GRPC_CHANNEL_READY) return;
|
137
|
+
grpc_pollset_set_del_pollset_set(
|
138
|
+
parent_->lb_policy_->interested_parties(),
|
139
|
+
parent_->interested_parties());
|
140
|
+
parent_->lb_policy_ = std::move(parent_->pending_lb_policy_);
|
141
|
+
} else if (!CalledByCurrentChild()) {
|
142
|
+
// This request is from an outdated child, so ignore it.
|
143
|
+
return;
|
144
|
+
}
|
145
|
+
parent_->channel_control_helper()->UpdateState(state, std::move(picker));
|
146
|
+
}
|
147
|
+
|
148
|
+
void RequestReresolution() override {
|
149
|
+
// If there is a pending child policy, ignore re-resolution requests
|
150
|
+
// from the current child policy (or any outdated child).
|
151
|
+
if (parent_->pending_lb_policy_ != nullptr && !CalledByPendingChild()) {
|
152
|
+
return;
|
153
|
+
}
|
154
|
+
if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
|
155
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: started name re-resolving",
|
156
|
+
parent_.get());
|
157
|
+
}
|
158
|
+
if (parent_->resolver_ != nullptr) {
|
159
|
+
parent_->resolver_->RequestReresolutionLocked();
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
void set_child(LoadBalancingPolicy* child) { child_ = child; }
|
164
|
+
|
165
|
+
private:
|
166
|
+
bool CalledByPendingChild() const {
|
167
|
+
GPR_ASSERT(child_ != nullptr);
|
168
|
+
return child_ == parent_->pending_lb_policy_.get();
|
169
|
+
}
|
170
|
+
|
171
|
+
bool CalledByCurrentChild() const {
|
172
|
+
GPR_ASSERT(child_ != nullptr);
|
173
|
+
return child_ == parent_->lb_policy_.get();
|
174
|
+
};
|
175
|
+
|
176
|
+
RefCountedPtr<ResolvingLoadBalancingPolicy> parent_;
|
177
|
+
LoadBalancingPolicy* child_ = nullptr;
|
178
|
+
};
|
179
|
+
|
180
|
+
//
|
181
|
+
// ResolvingLoadBalancingPolicy
|
182
|
+
//
|
183
|
+
|
184
|
+
ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy(
|
185
|
+
Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
|
186
|
+
UniquePtr<char> child_policy_name,
|
187
|
+
RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config,
|
188
|
+
grpc_error** error)
|
189
|
+
: LoadBalancingPolicy(std::move(args)),
|
190
|
+
tracer_(tracer),
|
191
|
+
target_uri_(std::move(target_uri)),
|
192
|
+
child_policy_name_(std::move(child_policy_name)),
|
193
|
+
child_lb_config_(std::move(child_lb_config)) {
|
194
|
+
GPR_ASSERT(child_policy_name_ != nullptr);
|
195
|
+
// Don't fetch service config, since this ctor is for use in nested LB
|
196
|
+
// policies, not at the top level, and we only fetch the service
|
197
|
+
// config at the top level.
|
198
|
+
grpc_arg arg = grpc_channel_arg_integer_create(
|
199
|
+
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION), 0);
|
200
|
+
grpc_channel_args* new_args =
|
201
|
+
grpc_channel_args_copy_and_add(args.args, &arg, 1);
|
202
|
+
*error = Init(*new_args);
|
203
|
+
grpc_channel_args_destroy(new_args);
|
204
|
+
}
|
205
|
+
|
206
|
+
ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy(
|
207
|
+
Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
|
208
|
+
ProcessResolverResultCallback process_resolver_result,
|
209
|
+
void* process_resolver_result_user_data, grpc_error** error)
|
210
|
+
: LoadBalancingPolicy(std::move(args)),
|
211
|
+
tracer_(tracer),
|
212
|
+
target_uri_(std::move(target_uri)),
|
213
|
+
process_resolver_result_(process_resolver_result),
|
214
|
+
process_resolver_result_user_data_(process_resolver_result_user_data) {
|
215
|
+
GPR_ASSERT(process_resolver_result != nullptr);
|
216
|
+
*error = Init(*args.args);
|
217
|
+
}
|
218
|
+
|
219
|
+
grpc_error* ResolvingLoadBalancingPolicy::Init(const grpc_channel_args& args) {
|
220
|
+
resolver_ = ResolverRegistry::CreateResolver(
|
221
|
+
target_uri_.get(), &args, interested_parties(), combiner(),
|
222
|
+
UniquePtr<Resolver::ResultHandler>(New<ResolverResultHandler>(Ref())));
|
223
|
+
if (resolver_ == nullptr) {
|
224
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("resolver creation failed");
|
225
|
+
}
|
226
|
+
// Return our picker to the channel.
|
227
|
+
channel_control_helper()->UpdateState(
|
228
|
+
GRPC_CHANNEL_IDLE, UniquePtr<SubchannelPicker>(New<QueuePicker>(Ref())));
|
229
|
+
return GRPC_ERROR_NONE;
|
230
|
+
}
|
231
|
+
|
232
|
+
ResolvingLoadBalancingPolicy::~ResolvingLoadBalancingPolicy() {
|
233
|
+
GPR_ASSERT(resolver_ == nullptr);
|
234
|
+
GPR_ASSERT(lb_policy_ == nullptr);
|
235
|
+
}
|
236
|
+
|
237
|
+
void ResolvingLoadBalancingPolicy::ShutdownLocked() {
|
238
|
+
if (resolver_ != nullptr) {
|
239
|
+
resolver_.reset();
|
240
|
+
if (lb_policy_ != nullptr) {
|
241
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
242
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: shutting down lb_policy=%p", this,
|
243
|
+
lb_policy_.get());
|
244
|
+
}
|
245
|
+
grpc_pollset_set_del_pollset_set(lb_policy_->interested_parties(),
|
246
|
+
interested_parties());
|
247
|
+
lb_policy_.reset();
|
248
|
+
}
|
249
|
+
if (pending_lb_policy_ != nullptr) {
|
250
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
251
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: shutting down pending lb_policy=%p",
|
252
|
+
this, pending_lb_policy_.get());
|
253
|
+
}
|
254
|
+
grpc_pollset_set_del_pollset_set(pending_lb_policy_->interested_parties(),
|
255
|
+
interested_parties());
|
256
|
+
pending_lb_policy_.reset();
|
257
|
+
}
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
void ResolvingLoadBalancingPolicy::ExitIdleLocked() {
|
262
|
+
if (lb_policy_ != nullptr) {
|
263
|
+
lb_policy_->ExitIdleLocked();
|
264
|
+
if (pending_lb_policy_ != nullptr) pending_lb_policy_->ExitIdleLocked();
|
265
|
+
} else {
|
266
|
+
if (!started_resolving_ && resolver_ != nullptr) {
|
267
|
+
StartResolvingLocked();
|
268
|
+
}
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
void ResolvingLoadBalancingPolicy::ResetBackoffLocked() {
|
273
|
+
if (resolver_ != nullptr) {
|
274
|
+
resolver_->ResetBackoffLocked();
|
275
|
+
resolver_->RequestReresolutionLocked();
|
276
|
+
}
|
277
|
+
if (lb_policy_ != nullptr) lb_policy_->ResetBackoffLocked();
|
278
|
+
if (pending_lb_policy_ != nullptr) pending_lb_policy_->ResetBackoffLocked();
|
279
|
+
}
|
280
|
+
|
281
|
+
void ResolvingLoadBalancingPolicy::StartResolvingLocked() {
|
282
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
283
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: starting name resolution", this);
|
284
|
+
}
|
285
|
+
GPR_ASSERT(!started_resolving_);
|
286
|
+
started_resolving_ = true;
|
287
|
+
channel_control_helper()->UpdateState(
|
288
|
+
GRPC_CHANNEL_CONNECTING,
|
289
|
+
UniquePtr<SubchannelPicker>(New<QueuePicker>(Ref())));
|
290
|
+
resolver_->StartLocked();
|
291
|
+
}
|
292
|
+
|
293
|
+
void ResolvingLoadBalancingPolicy::OnResolverError(grpc_error* error) {
|
294
|
+
if (resolver_ == nullptr) {
|
295
|
+
GRPC_ERROR_UNREF(error);
|
296
|
+
return;
|
297
|
+
}
|
298
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
299
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: resolver transient failure: %s", this,
|
300
|
+
grpc_error_string(error));
|
301
|
+
}
|
302
|
+
// If we already have an LB policy from a previous resolution
|
303
|
+
// result, then we continue to let it set the connectivity state.
|
304
|
+
// Otherwise, we go into TRANSIENT_FAILURE.
|
305
|
+
if (lb_policy_ == nullptr) {
|
306
|
+
grpc_error* state_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
307
|
+
"Resolver transient failure", &error, 1);
|
308
|
+
channel_control_helper()->UpdateState(
|
309
|
+
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
310
|
+
UniquePtr<SubchannelPicker>(New<TransientFailurePicker>(state_error)));
|
311
|
+
}
|
312
|
+
GRPC_ERROR_UNREF(error);
|
313
|
+
}
|
314
|
+
|
315
|
+
void ResolvingLoadBalancingPolicy::CreateOrUpdateLbPolicyLocked(
|
316
|
+
const char* lb_policy_name,
|
317
|
+
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
|
318
|
+
Resolver::Result result, TraceStringVector* trace_strings) {
|
319
|
+
// If the child policy name changes, we need to create a new child
|
320
|
+
// policy. When this happens, we leave child_policy_ as-is and store
|
321
|
+
// the new child policy in pending_child_policy_. Once the new child
|
322
|
+
// policy transitions into state READY, we swap it into child_policy_,
|
323
|
+
// replacing the original child policy. So pending_child_policy_ is
|
324
|
+
// non-null only between when we apply an update that changes the child
|
325
|
+
// policy name and when the new child reports state READY.
|
326
|
+
//
|
327
|
+
// Updates can arrive at any point during this transition. We always
|
328
|
+
// apply updates relative to the most recently created child policy,
|
329
|
+
// even if the most recent one is still in pending_child_policy_. This
|
330
|
+
// is true both when applying the updates to an existing child policy
|
331
|
+
// and when determining whether we need to create a new policy.
|
332
|
+
//
|
333
|
+
// As a result of this, there are several cases to consider here:
|
334
|
+
//
|
335
|
+
// 1. We have no existing child policy (i.e., we have started up but
|
336
|
+
// have not yet received a serverlist from the balancer or gone
|
337
|
+
// into fallback mode; in this case, both child_policy_ and
|
338
|
+
// pending_child_policy_ are null). In this case, we create a
|
339
|
+
// new child policy and store it in child_policy_.
|
340
|
+
//
|
341
|
+
// 2. We have an existing child policy and have no pending child policy
|
342
|
+
// from a previous update (i.e., either there has not been a
|
343
|
+
// previous update that changed the policy name, or we have already
|
344
|
+
// finished swapping in the new policy; in this case, child_policy_
|
345
|
+
// is non-null but pending_child_policy_ is null). In this case:
|
346
|
+
// a. If child_policy_->name() equals child_policy_name, then we
|
347
|
+
// update the existing child policy.
|
348
|
+
// b. If child_policy_->name() does not equal child_policy_name,
|
349
|
+
// we create a new policy. The policy will be stored in
|
350
|
+
// pending_child_policy_ and will later be swapped into
|
351
|
+
// child_policy_ by the helper when the new child transitions
|
352
|
+
// into state READY.
|
353
|
+
//
|
354
|
+
// 3. We have an existing child policy and have a pending child policy
|
355
|
+
// from a previous update (i.e., a previous update set
|
356
|
+
// pending_child_policy_ as per case 2b above and that policy has
|
357
|
+
// not yet transitioned into state READY and been swapped into
|
358
|
+
// child_policy_; in this case, both child_policy_ and
|
359
|
+
// pending_child_policy_ are non-null). In this case:
|
360
|
+
// a. If pending_child_policy_->name() equals child_policy_name,
|
361
|
+
// then we update the existing pending child policy.
|
362
|
+
// b. If pending_child_policy->name() does not equal
|
363
|
+
// child_policy_name, then we create a new policy. The new
|
364
|
+
// policy is stored in pending_child_policy_ (replacing the one
|
365
|
+
// that was there before, which will be immediately shut down)
|
366
|
+
// and will later be swapped into child_policy_ by the helper
|
367
|
+
// when the new child transitions into state READY.
|
368
|
+
const bool create_policy =
|
369
|
+
// case 1
|
370
|
+
lb_policy_ == nullptr ||
|
371
|
+
// case 2b
|
372
|
+
(pending_lb_policy_ == nullptr &&
|
373
|
+
strcmp(lb_policy_->name(), lb_policy_name) != 0) ||
|
374
|
+
// case 3b
|
375
|
+
(pending_lb_policy_ != nullptr &&
|
376
|
+
strcmp(pending_lb_policy_->name(), lb_policy_name) != 0);
|
377
|
+
LoadBalancingPolicy* policy_to_update = nullptr;
|
378
|
+
if (create_policy) {
|
379
|
+
// Cases 1, 2b, and 3b: create a new child policy.
|
380
|
+
// If lb_policy_ is null, we set it (case 1), else we set
|
381
|
+
// pending_lb_policy_ (cases 2b and 3b).
|
382
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
383
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: Creating new %schild policy %s", this,
|
384
|
+
lb_policy_ == nullptr ? "" : "pending ", lb_policy_name);
|
385
|
+
}
|
386
|
+
auto& lb_policy = lb_policy_ == nullptr ? lb_policy_ : pending_lb_policy_;
|
387
|
+
lb_policy =
|
388
|
+
CreateLbPolicyLocked(lb_policy_name, *result.args, trace_strings);
|
389
|
+
policy_to_update = lb_policy.get();
|
390
|
+
} else {
|
391
|
+
// Cases 2a and 3a: update an existing policy.
|
392
|
+
// If we have a pending child policy, send the update to the pending
|
393
|
+
// policy (case 3a), else send it to the current policy (case 2a).
|
394
|
+
policy_to_update = pending_lb_policy_ != nullptr ? pending_lb_policy_.get()
|
395
|
+
: lb_policy_.get();
|
396
|
+
}
|
397
|
+
GPR_ASSERT(policy_to_update != nullptr);
|
398
|
+
// Update the policy.
|
399
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
400
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: Updating %schild policy %p", this,
|
401
|
+
policy_to_update == pending_lb_policy_.get() ? "pending " : "",
|
402
|
+
policy_to_update);
|
403
|
+
}
|
404
|
+
UpdateArgs update_args;
|
405
|
+
update_args.addresses = std::move(result.addresses);
|
406
|
+
update_args.config = std::move(lb_policy_config);
|
407
|
+
// TODO(roth): Once channel args is converted to C++, use std::move() here.
|
408
|
+
update_args.args = result.args;
|
409
|
+
result.args = nullptr;
|
410
|
+
policy_to_update->UpdateLocked(std::move(update_args));
|
411
|
+
}
|
412
|
+
|
413
|
+
// Creates a new LB policy.
|
414
|
+
// Updates trace_strings to indicate what was done.
|
415
|
+
OrphanablePtr<LoadBalancingPolicy>
|
416
|
+
ResolvingLoadBalancingPolicy::CreateLbPolicyLocked(
|
417
|
+
const char* lb_policy_name, const grpc_channel_args& args,
|
418
|
+
TraceStringVector* trace_strings) {
|
419
|
+
ResolvingControlHelper* helper = New<ResolvingControlHelper>(Ref());
|
420
|
+
LoadBalancingPolicy::Args lb_policy_args;
|
421
|
+
lb_policy_args.combiner = combiner();
|
422
|
+
lb_policy_args.channel_control_helper =
|
423
|
+
UniquePtr<ChannelControlHelper>(helper);
|
424
|
+
lb_policy_args.args = &args;
|
425
|
+
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
426
|
+
LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
|
427
|
+
lb_policy_name, std::move(lb_policy_args));
|
428
|
+
if (GPR_UNLIKELY(lb_policy == nullptr)) {
|
429
|
+
gpr_log(GPR_ERROR, "could not create LB policy \"%s\"", lb_policy_name);
|
430
|
+
char* str;
|
431
|
+
gpr_asprintf(&str, "Could not create LB policy \"%s\"", lb_policy_name);
|
432
|
+
trace_strings->push_back(str);
|
433
|
+
return nullptr;
|
434
|
+
}
|
435
|
+
helper->set_child(lb_policy.get());
|
436
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
437
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: created new LB policy \"%s\" (%p)",
|
438
|
+
this, lb_policy_name, lb_policy.get());
|
439
|
+
}
|
440
|
+
char* str;
|
441
|
+
gpr_asprintf(&str, "Created new LB policy \"%s\"", lb_policy_name);
|
442
|
+
trace_strings->push_back(str);
|
443
|
+
grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
|
444
|
+
interested_parties());
|
445
|
+
return lb_policy;
|
446
|
+
}
|
447
|
+
|
448
|
+
void ResolvingLoadBalancingPolicy::MaybeAddTraceMessagesForAddressChangesLocked(
|
449
|
+
bool resolution_contains_addresses, TraceStringVector* trace_strings) {
|
450
|
+
if (!resolution_contains_addresses &&
|
451
|
+
previous_resolution_contained_addresses_) {
|
452
|
+
trace_strings->push_back(gpr_strdup("Address list became empty"));
|
453
|
+
} else if (resolution_contains_addresses &&
|
454
|
+
!previous_resolution_contained_addresses_) {
|
455
|
+
trace_strings->push_back(gpr_strdup("Address list became non-empty"));
|
456
|
+
}
|
457
|
+
previous_resolution_contained_addresses_ = resolution_contains_addresses;
|
458
|
+
}
|
459
|
+
|
460
|
+
void ResolvingLoadBalancingPolicy::ConcatenateAndAddChannelTraceLocked(
|
461
|
+
TraceStringVector* trace_strings) const {
|
462
|
+
if (!trace_strings->empty()) {
|
463
|
+
gpr_strvec v;
|
464
|
+
gpr_strvec_init(&v);
|
465
|
+
gpr_strvec_add(&v, gpr_strdup("Resolution event: "));
|
466
|
+
bool is_first = 1;
|
467
|
+
for (size_t i = 0; i < trace_strings->size(); ++i) {
|
468
|
+
if (!is_first) gpr_strvec_add(&v, gpr_strdup(", "));
|
469
|
+
is_first = false;
|
470
|
+
gpr_strvec_add(&v, (*trace_strings)[i]);
|
471
|
+
}
|
472
|
+
size_t len = 0;
|
473
|
+
UniquePtr<char> message(gpr_strvec_flatten(&v, &len));
|
474
|
+
channel_control_helper()->AddTraceEvent(ChannelControlHelper::TRACE_INFO,
|
475
|
+
message.get());
|
476
|
+
gpr_strvec_destroy(&v);
|
477
|
+
}
|
478
|
+
}
|
479
|
+
|
480
|
+
void ResolvingLoadBalancingPolicy::OnResolverResultChangedLocked(
|
481
|
+
Resolver::Result result) {
|
482
|
+
// Handle race conditions.
|
483
|
+
if (resolver_ == nullptr) return;
|
484
|
+
if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
|
485
|
+
gpr_log(GPR_INFO, "resolving_lb=%p: got resolver result", this);
|
486
|
+
}
|
487
|
+
// We only want to trace the address resolution in the follow cases:
|
488
|
+
// (a) Address resolution resulted in service config change.
|
489
|
+
// (b) Address resolution that causes number of backends to go from
|
490
|
+
// zero to non-zero.
|
491
|
+
// (c) Address resolution that causes number of backends to go from
|
492
|
+
// non-zero to zero.
|
493
|
+
// (d) Address resolution that causes a new LB policy to be created.
|
494
|
+
//
|
495
|
+
// We track a list of strings to eventually be concatenated and traced.
|
496
|
+
TraceStringVector trace_strings;
|
497
|
+
const bool resolution_contains_addresses = result.addresses.size() > 0;
|
498
|
+
// Process the resolver result.
|
499
|
+
const char* lb_policy_name = nullptr;
|
500
|
+
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config;
|
501
|
+
bool service_config_changed = false;
|
502
|
+
char* service_config_error_string = nullptr;
|
503
|
+
if (process_resolver_result_ != nullptr) {
|
504
|
+
grpc_error* service_config_error = GRPC_ERROR_NONE;
|
505
|
+
service_config_changed = process_resolver_result_(
|
506
|
+
process_resolver_result_user_data_, result, &lb_policy_name,
|
507
|
+
&lb_policy_config, &service_config_error);
|
508
|
+
if (service_config_error != GRPC_ERROR_NONE) {
|
509
|
+
service_config_error_string =
|
510
|
+
gpr_strdup(grpc_error_string(service_config_error));
|
511
|
+
if (lb_policy_name == nullptr) {
|
512
|
+
// Use an empty lb_policy_name as an indicator that we received an
|
513
|
+
// invalid service config and we don't have a fallback service config.
|
514
|
+
OnResolverError(service_config_error);
|
515
|
+
} else {
|
516
|
+
GRPC_ERROR_UNREF(service_config_error);
|
517
|
+
}
|
518
|
+
}
|
519
|
+
} else {
|
520
|
+
lb_policy_name = child_policy_name_.get();
|
521
|
+
lb_policy_config = child_lb_config_;
|
522
|
+
}
|
523
|
+
if (lb_policy_name != nullptr) {
|
524
|
+
// Create or update LB policy, as needed.
|
525
|
+
CreateOrUpdateLbPolicyLocked(lb_policy_name, lb_policy_config,
|
526
|
+
std::move(result), &trace_strings);
|
527
|
+
}
|
528
|
+
// Add channel trace event.
|
529
|
+
if (service_config_changed) {
|
530
|
+
// TODO(ncteisen): might be worth somehow including a snippet of the
|
531
|
+
// config in the trace, at the risk of bloating the trace logs.
|
532
|
+
trace_strings.push_back(gpr_strdup("Service config changed"));
|
533
|
+
}
|
534
|
+
if (service_config_error_string != nullptr) {
|
535
|
+
trace_strings.push_back(service_config_error_string);
|
536
|
+
service_config_error_string = nullptr;
|
537
|
+
}
|
538
|
+
MaybeAddTraceMessagesForAddressChangesLocked(resolution_contains_addresses,
|
539
|
+
&trace_strings);
|
540
|
+
ConcatenateAndAddChannelTraceLocked(&trace_strings);
|
541
|
+
}
|
542
|
+
|
543
|
+
} // namespace grpc_core
|
@@ -0,0 +1,139 @@
|
|
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_RESOLVING_LB_POLICY_H
|
20
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVING_LB_POLICY_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
25
|
+
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
26
|
+
#include "src/core/ext/filters/client_channel/resolver.h"
|
27
|
+
#include "src/core/lib/channel/channel_args.h"
|
28
|
+
#include "src/core/lib/channel/channel_stack.h"
|
29
|
+
#include "src/core/lib/debug/trace.h"
|
30
|
+
#include "src/core/lib/gprpp/inlined_vector.h"
|
31
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
32
|
+
#include "src/core/lib/iomgr/call_combiner.h"
|
33
|
+
#include "src/core/lib/iomgr/closure.h"
|
34
|
+
#include "src/core/lib/iomgr/polling_entity.h"
|
35
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
36
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
37
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
38
|
+
|
39
|
+
namespace grpc_core {
|
40
|
+
|
41
|
+
// An LB policy that wraps a resolver and a child LB policy to make use
|
42
|
+
// of the addresses returned by the resolver.
|
43
|
+
//
|
44
|
+
// When used in the client_channel code, the resolver will attempt to
|
45
|
+
// fetch the service config, and the child LB policy name and config
|
46
|
+
// will be determined based on the service config.
|
47
|
+
//
|
48
|
+
// When used in an LB policy implementation that needs to do another
|
49
|
+
// round of resolution before creating a child policy, the resolver does
|
50
|
+
// not fetch the service config, and the caller must pre-determine the
|
51
|
+
// child LB policy and config to use.
|
52
|
+
class ResolvingLoadBalancingPolicy : public LoadBalancingPolicy {
|
53
|
+
public:
|
54
|
+
// If error is set when this returns, then construction failed, and
|
55
|
+
// the caller may not use the new object.
|
56
|
+
ResolvingLoadBalancingPolicy(
|
57
|
+
Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
|
58
|
+
UniquePtr<char> child_policy_name,
|
59
|
+
RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config,
|
60
|
+
grpc_error** error);
|
61
|
+
|
62
|
+
// Private ctor, to be used by client_channel only!
|
63
|
+
//
|
64
|
+
// Synchronous callback that takes the resolver result and sets
|
65
|
+
// lb_policy_name and lb_policy_config to point to the right data.
|
66
|
+
// Returns true if the service config has changed since the last result.
|
67
|
+
// If the returned service_config_error is not none and lb_policy_name is
|
68
|
+
// empty, it means that we don't have a valid service config to use, and we
|
69
|
+
// should set the channel to be in TRANSIENT_FAILURE.
|
70
|
+
typedef bool (*ProcessResolverResultCallback)(
|
71
|
+
void* user_data, const Resolver::Result& result,
|
72
|
+
const char** lb_policy_name,
|
73
|
+
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
|
74
|
+
grpc_error** service_config_error);
|
75
|
+
// If error is set when this returns, then construction failed, and
|
76
|
+
// the caller may not use the new object.
|
77
|
+
ResolvingLoadBalancingPolicy(
|
78
|
+
Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
|
79
|
+
ProcessResolverResultCallback process_resolver_result,
|
80
|
+
void* process_resolver_result_user_data, grpc_error** error);
|
81
|
+
|
82
|
+
virtual const char* name() const override { return "resolving_lb"; }
|
83
|
+
|
84
|
+
// No-op -- should never get updates from the channel.
|
85
|
+
// TODO(roth): Need to support updating child LB policy's config for xds
|
86
|
+
// use case.
|
87
|
+
void UpdateLocked(UpdateArgs args) override {}
|
88
|
+
|
89
|
+
void ExitIdleLocked() override;
|
90
|
+
|
91
|
+
void ResetBackoffLocked() override;
|
92
|
+
|
93
|
+
private:
|
94
|
+
using TraceStringVector = InlinedVector<char*, 3>;
|
95
|
+
|
96
|
+
class ResolverResultHandler;
|
97
|
+
class ResolvingControlHelper;
|
98
|
+
|
99
|
+
~ResolvingLoadBalancingPolicy();
|
100
|
+
|
101
|
+
grpc_error* Init(const grpc_channel_args& args);
|
102
|
+
void ShutdownLocked() override;
|
103
|
+
|
104
|
+
void StartResolvingLocked();
|
105
|
+
void OnResolverError(grpc_error* error);
|
106
|
+
void CreateOrUpdateLbPolicyLocked(
|
107
|
+
const char* lb_policy_name,
|
108
|
+
RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
|
109
|
+
Resolver::Result result, TraceStringVector* trace_strings);
|
110
|
+
OrphanablePtr<LoadBalancingPolicy> CreateLbPolicyLocked(
|
111
|
+
const char* lb_policy_name, const grpc_channel_args& args,
|
112
|
+
TraceStringVector* trace_strings);
|
113
|
+
void MaybeAddTraceMessagesForAddressChangesLocked(
|
114
|
+
bool resolution_contains_addresses, TraceStringVector* trace_strings);
|
115
|
+
void ConcatenateAndAddChannelTraceLocked(
|
116
|
+
TraceStringVector* trace_strings) const;
|
117
|
+
void OnResolverResultChangedLocked(Resolver::Result result);
|
118
|
+
|
119
|
+
// Passed in from caller at construction time.
|
120
|
+
TraceFlag* tracer_;
|
121
|
+
UniquePtr<char> target_uri_;
|
122
|
+
ProcessResolverResultCallback process_resolver_result_ = nullptr;
|
123
|
+
void* process_resolver_result_user_data_ = nullptr;
|
124
|
+
UniquePtr<char> child_policy_name_;
|
125
|
+
RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config_;
|
126
|
+
|
127
|
+
// Resolver and associated state.
|
128
|
+
OrphanablePtr<Resolver> resolver_;
|
129
|
+
bool started_resolving_ = false;
|
130
|
+
bool previous_resolution_contained_addresses_ = false;
|
131
|
+
|
132
|
+
// Child LB policy.
|
133
|
+
OrphanablePtr<LoadBalancingPolicy> lb_policy_;
|
134
|
+
OrphanablePtr<LoadBalancingPolicy> pending_lb_policy_;
|
135
|
+
};
|
136
|
+
|
137
|
+
} // namespace grpc_core
|
138
|
+
|
139
|
+
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVING_LB_POLICY_H */
|