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
@@ -53,25 +53,46 @@
53
53
 
54
54
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
55
55
 
56
+ // IWYU pragma: no_include <sys/socket.h>
57
+
56
58
  #include <inttypes.h>
57
59
  #include <limits.h>
60
+ #include <stdlib.h>
58
61
  #include <string.h>
59
62
 
63
+ #include <algorithm>
64
+ #include <map>
65
+ #include <memory>
66
+ #include <string>
67
+ #include <utility>
68
+ #include <vector>
69
+
60
70
  #include "absl/container/inlined_vector.h"
71
+ #include "absl/memory/memory.h"
72
+ #include "absl/status/status.h"
73
+ #include "absl/status/statusor.h"
61
74
  #include "absl/strings/str_cat.h"
62
75
  #include "absl/strings/str_format.h"
63
76
  #include "absl/strings/str_join.h"
77
+ #include "absl/strings/string_view.h"
64
78
  #include "absl/strings/strip.h"
79
+ #include "absl/types/optional.h"
80
+ #include "absl/types/variant.h"
65
81
  #include "upb/upb.hpp"
66
82
 
83
+ #include <grpc/byte_buffer.h>
67
84
  #include <grpc/byte_buffer_reader.h>
68
85
  #include <grpc/grpc.h>
69
- #include <grpc/grpc_security.h>
86
+ #include <grpc/impl/codegen/connectivity_state.h>
87
+ #include <grpc/impl/codegen/grpc_types.h>
88
+ #include <grpc/impl/codegen/propagation_bits.h>
89
+ #include <grpc/slice.h>
90
+ #include <grpc/status.h>
70
91
  #include <grpc/support/alloc.h>
71
- #include <grpc/support/string_util.h>
72
- #include <grpc/support/time.h>
92
+ #include <grpc/support/log.h>
73
93
 
74
94
  #include "src/core/ext/filters/client_channel/client_channel.h"
95
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
75
96
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
76
97
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
77
98
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
@@ -80,27 +101,44 @@
80
101
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
81
102
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
82
103
  #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
83
- #include "src/core/lib/address_utils/parse_address.h"
104
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
84
105
  #include "src/core/lib/address_utils/sockaddr_utils.h"
85
106
  #include "src/core/lib/backoff/backoff.h"
86
107
  #include "src/core/lib/channel/channel_args.h"
87
- #include "src/core/lib/channel/channel_stack.h"
88
108
  #include "src/core/lib/channel/channel_stack_builder.h"
109
+ #include "src/core/lib/channel/channelz.h"
89
110
  #include "src/core/lib/config/core_configuration.h"
111
+ #include "src/core/lib/debug/trace.h"
90
112
  #include "src/core/lib/gpr/string.h"
91
- #include "src/core/lib/gprpp/manual_constructor.h"
92
- #include "src/core/lib/gprpp/memory.h"
113
+ #include "src/core/lib/gpr/useful.h"
114
+ #include "src/core/lib/gprpp/debug_location.h"
93
115
  #include "src/core/lib/gprpp/orphanable.h"
116
+ #include "src/core/lib/gprpp/ref_counted.h"
94
117
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
118
+ #include "src/core/lib/gprpp/time.h"
119
+ #include "src/core/lib/iomgr/closure.h"
120
+ #include "src/core/lib/iomgr/error.h"
121
+ #include "src/core/lib/iomgr/exec_ctx.h"
122
+ #include "src/core/lib/iomgr/pollset_set.h"
123
+ #include "src/core/lib/iomgr/resolved_address.h"
95
124
  #include "src/core/lib/iomgr/sockaddr.h"
96
125
  #include "src/core/lib/iomgr/socket_utils.h"
97
126
  #include "src/core/lib/iomgr/timer.h"
127
+ #include "src/core/lib/iomgr/work_serializer.h"
128
+ #include "src/core/lib/json/json.h"
129
+ #include "src/core/lib/resolver/resolver.h"
98
130
  #include "src/core/lib/resolver/server_address.h"
99
131
  #include "src/core/lib/security/credentials/credentials.h"
100
- #include "src/core/lib/slice/slice_internal.h"
132
+ #include "src/core/lib/slice/slice.h"
133
+ #include "src/core/lib/slice/slice_refcount.h"
101
134
  #include "src/core/lib/slice/slice_string_helpers.h"
102
135
  #include "src/core/lib/surface/call.h"
103
136
  #include "src/core/lib/surface/channel.h"
137
+ #include "src/core/lib/surface/channel_init.h"
138
+ #include "src/core/lib/surface/channel_stack_type.h"
139
+ #include "src/core/lib/transport/connectivity_state.h"
140
+ #include "src/core/lib/transport/metadata_batch.h"
141
+ #include "src/core/lib/uri/uri_parser.h"
104
142
 
105
143
  #define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
106
144
  #define GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER 1.6
@@ -534,7 +572,8 @@ std::string GrpcLb::Serverlist::AsText() const {
534
572
  } else {
535
573
  grpc_resolved_address addr;
536
574
  ParseServer(server, &addr);
537
- ipport = grpc_sockaddr_to_string(&addr, false);
575
+ auto addr_str = grpc_sockaddr_to_string(&addr, false);
576
+ ipport = addr_str.ok() ? *addr_str : addr_str.status().ToString();
538
577
  }
539
578
  entries.push_back(absl::StrFormat(" %" PRIuPTR ": %s token=%s\n", i,
540
579
  ipport, server.load_balance_token));
@@ -582,10 +621,12 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
582
621
  server.load_balance_token, GPR_ARRAY_SIZE(server.load_balance_token));
583
622
  std::string lb_token(server.load_balance_token, lb_token_length);
584
623
  if (lb_token.empty()) {
624
+ auto addr_uri = grpc_sockaddr_to_uri(&addr);
585
625
  gpr_log(GPR_INFO,
586
626
  "Missing LB token for backend address '%s'. The empty token will "
587
627
  "be used instead",
588
- grpc_sockaddr_to_uri(&addr).c_str());
628
+ addr_uri.ok() ? addr_uri->c_str()
629
+ : addr_uri.status().ToString().c_str());
589
630
  }
590
631
  // Attach attribute to address containing LB token and stats object.
591
632
  std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
@@ -1236,6 +1277,7 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
1236
1277
  // If the fallback-at-startup checks are pending, go into fallback mode
1237
1278
  // immediately. This short-circuits the timeout for the fallback-at-startup
1238
1279
  // case.
1280
+ grpclb_policy()->lb_calld_.reset();
1239
1281
  if (grpclb_policy()->fallback_at_startup_checks_pending_) {
1240
1282
  GPR_ASSERT(!seen_serverlist_);
1241
1283
  gpr_log(GPR_INFO,
@@ -1251,7 +1293,6 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
1251
1293
  // This handles the fallback-after-startup case.
1252
1294
  grpclb_policy()->MaybeEnterFallbackModeAfterStartup();
1253
1295
  }
1254
- grpclb_policy()->lb_calld_.reset();
1255
1296
  GPR_ASSERT(!grpclb_policy()->shutting_down_);
1256
1297
  grpclb_policy()->channel_control_helper()->RequestReresolution();
1257
1298
  if (seen_initial_response_) {
@@ -1481,7 +1522,8 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
1481
1522
  // Start watching the channel's connectivity state. If the channel
1482
1523
  // goes into state TRANSIENT_FAILURE before the timer fires, we go into
1483
1524
  // fallback mode even if the fallback timeout has not elapsed.
1484
- ClientChannel* client_channel = ClientChannel::GetFromChannel(lb_channel_);
1525
+ ClientChannel* client_channel =
1526
+ ClientChannel::GetFromChannel(Channel::FromC(lb_channel_));
1485
1527
  GPR_ASSERT(client_channel != nullptr);
1486
1528
  // Ref held by callback.
1487
1529
  watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "StateWatcher"));
@@ -1542,7 +1584,8 @@ void GrpcLb::UpdateBalancerChannelLocked(const grpc_channel_args& args) {
1542
1584
  }
1543
1585
 
1544
1586
  void GrpcLb::CancelBalancerChannelConnectivityWatchLocked() {
1545
- ClientChannel* client_channel = ClientChannel::GetFromChannel(lb_channel_);
1587
+ ClientChannel* client_channel =
1588
+ ClientChannel::GetFromChannel(Channel::FromC(lb_channel_));
1546
1589
  GPR_ASSERT(client_channel != nullptr);
1547
1590
  client_channel->RemoveConnectivityWatcher(watcher_);
1548
1591
  }
@@ -1867,17 +1910,14 @@ void RegisterGrpcLbLoadReportingFilter(CoreConfiguration::Builder* builder) {
1867
1910
  builder->channel_init()->RegisterStage(
1868
1911
  GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1869
1912
  [](ChannelStackBuilder* builder) {
1870
- const grpc_channel_args* args = builder->channel_args();
1871
- const grpc_arg* channel_arg =
1872
- grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
1873
- if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
1874
- strcmp(channel_arg->value.string, "grpclb") == 0) {
1913
+ if (builder->channel_args().GetString(GRPC_ARG_LB_POLICY_NAME) ==
1914
+ "grpclb") {
1875
1915
  // TODO(roth): When we get around to re-attempting
1876
1916
  // https://github.com/grpc/grpc/pull/16214, we should try to keep
1877
1917
  // this filter at the very top of the subchannel stack, since that
1878
1918
  // will minimize the number of metadata elements that the filter
1879
1919
  // needs to iterate through to find the ClientStats object.
1880
- builder->PrependFilter(&grpc_client_load_reporting_filter, nullptr);
1920
+ builder->PrependFilter(&grpc_client_load_reporting_filter);
1881
1921
  }
1882
1922
  return true;
1883
1923
  });
@@ -18,6 +18,10 @@
18
18
 
19
19
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
20
20
 
21
+ #include <stddef.h>
22
+
23
+ #include "absl/container/inlined_vector.h"
24
+
21
25
  #include "src/core/lib/channel/channel_args.h"
22
26
  #include "src/core/lib/gpr/useful.h"
23
27
 
@@ -21,6 +21,12 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <stdint.h>
25
+
26
+ #include <memory>
27
+ #include <utility>
28
+
29
+ #include "absl/base/thread_annotations.h"
24
30
  #include "absl/container/inlined_vector.h"
25
31
 
26
32
  #include <grpc/support/atm.h>
@@ -20,10 +20,19 @@
20
20
 
21
21
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
22
22
 
23
+ #include <string.h>
24
+
25
+ #include <algorithm>
26
+
23
27
  #include "google/protobuf/duration.upb.h"
24
28
  #include "google/protobuf/timestamp.upb.h"
25
29
 
26
- #include <grpc/support/alloc.h>
30
+ #include <grpc/impl/codegen/gpr_types.h>
31
+ #include <grpc/support/log.h>
32
+ #include <grpc/support/time.h>
33
+
34
+ #include "src/core/lib/gprpp/memory.h"
35
+ #include "src/proto/grpc/lb/v1/load_balancer.upb.h"
27
36
 
28
37
  namespace grpc_core {
29
38
 
@@ -21,13 +21,16 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <stdint.h>
25
+
24
26
  #include <vector>
25
27
 
26
- #include <grpc/slice_buffer.h>
28
+ #include "upb/upb.h"
29
+
30
+ #include <grpc/slice.h>
27
31
 
28
32
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
29
- #include "src/core/lib/iomgr/exec_ctx.h"
30
- #include "src/proto/grpc/lb/v1/load_balancer.upb.h"
33
+ #include "src/core/lib/gprpp/time.h"
31
34
 
32
35
  #define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
33
36
  #define GRPC_GRPCLB_SERVER_IP_ADDRESS_MAX_SIZE 16
@@ -0,0 +1,408 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h"
20
+
21
+ #include <string.h>
22
+
23
+ #include <algorithm>
24
+ #include <set>
25
+ #include <string>
26
+ #include <utility>
27
+ #include <vector>
28
+
29
+ #include "absl/base/thread_annotations.h"
30
+ #include "absl/memory/memory.h"
31
+ #include "absl/status/status.h"
32
+ #include "absl/strings/string_view.h"
33
+ #include "absl/types/optional.h"
34
+ #include "google/protobuf/duration.upb.h"
35
+ #include "upb/upb.hpp"
36
+ #include "xds/service/orca/v3/orca.upb.h"
37
+
38
+ #include <grpc/impl/codegen/connectivity_state.h>
39
+ #include <grpc/impl/codegen/gpr_types.h>
40
+ #include <grpc/slice.h>
41
+ #include <grpc/status.h>
42
+ #include <grpc/support/alloc.h>
43
+ #include <grpc/support/log.h>
44
+
45
+ #include "src/core/ext/filters/client_channel/backend_metric.h"
46
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
47
+ #include "src/core/ext/filters/client_channel/subchannel.h"
48
+ #include "src/core/ext/filters/client_channel/subchannel_interface_internal.h"
49
+ #include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
50
+ #include "src/core/lib/channel/channel_trace.h"
51
+ #include "src/core/lib/debug/trace.h"
52
+ #include "src/core/lib/gprpp/debug_location.h"
53
+ #include "src/core/lib/gprpp/memory.h"
54
+ #include "src/core/lib/gprpp/orphanable.h"
55
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
56
+ #include "src/core/lib/gprpp/sync.h"
57
+ #include "src/core/lib/gprpp/time.h"
58
+ #include "src/core/lib/gprpp/unique_type_name.h"
59
+ #include "src/core/lib/iomgr/closure.h"
60
+ #include "src/core/lib/iomgr/error.h"
61
+ #include "src/core/lib/iomgr/exec_ctx.h"
62
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
63
+ #include "src/core/lib/iomgr/pollset_set.h"
64
+ #include "src/core/lib/slice/slice.h"
65
+
66
+ namespace grpc_core {
67
+
68
+ namespace {
69
+
70
+ TraceFlag grpc_orca_client_trace(false, "orca_client");
71
+
72
+ class OrcaWatcher;
73
+
74
+ // This producer is registered with a subchannel. It creates a
75
+ // streaming ORCA call and reports the resulting backend metrics to all
76
+ // registered watchers.
77
+ class OrcaProducer : public Subchannel::DataProducerInterface {
78
+ public:
79
+ explicit OrcaProducer(RefCountedPtr<Subchannel> subchannel);
80
+
81
+ void Orphan() override;
82
+
83
+ static UniqueTypeName Type() {
84
+ static UniqueTypeName::Factory kFactory("orca");
85
+ return kFactory.Create();
86
+ }
87
+
88
+ UniqueTypeName type() const override { return Type(); }
89
+
90
+ // Adds and removes watchers.
91
+ void AddWatcher(OrcaWatcher* watcher);
92
+ void RemoveWatcher(OrcaWatcher* watcher);
93
+
94
+ private:
95
+ class ConnectivityWatcher;
96
+ class OrcaStreamEventHandler;
97
+
98
+ // Returns the minimum requested reporting interval across all watchers.
99
+ Duration GetMinIntervalLocked() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
100
+
101
+ // Starts a new stream if we have a connected subchannel.
102
+ // Called whenever the reporting interval changes or the subchannel
103
+ // transitions to state READY.
104
+ void MaybeStartStreamLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
105
+
106
+ // Handles a connectivity state change on the subchannel.
107
+ void OnConnectivityStateChange(grpc_connectivity_state state);
108
+
109
+ // Called to notify watchers of a new backend metric report.
110
+ void NotifyWatchers(const BackendMetricData& backend_metric_data);
111
+
112
+ RefCountedPtr<Subchannel> subchannel_;
113
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
114
+ ConnectivityWatcher* connectivity_watcher_;
115
+ Mutex mu_;
116
+ std::set<OrcaWatcher*> watchers_ ABSL_GUARDED_BY(mu_);
117
+ Duration report_interval_ ABSL_GUARDED_BY(mu_) = Duration::Infinity();
118
+ OrphanablePtr<SubchannelStreamClient> stream_client_ ABSL_GUARDED_BY(mu_);
119
+ };
120
+
121
+ // This watcher is returned to the LB policy and added to the
122
+ // client channel SubchannelWrapper.
123
+ class OrcaWatcher : public InternalSubchannelDataWatcherInterface {
124
+ public:
125
+ OrcaWatcher(Duration report_interval,
126
+ std::unique_ptr<OobBackendMetricWatcher> watcher)
127
+ : report_interval_(report_interval), watcher_(std::move(watcher)) {}
128
+ ~OrcaWatcher() override;
129
+
130
+ Duration report_interval() const { return report_interval_; }
131
+ OobBackendMetricWatcher* watcher() const { return watcher_.get(); }
132
+
133
+ // When the client channel sees this wrapper, it will pass it the real
134
+ // subchannel to use.
135
+ void SetSubchannel(Subchannel* subchannel) override;
136
+
137
+ private:
138
+ const Duration report_interval_;
139
+ std::unique_ptr<OobBackendMetricWatcher> watcher_;
140
+ RefCountedPtr<OrcaProducer> producer_;
141
+ };
142
+
143
+ //
144
+ // OrcaProducer::ConnectivityWatcher
145
+ //
146
+
147
+ class OrcaProducer::ConnectivityWatcher
148
+ : public Subchannel::ConnectivityStateWatcherInterface {
149
+ public:
150
+ explicit ConnectivityWatcher(WeakRefCountedPtr<OrcaProducer> producer)
151
+ : producer_(std::move(producer)),
152
+ interested_parties_(grpc_pollset_set_create()) {}
153
+
154
+ ~ConnectivityWatcher() override {
155
+ grpc_pollset_set_destroy(interested_parties_);
156
+ }
157
+
158
+ void OnConnectivityStateChange() override {
159
+ auto change = PopConnectivityStateChange();
160
+ producer_->OnConnectivityStateChange(change.state);
161
+ }
162
+
163
+ grpc_pollset_set* interested_parties() override {
164
+ return interested_parties_;
165
+ }
166
+
167
+ private:
168
+ WeakRefCountedPtr<OrcaProducer> producer_;
169
+ grpc_pollset_set* interested_parties_;
170
+ };
171
+
172
+ //
173
+ // OrcaProducer::OrcaStreamEventHandler
174
+ //
175
+
176
+ class OrcaProducer::OrcaStreamEventHandler
177
+ : public SubchannelStreamClient::CallEventHandler {
178
+ public:
179
+ OrcaStreamEventHandler(WeakRefCountedPtr<OrcaProducer> producer,
180
+ Duration report_interval)
181
+ : producer_(std::move(producer)), report_interval_(report_interval) {}
182
+
183
+ Slice GetPathLocked() override {
184
+ return Slice::FromStaticString(
185
+ "/xds.service.orca.v3.OpenRcaService/StreamCoreMetrics");
186
+ }
187
+
188
+ void OnCallStartLocked(SubchannelStreamClient* /*client*/) override {}
189
+
190
+ void OnRetryTimerStartLocked(SubchannelStreamClient* /*client*/) override {}
191
+
192
+ grpc_slice EncodeSendMessageLocked() override {
193
+ upb::Arena arena;
194
+ xds_service_orca_v3_OrcaLoadReportRequest* request =
195
+ xds_service_orca_v3_OrcaLoadReportRequest_new(arena.ptr());
196
+ gpr_timespec timespec = report_interval_.as_timespec();
197
+ auto* report_interval =
198
+ xds_service_orca_v3_OrcaLoadReportRequest_mutable_report_interval(
199
+ request, arena.ptr());
200
+ google_protobuf_Duration_set_seconds(report_interval, timespec.tv_sec);
201
+ google_protobuf_Duration_set_nanos(report_interval, timespec.tv_nsec);
202
+ size_t buf_length;
203
+ char* buf = xds_service_orca_v3_OrcaLoadReportRequest_serialize(
204
+ request, arena.ptr(), &buf_length);
205
+ grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
206
+ memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
207
+ return request_slice;
208
+ }
209
+
210
+ absl::Status RecvMessageReadyLocked(
211
+ SubchannelStreamClient* /*client*/,
212
+ absl::string_view serialized_message) override {
213
+ auto* allocator = new BackendMetricAllocator(producer_);
214
+ auto* backend_metric_data =
215
+ ParseBackendMetricData(serialized_message, allocator);
216
+ if (backend_metric_data == nullptr) {
217
+ delete allocator;
218
+ return absl::InvalidArgumentError("unable to parse Orca response");
219
+ }
220
+ allocator->AsyncNotifyWatchersAndDelete();
221
+ return absl::OkStatus();
222
+ }
223
+
224
+ void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* /*client*/,
225
+ grpc_status_code status) override {
226
+ if (status == GRPC_STATUS_UNIMPLEMENTED) {
227
+ static const char kErrorMessage[] =
228
+ "Orca stream returned UNIMPLEMENTED; disabling";
229
+ gpr_log(GPR_ERROR, kErrorMessage);
230
+ auto* channelz_node = producer_->subchannel_->channelz_node();
231
+ if (channelz_node != nullptr) {
232
+ channelz_node->AddTraceEvent(
233
+ channelz::ChannelTrace::Error,
234
+ grpc_slice_from_static_string(kErrorMessage));
235
+ }
236
+ }
237
+ }
238
+
239
+ private:
240
+ // This class acts as storage for the parsed backend metric data. It
241
+ // is injected into ParseBackendMetricData() as an allocator that
242
+ // returns internal storage. It then also acts as a place to hold
243
+ // onto the data during an async hop into the ExecCtx before sending
244
+ // notifications, which avoids lock inversion problems due to
245
+ // acquiring producer_->mu_ while holding the lock from inside of
246
+ // SubchannelStreamClient.
247
+ class BackendMetricAllocator : public BackendMetricAllocatorInterface {
248
+ public:
249
+ explicit BackendMetricAllocator(WeakRefCountedPtr<OrcaProducer> producer)
250
+ : producer_(std::move(producer)) {}
251
+
252
+ BackendMetricData* AllocateBackendMetricData() override {
253
+ return &backend_metric_data_;
254
+ }
255
+
256
+ char* AllocateString(size_t size) override {
257
+ char* string = static_cast<char*>(gpr_malloc(size));
258
+ string_storage_.emplace_back(string);
259
+ return string;
260
+ }
261
+
262
+ // Notifies watchers asynchronously and then deletes the
263
+ // BackendMetricAllocator object.
264
+ void AsyncNotifyWatchersAndDelete() {
265
+ GRPC_CLOSURE_INIT(&closure_, NotifyWatchersInExecCtx, this, nullptr);
266
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
267
+ }
268
+
269
+ private:
270
+ static void NotifyWatchersInExecCtx(void* arg,
271
+ grpc_error_handle /*error*/) {
272
+ auto* self = static_cast<BackendMetricAllocator*>(arg);
273
+ self->producer_->NotifyWatchers(self->backend_metric_data_);
274
+ delete self;
275
+ }
276
+
277
+ WeakRefCountedPtr<OrcaProducer> producer_;
278
+ BackendMetricData backend_metric_data_;
279
+ std::vector<UniquePtr<char>> string_storage_;
280
+ grpc_closure closure_;
281
+ };
282
+
283
+ WeakRefCountedPtr<OrcaProducer> producer_;
284
+ const Duration report_interval_;
285
+ };
286
+
287
+ //
288
+ // OrcaProducer
289
+ //
290
+
291
+ OrcaProducer::OrcaProducer(RefCountedPtr<Subchannel> subchannel)
292
+ : subchannel_(std::move(subchannel)) {
293
+ subchannel_->AddDataProducer(this);
294
+ connected_subchannel_ = subchannel_->connected_subchannel();
295
+ auto connectivity_watcher = MakeRefCounted<ConnectivityWatcher>(WeakRef());
296
+ connectivity_watcher_ = connectivity_watcher.get();
297
+ subchannel_->WatchConnectivityState(
298
+ connected_subchannel_ == nullptr ? GRPC_CHANNEL_IDLE : GRPC_CHANNEL_READY,
299
+ /*health_check_service_name=*/absl::nullopt,
300
+ std::move(connectivity_watcher));
301
+ }
302
+
303
+ void OrcaProducer::Orphan() {
304
+ {
305
+ MutexLock lock(&mu_);
306
+ stream_client_.reset();
307
+ }
308
+ subchannel_->CancelConnectivityStateWatch(
309
+ /*health_check_service_name=*/absl::nullopt, connectivity_watcher_);
310
+ subchannel_->RemoveDataProducer(this);
311
+ }
312
+
313
+ void OrcaProducer::AddWatcher(OrcaWatcher* watcher) {
314
+ MutexLock lock(&mu_);
315
+ watchers_.insert(watcher);
316
+ Duration watcher_interval = watcher->report_interval();
317
+ if (watcher_interval < report_interval_) {
318
+ report_interval_ = watcher_interval;
319
+ stream_client_.reset();
320
+ MaybeStartStreamLocked();
321
+ }
322
+ }
323
+
324
+ void OrcaProducer::RemoveWatcher(OrcaWatcher* watcher) {
325
+ MutexLock lock(&mu_);
326
+ watchers_.erase(watcher);
327
+ if (watchers_.empty()) {
328
+ stream_client_.reset();
329
+ return;
330
+ }
331
+ Duration new_interval = GetMinIntervalLocked();
332
+ if (new_interval < report_interval_) {
333
+ report_interval_ = new_interval;
334
+ stream_client_.reset();
335
+ MaybeStartStreamLocked();
336
+ }
337
+ }
338
+
339
+ Duration OrcaProducer::GetMinIntervalLocked() const {
340
+ Duration duration = Duration::Infinity();
341
+ for (OrcaWatcher* watcher : watchers_) {
342
+ Duration watcher_interval = watcher->report_interval();
343
+ if (watcher_interval < duration) duration = watcher_interval;
344
+ }
345
+ return duration;
346
+ }
347
+
348
+ void OrcaProducer::MaybeStartStreamLocked() {
349
+ if (connected_subchannel_ == nullptr) return;
350
+ stream_client_ = MakeOrphanable<SubchannelStreamClient>(
351
+ connected_subchannel_, subchannel_->pollset_set(),
352
+ absl::make_unique<OrcaStreamEventHandler>(WeakRef(), report_interval_),
353
+ GRPC_TRACE_FLAG_ENABLED(grpc_orca_client_trace) ? "OrcaClient" : nullptr);
354
+ }
355
+
356
+ void OrcaProducer::NotifyWatchers(
357
+ const BackendMetricData& backend_metric_data) {
358
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_orca_client_trace)) {
359
+ gpr_log(GPR_INFO, "OrcaProducer %p: reporting backend metrics to watchers",
360
+ this);
361
+ }
362
+ MutexLock lock(&mu_);
363
+ for (OrcaWatcher* watcher : watchers_) {
364
+ watcher->watcher()->OnBackendMetricReport(backend_metric_data);
365
+ }
366
+ }
367
+
368
+ void OrcaProducer::OnConnectivityStateChange(grpc_connectivity_state state) {
369
+ MutexLock lock(&mu_);
370
+ if (state == GRPC_CHANNEL_READY) {
371
+ connected_subchannel_ = subchannel_->connected_subchannel();
372
+ if (!watchers_.empty()) MaybeStartStreamLocked();
373
+ } else {
374
+ connected_subchannel_.reset();
375
+ stream_client_.reset();
376
+ }
377
+ }
378
+
379
+ //
380
+ // OrcaWatcher
381
+ //
382
+
383
+ OrcaWatcher::~OrcaWatcher() {
384
+ if (producer_ != nullptr) producer_->RemoveWatcher(this);
385
+ }
386
+
387
+ void OrcaWatcher::SetSubchannel(Subchannel* subchannel) {
388
+ // Check if our producer is already registered with the subchannel.
389
+ // If not, create a new one, which will register itself with the subchannel.
390
+ auto* p = static_cast<OrcaProducer*>(
391
+ subchannel->GetDataProducer(OrcaProducer::Type()));
392
+ if (p != nullptr) producer_ = p->RefIfNonZero();
393
+ if (producer_ == nullptr) {
394
+ producer_ = MakeRefCounted<OrcaProducer>(subchannel->Ref());
395
+ }
396
+ // Register ourself with the producer.
397
+ producer_->AddWatcher(this);
398
+ }
399
+
400
+ } // namespace
401
+
402
+ std::unique_ptr<SubchannelInterface::DataWatcherInterface>
403
+ MakeOobBackendMetricWatcher(Duration report_interval,
404
+ std::unique_ptr<OobBackendMetricWatcher> watcher) {
405
+ return absl::make_unique<OrcaWatcher>(report_interval, std::move(watcher));
406
+ }
407
+
408
+ } // namespace grpc_core