grpc 1.83.1 → 1.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +21 -17
- data/include/grpc/credentials.h +10 -0
- data/include/grpc/grpc_security_constants.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +9 -0
- data/src/core/call/call_filters.h +4 -2
- data/src/core/call/client_call.cc +20 -8
- data/src/core/call/client_call.h +4 -0
- data/src/core/call/interception_chain.cc +2 -0
- data/src/core/call/interception_chain.h +14 -1
- data/src/core/call/metadata.cc +1 -3
- data/src/core/call/metadata_batch.h +13 -5
- data/src/core/call/server_call.cc +31 -14
- data/src/core/call/server_call.h +4 -0
- data/src/core/channelz/text_encode.cc +9 -4
- data/src/core/channelz/v2tov1/convert.cc +2 -2
- data/src/core/client_channel/backup_poller.cc +1 -2
- data/src/core/client_channel/client_channel.cc +6 -33
- data/src/core/client_channel/client_channel_filter.cc +22 -55
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_service_config.cc +3 -19
- data/src/core/client_channel/direct_channel.cc +7 -1
- data/src/core/client_channel/direct_channel.h +2 -2
- data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
- data/src/core/client_channel/subchannel.cc +310 -1058
- data/src/core/client_channel/subchannel.h +44 -329
- data/src/core/client_channel/subchannel_metrics.cc +48 -0
- data/src/core/client_channel/subchannel_metrics.h +60 -0
- data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
- data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
- data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
- data/src/core/credentials/call/json_util.h +1 -0
- data/src/core/credentials/call/jwt/json_token.cc +10 -2
- data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
- data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
- data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
- data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
- data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
- data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
- data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
- data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
- data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
- data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
- data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
- data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
- data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
- data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
- data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
- data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
- data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
- data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
- data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
- data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
- data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
- data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
- data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
- data/src/core/filter/auth/server_auth_filter.cc +2 -3
- data/src/core/filter/composite/composite_filter.cc +45 -33
- data/src/core/filter/composite/composite_filter.h +5 -4
- data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
- data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
- data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
- data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
- data/src/core/filter/filter_args.h +13 -2
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
- data/src/core/handshaker/security/security_handshaker.cc +9 -6
- data/src/core/lib/channel/channel_stack.cc +3 -0
- data/src/core/lib/channel/channel_stack.h +2 -0
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
- data/src/core/lib/channel/promise_based_filter.cc +132 -20
- data/src/core/lib/channel/promise_based_filter.h +42 -12
- data/src/core/lib/compression/compression_internal.cc +4 -5
- data/src/core/lib/debug/trace_flags.cc +8 -0
- data/src/core/lib/debug/trace_flags.h +3 -0
- data/src/core/lib/event_engine/ares_resolver.cc +54 -50
- data/src/core/lib/event_engine/ares_resolver.h +3 -2
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
- data/src/core/lib/experiments/experiments.cc +60 -96
- data/src/core/lib/experiments/experiments.h +34 -50
- data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
- data/src/core/lib/iomgr/error.cc +2 -6
- data/src/core/lib/iomgr/error_cfstream.cc +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
- data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
- data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
- data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/systemd_utils.cc +0 -1
- data/src/core/lib/iomgr/tcp_client.h +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +23 -15
- data/src/core/lib/iomgr/tcp_server.h +1 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
- data/src/core/lib/iomgr/tcp_windows.cc +5 -10
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/vsock.h +3 -1
- data/src/core/lib/resource_quota/memory_quota.cc +1 -1
- data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
- data/src/core/lib/security/authorization/rbac_policy.h +21 -3
- data/src/core/lib/surface/call.cc +3 -9
- data/src/core/lib/surface/call_utils.h +113 -0
- data/src/core/lib/surface/channel_create.cc +1 -1
- data/src/core/lib/surface/channel_create.h +0 -2
- data/src/core/lib/surface/channel_init.cc +77 -38
- data/src/core/lib/surface/channel_init.h +30 -16
- data/src/core/lib/surface/filter_stack_call.cc +5 -10
- data/src/core/lib/surface/init.cc +13 -27
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +0 -27
- data/src/core/lib/transport/error_utils.h +0 -16
- data/src/core/lib/transport/transport.h +7 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
- data/src/core/load_balancing/rls/rls.cc +28 -11
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
- data/src/core/load_balancing/xds/cds.cc +3 -1
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
- data/src/core/mitigation_engine/mitigation.h +14 -5
- data/src/core/mitigation_engine/mitigation_engine.h +7 -3
- data/src/core/mitigation_engine/mitigation_provider.h +2 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
- data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
- data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
- data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
- data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
- data/src/core/resolver/endpoint_addresses.h +3 -0
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +35 -9
- data/src/core/server/server.cc +2 -6
- data/src/core/server/server_config_selector.h +18 -3
- data/src/core/server/server_config_selector_filter.cc +178 -91
- data/src/core/server/server_config_selector_filter.h +58 -3
- data/src/core/server/xds_server_config_fetcher.cc +196 -129
- data/src/core/server/xds_server_config_fetcher.h +49 -0
- data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
- data/src/core/telemetry/histogram.h +94 -14
- data/src/core/telemetry/instrument.cc +179 -74
- data/src/core/telemetry/instrument.h +78 -30
- data/src/core/telemetry/metrics.h +5 -0
- data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
- data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
- data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
- data/src/core/tsi/ssl_telemetry_utils.h +12 -2
- data/src/core/tsi/ssl_transport_security.cc +238 -80
- data/src/core/tsi/ssl_transport_security.h +63 -33
- data/src/core/tsi/tls_telemetry.cc +31 -0
- data/src/core/tsi/tls_telemetry.h +47 -0
- data/src/core/tsi/transport_security.cc +2 -2
- data/src/core/tsi/transport_security.h +1 -1
- data/src/core/tsi/transport_security_interface.h +1 -1
- data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
- data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
- data/src/core/util/http_client/httpcli.cc +16 -53
- data/src/core/util/http_client/httpcli.h +0 -7
- data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
- data/src/core/util/linux/cpu.cc +1 -1
- data/src/core/util/load_file.cc +3 -9
- data/src/core/util/load_file.h +3 -4
- data/src/core/util/matchers.h +8 -0
- data/src/core/util/posix/cpu.cc +1 -1
- data/src/core/util/status_helper.cc +0 -20
- data/src/core/util/status_helper.h +3 -14
- data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
- data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
- data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
- data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
- data/src/core/xds/grpc/xds_client_grpc.h +0 -4
- data/src/core/xds/grpc/xds_cluster.h +1 -0
- data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
- data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
- data/src/core/xds/grpc/xds_common_types.cc +0 -91
- data/src/core/xds/grpc/xds_common_types.h +1 -47
- data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
- data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
- data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
- data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
- data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
- data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
- data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
- data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
- data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
- data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
- data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
- data/src/core/xds/grpc/xds_http_filter.cc +2 -1
- data/src/core/xds/grpc/xds_http_filter.h +6 -5
- data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
- data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
- data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
- data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
- data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
- data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
- data/src/core/xds/grpc/xds_listener.cc +2 -0
- data/src/core/xds/grpc/xds_listener.h +5 -0
- data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
- data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
- data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
- data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
- data/src/core/xds/grpc/xds_route_config.cc +2 -0
- data/src/core/xds/grpc/xds_route_config.h +3 -1
- data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
- data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
- data/src/core/xds/grpc/xds_routing.cc +116 -69
- data/src/core/xds/grpc/xds_routing.h +19 -8
- data/src/core/xds/grpc/xds_tls_context.cc +117 -0
- data/src/core/xds/grpc/xds_tls_context.h +76 -0
- data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
- data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
- data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_call.c +26 -15
- data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +5 -4
- data/src/ruby/spec/call_spec.rb +14 -0
- data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
- metadata +50 -35
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
- data/src/core/lib/iomgr/resolve_address.cc +0 -59
- data/src/core/lib/iomgr/resolve_address.h +0 -125
- data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
- data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
- data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
- data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
- data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
- data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
- data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
- data/src/core/util/json/json_util.cc +0 -101
- data/src/core/util/json/json_util.h +0 -163
|
@@ -1,781 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2015 gRPC authors.
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
#include <grpc/impl/channel_arg_names.h>
|
|
18
|
-
#include <grpc/support/alloc.h>
|
|
19
|
-
#include <grpc/support/port_platform.h>
|
|
20
|
-
#include <stdint.h>
|
|
21
|
-
|
|
22
|
-
#include <algorithm>
|
|
23
|
-
#include <functional>
|
|
24
|
-
#include <memory>
|
|
25
|
-
#include <optional>
|
|
26
|
-
#include <string>
|
|
27
|
-
#include <utility>
|
|
28
|
-
#include <vector>
|
|
29
|
-
|
|
30
|
-
#include "src/core/config/core_configuration.h"
|
|
31
|
-
#include "src/core/lib/debug/trace.h"
|
|
32
|
-
#include "src/core/lib/iomgr/closure.h"
|
|
33
|
-
#include "src/core/lib/iomgr/error.h"
|
|
34
|
-
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
|
35
|
-
#include "src/core/lib/iomgr/pollset_set.h"
|
|
36
|
-
#include "src/core/lib/iomgr/resolved_address.h"
|
|
37
|
-
#include "src/core/resolver/dns/event_engine/service_config_helper.h"
|
|
38
|
-
#include "src/core/resolver/resolver.h"
|
|
39
|
-
#include "src/core/resolver/resolver_factory.h"
|
|
40
|
-
#include "src/core/service_config/service_config.h"
|
|
41
|
-
#include "src/core/util/debug_location.h"
|
|
42
|
-
#include "src/core/util/orphanable.h"
|
|
43
|
-
#include "src/core/util/ref_counted_ptr.h"
|
|
44
|
-
#include "src/core/util/status_helper.h"
|
|
45
|
-
#include "src/core/util/sync.h"
|
|
46
|
-
#include "src/core/util/time.h"
|
|
47
|
-
#include "src/core/util/uri.h"
|
|
48
|
-
#include "absl/base/thread_annotations.h"
|
|
49
|
-
#include "absl/log/log.h"
|
|
50
|
-
#include "absl/status/status.h"
|
|
51
|
-
#include "absl/status/statusor.h"
|
|
52
|
-
#include "absl/strings/match.h"
|
|
53
|
-
#include "absl/strings/string_view.h"
|
|
54
|
-
#include "absl/strings/strip.h"
|
|
55
|
-
|
|
56
|
-
#if GRPC_ARES == 1
|
|
57
|
-
|
|
58
|
-
#include <address_sorting/address_sorting.h>
|
|
59
|
-
|
|
60
|
-
#include "src/core/config/config_vars.h"
|
|
61
|
-
#include "src/core/lib/channel/channel_args.h"
|
|
62
|
-
#include "src/core/lib/iomgr/resolve_address.h"
|
|
63
|
-
#include "src/core/lib/transport/error_utils.h"
|
|
64
|
-
#include "src/core/load_balancing/grpclb/grpclb_balancer_addresses.h"
|
|
65
|
-
#include "src/core/resolver/dns/c_ares/grpc_ares_wrapper.h"
|
|
66
|
-
#include "src/core/resolver/endpoint_addresses.h"
|
|
67
|
-
#include "src/core/resolver/polling_resolver.h"
|
|
68
|
-
#include "src/core/service_config/service_config_impl.h"
|
|
69
|
-
#include "src/core/util/backoff.h"
|
|
70
|
-
#include "absl/strings/str_cat.h"
|
|
71
|
-
|
|
72
|
-
#define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
|
73
|
-
#define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
|
74
|
-
#define GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS 120
|
|
75
|
-
#define GRPC_DNS_RECONNECT_JITTER 0.2
|
|
76
|
-
|
|
77
|
-
namespace grpc_core {
|
|
78
|
-
|
|
79
|
-
namespace {
|
|
80
|
-
|
|
81
|
-
class AresClientChannelDNSResolver final : public PollingResolver {
|
|
82
|
-
public:
|
|
83
|
-
AresClientChannelDNSResolver(ResolverArgs args,
|
|
84
|
-
Duration min_time_between_resolutions);
|
|
85
|
-
|
|
86
|
-
OrphanablePtr<Orphanable> StartRequest() override;
|
|
87
|
-
|
|
88
|
-
private:
|
|
89
|
-
class AresRequestWrapper final
|
|
90
|
-
: public InternallyRefCounted<AresRequestWrapper> {
|
|
91
|
-
public:
|
|
92
|
-
explicit AresRequestWrapper(
|
|
93
|
-
RefCountedPtr<AresClientChannelDNSResolver> resolver)
|
|
94
|
-
: resolver_(std::move(resolver)) {
|
|
95
|
-
// TODO(hork): replace this callback bookkeeping with promises.
|
|
96
|
-
// Locking to prevent completion before all records are queried
|
|
97
|
-
MutexLock lock(&on_resolved_mu_);
|
|
98
|
-
Ref(DEBUG_LOCATION, "OnHostnameResolved").release();
|
|
99
|
-
GRPC_CLOSURE_INIT(&on_hostname_resolved_, OnHostnameResolved, this,
|
|
100
|
-
nullptr);
|
|
101
|
-
hostname_request_.reset(grpc_dns_lookup_hostname_ares(
|
|
102
|
-
resolver_->authority().c_str(), resolver_->name_to_resolve().c_str(),
|
|
103
|
-
kDefaultSecurePort, resolver_->interested_parties(),
|
|
104
|
-
&on_hostname_resolved_, &addresses_, resolver_->query_timeout_ms_));
|
|
105
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
106
|
-
<< "(c-ares resolver) resolver:" << resolver_.get()
|
|
107
|
-
<< " Started resolving hostnames. hostname_request_:"
|
|
108
|
-
<< hostname_request_.get();
|
|
109
|
-
if (resolver_->enable_srv_queries_) {
|
|
110
|
-
Ref(DEBUG_LOCATION, "OnSRVResolved").release();
|
|
111
|
-
GRPC_CLOSURE_INIT(&on_srv_resolved_, OnSRVResolved, this, nullptr);
|
|
112
|
-
srv_request_.reset(grpc_dns_lookup_srv_ares(
|
|
113
|
-
resolver_->authority().c_str(),
|
|
114
|
-
resolver_->name_to_resolve().c_str(),
|
|
115
|
-
resolver_->interested_parties(), &on_srv_resolved_,
|
|
116
|
-
&balancer_addresses_, resolver_->query_timeout_ms_));
|
|
117
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
118
|
-
<< "(c-ares resolver) resolver:" << resolver_.get()
|
|
119
|
-
<< " Started resolving SRV records. srv_request_:"
|
|
120
|
-
<< srv_request_.get();
|
|
121
|
-
}
|
|
122
|
-
if (resolver_->request_service_config_) {
|
|
123
|
-
Ref(DEBUG_LOCATION, "OnTXTResolved").release();
|
|
124
|
-
GRPC_CLOSURE_INIT(&on_txt_resolved_, OnTXTResolved, this, nullptr);
|
|
125
|
-
txt_request_.reset(grpc_dns_lookup_txt_ares(
|
|
126
|
-
resolver_->authority().c_str(),
|
|
127
|
-
resolver_->name_to_resolve().c_str(),
|
|
128
|
-
resolver_->interested_parties(), &on_txt_resolved_,
|
|
129
|
-
&service_config_json_, resolver_->query_timeout_ms_));
|
|
130
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
131
|
-
<< "(c-ares resolver) resolver:" << resolver_.get()
|
|
132
|
-
<< " Started resolving TXT records. txt_request_:"
|
|
133
|
-
<< txt_request_.get();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
~AresRequestWrapper() override {
|
|
138
|
-
gpr_free(service_config_json_);
|
|
139
|
-
resolver_.reset(DEBUG_LOCATION, "dns-resolving");
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Note that thread safety cannot be analyzed due to this being invoked from
|
|
143
|
-
// OrphanablePtr<>, and there's no way to pass the lock annotation through
|
|
144
|
-
// there.
|
|
145
|
-
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
146
|
-
{
|
|
147
|
-
MutexLock lock(&on_resolved_mu_);
|
|
148
|
-
if (hostname_request_ != nullptr) {
|
|
149
|
-
grpc_cancel_ares_request(hostname_request_.get());
|
|
150
|
-
}
|
|
151
|
-
if (srv_request_ != nullptr) {
|
|
152
|
-
grpc_cancel_ares_request(srv_request_.get());
|
|
153
|
-
}
|
|
154
|
-
if (txt_request_ != nullptr) {
|
|
155
|
-
grpc_cancel_ares_request(txt_request_.get());
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
Unref(DEBUG_LOCATION, "Orphan");
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
private:
|
|
162
|
-
static void OnHostnameResolved(void* arg, grpc_error_handle error);
|
|
163
|
-
static void OnSRVResolved(void* arg, grpc_error_handle error);
|
|
164
|
-
static void OnTXTResolved(void* arg, grpc_error_handle error);
|
|
165
|
-
std::optional<Result> OnResolvedLocked(grpc_error_handle error)
|
|
166
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(on_resolved_mu_);
|
|
167
|
-
|
|
168
|
-
Mutex on_resolved_mu_;
|
|
169
|
-
RefCountedPtr<AresClientChannelDNSResolver> resolver_;
|
|
170
|
-
grpc_closure on_hostname_resolved_;
|
|
171
|
-
std::unique_ptr<grpc_ares_request> hostname_request_
|
|
172
|
-
ABSL_GUARDED_BY(on_resolved_mu_);
|
|
173
|
-
grpc_closure on_srv_resolved_;
|
|
174
|
-
std::unique_ptr<grpc_ares_request> srv_request_
|
|
175
|
-
ABSL_GUARDED_BY(on_resolved_mu_);
|
|
176
|
-
grpc_closure on_txt_resolved_;
|
|
177
|
-
std::unique_ptr<grpc_ares_request> txt_request_
|
|
178
|
-
ABSL_GUARDED_BY(on_resolved_mu_);
|
|
179
|
-
// Output fields from ares request.
|
|
180
|
-
std::unique_ptr<EndpointAddressesList> addresses_
|
|
181
|
-
ABSL_GUARDED_BY(on_resolved_mu_);
|
|
182
|
-
std::unique_ptr<EndpointAddressesList> balancer_addresses_
|
|
183
|
-
ABSL_GUARDED_BY(on_resolved_mu_);
|
|
184
|
-
char* service_config_json_ ABSL_GUARDED_BY(on_resolved_mu_) = nullptr;
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
~AresClientChannelDNSResolver() override;
|
|
188
|
-
|
|
189
|
-
/// whether to request the service config
|
|
190
|
-
const bool request_service_config_;
|
|
191
|
-
// whether or not to enable SRV DNS queries
|
|
192
|
-
const bool enable_srv_queries_;
|
|
193
|
-
// timeout in milliseconds for active DNS queries
|
|
194
|
-
const int query_timeout_ms_;
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
AresClientChannelDNSResolver::AresClientChannelDNSResolver(
|
|
198
|
-
ResolverArgs args, Duration min_time_between_resolutions)
|
|
199
|
-
: PollingResolver(std::move(args), min_time_between_resolutions,
|
|
200
|
-
BackOff::Options()
|
|
201
|
-
.set_initial_backoff(Duration::Seconds(
|
|
202
|
-
GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS))
|
|
203
|
-
.set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
|
|
204
|
-
.set_jitter(GRPC_DNS_RECONNECT_JITTER)
|
|
205
|
-
.set_max_backoff(Duration::Seconds(
|
|
206
|
-
GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS)),
|
|
207
|
-
&cares_resolver_trace),
|
|
208
|
-
request_service_config_(
|
|
209
|
-
!channel_args()
|
|
210
|
-
.GetBool(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION)
|
|
211
|
-
.value_or(true)),
|
|
212
|
-
enable_srv_queries_(channel_args()
|
|
213
|
-
.GetBool(GRPC_ARG_DNS_ENABLE_SRV_QUERIES)
|
|
214
|
-
.value_or(false)),
|
|
215
|
-
query_timeout_ms_(
|
|
216
|
-
std::max(0, channel_args()
|
|
217
|
-
.GetInt(GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS)
|
|
218
|
-
.value_or(GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS))) {}
|
|
219
|
-
|
|
220
|
-
AresClientChannelDNSResolver::~AresClientChannelDNSResolver() {
|
|
221
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
222
|
-
<< "(c-ares resolver) resolver:" << this
|
|
223
|
-
<< " destroying AresClientChannelDNSResolver";
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
OrphanablePtr<Orphanable> AresClientChannelDNSResolver::StartRequest() {
|
|
227
|
-
return MakeOrphanable<AresRequestWrapper>(
|
|
228
|
-
RefAsSubclass<AresClientChannelDNSResolver>(DEBUG_LOCATION,
|
|
229
|
-
"dns-resolving"));
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
void AresClientChannelDNSResolver::AresRequestWrapper::OnHostnameResolved(
|
|
233
|
-
void* arg, grpc_error_handle error) {
|
|
234
|
-
auto* self = static_cast<AresRequestWrapper*>(arg);
|
|
235
|
-
std::optional<Result> result;
|
|
236
|
-
{
|
|
237
|
-
MutexLock lock(&self->on_resolved_mu_);
|
|
238
|
-
self->hostname_request_.reset();
|
|
239
|
-
result = self->OnResolvedLocked(error);
|
|
240
|
-
}
|
|
241
|
-
if (result.has_value()) {
|
|
242
|
-
self->resolver_->OnRequestComplete(std::move(*result));
|
|
243
|
-
}
|
|
244
|
-
self->Unref(DEBUG_LOCATION, "OnHostnameResolved");
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
void AresClientChannelDNSResolver::AresRequestWrapper::OnSRVResolved(
|
|
248
|
-
void* arg, grpc_error_handle error) {
|
|
249
|
-
auto* self = static_cast<AresRequestWrapper*>(arg);
|
|
250
|
-
std::optional<Result> result;
|
|
251
|
-
{
|
|
252
|
-
MutexLock lock(&self->on_resolved_mu_);
|
|
253
|
-
self->srv_request_.reset();
|
|
254
|
-
result = self->OnResolvedLocked(error);
|
|
255
|
-
}
|
|
256
|
-
if (result.has_value()) {
|
|
257
|
-
self->resolver_->OnRequestComplete(std::move(*result));
|
|
258
|
-
}
|
|
259
|
-
self->Unref(DEBUG_LOCATION, "OnSRVResolved");
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
void AresClientChannelDNSResolver::AresRequestWrapper::OnTXTResolved(
|
|
263
|
-
void* arg, grpc_error_handle error) {
|
|
264
|
-
auto* self = static_cast<AresRequestWrapper*>(arg);
|
|
265
|
-
std::optional<Result> result;
|
|
266
|
-
{
|
|
267
|
-
MutexLock lock(&self->on_resolved_mu_);
|
|
268
|
-
self->txt_request_.reset();
|
|
269
|
-
result = self->OnResolvedLocked(error);
|
|
270
|
-
}
|
|
271
|
-
if (result.has_value()) {
|
|
272
|
-
self->resolver_->OnRequestComplete(std::move(*result));
|
|
273
|
-
}
|
|
274
|
-
self->Unref(DEBUG_LOCATION, "OnTXTResolved");
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Returns a Result if resolution is complete.
|
|
278
|
-
// callers must release the lock and call OnRequestComplete if a Result is
|
|
279
|
-
// returned. This is because OnRequestComplete may Orphan the resolver, which
|
|
280
|
-
// requires taking the lock.
|
|
281
|
-
std::optional<AresClientChannelDNSResolver::Result>
|
|
282
|
-
AresClientChannelDNSResolver::AresRequestWrapper::OnResolvedLocked(
|
|
283
|
-
grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(on_resolved_mu_) {
|
|
284
|
-
if (hostname_request_ != nullptr || srv_request_ != nullptr ||
|
|
285
|
-
txt_request_ != nullptr) {
|
|
286
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
287
|
-
<< "(c-ares resolver) resolver:" << this
|
|
288
|
-
<< " OnResolved() waiting for results (hostname: "
|
|
289
|
-
<< (hostname_request_ != nullptr ? "waiting" : "done")
|
|
290
|
-
<< ", srv: " << (srv_request_ != nullptr ? "waiting" : "done")
|
|
291
|
-
<< ", txt: " << (txt_request_ != nullptr ? "waiting" : "done") << ")";
|
|
292
|
-
return std::nullopt;
|
|
293
|
-
}
|
|
294
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
295
|
-
<< "(c-ares resolver) resolver:" << this << " OnResolved() proceeding";
|
|
296
|
-
Result result;
|
|
297
|
-
result.args = resolver_->channel_args();
|
|
298
|
-
// TODO(roth): Change logic to be able to report failures for addresses
|
|
299
|
-
// and service config independently of each other.
|
|
300
|
-
if (addresses_ != nullptr || balancer_addresses_ != nullptr) {
|
|
301
|
-
if (addresses_ != nullptr) {
|
|
302
|
-
result.addresses = std::move(*addresses_);
|
|
303
|
-
} else {
|
|
304
|
-
result.addresses.emplace();
|
|
305
|
-
}
|
|
306
|
-
if (service_config_json_ != nullptr) {
|
|
307
|
-
auto service_config_string = ChooseServiceConfig(service_config_json_);
|
|
308
|
-
if (!service_config_string.ok()) {
|
|
309
|
-
result.service_config = absl::UnavailableError(
|
|
310
|
-
absl::StrCat("failed to parse service config: ",
|
|
311
|
-
StatusToString(service_config_string.status())));
|
|
312
|
-
} else if (!service_config_string->empty()) {
|
|
313
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
314
|
-
<< "(c-ares resolver) resolver:" << this
|
|
315
|
-
<< " selected service config choice: " << *service_config_string;
|
|
316
|
-
result.service_config = ServiceConfigImpl::Create(
|
|
317
|
-
resolver_->channel_args(), *service_config_string);
|
|
318
|
-
if (!result.service_config.ok()) {
|
|
319
|
-
result.service_config = absl::UnavailableError(
|
|
320
|
-
absl::StrCat("failed to parse service config: ",
|
|
321
|
-
result.service_config.status().message()));
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
if (balancer_addresses_ != nullptr) {
|
|
326
|
-
result.args =
|
|
327
|
-
SetGrpcLbBalancerAddresses(result.args, *balancer_addresses_);
|
|
328
|
-
}
|
|
329
|
-
} else {
|
|
330
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
331
|
-
<< "(c-ares resolver) resolver:" << this
|
|
332
|
-
<< " dns resolution failed: " << StatusToString(error);
|
|
333
|
-
absl::Status status = absl::UnavailableError(
|
|
334
|
-
absl::StrCat("DNS resolution failed for ", resolver_->name_to_resolve(),
|
|
335
|
-
": ", error.message()));
|
|
336
|
-
result.addresses = status;
|
|
337
|
-
result.service_config = status;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return std::move(result);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
//
|
|
344
|
-
// Factory
|
|
345
|
-
//
|
|
346
|
-
|
|
347
|
-
class AresClientChannelDNSResolverFactory final : public ResolverFactory {
|
|
348
|
-
public:
|
|
349
|
-
absl::string_view scheme() const override { return "dns"; }
|
|
350
|
-
|
|
351
|
-
bool IsValidUri(const URI& uri) const override {
|
|
352
|
-
if (absl::StripPrefix(uri.path(), "/").empty()) {
|
|
353
|
-
LOG(ERROR) << "no server name supplied in dns URI";
|
|
354
|
-
return false;
|
|
355
|
-
}
|
|
356
|
-
return true;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
|
|
360
|
-
Duration min_time_between_resolutions = std::max(
|
|
361
|
-
Duration::Zero(), args.args
|
|
362
|
-
.GetDurationFromIntMillis(
|
|
363
|
-
GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS)
|
|
364
|
-
.value_or(Duration::Seconds(30)));
|
|
365
|
-
return MakeOrphanable<AresClientChannelDNSResolver>(
|
|
366
|
-
std::move(args), min_time_between_resolutions);
|
|
367
|
-
}
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
class AresDNSResolver final : public DNSResolver {
|
|
371
|
-
public:
|
|
372
|
-
// Abstract class that centralizes common request handling logic via the
|
|
373
|
-
// template method pattern.
|
|
374
|
-
// This requires a two-phase initialization, where 1) a request is created via
|
|
375
|
-
// a subclass constructor, and 2) the request is initiated via Run()
|
|
376
|
-
class AresRequest {
|
|
377
|
-
public:
|
|
378
|
-
virtual ~AresRequest() {
|
|
379
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
380
|
-
<< "(c-ares resolver) AresRequest:" << this
|
|
381
|
-
<< " dtor ares_request_:" << grpc_ares_request_.get();
|
|
382
|
-
resolver_->UnregisterRequest(task_handle());
|
|
383
|
-
grpc_pollset_set_destroy(pollset_set_);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Initiates the low-level c-ares request and returns its handle.
|
|
387
|
-
virtual std::unique_ptr<grpc_ares_request> MakeRequestLocked() = 0;
|
|
388
|
-
// Called on ares resolution, but not upon cancellation.
|
|
389
|
-
// After execution, the AresRequest will perform any final cleanup and
|
|
390
|
-
// delete itself.
|
|
391
|
-
virtual void OnComplete(grpc_error_handle error) = 0;
|
|
392
|
-
|
|
393
|
-
// Called to initiate the request.
|
|
394
|
-
void Run() {
|
|
395
|
-
MutexLock lock(&mu_);
|
|
396
|
-
grpc_ares_request_ = MakeRequestLocked();
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
bool Cancel() {
|
|
400
|
-
MutexLock lock(&mu_);
|
|
401
|
-
if (grpc_ares_request_ != nullptr) {
|
|
402
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
403
|
-
<< "(c-ares resolver) AresRequest:" << this
|
|
404
|
-
<< " Cancel ares_request_:" << grpc_ares_request_.get();
|
|
405
|
-
if (completed_) return false;
|
|
406
|
-
// OnDnsLookupDone will still be run
|
|
407
|
-
completed_ = true;
|
|
408
|
-
grpc_cancel_ares_request(grpc_ares_request_.get());
|
|
409
|
-
} else {
|
|
410
|
-
completed_ = true;
|
|
411
|
-
OnDnsLookupDone(this, absl::CancelledError());
|
|
412
|
-
}
|
|
413
|
-
grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties_);
|
|
414
|
-
return true;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
TaskHandle task_handle() {
|
|
418
|
-
return {reinterpret_cast<intptr_t>(this), aba_token_};
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
protected:
|
|
422
|
-
AresRequest(absl::string_view name, absl::string_view name_server,
|
|
423
|
-
Duration timeout, grpc_pollset_set* interested_parties,
|
|
424
|
-
AresDNSResolver* resolver, intptr_t aba_token)
|
|
425
|
-
: name_(name),
|
|
426
|
-
name_server_(name_server),
|
|
427
|
-
timeout_(timeout),
|
|
428
|
-
interested_parties_(interested_parties),
|
|
429
|
-
completed_(false),
|
|
430
|
-
resolver_(resolver),
|
|
431
|
-
aba_token_(aba_token),
|
|
432
|
-
pollset_set_(grpc_pollset_set_create()) {
|
|
433
|
-
GRPC_CLOSURE_INIT(&on_dns_lookup_done_, OnDnsLookupDone, this,
|
|
434
|
-
grpc_schedule_on_exec_ctx);
|
|
435
|
-
grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties_);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
grpc_pollset_set* pollset_set() { return pollset_set_; };
|
|
439
|
-
grpc_closure* on_dns_lookup_done() { return &on_dns_lookup_done_; };
|
|
440
|
-
const std::string& name() { return name_; }
|
|
441
|
-
const std::string& name_server() { return name_server_; }
|
|
442
|
-
const Duration& timeout() { return timeout_; }
|
|
443
|
-
|
|
444
|
-
private:
|
|
445
|
-
// Called by ares when lookup has completed or when cancelled. It is always
|
|
446
|
-
// called exactly once, and it triggers self-deletion.
|
|
447
|
-
static void OnDnsLookupDone(void* arg, grpc_error_handle error) {
|
|
448
|
-
AresRequest* r = static_cast<AresRequest*>(arg);
|
|
449
|
-
auto deleter = std::unique_ptr<AresRequest>(r);
|
|
450
|
-
{
|
|
451
|
-
MutexLock lock(&r->mu_);
|
|
452
|
-
grpc_pollset_set_del_pollset_set(r->pollset_set_,
|
|
453
|
-
r->interested_parties_);
|
|
454
|
-
if (r->completed_) {
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
r->completed_ = true;
|
|
458
|
-
}
|
|
459
|
-
r->OnComplete(error);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// the name to resolve
|
|
463
|
-
const std::string name_;
|
|
464
|
-
// the name server to query
|
|
465
|
-
const std::string name_server_;
|
|
466
|
-
// request-specific timeout
|
|
467
|
-
Duration timeout_;
|
|
468
|
-
// mutex to synchronize access to this object (but not to the ares_request
|
|
469
|
-
// object itself).
|
|
470
|
-
Mutex mu_;
|
|
471
|
-
// parties interested in our I/O
|
|
472
|
-
grpc_pollset_set* const interested_parties_;
|
|
473
|
-
// underlying cares_request that the query is performed on
|
|
474
|
-
std::unique_ptr<grpc_ares_request> grpc_ares_request_ ABSL_GUARDED_BY(mu_);
|
|
475
|
-
// Set when the callback is either cancelled or executed.
|
|
476
|
-
// It is not the subclasses' responsibility to set this flag.
|
|
477
|
-
bool completed_ ABSL_GUARDED_BY(mu_);
|
|
478
|
-
// Parent resolver that created this request
|
|
479
|
-
AresDNSResolver* resolver_;
|
|
480
|
-
// Unique token to help distinguish this request from others that may later
|
|
481
|
-
// be created in the same memory location.
|
|
482
|
-
intptr_t aba_token_;
|
|
483
|
-
// closure to call when the ares resolution request completes. Subclasses
|
|
484
|
-
// should use this as the ares callback in MakeRequestLocked()
|
|
485
|
-
grpc_closure on_dns_lookup_done_ ABSL_GUARDED_BY(mu_);
|
|
486
|
-
// locally owned pollset_set, required to support cancellation of requests
|
|
487
|
-
// while ares still needs a valid pollset_set. Subclasses should give this
|
|
488
|
-
// pollset to ares in MakeRequestLocked();
|
|
489
|
-
grpc_pollset_set* pollset_set_;
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
class AresHostnameRequest final : public AresRequest {
|
|
493
|
-
public:
|
|
494
|
-
AresHostnameRequest(
|
|
495
|
-
absl::string_view name, absl::string_view default_port,
|
|
496
|
-
absl::string_view name_server, Duration timeout,
|
|
497
|
-
grpc_pollset_set* interested_parties,
|
|
498
|
-
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
499
|
-
on_resolve_address_done,
|
|
500
|
-
AresDNSResolver* resolver, intptr_t aba_token)
|
|
501
|
-
: AresRequest(name, name_server, timeout, interested_parties, resolver,
|
|
502
|
-
aba_token),
|
|
503
|
-
default_port_(default_port),
|
|
504
|
-
on_resolve_address_done_(std::move(on_resolve_address_done)) {
|
|
505
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
506
|
-
<< "(c-ares resolver) AresHostnameRequest:" << this << " ctor";
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
std::unique_ptr<grpc_ares_request> MakeRequestLocked() override {
|
|
510
|
-
auto ares_request =
|
|
511
|
-
std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_hostname_ares(
|
|
512
|
-
name_server().c_str(), name().c_str(), default_port_.c_str(),
|
|
513
|
-
pollset_set(), on_dns_lookup_done(), &addresses_,
|
|
514
|
-
timeout().millis()));
|
|
515
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
516
|
-
<< "(c-ares resolver) AresHostnameRequest:" << this
|
|
517
|
-
<< " Start ares_request_:" << ares_request.get();
|
|
518
|
-
return ares_request;
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
void OnComplete(grpc_error_handle error) override {
|
|
522
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
523
|
-
<< "(c-ares resolver) AresHostnameRequest:" << this << " OnComplete";
|
|
524
|
-
if (!error.ok()) {
|
|
525
|
-
on_resolve_address_done_(grpc_error_to_absl_status(error));
|
|
526
|
-
return;
|
|
527
|
-
}
|
|
528
|
-
std::vector<grpc_resolved_address> resolved_addresses;
|
|
529
|
-
if (addresses_ != nullptr) {
|
|
530
|
-
resolved_addresses.reserve(addresses_->size());
|
|
531
|
-
for (const auto& server_address : *addresses_) {
|
|
532
|
-
resolved_addresses.push_back(server_address.address());
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
on_resolve_address_done_(std::move(resolved_addresses));
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
// the default port to use if name doesn't have one
|
|
539
|
-
const std::string default_port_;
|
|
540
|
-
// user-provided completion callback
|
|
541
|
-
const std::function<void(
|
|
542
|
-
absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
543
|
-
on_resolve_address_done_;
|
|
544
|
-
// currently resolving addresses
|
|
545
|
-
std::unique_ptr<EndpointAddressesList> addresses_;
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
class AresSRVRequest final : public AresRequest {
|
|
549
|
-
public:
|
|
550
|
-
AresSRVRequest(
|
|
551
|
-
absl::string_view name, absl::string_view name_server, Duration timeout,
|
|
552
|
-
grpc_pollset_set* interested_parties,
|
|
553
|
-
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
554
|
-
on_resolve_address_done,
|
|
555
|
-
AresDNSResolver* resolver, intptr_t aba_token)
|
|
556
|
-
: AresRequest(name, name_server, timeout, interested_parties, resolver,
|
|
557
|
-
aba_token),
|
|
558
|
-
on_resolve_address_done_(std::move(on_resolve_address_done)) {
|
|
559
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
560
|
-
<< "(c-ares resolver) AresSRVRequest:" << this << " ctor";
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
std::unique_ptr<grpc_ares_request> MakeRequestLocked() override {
|
|
564
|
-
auto ares_request =
|
|
565
|
-
std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_srv_ares(
|
|
566
|
-
name_server().c_str(), name().c_str(), pollset_set(),
|
|
567
|
-
on_dns_lookup_done(), &balancer_addresses_, timeout().millis()));
|
|
568
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
569
|
-
<< "(c-ares resolver) AresSRVRequest:" << this
|
|
570
|
-
<< " Start ares_request_:" << ares_request.get();
|
|
571
|
-
return ares_request;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
void OnComplete(grpc_error_handle error) override {
|
|
575
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
576
|
-
<< "(c-ares resolver) AresSRVRequest:" << this << " OnComplete";
|
|
577
|
-
if (!error.ok()) {
|
|
578
|
-
on_resolve_address_done_(grpc_error_to_absl_status(error));
|
|
579
|
-
return;
|
|
580
|
-
}
|
|
581
|
-
std::vector<grpc_resolved_address> resolved_addresses;
|
|
582
|
-
if (balancer_addresses_ != nullptr) {
|
|
583
|
-
resolved_addresses.reserve(balancer_addresses_->size());
|
|
584
|
-
for (const auto& server_address : *balancer_addresses_) {
|
|
585
|
-
resolved_addresses.push_back(server_address.address());
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
on_resolve_address_done_(std::move(resolved_addresses));
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
// user-provided completion callback
|
|
592
|
-
const std::function<void(
|
|
593
|
-
absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
594
|
-
on_resolve_address_done_;
|
|
595
|
-
// currently resolving addresses
|
|
596
|
-
std::unique_ptr<EndpointAddressesList> balancer_addresses_;
|
|
597
|
-
};
|
|
598
|
-
|
|
599
|
-
class AresTXTRequest final : public AresRequest {
|
|
600
|
-
public:
|
|
601
|
-
AresTXTRequest(absl::string_view name, absl::string_view name_server,
|
|
602
|
-
Duration timeout, grpc_pollset_set* interested_parties,
|
|
603
|
-
std::function<void(absl::StatusOr<std::string>)> on_resolved,
|
|
604
|
-
AresDNSResolver* resolver, intptr_t aba_token)
|
|
605
|
-
: AresRequest(name, name_server, timeout, interested_parties, resolver,
|
|
606
|
-
aba_token),
|
|
607
|
-
on_resolved_(std::move(on_resolved)) {
|
|
608
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
609
|
-
<< "(c-ares resolver) AresTXTRequest:" << this << " ctor";
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
~AresTXTRequest() override { gpr_free(service_config_json_); }
|
|
613
|
-
|
|
614
|
-
std::unique_ptr<grpc_ares_request> MakeRequestLocked() override {
|
|
615
|
-
auto ares_request =
|
|
616
|
-
std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_txt_ares(
|
|
617
|
-
name_server().c_str(), name().c_str(), pollset_set(),
|
|
618
|
-
on_dns_lookup_done(), &service_config_json_, timeout().millis()));
|
|
619
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
620
|
-
<< "(c-ares resolver) AresSRVRequest:" << this
|
|
621
|
-
<< " Start ares_request_:" << ares_request.get();
|
|
622
|
-
return ares_request;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
void OnComplete(grpc_error_handle error) override {
|
|
626
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
627
|
-
<< "(c-ares resolver) AresSRVRequest:" << this << " OnComplete";
|
|
628
|
-
if (!error.ok()) {
|
|
629
|
-
on_resolved_(grpc_error_to_absl_status(error));
|
|
630
|
-
return;
|
|
631
|
-
}
|
|
632
|
-
on_resolved_(service_config_json_);
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
// service config from the TXT record
|
|
636
|
-
char* service_config_json_ = nullptr;
|
|
637
|
-
// user-provided completion callback
|
|
638
|
-
const std::function<void(absl::StatusOr<std::string>)> on_resolved_;
|
|
639
|
-
};
|
|
640
|
-
|
|
641
|
-
TaskHandle LookupHostname(
|
|
642
|
-
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
643
|
-
on_resolved,
|
|
644
|
-
absl::string_view name, absl::string_view default_port, Duration timeout,
|
|
645
|
-
grpc_pollset_set* interested_parties,
|
|
646
|
-
absl::string_view name_server) override {
|
|
647
|
-
MutexLock lock(&mu_);
|
|
648
|
-
auto* request = new AresHostnameRequest(
|
|
649
|
-
name, default_port, name_server, timeout, interested_parties,
|
|
650
|
-
std::move(on_resolved), this, aba_token_++);
|
|
651
|
-
request->Run();
|
|
652
|
-
auto handle = request->task_handle();
|
|
653
|
-
open_requests_.insert(handle);
|
|
654
|
-
return handle;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
absl::StatusOr<std::vector<grpc_resolved_address>> LookupHostnameBlocking(
|
|
658
|
-
absl::string_view name, absl::string_view default_port) override {
|
|
659
|
-
// TODO(apolcyn): change this to wrap the async version of the c-ares
|
|
660
|
-
// API with a promise, and remove the reference to the previous resolver.
|
|
661
|
-
return default_resolver_->LookupHostnameBlocking(name, default_port);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
TaskHandle LookupSRV(
|
|
665
|
-
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
|
|
666
|
-
on_resolved,
|
|
667
|
-
absl::string_view name, Duration timeout,
|
|
668
|
-
grpc_pollset_set* interested_parties,
|
|
669
|
-
absl::string_view name_server) override {
|
|
670
|
-
MutexLock lock(&mu_);
|
|
671
|
-
auto* request =
|
|
672
|
-
new AresSRVRequest(name, name_server, timeout, interested_parties,
|
|
673
|
-
std::move(on_resolved), this, aba_token_++);
|
|
674
|
-
request->Run();
|
|
675
|
-
auto handle = request->task_handle();
|
|
676
|
-
open_requests_.insert(handle);
|
|
677
|
-
return handle;
|
|
678
|
-
};
|
|
679
|
-
|
|
680
|
-
TaskHandle LookupTXT(
|
|
681
|
-
std::function<void(absl::StatusOr<std::string>)> on_resolved,
|
|
682
|
-
absl::string_view name, Duration timeout,
|
|
683
|
-
grpc_pollset_set* interested_parties,
|
|
684
|
-
absl::string_view name_server) override {
|
|
685
|
-
MutexLock lock(&mu_);
|
|
686
|
-
auto* request =
|
|
687
|
-
new AresTXTRequest(name, name_server, timeout, interested_parties,
|
|
688
|
-
std::move(on_resolved), this, aba_token_++);
|
|
689
|
-
request->Run();
|
|
690
|
-
auto handle = request->task_handle();
|
|
691
|
-
open_requests_.insert(handle);
|
|
692
|
-
return handle;
|
|
693
|
-
};
|
|
694
|
-
|
|
695
|
-
bool Cancel(TaskHandle handle) override {
|
|
696
|
-
MutexLock lock(&mu_);
|
|
697
|
-
if (!open_requests_.contains(handle)) {
|
|
698
|
-
// Unknown request, possibly completed already, or an invalid handle.
|
|
699
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
700
|
-
<< "(c-ares resolver) AresDNSResolver:" << this
|
|
701
|
-
<< " attempt to cancel unknown TaskHandle:" << HandleToString(handle);
|
|
702
|
-
return false;
|
|
703
|
-
}
|
|
704
|
-
auto* request = reinterpret_cast<AresRequest*>(handle.keys[0]);
|
|
705
|
-
GRPC_TRACE_VLOG(cares_resolver, 2)
|
|
706
|
-
<< "(c-ares resolver) AresDNSResolver:" << this
|
|
707
|
-
<< " cancel ares_request:" << request;
|
|
708
|
-
return request->Cancel();
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
private:
|
|
712
|
-
// Called exclusively from the AresRequest destructor.
|
|
713
|
-
void UnregisterRequest(TaskHandle handle) {
|
|
714
|
-
MutexLock lock(&mu_);
|
|
715
|
-
open_requests_.erase(handle);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
// the previous default DNS resolver, used to delegate blocking DNS calls to
|
|
719
|
-
std::shared_ptr<DNSResolver> default_resolver_ = GetDNSResolver();
|
|
720
|
-
Mutex mu_;
|
|
721
|
-
TaskHandleSet open_requests_ ABSL_GUARDED_BY(mu_);
|
|
722
|
-
intptr_t aba_token_ ABSL_GUARDED_BY(mu_) = 0;
|
|
723
|
-
};
|
|
724
|
-
|
|
725
|
-
} // namespace
|
|
726
|
-
|
|
727
|
-
bool ShouldUseAresDnsResolver(absl::string_view resolver_env) {
|
|
728
|
-
return resolver_env.empty() || absl::EqualsIgnoreCase(resolver_env, "ares");
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
void RegisterAresDnsResolver(CoreConfiguration::Builder* builder) {
|
|
732
|
-
builder->resolver_registry()->RegisterResolverFactory(
|
|
733
|
-
std::make_unique<AresClientChannelDNSResolverFactory>());
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
} // namespace grpc_core
|
|
737
|
-
|
|
738
|
-
void grpc_resolver_dns_ares_init() {
|
|
739
|
-
if (grpc_core::ShouldUseAresDnsResolver(
|
|
740
|
-
grpc_core::ConfigVars::Get().DnsResolver())) {
|
|
741
|
-
address_sorting_init();
|
|
742
|
-
grpc_error_handle error = grpc_ares_init();
|
|
743
|
-
if (!error.ok()) {
|
|
744
|
-
GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
|
|
745
|
-
return;
|
|
746
|
-
}
|
|
747
|
-
grpc_core::ResetDNSResolver(std::make_unique<grpc_core::AresDNSResolver>());
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
void grpc_resolver_dns_ares_shutdown() {
|
|
752
|
-
if (grpc_core::ShouldUseAresDnsResolver(
|
|
753
|
-
grpc_core::ConfigVars::Get().DnsResolver())) {
|
|
754
|
-
address_sorting_shutdown();
|
|
755
|
-
grpc_ares_cleanup();
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
void grpc_resolver_dns_ares_reset_dns_resolver() {
|
|
760
|
-
if (grpc_core::ShouldUseAresDnsResolver(
|
|
761
|
-
grpc_core::ConfigVars::Get().DnsResolver())) {
|
|
762
|
-
grpc_core::ResetDNSResolver(std::make_unique<grpc_core::AresDNSResolver>());
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
#else // GRPC_ARES == 1
|
|
767
|
-
|
|
768
|
-
namespace grpc_core {
|
|
769
|
-
bool ShouldUseAresDnsResolver(absl::string_view /* resolver_env */) {
|
|
770
|
-
return false;
|
|
771
|
-
}
|
|
772
|
-
void RegisterAresDnsResolver(CoreConfiguration::Builder*) {}
|
|
773
|
-
} // namespace grpc_core
|
|
774
|
-
|
|
775
|
-
void grpc_resolver_dns_ares_init() {}
|
|
776
|
-
|
|
777
|
-
void grpc_resolver_dns_ares_shutdown() {}
|
|
778
|
-
|
|
779
|
-
void grpc_resolver_dns_ares_reset_dns_resolver() {}
|
|
780
|
-
|
|
781
|
-
#endif // GRPC_ARES == 1
|