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.
Files changed (322) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +21 -17
  3. data/include/grpc/credentials.h +10 -0
  4. data/include/grpc/grpc_security_constants.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +9 -0
  6. data/src/core/call/call_filters.h +4 -2
  7. data/src/core/call/client_call.cc +20 -8
  8. data/src/core/call/client_call.h +4 -0
  9. data/src/core/call/interception_chain.cc +2 -0
  10. data/src/core/call/interception_chain.h +14 -1
  11. data/src/core/call/metadata.cc +1 -3
  12. data/src/core/call/metadata_batch.h +13 -5
  13. data/src/core/call/server_call.cc +31 -14
  14. data/src/core/call/server_call.h +4 -0
  15. data/src/core/channelz/text_encode.cc +9 -4
  16. data/src/core/channelz/v2tov1/convert.cc +2 -2
  17. data/src/core/client_channel/backup_poller.cc +1 -2
  18. data/src/core/client_channel/client_channel.cc +6 -33
  19. data/src/core/client_channel/client_channel_filter.cc +22 -55
  20. data/src/core/client_channel/client_channel_filter.h +2 -2
  21. data/src/core/client_channel/client_channel_service_config.cc +3 -19
  22. data/src/core/client_channel/direct_channel.cc +7 -1
  23. data/src/core/client_channel/direct_channel.h +2 -2
  24. data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
  25. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
  26. data/src/core/client_channel/subchannel.cc +310 -1058
  27. data/src/core/client_channel/subchannel.h +44 -329
  28. data/src/core/client_channel/subchannel_metrics.cc +48 -0
  29. data/src/core/client_channel/subchannel_metrics.h +60 -0
  30. data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
  31. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
  32. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
  33. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
  34. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
  35. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
  36. data/src/core/credentials/call/json_util.h +1 -0
  37. data/src/core/credentials/call/jwt/json_token.cc +10 -2
  38. data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
  39. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
  40. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
  41. data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
  42. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
  43. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
  44. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
  45. data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
  46. data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
  47. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
  48. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
  49. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
  50. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
  51. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
  52. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
  53. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
  54. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
  55. data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
  56. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
  57. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
  58. data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
  59. data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
  60. data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
  61. data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
  62. data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
  63. data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
  64. data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
  65. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
  67. data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
  68. data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
  69. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  70. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  71. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
  74. data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
  75. data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
  76. data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
  77. data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
  78. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
  79. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  80. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
  81. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
  82. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
  83. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
  84. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
  85. data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
  86. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
  87. data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
  88. data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
  92. data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
  93. data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
  94. data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
  95. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
  97. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
  98. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
  103. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
  104. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
  105. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
  106. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
  107. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
  108. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
  109. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
  110. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
  111. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
  112. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
  113. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
  114. data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
  115. data/src/core/filter/auth/server_auth_filter.cc +2 -3
  116. data/src/core/filter/composite/composite_filter.cc +45 -33
  117. data/src/core/filter/composite/composite_filter.h +5 -4
  118. data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
  119. data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
  120. data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
  121. data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
  122. data/src/core/filter/filter_args.h +13 -2
  123. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
  124. data/src/core/handshaker/security/security_handshaker.cc +9 -6
  125. data/src/core/lib/channel/channel_stack.cc +3 -0
  126. data/src/core/lib/channel/channel_stack.h +2 -0
  127. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
  128. data/src/core/lib/channel/promise_based_filter.cc +132 -20
  129. data/src/core/lib/channel/promise_based_filter.h +42 -12
  130. data/src/core/lib/compression/compression_internal.cc +4 -5
  131. data/src/core/lib/debug/trace_flags.cc +8 -0
  132. data/src/core/lib/debug/trace_flags.h +3 -0
  133. data/src/core/lib/event_engine/ares_resolver.cc +54 -50
  134. data/src/core/lib/event_engine/ares_resolver.h +3 -2
  135. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
  136. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
  137. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
  138. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
  139. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
  140. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
  141. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
  142. data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
  143. data/src/core/lib/experiments/experiments.cc +60 -96
  144. data/src/core/lib/experiments/experiments.h +34 -50
  145. data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
  146. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
  147. data/src/core/lib/iomgr/error.cc +2 -6
  148. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  149. data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
  150. data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
  151. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
  152. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
  153. data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
  154. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
  155. data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
  156. data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
  157. data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
  158. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  159. data/src/core/lib/iomgr/systemd_utils.cc +0 -1
  160. data/src/core/lib/iomgr/tcp_client.h +1 -1
  161. data/src/core/lib/iomgr/tcp_posix.cc +23 -15
  162. data/src/core/lib/iomgr/tcp_server.h +1 -1
  163. data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
  164. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
  165. data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
  166. data/src/core/lib/iomgr/tcp_windows.cc +5 -10
  167. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  168. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  169. data/src/core/lib/iomgr/vsock.h +3 -1
  170. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  171. data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
  172. data/src/core/lib/security/authorization/rbac_policy.h +21 -3
  173. data/src/core/lib/surface/call.cc +3 -9
  174. data/src/core/lib/surface/call_utils.h +113 -0
  175. data/src/core/lib/surface/channel_create.cc +1 -1
  176. data/src/core/lib/surface/channel_create.h +0 -2
  177. data/src/core/lib/surface/channel_init.cc +77 -38
  178. data/src/core/lib/surface/channel_init.h +30 -16
  179. data/src/core/lib/surface/filter_stack_call.cc +5 -10
  180. data/src/core/lib/surface/init.cc +13 -27
  181. data/src/core/lib/surface/version.cc +1 -1
  182. data/src/core/lib/transport/error_utils.cc +0 -27
  183. data/src/core/lib/transport/error_utils.h +0 -16
  184. data/src/core/lib/transport/transport.h +7 -5
  185. data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
  186. data/src/core/load_balancing/rls/rls.cc +28 -11
  187. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
  188. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
  189. data/src/core/load_balancing/xds/cds.cc +3 -1
  190. data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
  191. data/src/core/mitigation_engine/mitigation.h +14 -5
  192. data/src/core/mitigation_engine/mitigation_engine.h +7 -3
  193. data/src/core/mitigation_engine/mitigation_provider.h +2 -1
  194. data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
  195. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
  196. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
  197. data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
  198. data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
  199. data/src/core/resolver/endpoint_addresses.h +3 -0
  200. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
  201. data/src/core/resolver/xds/xds_resolver.cc +35 -9
  202. data/src/core/server/server.cc +2 -6
  203. data/src/core/server/server_config_selector.h +18 -3
  204. data/src/core/server/server_config_selector_filter.cc +178 -91
  205. data/src/core/server/server_config_selector_filter.h +58 -3
  206. data/src/core/server/xds_server_config_fetcher.cc +196 -129
  207. data/src/core/server/xds_server_config_fetcher.h +49 -0
  208. data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
  209. data/src/core/telemetry/histogram.h +94 -14
  210. data/src/core/telemetry/instrument.cc +179 -74
  211. data/src/core/telemetry/instrument.h +78 -30
  212. data/src/core/telemetry/metrics.h +5 -0
  213. data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
  214. data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
  215. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  216. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
  217. data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
  218. data/src/core/tsi/ssl_telemetry_utils.h +12 -2
  219. data/src/core/tsi/ssl_transport_security.cc +238 -80
  220. data/src/core/tsi/ssl_transport_security.h +63 -33
  221. data/src/core/tsi/tls_telemetry.cc +31 -0
  222. data/src/core/tsi/tls_telemetry.h +47 -0
  223. data/src/core/tsi/transport_security.cc +2 -2
  224. data/src/core/tsi/transport_security.h +1 -1
  225. data/src/core/tsi/transport_security_interface.h +1 -1
  226. data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
  227. data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
  228. data/src/core/util/http_client/httpcli.cc +16 -53
  229. data/src/core/util/http_client/httpcli.h +0 -7
  230. data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
  231. data/src/core/util/linux/cpu.cc +1 -1
  232. data/src/core/util/load_file.cc +3 -9
  233. data/src/core/util/load_file.h +3 -4
  234. data/src/core/util/matchers.h +8 -0
  235. data/src/core/util/posix/cpu.cc +1 -1
  236. data/src/core/util/status_helper.cc +0 -20
  237. data/src/core/util/status_helper.h +3 -14
  238. data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
  239. data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
  240. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
  241. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
  242. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
  243. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
  244. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
  245. data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
  246. data/src/core/xds/grpc/xds_client_grpc.h +0 -4
  247. data/src/core/xds/grpc/xds_cluster.h +1 -0
  248. data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
  249. data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
  250. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
  251. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
  252. data/src/core/xds/grpc/xds_common_types.cc +0 -91
  253. data/src/core/xds/grpc/xds_common_types.h +1 -47
  254. data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
  255. data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
  256. data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
  257. data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
  258. data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
  259. data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
  260. data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
  261. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
  262. data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
  263. data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
  264. data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
  265. data/src/core/xds/grpc/xds_http_filter.cc +2 -1
  266. data/src/core/xds/grpc/xds_http_filter.h +6 -5
  267. data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
  268. data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
  269. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
  270. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
  271. data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
  272. data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
  273. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
  274. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
  275. data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
  276. data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
  277. data/src/core/xds/grpc/xds_listener.cc +2 -0
  278. data/src/core/xds/grpc/xds_listener.h +5 -0
  279. data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
  280. data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
  281. data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
  282. data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
  283. data/src/core/xds/grpc/xds_route_config.cc +2 -0
  284. data/src/core/xds/grpc/xds_route_config.h +3 -1
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
  286. data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
  287. data/src/core/xds/grpc/xds_routing.cc +116 -69
  288. data/src/core/xds/grpc/xds_routing.h +19 -8
  289. data/src/core/xds/grpc/xds_tls_context.cc +117 -0
  290. data/src/core/xds/grpc/xds_tls_context.h +76 -0
  291. data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
  292. data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
  293. data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
  294. data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
  295. data/src/ruby/ext/grpc/rb_call.c +26 -15
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
  297. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  298. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  299. data/src/ruby/lib/grpc/version.rb +1 -1
  300. data/src/ruby/pb/test/client.rb +5 -4
  301. data/src/ruby/spec/call_spec.rb +14 -0
  302. data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
  303. metadata +50 -35
  304. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
  305. data/src/core/lib/iomgr/resolve_address.cc +0 -59
  306. data/src/core/lib/iomgr/resolve_address.h +0 -125
  307. data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
  308. data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
  309. data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
  310. data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
  311. data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
  312. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
  313. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
  314. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
  315. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
  316. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
  317. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
  318. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
  319. data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
  320. data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
  321. data/src/core/util/json/json_util.cc +0 -101
  322. 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