grpc 1.43.1 → 1.44.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2015 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
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
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -37,9 +35,6 @@
37
35
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
38
36
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
39
37
  #include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
40
- #include "src/core/ext/filters/client_channel/resolver_registry.h"
41
- #include "src/core/ext/filters/client_channel/server_address.h"
42
- #include "src/core/ext/service_config/service_config.h"
43
38
  #include "src/core/lib/backoff/backoff.h"
44
39
  #include "src/core/lib/channel/channel_args.h"
45
40
  #include "src/core/lib/gpr/string.h"
@@ -50,6 +45,10 @@
50
45
  #include "src/core/lib/iomgr/timer.h"
51
46
  #include "src/core/lib/iomgr/work_serializer.h"
52
47
  #include "src/core/lib/json/json.h"
48
+ #include "src/core/lib/resolver/resolver_registry.h"
49
+ #include "src/core/lib/resolver/server_address.h"
50
+ #include "src/core/lib/service_config/service_config.h"
51
+ #include "src/core/lib/transport/error_utils.h"
53
52
 
54
53
  #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
55
54
  #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
@@ -60,9 +59,9 @@ namespace grpc_core {
60
59
 
61
60
  namespace {
62
61
 
63
- class AresDnsResolver : public Resolver {
62
+ class AresClientChannelDNSResolver : public Resolver {
64
63
  public:
65
- explicit AresDnsResolver(ResolverArgs args);
64
+ explicit AresClientChannelDNSResolver(ResolverArgs args);
66
65
 
67
66
  void StartLocked() override;
68
67
 
@@ -73,7 +72,7 @@ class AresDnsResolver : public Resolver {
73
72
  void ShutdownLocked() override;
74
73
 
75
74
  private:
76
- ~AresDnsResolver() override;
75
+ ~AresClientChannelDNSResolver() override;
77
76
 
78
77
  void MaybeStartResolvingLocked();
79
78
  void StartResolvingLocked();
@@ -127,7 +126,7 @@ class AresDnsResolver : public Resolver {
127
126
  bool shutdown_initiated_ = false;
128
127
  };
129
128
 
130
- AresDnsResolver::AresDnsResolver(ResolverArgs args)
129
+ AresClientChannelDNSResolver::AresClientChannelDNSResolver(ResolverArgs args)
131
130
  : dns_server_(args.uri.authority()),
132
131
  name_to_resolve_(absl::StripPrefix(args.uri.path(), "/")),
133
132
  channel_args_(grpc_channel_args_copy(args.args)),
@@ -157,48 +156,53 @@ AresDnsResolver::AresDnsResolver(ResolverArgs args)
157
156
  GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx);
158
157
  }
159
158
 
160
- AresDnsResolver::~AresDnsResolver() {
161
- GRPC_CARES_TRACE_LOG("resolver:%p destroying AresDnsResolver", this);
159
+ AresClientChannelDNSResolver::~AresClientChannelDNSResolver() {
160
+ GRPC_CARES_TRACE_LOG("resolver:%p destroying AresClientChannelDNSResolver",
161
+ this);
162
162
  grpc_channel_args_destroy(channel_args_);
163
163
  }
164
164
 
165
- void AresDnsResolver::StartLocked() {
166
- GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::StartLocked() is called.",
167
- this);
165
+ void AresClientChannelDNSResolver::StartLocked() {
166
+ GRPC_CARES_TRACE_LOG(
167
+ "resolver:%p AresClientChannelDNSResolver::StartLocked() is called.",
168
+ this);
168
169
  MaybeStartResolvingLocked();
169
170
  }
170
171
 
171
- void AresDnsResolver::RequestReresolutionLocked() {
172
+ void AresClientChannelDNSResolver::RequestReresolutionLocked() {
172
173
  if (!resolving_) {
173
174
  MaybeStartResolvingLocked();
174
175
  }
175
176
  }
176
177
 
177
- void AresDnsResolver::ResetBackoffLocked() {
178
+ void AresClientChannelDNSResolver::ResetBackoffLocked() {
178
179
  if (have_next_resolution_timer_) {
179
180
  grpc_timer_cancel(&next_resolution_timer_);
180
181
  }
181
182
  backoff_.Reset();
182
183
  }
183
184
 
184
- void AresDnsResolver::ShutdownLocked() {
185
+ void AresClientChannelDNSResolver::ShutdownLocked() {
185
186
  shutdown_initiated_ = true;
186
187
  if (have_next_resolution_timer_) {
187
188
  grpc_timer_cancel(&next_resolution_timer_);
188
189
  }
189
190
  if (pending_request_ != nullptr) {
190
- grpc_cancel_ares_request_locked(pending_request_);
191
+ grpc_cancel_ares_request(pending_request_);
191
192
  }
192
193
  }
193
194
 
194
- void AresDnsResolver::OnNextResolution(void* arg, grpc_error_handle error) {
195
- AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
195
+ void AresClientChannelDNSResolver::OnNextResolution(void* arg,
196
+ grpc_error_handle error) {
197
+ AresClientChannelDNSResolver* r =
198
+ static_cast<AresClientChannelDNSResolver*>(arg);
196
199
  (void)GRPC_ERROR_REF(error); // ref owned by lambda
197
200
  r->work_serializer_->Run([r, error]() { r->OnNextResolutionLocked(error); },
198
201
  DEBUG_LOCATION);
199
202
  }
200
203
 
201
- void AresDnsResolver::OnNextResolutionLocked(grpc_error_handle error) {
204
+ void AresClientChannelDNSResolver::OnNextResolutionLocked(
205
+ grpc_error_handle error) {
202
206
  GRPC_CARES_TRACE_LOG(
203
207
  "resolver:%p re-resolution timer fired. error: %s. shutdown_initiated_: "
204
208
  "%d",
@@ -303,14 +307,16 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
303
307
  return service_config->Dump();
304
308
  }
305
309
 
306
- void AresDnsResolver::OnResolved(void* arg, grpc_error_handle error) {
307
- AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
310
+ void AresClientChannelDNSResolver::OnResolved(void* arg,
311
+ grpc_error_handle error) {
312
+ AresClientChannelDNSResolver* r =
313
+ static_cast<AresClientChannelDNSResolver*>(arg);
308
314
  (void)GRPC_ERROR_REF(error); // ref owned by lambda
309
315
  r->work_serializer_->Run([r, error]() { r->OnResolvedLocked(error); },
310
316
  DEBUG_LOCATION);
311
317
  }
312
318
 
313
- void AresDnsResolver::OnResolvedLocked(grpc_error_handle error) {
319
+ void AresClientChannelDNSResolver::OnResolvedLocked(grpc_error_handle error) {
314
320
  GPR_ASSERT(resolving_);
315
321
  resolving_ = false;
316
322
  delete pending_request_;
@@ -320,21 +326,35 @@ void AresDnsResolver::OnResolvedLocked(grpc_error_handle error) {
320
326
  GRPC_ERROR_UNREF(error);
321
327
  return;
322
328
  }
329
+ // TODO(roth): Change logic to be able to report failures for addresses
330
+ // and service config independently of each other.
323
331
  if (addresses_ != nullptr || balancer_addresses_ != nullptr) {
324
332
  Result result;
325
333
  if (addresses_ != nullptr) {
326
334
  result.addresses = std::move(*addresses_);
335
+ } else {
336
+ result.addresses = ServerAddressList();
327
337
  }
328
338
  if (service_config_json_ != nullptr) {
329
- std::string service_config_string = ChooseServiceConfig(
330
- service_config_json_, &result.service_config_error);
339
+ grpc_error_handle service_config_error = GRPC_ERROR_NONE;
340
+ std::string service_config_string =
341
+ ChooseServiceConfig(service_config_json_, &service_config_error);
331
342
  gpr_free(service_config_json_);
332
- if (result.service_config_error == GRPC_ERROR_NONE &&
343
+ RefCountedPtr<ServiceConfig> service_config;
344
+ if (service_config_error == GRPC_ERROR_NONE &&
333
345
  !service_config_string.empty()) {
334
346
  GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s",
335
347
  this, service_config_string.c_str());
336
- result.service_config = ServiceConfig::Create(
337
- channel_args_, service_config_string, &result.service_config_error);
348
+ service_config = ServiceConfig::Create(
349
+ channel_args_, service_config_string, &service_config_error);
350
+ }
351
+ if (service_config_error != GRPC_ERROR_NONE) {
352
+ result.service_config = absl::UnavailableError(
353
+ absl::StrCat("failed to parse service config: ",
354
+ grpc_error_std_string(service_config_error)));
355
+ GRPC_ERROR_UNREF(service_config_error);
356
+ } else {
357
+ result.service_config = std::move(service_config);
338
358
  }
339
359
  }
340
360
  absl::InlinedVector<grpc_arg, 1> new_args;
@@ -344,7 +364,7 @@ void AresDnsResolver::OnResolvedLocked(grpc_error_handle error) {
344
364
  }
345
365
  result.args = grpc_channel_args_copy_and_add(channel_args_, new_args.data(),
346
366
  new_args.size());
347
- result_handler_->ReturnResult(std::move(result));
367
+ result_handler_->ReportResult(std::move(result));
348
368
  addresses_.reset();
349
369
  balancer_addresses_.reset();
350
370
  // Reset backoff state so that we start from the beginning when the
@@ -353,12 +373,15 @@ void AresDnsResolver::OnResolvedLocked(grpc_error_handle error) {
353
373
  } else {
354
374
  GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", this,
355
375
  grpc_error_std_string(error).c_str());
356
- std::string error_message =
357
- absl::StrCat("DNS resolution failed for service: ", name_to_resolve_);
358
- result_handler_->ReturnError(grpc_error_set_int(
359
- GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(error_message.c_str(),
360
- &error, 1),
361
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
376
+ std::string error_message;
377
+ grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &error_message);
378
+ absl::Status status = absl::UnavailableError(absl::StrCat(
379
+ "DNS resolution failed for ", name_to_resolve_, ": ", error_message));
380
+ Result result;
381
+ result.addresses = status;
382
+ result.service_config = status;
383
+ result.args = grpc_channel_args_copy(channel_args_);
384
+ result_handler_->ReportResult(std::move(result));
362
385
  // Set retry timer.
363
386
  // InvalidateNow to avoid getting stuck re-initializing this timer
364
387
  // in a loop while draining the currently-held WorkSerializer.
@@ -386,7 +409,7 @@ void AresDnsResolver::OnResolvedLocked(grpc_error_handle error) {
386
409
  GRPC_ERROR_UNREF(error);
387
410
  }
388
411
 
389
- void AresDnsResolver::MaybeStartResolvingLocked() {
412
+ void AresClientChannelDNSResolver::MaybeStartResolvingLocked() {
390
413
  // If there is an existing timer, the time it fires is the earliest time we
391
414
  // can start the next resolution.
392
415
  if (have_next_resolution_timer_) return;
@@ -420,7 +443,7 @@ void AresDnsResolver::MaybeStartResolvingLocked() {
420
443
  StartResolvingLocked();
421
444
  }
422
445
 
423
- void AresDnsResolver::StartResolvingLocked() {
446
+ void AresClientChannelDNSResolver::StartResolvingLocked() {
424
447
  // TODO(roth): We currently deal with this ref manually. Once the
425
448
  // new closure API is done, find a way to track this ref with the timer
426
449
  // callback as part of the type system.
@@ -428,12 +451,12 @@ void AresDnsResolver::StartResolvingLocked() {
428
451
  GPR_ASSERT(!resolving_);
429
452
  resolving_ = true;
430
453
  service_config_json_ = nullptr;
431
- pending_request_ = grpc_dns_lookup_ares_locked(
454
+ pending_request_ = grpc_dns_lookup_ares(
432
455
  dns_server_.c_str(), name_to_resolve_.c_str(), kDefaultSecurePort,
433
456
  interested_parties_, &on_resolved_, &addresses_,
434
457
  enable_srv_queries_ ? &balancer_addresses_ : nullptr,
435
458
  request_service_config_ ? &service_config_json_ : nullptr,
436
- query_timeout_ms_, work_serializer_);
459
+ query_timeout_ms_);
437
460
  last_resolution_timestamp_ = ExecCtx::Get()->Now();
438
461
  GRPC_CARES_TRACE_LOG("resolver:%p Started resolving. pending_request_:%p",
439
462
  this, pending_request_);
@@ -442,8 +465,7 @@ void AresDnsResolver::StartResolvingLocked() {
442
465
  //
443
466
  // Factory
444
467
  //
445
-
446
- class AresDnsResolverFactory : public ResolverFactory {
468
+ class AresClientChannelDNSResolverFactory : public ResolverFactory {
447
469
  public:
448
470
  bool IsValidUri(const URI& uri) const override {
449
471
  if (absl::StripPrefix(uri.path(), "/").empty()) {
@@ -454,30 +476,133 @@ class AresDnsResolverFactory : public ResolverFactory {
454
476
  }
455
477
 
456
478
  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
457
- return MakeOrphanable<AresDnsResolver>(std::move(args));
479
+ return MakeOrphanable<AresClientChannelDNSResolver>(std::move(args));
458
480
  }
459
481
 
460
482
  const char* scheme() const override { return "dns"; }
461
483
  };
462
484
 
463
- } // namespace
485
+ class AresDNSResolver : public DNSResolver {
486
+ public:
487
+ class AresRequest : public DNSResolver::Request {
488
+ public:
489
+ AresRequest(
490
+ absl::string_view name, absl::string_view default_port,
491
+ grpc_pollset_set* interested_parties,
492
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
493
+ on_resolve_address_done)
494
+ : name_(std::string(name)),
495
+ default_port_(std::string(default_port)),
496
+ interested_parties_(interested_parties),
497
+ on_resolve_address_done_(std::move(on_resolve_address_done)) {
498
+ GRPC_CARES_TRACE_LOG("AresRequest:%p ctor", this);
499
+ GRPC_CLOSURE_INIT(&on_dns_lookup_done_, OnDnsLookupDone, this,
500
+ grpc_schedule_on_exec_ctx);
501
+ }
464
502
 
465
- } // namespace grpc_core
503
+ ~AresRequest() override {
504
+ GRPC_CARES_TRACE_LOG("AresRequest:%p dtor ares_request_:%p", this,
505
+ ares_request_.get());
506
+ }
466
507
 
467
- extern grpc_address_resolver_vtable* grpc_resolve_address_impl;
468
- static grpc_address_resolver_vtable* default_resolver;
508
+ void Start() override {
509
+ absl::MutexLock lock(&mu_);
510
+ Ref().release(); // ref held by resolution
511
+ ares_request_ = std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_ares(
512
+ "" /* dns_server */, name_.c_str(), default_port_.c_str(),
513
+ interested_parties_, &on_dns_lookup_done_, &addresses_,
514
+ nullptr /* balancer_addresses */, nullptr /* service_config_json */,
515
+ GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS));
516
+ GRPC_CARES_TRACE_LOG("AresRequest:%p Start ares_request_:%p", this,
517
+ ares_request_.get());
518
+ }
469
519
 
470
- static grpc_error_handle blocking_resolve_address_ares(
471
- const char* name, const char* default_port,
472
- grpc_resolved_addresses** addresses) {
473
- return default_resolver->blocking_resolve_address(name, default_port,
474
- addresses);
475
- }
520
+ void Orphan() override {
521
+ {
522
+ absl::MutexLock lock(&mu_);
523
+ GRPC_CARES_TRACE_LOG("AresRequest:%p Orphan ares_request_:%p", this,
524
+ ares_request_.get());
525
+ grpc_cancel_ares_request(ares_request_.get());
526
+ }
527
+ Unref();
528
+ }
529
+
530
+ private:
531
+ static void OnDnsLookupDone(void* arg, grpc_error_handle error) {
532
+ AresRequest* r = static_cast<AresRequest*>(arg);
533
+ std::vector<grpc_resolved_address> resolved_addresses;
534
+ {
535
+ absl::MutexLock lock(&r->mu_);
536
+ GRPC_CARES_TRACE_LOG("AresRequest:%p OnDnsLookupDone error:%s", r,
537
+ grpc_error_std_string(error).c_str());
538
+ if (r->addresses_ != nullptr) {
539
+ resolved_addresses.reserve(r->addresses_->size());
540
+ for (const auto& server_address : *r->addresses_) {
541
+ resolved_addresses.push_back(server_address.address());
542
+ }
543
+ }
544
+ }
545
+ if (error == GRPC_ERROR_NONE) {
546
+ // it's safe to run this inline since we've already been scheduled
547
+ // on the ExecCtx
548
+ r->on_resolve_address_done_(std::move(resolved_addresses));
549
+ } else {
550
+ r->on_resolve_address_done_(grpc_error_to_absl_status(error));
551
+ }
552
+ r->Unref();
553
+ }
554
+
555
+ // mutex to synchronize access to this object (but not to the ares_request
556
+ // object itself).
557
+ absl::Mutex mu_;
558
+ // the name to resolve
559
+ const std::string name_;
560
+ // the default port to use if name doesn't have one
561
+ const std::string default_port_;
562
+ // parties interested in our I/O
563
+ grpc_pollset_set* const interested_parties_;
564
+ // user-provided completion callback
565
+ const std::function<void(
566
+ absl::StatusOr<std::vector<grpc_resolved_address>>)>
567
+ on_resolve_address_done_;
568
+ // currently resolving addresses
569
+ std::unique_ptr<ServerAddressList> addresses_ ABSL_GUARDED_BY(mu_);
570
+ // closure to call when the resolve_address_ares request completes
571
+ // a closure wrapping on_resolve_address_done, which should be invoked
572
+ // when the grpc_dns_lookup_ares operation is done.
573
+ grpc_closure on_dns_lookup_done_ ABSL_GUARDED_BY(mu_);
574
+ // underlying ares_request that the query is performed on
575
+ std::unique_ptr<grpc_ares_request> ares_request_ ABSL_GUARDED_BY(mu_);
576
+ };
577
+
578
+ // gets the singleton instance, possibly creating it first
579
+ static AresDNSResolver* GetOrCreate() {
580
+ static AresDNSResolver* instance = new AresDNSResolver();
581
+ return instance;
582
+ }
583
+
584
+ OrphanablePtr<DNSResolver::Request> ResolveName(
585
+ absl::string_view name, absl::string_view default_port,
586
+ grpc_pollset_set* interested_parties,
587
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
588
+ on_done) override {
589
+ return MakeOrphanable<AresRequest>(name, default_port, interested_parties,
590
+ std::move(on_done));
591
+ }
592
+
593
+ absl::StatusOr<std::vector<grpc_resolved_address>> ResolveNameBlocking(
594
+ absl::string_view name, absl::string_view default_port) override {
595
+ // TODO(apolcyn): change this to wrap the async version of the c-ares
596
+ // API with a promise, and remove the reference to the previous resolver.
597
+ return default_resolver_->ResolveNameBlocking(name, default_port);
598
+ }
476
599
 
477
- static grpc_address_resolver_vtable ares_resolver = {
478
- grpc_resolve_address_ares, blocking_resolve_address_ares};
600
+ private:
601
+ // the previous default DNS resolver, used to delegate blocking DNS calls to
602
+ DNSResolver* default_resolver_ = GetDNSResolver();
603
+ };
479
604
 
480
- static bool should_use_ares(const char* resolver_env) {
605
+ bool ShouldUseAres(const char* resolver_env) {
481
606
  // TODO(lidiz): Remove the "g_custom_iomgr_enabled" flag once c-ares support
482
607
  // custom IO managers (e.g. gevent).
483
608
  return !g_custom_iomgr_enabled &&
@@ -485,13 +610,17 @@ static bool should_use_ares(const char* resolver_env) {
485
610
  gpr_stricmp(resolver_env, "ares") == 0);
486
611
  }
487
612
 
488
- static bool g_use_ares_dns_resolver;
613
+ bool g_use_ares_dns_resolver;
614
+
615
+ } // namespace
616
+
617
+ } // namespace grpc_core
489
618
 
490
619
  void grpc_resolver_dns_ares_init() {
491
620
  grpc_core::UniquePtr<char> resolver =
492
621
  GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
493
- if (should_use_ares(resolver.get())) {
494
- g_use_ares_dns_resolver = true;
622
+ if (grpc_core::ShouldUseAres(resolver.get())) {
623
+ grpc_core::g_use_ares_dns_resolver = true;
495
624
  gpr_log(GPR_DEBUG, "Using ares dns resolver");
496
625
  address_sorting_init();
497
626
  grpc_error_handle error = grpc_ares_init();
@@ -499,19 +628,16 @@ void grpc_resolver_dns_ares_init() {
499
628
  GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
500
629
  return;
501
630
  }
502
- if (default_resolver == nullptr) {
503
- default_resolver = grpc_resolve_address_impl;
504
- }
505
- grpc_set_resolver_impl(&ares_resolver);
631
+ grpc_core::SetDNSResolver(grpc_core::AresDNSResolver::GetOrCreate());
506
632
  grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
507
- absl::make_unique<grpc_core::AresDnsResolverFactory>());
633
+ absl::make_unique<grpc_core::AresClientChannelDNSResolverFactory>());
508
634
  } else {
509
- g_use_ares_dns_resolver = false;
635
+ grpc_core::g_use_ares_dns_resolver = false;
510
636
  }
511
637
  }
512
638
 
513
639
  void grpc_resolver_dns_ares_shutdown() {
514
- if (g_use_ares_dns_resolver) {
640
+ if (grpc_core::g_use_ares_dns_resolver) {
515
641
  address_sorting_shutdown();
516
642
  grpc_ares_cleanup();
517
643
  }
@@ -23,8 +23,8 @@
23
23
 
24
24
  #include <ares.h>
25
25
 
26
+ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
26
27
  #include "src/core/lib/iomgr/pollset_set.h"
27
- #include "src/core/lib/iomgr/work_serializer.h"
28
28
 
29
29
  namespace grpc_core {
30
30
 
@@ -36,18 +36,23 @@ class GrpcPolledFd {
36
36
  public:
37
37
  virtual ~GrpcPolledFd() {}
38
38
  /* Called when c-ares library is interested and there's no pending callback */
39
- virtual void RegisterForOnReadableLocked(grpc_closure* read_closure) = 0;
39
+ virtual void RegisterForOnReadableLocked(grpc_closure* read_closure)
40
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
40
41
  /* Called when c-ares library is interested and there's no pending callback */
41
- virtual void RegisterForOnWriteableLocked(grpc_closure* write_closure) = 0;
42
+ virtual void RegisterForOnWriteableLocked(grpc_closure* write_closure)
43
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
42
44
  /* Indicates if there is data left even after just being read from */
43
- virtual bool IsFdStillReadableLocked() = 0;
45
+ virtual bool IsFdStillReadableLocked()
46
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
44
47
  /* Called once and only once. Must cause cancellation of any pending
45
48
  * read/write callbacks. */
46
- virtual void ShutdownLocked(grpc_error_handle error) = 0;
49
+ virtual void ShutdownLocked(grpc_error_handle error)
50
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
47
51
  /* Get the underlying ares_socket_t that this was created from */
48
- virtual ares_socket_t GetWrappedAresSocketLocked() = 0;
52
+ virtual ares_socket_t GetWrappedAresSocketLocked()
53
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
49
54
  /* A unique name, for logging */
50
- virtual const char* GetName() = 0;
55
+ virtual const char* GetName() const = 0;
51
56
  };
52
57
 
53
58
  /* A GrpcPolledFdFactory is 1-to-1 with and owned by the
@@ -59,14 +64,19 @@ class GrpcPolledFdFactory {
59
64
  virtual ~GrpcPolledFdFactory() {}
60
65
  /* Creates a new wrapped fd for the current platform */
61
66
  virtual GrpcPolledFd* NewGrpcPolledFdLocked(
62
- ares_socket_t as, grpc_pollset_set* driver_pollset_set,
63
- std::shared_ptr<WorkSerializer> work_serializer) = 0;
67
+ ares_socket_t as, grpc_pollset_set* driver_pollset_set)
68
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
64
69
  /* Optionally configures the ares channel after creation */
65
- virtual void ConfigureAresChannelLocked(ares_channel channel) = 0;
70
+ virtual void ConfigureAresChannelLocked(ares_channel channel)
71
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) = 0;
66
72
  };
67
73
 
68
- std::unique_ptr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(
69
- std::shared_ptr<WorkSerializer> work_serializer);
74
+ /* Creates a new polled fd factory.
75
+ * Note that even though ownership of mu is not transferred, the mu
76
+ * parameter is guaranteed to be alive for the the whole lifetime of
77
+ * the resulting GrpcPolledFdFactory as well as any GrpcPolledFd
78
+ * returned by the factory. */
79
+ std::unique_ptr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(Mutex* mu);
70
80
 
71
81
  } // namespace grpc_core
72
82
 
@@ -59,49 +59,53 @@ class GrpcPolledFdPosix : public GrpcPolledFd {
59
59
  grpc_fd_orphan(fd_, nullptr, &phony_release_fd, "c-ares query finished");
60
60
  }
61
61
 
62
- void RegisterForOnReadableLocked(grpc_closure* read_closure) override {
62
+ void RegisterForOnReadableLocked(grpc_closure* read_closure)
63
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) override {
63
64
  grpc_fd_notify_on_read(fd_, read_closure);
64
65
  }
65
66
 
66
- void RegisterForOnWriteableLocked(grpc_closure* write_closure) override {
67
+ void RegisterForOnWriteableLocked(grpc_closure* write_closure)
68
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) override {
67
69
  grpc_fd_notify_on_write(fd_, write_closure);
68
70
  }
69
71
 
70
- bool IsFdStillReadableLocked() override {
72
+ bool IsFdStillReadableLocked()
73
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) override {
71
74
  size_t bytes_available = 0;
72
75
  return ioctl(grpc_fd_wrapped_fd(fd_), FIONREAD, &bytes_available) == 0 &&
73
76
  bytes_available > 0;
74
77
  }
75
78
 
76
- void ShutdownLocked(grpc_error_handle error) override {
79
+ void ShutdownLocked(grpc_error_handle error)
80
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) override {
77
81
  grpc_fd_shutdown(fd_, error);
78
82
  }
79
83
 
80
- ares_socket_t GetWrappedAresSocketLocked() override { return as_; }
84
+ ares_socket_t GetWrappedAresSocketLocked()
85
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&grpc_ares_request::mu) override {
86
+ return as_;
87
+ }
81
88
 
82
- const char* GetName() override { return name_.c_str(); }
89
+ const char* GetName() const override { return name_.c_str(); }
83
90
 
84
91
  private:
85
- std::string name_;
86
- ares_socket_t as_;
87
- grpc_fd* fd_;
88
- grpc_pollset_set* driver_pollset_set_;
92
+ const std::string name_;
93
+ const ares_socket_t as_;
94
+ grpc_fd* fd_ ABSL_GUARDED_BY(&grpc_ares_request::mu);
95
+ grpc_pollset_set* driver_pollset_set_ ABSL_GUARDED_BY(&grpc_ares_request::mu);
89
96
  };
90
97
 
91
98
  class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory {
92
99
  public:
93
100
  GrpcPolledFd* NewGrpcPolledFdLocked(
94
- ares_socket_t as, grpc_pollset_set* driver_pollset_set,
95
- std::shared_ptr<WorkSerializer> /*work_serializer*/) override {
101
+ ares_socket_t as, grpc_pollset_set* driver_pollset_set) override {
96
102
  return new GrpcPolledFdPosix(as, driver_pollset_set);
97
103
  }
98
104
 
99
105
  void ConfigureAresChannelLocked(ares_channel /*channel*/) override {}
100
106
  };
101
107
 
102
- std::unique_ptr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(
103
- std::shared_ptr<WorkSerializer> work_serializer) {
104
- (void)work_serializer;
108
+ std::unique_ptr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(Mutex* /* mu */) {
105
109
  return absl::make_unique<GrpcPolledFdFactoryPosix>();
106
110
  }
107
111