grpc 1.46.3 → 1.47.0

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

Potentially problematic release.


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

Files changed (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -17,38 +17,60 @@
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
19
  #include <inttypes.h>
20
- #include <limits.h>
21
-
20
+ #include <stddef.h>
21
+
22
+ #include <algorithm>
23
+ #include <map>
24
+ #include <memory>
25
+ #include <set>
26
+ #include <string>
27
+ #include <utility>
28
+ #include <vector>
29
+
30
+ #include "absl/container/inlined_vector.h"
31
+ #include "absl/memory/memory.h"
32
+ #include "absl/status/status.h"
33
+ #include "absl/status/statusor.h"
22
34
  #include "absl/strings/str_cat.h"
35
+ #include "absl/strings/string_view.h"
23
36
  #include "absl/types/optional.h"
24
37
 
25
- #include <grpc/grpc.h>
38
+ #include <grpc/impl/codegen/connectivity_state.h>
39
+ #include <grpc/impl/codegen/grpc_types.h>
40
+ #include <grpc/support/log.h>
26
41
 
27
- #include "src/core/ext/filters/client_channel/client_channel.h"
28
42
  #include "src/core/ext/filters/client_channel/lb_policy.h"
29
43
  #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
30
44
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
45
+ #include "src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h"
31
46
  #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
32
47
  #include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
33
48
  #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
34
49
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
35
50
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
36
51
  #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
52
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
37
53
  #include "src/core/ext/xds/xds_bootstrap.h"
38
- #include "src/core/ext/xds/xds_channel_args.h"
39
54
  #include "src/core/ext/xds/xds_client.h"
40
55
  #include "src/core/ext/xds/xds_client_stats.h"
41
56
  #include "src/core/ext/xds/xds_endpoint.h"
57
+ #include "src/core/ext/xds/xds_resource_type_impl.h"
42
58
  #include "src/core/lib/channel/channel_args.h"
43
59
  #include "src/core/lib/config/core_configuration.h"
60
+ #include "src/core/lib/debug/trace.h"
44
61
  #include "src/core/lib/gpr/string.h"
62
+ #include "src/core/lib/gprpp/debug_location.h"
45
63
  #include "src/core/lib/gprpp/orphanable.h"
46
64
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
65
+ #include "src/core/lib/gprpp/time.h"
66
+ #include "src/core/lib/iomgr/error.h"
67
+ #include "src/core/lib/iomgr/pollset_set.h"
47
68
  #include "src/core/lib/iomgr/work_serializer.h"
69
+ #include "src/core/lib/json/json.h"
70
+ #include "src/core/lib/resolver/resolver.h"
48
71
  #include "src/core/lib/resolver/resolver_registry.h"
49
72
  #include "src/core/lib/resolver/server_address.h"
50
- #include "src/core/lib/transport/error_utils.h"
51
- #include "src/core/lib/uri/uri_parser.h"
73
+ #include "src/core/lib/transport/connectivity_state.h"
52
74
 
53
75
  #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
54
76
 
@@ -76,6 +98,7 @@ class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
76
98
  DiscoveryMechanismType type;
77
99
  std::string eds_service_name;
78
100
  std::string dns_hostname;
101
+ absl::optional<Json::Object> outlier_detection_lb_config;
79
102
 
80
103
  bool operator==(const DiscoveryMechanism& other) const {
81
104
  return (cluster_name == other.cluster_name &&
@@ -83,7 +106,8 @@ class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
83
106
  max_concurrent_requests == other.max_concurrent_requests &&
84
107
  type == other.type &&
85
108
  eds_service_name == other.eds_service_name &&
86
- dns_hostname == other.dns_hostname);
109
+ dns_hostname == other.dns_hostname &&
110
+ outlier_detection_lb_config == other.outlier_detection_lb_config);
87
111
  }
88
112
  };
89
113
 
@@ -855,9 +879,31 @@ XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
855
879
  xds_cluster_impl_config["lrsLoadReportingServer"] =
856
880
  discovery_config.lrs_load_reporting_server->ToJson();
857
881
  }
858
- Json locality_picking_policy = Json::Array{Json::Object{
859
- {"xds_cluster_impl_experimental", std::move(xds_cluster_impl_config)},
860
- }};
882
+ Json locality_picking_policy;
883
+ if (XdsOutlierDetectionEnabled()) {
884
+ Json::Object outlier_detection_config;
885
+ if (discovery_entry.config().outlier_detection_lb_config.has_value()) {
886
+ outlier_detection_config =
887
+ discovery_entry.config().outlier_detection_lb_config.value();
888
+ } else {
889
+ // outlier detection will be a no-op
890
+ outlier_detection_config["interval"] =
891
+ Duration::Infinity().ToJsonString();
892
+ }
893
+ outlier_detection_config["childPolicy"] = Json::Array{Json::Object{
894
+ {"xds_cluster_impl_experimental",
895
+ std::move(xds_cluster_impl_config)},
896
+ }};
897
+ locality_picking_policy = Json::Array{Json::Object{
898
+ {"outlier_detection_experimental",
899
+ std::move(outlier_detection_config)},
900
+ }};
901
+ } else {
902
+ locality_picking_policy = Json::Array{Json::Object{
903
+ {"xds_cluster_impl_experimental",
904
+ std::move(xds_cluster_impl_config)},
905
+ }};
906
+ }
861
907
  // Add priority entry, with the appropriate child name.
862
908
  std::string child_name = discovery_entry.GetChildPolicyName(priority);
863
909
  priority_priorities.emplace_back(child_name);
@@ -1125,6 +1171,24 @@ class XdsClusterResolverLbFactory : public LoadBalancingPolicyFactory {
1125
1171
  gpr_parse_nonnegative_int(it->second.string_value().c_str());
1126
1172
  }
1127
1173
  }
1174
+ if (XdsOutlierDetectionEnabled()) {
1175
+ it = json.object_value().find("outlierDetection");
1176
+ if (it != json.object_value().end()) {
1177
+ if (it->second.type() != Json::Type::OBJECT) {
1178
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1179
+ "field:outlierDetection error:type should be object"));
1180
+ } else {
1181
+ // No need to validate the contents of the outlier detection config,
1182
+ // because in this particular case, the JSON is generated by the CDS
1183
+ // policy instead of coming from service config, so it's not actually
1184
+ // any better to catch the problem here than it is to catch it in the
1185
+ // outlier_detection policy itself, so here we just act as a
1186
+ // pass-through.
1187
+ discovery_mechanism->outlier_detection_lb_config =
1188
+ it->second.object_value();
1189
+ }
1190
+ }
1191
+ }
1128
1192
  // Discovery Mechanism type
1129
1193
  it = json.object_value().find("type");
1130
1194
  if (it == json.object_value().end()) {
@@ -20,8 +20,10 @@
20
20
 
21
21
  #include "src/core/ext/filters/client_channel/lb_policy.h"
22
22
 
23
- #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
24
- #include "src/core/lib/iomgr/combiner.h"
23
+ #include "src/core/lib/iomgr/closure.h"
24
+ #include "src/core/lib/iomgr/error.h"
25
+ #include "src/core/lib/iomgr/exec_ctx.h"
26
+ #include "src/core/lib/iomgr/pollset_set.h"
25
27
 
26
28
  namespace grpc_core {
27
29
 
@@ -19,21 +19,35 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
- #include <functional>
23
- #include <iterator>
22
+ #include <stddef.h>
23
+ #include <stdint.h>
24
+
25
+ #include <memory>
26
+ #include <string>
27
+ #include <type_traits>
28
+ #include <utility>
29
+ #include <vector>
24
30
 
25
31
  #include "absl/status/status.h"
26
32
  #include "absl/status/statusor.h"
27
33
  #include "absl/strings/string_view.h"
34
+ #include "absl/types/optional.h"
28
35
  #include "absl/types/variant.h"
29
36
 
37
+ #include <grpc/impl/codegen/connectivity_state.h>
38
+ #include <grpc/impl/codegen/grpc_types.h>
39
+
40
+ #include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h"
30
41
  #include "src/core/ext/filters/client_channel/subchannel_interface.h"
42
+ #include "src/core/lib/channel/channel_args.h"
43
+ #include "src/core/lib/debug/trace.h"
44
+ #include "src/core/lib/gprpp/debug_location.h"
31
45
  #include "src/core/lib/gprpp/orphanable.h"
46
+ #include "src/core/lib/gprpp/ref_counted.h"
32
47
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
33
- #include "src/core/lib/iomgr/polling_entity.h"
48
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
34
49
  #include "src/core/lib/iomgr/work_serializer.h"
35
50
  #include "src/core/lib/resolver/server_address.h"
36
- #include "src/core/lib/transport/connectivity_state.h"
37
51
 
38
52
  namespace grpc_core {
39
53
 
@@ -149,26 +163,6 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
149
163
  /// SubchannelCallTrackerInterface.
150
164
  class BackendMetricAccessor {
151
165
  public:
152
- // Represents backend metrics reported by the backend to the client.
153
- struct BackendMetricData {
154
- /// CPU utilization expressed as a fraction of available CPU resources.
155
- double cpu_utilization;
156
- /// Memory utilization expressed as a fraction of available memory
157
- /// resources.
158
- double mem_utilization;
159
- /// Total requests per second being served by the backend. This
160
- /// should include all services that a backend is responsible for.
161
- uint64_t requests_per_second;
162
- /// Application-specific requests cost metrics. Metric names are
163
- /// determined by the application. Each value is an absolute cost
164
- /// (e.g. 3487 bytes of storage) associated with the request.
165
- std::map<absl::string_view, double> request_cost;
166
- /// Application-specific resource utilization metrics. Metric names
167
- /// are determined by the application. Each value is expressed as a
168
- /// fraction of total resources available.
169
- std::map<absl::string_view, double> utilization;
170
- };
171
-
172
166
  virtual ~BackendMetricAccessor() = default;
173
167
 
174
168
  /// Returns the backend metric data returned by the server for the call,
@@ -23,6 +23,8 @@
23
23
 
24
24
  #include "src/core/ext/filters/client_channel/lb_policy.h"
25
25
  #include "src/core/lib/gprpp/orphanable.h"
26
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
27
+ #include "src/core/lib/iomgr/error.h"
26
28
  #include "src/core/lib/json/json.h"
27
29
 
28
30
  namespace grpc_core {
@@ -22,12 +22,19 @@
22
22
 
23
23
  #include <string.h>
24
24
 
25
+ #include <algorithm>
26
+ #include <map>
27
+ #include <string>
28
+ #include <utility>
29
+ #include <vector>
30
+
25
31
  #include "absl/container/inlined_vector.h"
26
32
  #include "absl/strings/str_cat.h"
27
33
  #include "absl/strings/str_format.h"
28
34
  #include "absl/strings/str_join.h"
35
+ #include "absl/strings/string_view.h"
29
36
 
30
- #include "src/core/lib/gpr/string.h"
37
+ #include <grpc/support/log.h>
31
38
 
32
39
  namespace grpc_core {
33
40
 
@@ -21,9 +21,14 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <memory>
25
+
26
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
24
27
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
25
- #include "src/core/lib/gprpp/memory.h"
26
28
  #include "src/core/lib/gprpp/orphanable.h"
29
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
30
+ #include "src/core/lib/iomgr/error.h"
31
+ #include "src/core/lib/json/json.h"
27
32
 
28
33
  namespace grpc_core {
29
34
 
@@ -20,6 +20,10 @@
20
20
 
21
21
  #include "src/core/ext/filters/client_channel/local_subchannel_pool.h"
22
22
 
23
+ #include <utility>
24
+
25
+ #include <grpc/support/log.h>
26
+
23
27
  #include "src/core/ext/filters/client_channel/subchannel.h"
24
28
 
25
29
  namespace grpc_core {
@@ -24,6 +24,7 @@
24
24
  #include <map>
25
25
 
26
26
  #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
27
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
27
28
 
28
29
  namespace grpc_core {
29
30
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  #include <grpc/impl/codegen/grpc_types.h>
25
25
 
26
- #include "src/core/lib/iomgr/resolve_address.h"
26
+ #include "src/core/lib/iomgr/resolved_address.h"
27
27
 
28
28
  namespace grpc_core {
29
29
 
@@ -20,7 +20,9 @@
20
20
 
21
21
  #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
22
22
 
23
+ #include <algorithm>
23
24
  #include <memory>
25
+ #include <utility>
24
26
  #include <vector>
25
27
 
26
28
  namespace grpc_core {
@@ -21,7 +21,12 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <memory>
25
+
26
+ #include <grpc/impl/codegen/grpc_types.h>
27
+
24
28
  #include "src/core/ext/filters/client_channel/proxy_mapper.h"
29
+ #include "src/core/lib/iomgr/resolved_address.h"
25
30
 
26
31
  namespace grpc_core {
27
32
 
@@ -14,21 +14,39 @@
14
14
 
15
15
  #include <grpc/support/port_platform.h>
16
16
 
17
- #include "src/core/lib/iomgr/port.h"
17
+ #include "src/core/lib/iomgr/port.h" // IWYU pragma: keep
18
18
 
19
19
  #ifdef GRPC_HAVE_UNIX_SOCKET
20
20
 
21
+ #include <string.h>
22
+ #include <sys/socket.h>
21
23
  #include <sys/un.h>
22
24
 
23
- #include <grpc/support/alloc.h>
24
- #include <grpc/support/string_util.h>
25
+ #include <memory>
26
+ #include <string>
27
+ #include <type_traits>
28
+ #include <utility>
29
+
30
+ #include "absl/memory/memory.h"
31
+ #include "absl/status/statusor.h"
32
+ #include "absl/strings/str_cat.h"
33
+ #include "absl/strings/string_view.h"
34
+ #include "absl/strings/strip.h"
35
+
36
+ #include <grpc/impl/codegen/grpc_types.h>
37
+ #include <grpc/support/log.h>
25
38
 
26
- #include "src/core/lib/address_utils/parse_address.h"
27
39
  #include "src/core/lib/channel/channel_args.h"
28
40
  #include "src/core/lib/config/core_configuration.h"
29
- #include "src/core/lib/gpr/string.h"
41
+ #include "src/core/lib/gprpp/orphanable.h"
42
+ #include "src/core/lib/iomgr/error.h"
43
+ #include "src/core/lib/iomgr/port.h"
44
+ #include "src/core/lib/iomgr/resolved_address.h"
45
+ #include "src/core/lib/resolver/resolver.h"
46
+ #include "src/core/lib/resolver/resolver_factory.h"
30
47
  #include "src/core/lib/resolver/resolver_registry.h"
31
48
  #include "src/core/lib/resolver/server_address.h"
49
+ #include "src/core/lib/uri/uri_parser.h"
32
50
 
33
51
  namespace grpc_core {
34
52
  namespace {
@@ -16,7 +16,48 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <stdint.h>
20
+ #include <stdlib.h>
21
+
22
+ #include <algorithm>
23
+ #include <functional>
24
+ #include <map>
25
+ #include <memory>
26
+ #include <string>
27
+ #include <type_traits>
28
+ #include <utility>
29
+ #include <vector>
30
+
31
+ #include "absl/base/thread_annotations.h"
32
+ #include "absl/memory/memory.h"
33
+ #include "absl/status/status.h"
34
+ #include "absl/status/statusor.h"
35
+ #include "absl/strings/string_view.h"
36
+ #include "absl/strings/strip.h"
37
+
38
+ #include <grpc/event_engine/event_engine.h>
39
+ #include <grpc/impl/codegen/grpc_types.h>
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+
19
43
  #include "src/core/lib/config/core_configuration.h"
44
+ #include "src/core/lib/debug/trace.h"
45
+ #include "src/core/lib/gprpp/debug_location.h"
46
+ #include "src/core/lib/gprpp/global_config_generic.h"
47
+ #include "src/core/lib/gprpp/memory.h"
48
+ #include "src/core/lib/gprpp/orphanable.h"
49
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
50
+ #include "src/core/lib/gprpp/sync.h"
51
+ #include "src/core/lib/gprpp/time.h"
52
+ #include "src/core/lib/iomgr/closure.h"
53
+ #include "src/core/lib/iomgr/error.h"
54
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
55
+ #include "src/core/lib/iomgr/pollset_set.h"
56
+ #include "src/core/lib/iomgr/resolved_address.h"
57
+ #include "src/core/lib/resolver/resolver.h"
58
+ #include "src/core/lib/resolver/resolver_factory.h"
59
+ #include "src/core/lib/service_config/service_config.h"
60
+ #include "src/core/lib/uri/uri_parser.h"
20
61
 
21
62
  #if GRPC_ARES == 1
22
63
 
@@ -26,20 +67,20 @@
26
67
 
27
68
  #include <address_sorting/address_sorting.h>
28
69
 
70
+ #include "absl/container/flat_hash_set.h"
29
71
  #include "absl/container/inlined_vector.h"
30
72
  #include "absl/strings/str_cat.h"
31
73
 
32
74
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
33
- #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
34
75
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
35
76
  #include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
36
77
  #include "src/core/ext/filters/client_channel/resolver/polling_resolver.h"
37
78
  #include "src/core/lib/backoff/backoff.h"
38
79
  #include "src/core/lib/channel/channel_args.h"
80
+ #include "src/core/lib/event_engine/handle_containers.h"
39
81
  #include "src/core/lib/gpr/string.h"
40
82
  #include "src/core/lib/iomgr/gethostname.h"
41
83
  #include "src/core/lib/iomgr/resolve_address.h"
42
- #include "src/core/lib/iomgr/timer.h"
43
84
  #include "src/core/lib/json/json.h"
44
85
  #include "src/core/lib/resolver/resolver_registry.h"
45
86
  #include "src/core/lib/resolver/server_address.h"
@@ -322,85 +363,100 @@ class AresClientChannelDNSResolverFactory : public ResolverFactory {
322
363
 
323
364
  class AresDNSResolver : public DNSResolver {
324
365
  public:
325
- class AresRequest : public DNSResolver::Request {
366
+ class AresRequest {
326
367
  public:
327
368
  AresRequest(
328
369
  absl::string_view name, absl::string_view default_port,
329
370
  grpc_pollset_set* interested_parties,
330
371
  std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
331
- on_resolve_address_done)
372
+ on_resolve_address_done,
373
+ AresDNSResolver* resolver, intptr_t aba_token)
332
374
  : name_(std::string(name)),
333
375
  default_port_(std::string(default_port)),
334
376
  interested_parties_(interested_parties),
335
- on_resolve_address_done_(std::move(on_resolve_address_done)) {
377
+ pollset_set_(grpc_pollset_set_create()),
378
+ on_resolve_address_done_(std::move(on_resolve_address_done)),
379
+ completed_(false),
380
+ resolver_(resolver),
381
+ aba_token_(aba_token) {
336
382
  GRPC_CARES_TRACE_LOG("AresRequest:%p ctor", this);
337
383
  GRPC_CLOSURE_INIT(&on_dns_lookup_done_, OnDnsLookupDone, this,
338
384
  grpc_schedule_on_exec_ctx);
385
+ MutexLock lock(&mu_);
386
+ grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties);
387
+ ares_request_ = std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_ares(
388
+ /*dns_server=*/"", name_.c_str(), default_port_.c_str(), pollset_set_,
389
+ &on_dns_lookup_done_, &addresses_,
390
+ /*balancer_addresses=*/nullptr, /*service_config_json=*/nullptr,
391
+ GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS));
392
+ GRPC_CARES_TRACE_LOG("AresRequest:%p Start ares_request_:%p", this,
393
+ ares_request_.get());
339
394
  }
340
395
 
341
- ~AresRequest() override {
396
+ ~AresRequest() {
342
397
  GRPC_CARES_TRACE_LOG("AresRequest:%p dtor ares_request_:%p", this,
343
398
  ares_request_.get());
399
+ resolver_->UnregisterRequest(task_handle());
400
+ grpc_pollset_set_destroy(pollset_set_);
344
401
  }
345
402
 
346
- void Start() override {
347
- absl::MutexLock lock(&mu_);
348
- Ref().release(); // ref held by resolution
349
- ares_request_ = std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_ares(
350
- "" /* dns_server */, name_.c_str(), default_port_.c_str(),
351
- interested_parties_, &on_dns_lookup_done_, &addresses_,
352
- nullptr /* balancer_addresses */, nullptr /* service_config_json */,
353
- GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS));
354
- GRPC_CARES_TRACE_LOG("AresRequest:%p Start ares_request_:%p", this,
403
+ bool Cancel() {
404
+ MutexLock lock(&mu_);
405
+ GRPC_CARES_TRACE_LOG("AresRequest:%p Cancel ares_request_:%p", this,
355
406
  ares_request_.get());
407
+ if (completed_) return false;
408
+ // OnDnsLookupDone will still be run
409
+ grpc_cancel_ares_request(ares_request_.get());
410
+ completed_ = true;
411
+ grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties_);
412
+ return true;
356
413
  }
357
414
 
358
- void Orphan() override {
359
- {
360
- absl::MutexLock lock(&mu_);
361
- GRPC_CARES_TRACE_LOG("AresRequest:%p Orphan ares_request_:%p", this,
362
- ares_request_.get());
363
- if (ares_request_ != nullptr) {
364
- grpc_cancel_ares_request(ares_request_.get());
365
- }
366
- }
367
- Unref();
415
+ TaskHandle task_handle() {
416
+ return {reinterpret_cast<intptr_t>(this), aba_token_};
368
417
  }
369
418
 
370
419
  private:
420
+ // Called by ares when lookup has completed or when cancelled. It is always
421
+ // called exactly once.
371
422
  static void OnDnsLookupDone(void* arg, grpc_error_handle error) {
372
- AresRequest* r = static_cast<AresRequest*>(arg);
423
+ AresRequest* request = static_cast<AresRequest*>(arg);
424
+ GRPC_CARES_TRACE_LOG("AresRequest:%p OnDnsLookupDone", request);
425
+ // This request is deleted and unregistered upon any exit.
426
+ std::unique_ptr<AresRequest> deleter(request);
373
427
  std::vector<grpc_resolved_address> resolved_addresses;
374
428
  {
375
- absl::MutexLock lock(&r->mu_);
376
- GRPC_CARES_TRACE_LOG("AresRequest:%p OnDnsLookupDone error:%s", r,
377
- grpc_error_std_string(error).c_str());
378
- if (r->addresses_ != nullptr) {
379
- resolved_addresses.reserve(r->addresses_->size());
380
- for (const auto& server_address : *r->addresses_) {
429
+ MutexLock lock(&request->mu_);
430
+ if (request->completed_) return;
431
+ request->completed_ = true;
432
+ if (request->addresses_ != nullptr) {
433
+ resolved_addresses.reserve(request->addresses_->size());
434
+ for (const auto& server_address : *request->addresses_) {
381
435
  resolved_addresses.push_back(server_address.address());
382
436
  }
383
437
  }
384
438
  }
385
- if (error == GRPC_ERROR_NONE) {
386
- // it's safe to run this inline since we've already been scheduled
387
- // on the ExecCtx
388
- r->on_resolve_address_done_(std::move(resolved_addresses));
389
- } else {
390
- r->on_resolve_address_done_(grpc_error_to_absl_status(error));
439
+ grpc_pollset_set_del_pollset_set(request->pollset_set_,
440
+ request->interested_parties_);
441
+ if (error != GRPC_ERROR_NONE) {
442
+ request->on_resolve_address_done_(grpc_error_to_absl_status(error));
443
+ return;
391
444
  }
392
- r->Unref();
445
+ request->on_resolve_address_done_(std::move(resolved_addresses));
393
446
  }
394
447
 
395
448
  // mutex to synchronize access to this object (but not to the ares_request
396
449
  // object itself).
397
- absl::Mutex mu_;
450
+ Mutex mu_;
398
451
  // the name to resolve
399
452
  const std::string name_;
400
453
  // the default port to use if name doesn't have one
401
454
  const std::string default_port_;
402
455
  // parties interested in our I/O
403
456
  grpc_pollset_set* const interested_parties_;
457
+ // locally owned pollset_set, required to support cancellation of requests
458
+ // while ares still needs a valid pollset_set.
459
+ grpc_pollset_set* pollset_set_;
404
460
  // user-provided completion callback
405
461
  const std::function<void(
406
462
  absl::StatusOr<std::vector<grpc_resolved_address>>)>
@@ -413,6 +469,12 @@ class AresDNSResolver : public DNSResolver {
413
469
  grpc_closure on_dns_lookup_done_ ABSL_GUARDED_BY(mu_);
414
470
  // underlying ares_request that the query is performed on
415
471
  std::unique_ptr<grpc_ares_request> ares_request_ ABSL_GUARDED_BY(mu_);
472
+ bool completed_ ABSL_GUARDED_BY(mu_);
473
+ // Parent resolver that created this request
474
+ AresDNSResolver* resolver_;
475
+ // Unique token to help distinguish this request from others that may later
476
+ // be created in the same memory location.
477
+ intptr_t aba_token_;
416
478
  };
417
479
 
418
480
  // gets the singleton instance, possibly creating it first
@@ -421,13 +483,17 @@ class AresDNSResolver : public DNSResolver {
421
483
  return instance;
422
484
  }
423
485
 
424
- OrphanablePtr<DNSResolver::Request> ResolveName(
486
+ TaskHandle ResolveName(
425
487
  absl::string_view name, absl::string_view default_port,
426
488
  grpc_pollset_set* interested_parties,
427
489
  std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
428
490
  on_done) override {
429
- return MakeOrphanable<AresRequest>(name, default_port, interested_parties,
430
- std::move(on_done));
491
+ MutexLock lock(&mu_);
492
+ auto* request = new AresRequest(name, default_port, interested_parties,
493
+ std::move(on_done), this, aba_token_++);
494
+ auto handle = request->task_handle();
495
+ open_requests_.insert(handle);
496
+ return handle;
431
497
  }
432
498
 
433
499
  absl::StatusOr<std::vector<grpc_resolved_address>> ResolveNameBlocking(
@@ -437,9 +503,34 @@ class AresDNSResolver : public DNSResolver {
437
503
  return default_resolver_->ResolveNameBlocking(name, default_port);
438
504
  }
439
505
 
506
+ bool Cancel(TaskHandle handle) override {
507
+ MutexLock lock(&mu_);
508
+ if (!open_requests_.contains(handle)) {
509
+ // Unknown request, possibly completed already, or an invalid handle.
510
+ GRPC_CARES_TRACE_LOG(
511
+ "AresDNSResolver:%p attempt to cancel unknown TaskHandle:%s", this,
512
+ HandleToString(handle).c_str());
513
+ return false;
514
+ }
515
+ auto* request = reinterpret_cast<AresRequest*>(handle.keys[0]);
516
+ GRPC_CARES_TRACE_LOG("AresDNSResolver:%p cancel ares_request:%p", this,
517
+ request);
518
+ return request->Cancel();
519
+ }
520
+
440
521
  private:
522
+ // Called exclusively from the AresRequest destructor.
523
+ void UnregisterRequest(TaskHandle handle) {
524
+ MutexLock lock(&mu_);
525
+ open_requests_.erase(handle);
526
+ }
527
+
441
528
  // the previous default DNS resolver, used to delegate blocking DNS calls to
442
529
  DNSResolver* default_resolver_ = GetDNSResolver();
530
+ Mutex mu_;
531
+ grpc_event_engine::experimental::LookupTaskHandleSet open_requests_
532
+ ABSL_GUARDED_BY(mu_);
533
+ intptr_t aba_token_ ABSL_GUARDED_BY(mu_) = 0;
443
534
  };
444
535
 
445
536
  bool ShouldUseAres(const char* resolver_env) {