grpc 1.45.0 → 1.53.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 (1842) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +437 -254
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/endpoint_config.h +11 -5
  7. data/include/grpc/event_engine/event_engine.h +129 -39
  8. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  9. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  10. data/include/grpc/event_engine/memory_allocator.h +1 -16
  11. data/include/grpc/event_engine/port.h +1 -1
  12. data/include/grpc/event_engine/slice.h +306 -0
  13. data/include/grpc/event_engine/slice_buffer.h +159 -0
  14. data/include/grpc/fork.h +25 -1
  15. data/include/grpc/grpc.h +4 -14
  16. data/include/grpc/grpc_posix.h +1 -1
  17. data/include/grpc/grpc_security.h +11 -0
  18. data/include/grpc/impl/codegen/atm.h +3 -71
  19. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
  20. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
  21. data/include/grpc/impl/codegen/atm_windows.h +3 -108
  22. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  23. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  24. data/include/grpc/impl/codegen/compression_types.h +5 -83
  25. data/include/grpc/impl/codegen/connectivity_state.h +5 -21
  26. data/include/grpc/impl/codegen/fork.h +4 -25
  27. data/include/grpc/impl/codegen/gpr_types.h +4 -35
  28. data/include/grpc/impl/codegen/grpc_types.h +5 -797
  29. data/include/grpc/impl/codegen/log.h +3 -86
  30. data/include/grpc/impl/codegen/port_platform.h +3 -699
  31. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  32. data/include/grpc/impl/codegen/slice.h +4 -107
  33. data/include/grpc/impl/codegen/status.h +4 -131
  34. data/include/grpc/impl/codegen/sync.h +3 -42
  35. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  36. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  37. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  38. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  39. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  40. data/include/grpc/impl/compression_types.h +109 -0
  41. data/include/grpc/impl/connectivity_state.h +47 -0
  42. data/include/grpc/impl/grpc_types.h +827 -0
  43. data/include/grpc/impl/propagation_bits.h +54 -0
  44. data/include/grpc/impl/slice_type.h +112 -0
  45. data/include/grpc/load_reporting.h +1 -1
  46. data/include/grpc/module.modulemap +5 -1
  47. data/include/grpc/slice.h +1 -1
  48. data/include/grpc/status.h +131 -1
  49. data/include/grpc/support/atm.h +70 -1
  50. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  51. data/include/grpc/support/atm_gcc_sync.h +58 -1
  52. data/include/grpc/support/atm_windows.h +105 -1
  53. data/include/grpc/support/log.h +87 -1
  54. data/include/grpc/support/log_windows.h +1 -1
  55. data/include/grpc/support/port_platform.h +767 -1
  56. data/include/grpc/support/string_util.h +1 -1
  57. data/include/grpc/support/sync.h +35 -2
  58. data/include/grpc/support/sync_abseil.h +11 -1
  59. data/include/grpc/support/sync_custom.h +13 -1
  60. data/include/grpc/support/sync_generic.h +24 -1
  61. data/include/grpc/support/sync_posix.h +27 -1
  62. data/include/grpc/support/sync_windows.h +15 -1
  63. data/include/grpc/support/time.h +31 -6
  64. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
  65. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
  66. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
  67. data/src/core/ext/filters/census/grpc_context.cc +19 -17
  68. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
  69. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
  70. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  71. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +6 -4
  72. data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
  73. data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
  74. data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
  75. data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
  76. data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
  77. data/src/core/ext/filters/client_channel/client_channel.cc +557 -540
  78. data/src/core/ext/filters/client_channel/client_channel.h +70 -26
  79. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
  80. data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
  81. data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
  82. data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
  83. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
  84. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  85. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +33 -27
  86. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  87. data/src/core/ext/filters/client_channel/config_selector.h +29 -23
  88. data/src/core/ext/filters/client_channel/connector.h +19 -10
  89. data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
  90. data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
  91. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  92. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
  93. data/src/core/ext/filters/client_channel/health/health_check_client.cc +137 -582
  94. data/src/core/ext/filters/client_channel/health/health_check_client.h +29 -163
  95. data/src/core/ext/filters/client_channel/http_proxy.cc +130 -164
  96. data/src/core/ext/filters/client_channel/http_proxy.h +46 -22
  97. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  98. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +8 -5
  99. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
  100. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  101. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
  102. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
  103. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
  104. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
  105. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
  106. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
  107. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  108. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
  109. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  110. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +27 -22
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
  112. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
  113. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
  117. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  118. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
  119. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +478 -479
  120. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -409
  121. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
  122. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +618 -642
  123. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
  124. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
  125. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
  126. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
  127. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
  128. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +280 -248
  129. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +251 -187
  130. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  131. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +19 -15
  132. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
  133. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
  134. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +212 -216
  135. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +543 -584
  136. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
  137. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
  138. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
  139. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  140. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
  141. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
  142. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +579 -376
  143. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
  144. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
  145. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
  146. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
  147. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
  148. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  149. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +20 -19
  150. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  151. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
  152. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +86 -224
  153. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
  154. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
  155. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
  156. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +269 -0
  157. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +121 -0
  158. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
  159. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +413 -303
  160. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
  161. data/src/core/ext/filters/client_channel/retry_filter.cc +184 -166
  162. data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
  163. data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
  164. data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
  165. data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
  166. data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
  167. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
  168. data/src/core/ext/filters/client_channel/subchannel.cc +336 -388
  169. data/src/core/ext/filters/client_channel/subchannel.h +112 -82
  170. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  171. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  172. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
  173. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
  174. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  175. data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
  176. data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
  177. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +154 -372
  178. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +41 -9
  179. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  180. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +34 -13
  181. data/src/core/ext/filters/http/client/http_client_filter.cc +119 -477
  182. data/src/core/ext/filters/http/client/http_client_filter.h +55 -25
  183. data/src/core/ext/filters/http/client_authority_filter.cc +48 -58
  184. data/src/core/ext/filters/http/client_authority_filter.h +32 -28
  185. data/src/core/ext/filters/http/http_filters_plugin.cc +46 -52
  186. data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
  187. data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
  188. data/src/core/ext/filters/http/server/http_server_filter.cc +111 -385
  189. data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
  190. data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
  191. data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
  192. data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
  193. data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
  194. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
  195. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
  196. data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
  197. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +90 -202
  198. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
  199. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -0
  200. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  201. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  202. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  203. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  204. data/src/core/ext/transport/chttp2/alpn/alpn.h +24 -24
  205. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +186 -241
  206. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
  207. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +209 -215
  208. data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
  209. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
  210. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
  211. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +31 -30
  212. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +29 -29
  213. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +893 -1079
  214. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
  215. data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
  216. data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
  217. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
  218. data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
  219. data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
  220. data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
  221. data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
  222. data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
  223. data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
  224. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
  225. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
  226. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
  227. data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
  228. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
  229. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
  230. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +46 -77
  231. data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
  232. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
  233. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
  234. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
  235. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +169 -220
  236. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +59 -61
  237. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +4 -1
  238. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +14 -5
  239. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +114 -542
  240. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +31 -24
  241. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +75 -67
  242. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +70 -48
  243. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  244. data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
  245. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  246. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  247. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  248. data/src/core/ext/transport/chttp2/transport/huffsyms.h +21 -21
  249. data/src/core/ext/transport/chttp2/transport/internal.h +250 -298
  250. data/src/core/ext/transport/chttp2/transport/parsing.cc +365 -132
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
  252. data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
  253. data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
  254. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  255. data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
  256. data/src/core/ext/transport/chttp2/transport/writing.cc +144 -106
  257. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
  259. data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
  260. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  261. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +173 -73
  262. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +39 -36
  263. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +210 -85
  264. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +29 -344
  265. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +189 -1489
  266. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
  267. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
  268. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  269. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +38 -17
  270. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +9 -7
  271. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +56 -13
  272. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  273. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +24 -2
  274. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  275. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +19 -6
  276. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  277. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +15 -2
  278. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  279. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +229 -82
  280. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  281. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +16 -4
  282. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  283. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  284. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  285. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +26 -4
  286. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  287. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +379 -140
  288. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +140 -126
  289. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +824 -301
  290. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  291. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +114 -29
  292. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +195 -191
  293. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1042 -412
  294. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  295. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +16 -4
  296. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  297. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +171 -42
  298. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  299. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +517 -202
  300. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +61 -36
  301. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +333 -66
  302. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  303. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +20 -6
  304. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +93 -91
  305. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +615 -213
  306. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  307. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +417 -79
  308. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  309. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +20 -8
  310. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  311. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +16 -93
  312. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  313. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +38 -17
  314. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  315. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +447 -157
  316. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +98 -66
  317. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +545 -191
  318. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  319. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +33 -13
  320. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +108 -87
  321. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +502 -149
  322. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  323. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +9 -2
  324. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  325. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +42 -17
  326. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +24 -9
  327. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +110 -18
  328. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  329. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +64 -26
  330. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  331. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +20 -6
  332. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  333. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +118 -49
  334. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +39 -32
  335. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +242 -87
  336. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  337. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +226 -105
  338. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  339. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -4
  340. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +86 -53
  341. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +475 -141
  342. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  343. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +379 -160
  344. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +16 -12
  345. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +77 -16
  346. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +9 -6
  347. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +50 -8
  348. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  349. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +26 -6
  350. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  351. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +253 -102
  352. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  353. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +229 -92
  354. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +74 -55
  355. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +494 -160
  356. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +38 -30
  357. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +232 -124
  358. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +458 -351
  359. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2879 -947
  360. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  361. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +67 -22
  362. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +79 -54
  363. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +454 -133
  364. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +5 -4
  365. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +21 -2
  366. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  367. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +16 -4
  368. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  369. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +38 -14
  370. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  371. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +33 -14
  372. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  373. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +89 -38
  374. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
  375. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
  376. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  377. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +13 -4
  378. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  379. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +58 -21
  380. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  381. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  382. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  383. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +50 -16
  384. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +9 -8
  385. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +43 -10
  386. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  387. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +16 -8
  388. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  389. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +101 -38
  390. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  391. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +167 -71
  392. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +16 -8
  393. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +88 -16
  394. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +14 -11
  395. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +71 -17
  396. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  397. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  398. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +184 -144
  399. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1091 -361
  400. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  401. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  402. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
  403. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
  404. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
  405. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
  406. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
  407. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
  408. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  409. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  410. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +56 -48
  411. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +327 -130
  412. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  413. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +88 -31
  414. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +83 -56
  415. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +472 -136
  416. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  417. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +35 -13
  418. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  419. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  420. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +171 -54
  421. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +917 -134
  422. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  423. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +59 -25
  424. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -33
  425. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +205 -76
  426. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  427. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +23 -8
  428. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  429. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +62 -25
  430. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
  431. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
  432. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  433. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +36 -8
  434. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  435. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +55 -22
  436. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  437. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +26 -11
  438. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  439. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +30 -11
  440. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  441. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +20 -8
  442. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  443. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +58 -22
  444. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
  445. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
  446. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  447. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +82 -29
  448. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  449. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +49 -22
  450. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  451. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +99 -36
  452. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  453. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +118 -44
  454. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  455. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +120 -40
  456. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  457. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +46 -16
  458. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  459. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +9 -2
  460. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  461. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +25 -8
  462. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  463. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +36 -6
  464. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  465. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  466. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
  467. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  468. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +15 -2
  469. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  470. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +23 -6
  471. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  472. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  473. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  474. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +477 -185
  475. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  476. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +512 -182
  477. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  478. data/src/core/ext/upb-generated/google/api/http.upb.h +134 -49
  479. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  480. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +25 -9
  481. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  482. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +12 -2
  483. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +183 -181
  484. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1332 -488
  485. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  486. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +16 -6
  487. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  488. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  489. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  490. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +126 -46
  491. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  492. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +16 -6
  493. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  494. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +81 -18
  495. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  496. data/src/core/ext/upb-generated/google/rpc/status.upb.h +25 -9
  497. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  498. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +89 -30
  499. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  500. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +55 -14
  501. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  502. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +424 -169
  503. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  504. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +32 -8
  505. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  506. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +18 -4
  507. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  508. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +204 -76
  509. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  510. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +63 -22
  511. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  512. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  513. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  514. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +115 -16
  515. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  516. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +29 -4
  517. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  518. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  519. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  520. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +33 -8
  521. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  522. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +26 -4
  523. data/src/core/ext/upb-generated/validate/validate.upb.c +264 -253
  524. data/src/core/ext/upb-generated/validate/validate.upb.h +1974 -709
  525. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  526. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +115 -16
  527. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  528. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +29 -4
  529. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  530. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  531. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  532. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +94 -18
  533. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  534. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +26 -4
  535. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  536. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +9 -2
  537. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  538. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  539. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  540. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +50 -16
  541. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  542. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +33 -12
  543. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  544. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +16 -4
  545. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  546. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +27 -10
  547. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  548. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +83 -34
  549. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  550. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +22 -4
  551. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +14 -13
  552. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +84 -28
  553. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
  554. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  555. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  556. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  557. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  558. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  559. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  560. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  561. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  562. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  563. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  564. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +309 -121
  565. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  566. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  567. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  568. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +31 -12
  569. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  570. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +82 -29
  571. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  572. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  573. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  574. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  575. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -4
  576. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +16 -4
  577. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
  578. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  579. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  580. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
  581. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
  582. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  583. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  584. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
  585. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  586. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +149 -129
  587. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
  588. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  589. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
  590. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
  592. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  593. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  595. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  596. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +168 -154
  597. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  598. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
  599. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
  600. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  602. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
  603. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
  604. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  605. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  606. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
  607. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  608. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
  609. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -68
  611. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
  612. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -747
  613. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  615. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
  621. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +483 -445
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +211 -193
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  632. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
  633. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  634. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  635. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
  636. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
  637. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  638. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
  639. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
  640. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  641. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  642. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
  643. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  644. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  645. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  646. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  647. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  648. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  649. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  650. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  651. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  652. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  653. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  654. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  655. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  656. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  657. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  658. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  659. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  660. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  661. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  662. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  663. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  664. data/src/core/ext/xds/certificate_provider_store.cc +75 -3
  665. data/src/core/ext/xds/certificate_provider_store.h +30 -4
  666. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
  667. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
  668. data/src/core/ext/xds/upb_utils.h +3 -25
  669. data/src/core/ext/xds/xds_api.cc +106 -192
  670. data/src/core/ext/xds/xds_api.h +41 -39
  671. data/src/core/ext/xds/xds_bootstrap.cc +5 -537
  672. data/src/core/ext/xds/xds_bootstrap.h +42 -95
  673. data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
  674. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  675. data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
  676. data/src/core/ext/xds/xds_certificate_provider.h +36 -4
  677. data/src/core/ext/xds/xds_channel_args.h +3 -3
  678. data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
  679. data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
  680. data/src/core/ext/xds/xds_client.cc +885 -1360
  681. data/src/core/ext/xds/xds_client.h +69 -65
  682. data/src/core/ext/xds/xds_client_grpc.cc +235 -0
  683. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  684. data/src/core/ext/xds/xds_client_stats.cc +24 -25
  685. data/src/core/ext/xds/xds_client_stats.h +26 -24
  686. data/src/core/ext/xds/xds_cluster.cc +505 -247
  687. data/src/core/ext/xds/xds_cluster.h +69 -40
  688. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +132 -0
  689. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +97 -0
  690. data/src/core/ext/xds/xds_common_types.cc +238 -123
  691. data/src/core/ext/xds/xds_common_types.h +29 -16
  692. data/src/core/ext/xds/xds_endpoint.cc +266 -156
  693. data/src/core/ext/xds/xds_endpoint.h +19 -15
  694. data/src/core/ext/xds/xds_health_status.cc +80 -0
  695. data/src/core/ext/xds/xds_health_status.h +109 -0
  696. data/src/core/ext/xds/xds_http_fault_filter.cc +68 -59
  697. data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
  698. data/src/core/ext/xds/xds_http_filters.cc +70 -71
  699. data/src/core/ext/xds/xds_http_filters.h +73 -25
  700. data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
  701. data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
  702. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  703. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  704. data/src/core/ext/xds/xds_lb_policy_registry.cc +334 -0
  705. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  706. data/src/core/ext/xds/xds_listener.cc +573 -481
  707. data/src/core/ext/xds/xds_listener.h +57 -51
  708. data/src/core/ext/xds/xds_resource_type.h +28 -22
  709. data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
  710. data/src/core/ext/xds/xds_route_config.cc +638 -479
  711. data/src/core/ext/xds/xds_route_config.h +79 -42
  712. data/src/core/ext/xds/xds_routing.cc +21 -7
  713. data/src/core/ext/xds/xds_routing.h +17 -12
  714. data/src/core/ext/xds/xds_server_config_fetcher.cc +244 -200
  715. data/src/core/ext/xds/xds_transport.h +86 -0
  716. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  717. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  718. data/src/core/lib/address_utils/parse_address.cc +52 -52
  719. data/src/core/lib/address_utils/parse_address.h +46 -42
  720. data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
  721. data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
  722. data/src/core/lib/avl/avl.h +100 -13
  723. data/src/core/lib/backoff/backoff.cc +19 -21
  724. data/src/core/lib/backoff/backoff.h +21 -21
  725. data/src/core/lib/channel/call_finalization.h +6 -4
  726. data/src/core/lib/channel/call_tracer.h +27 -9
  727. data/src/core/lib/channel/channel_args.cc +268 -101
  728. data/src/core/lib/channel/channel_args.h +461 -56
  729. data/src/core/lib/channel/channel_args_preconditioning.cc +6 -11
  730. data/src/core/lib/channel/channel_args_preconditioning.h +7 -7
  731. data/src/core/lib/channel/channel_fwd.h +26 -0
  732. data/src/core/lib/channel/channel_stack.cc +92 -52
  733. data/src/core/lib/channel/channel_stack.h +186 -140
  734. data/src/core/lib/channel/channel_stack_builder.cc +26 -104
  735. data/src/core/lib/channel/channel_stack_builder.h +45 -31
  736. data/src/core/lib/channel/channel_stack_builder_impl.cc +126 -0
  737. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  738. data/src/core/lib/channel/channel_trace.cc +29 -36
  739. data/src/core/lib/channel/channel_trace.h +27 -24
  740. data/src/core/lib/channel/channelz.cc +50 -65
  741. data/src/core/lib/channel/channelz.h +50 -33
  742. data/src/core/lib/channel/channelz_registry.cc +28 -36
  743. data/src/core/lib/channel/channelz_registry.h +31 -30
  744. data/src/core/lib/channel/connected_channel.cc +1267 -78
  745. data/src/core/lib/channel/connected_channel.h +22 -23
  746. data/src/core/lib/channel/context.h +25 -21
  747. data/src/core/lib/channel/promise_based_filter.cc +2155 -303
  748. data/src/core/lib/channel/promise_based_filter.h +636 -122
  749. data/src/core/lib/channel/status_util.cc +64 -17
  750. data/src/core/lib/channel/status_util.h +38 -24
  751. data/src/core/lib/compression/compression.cc +24 -19
  752. data/src/core/lib/compression/compression_internal.cc +89 -70
  753. data/src/core/lib/compression/compression_internal.h +28 -27
  754. data/src/core/lib/compression/message_compress.cc +28 -26
  755. data/src/core/lib/compression/message_compress.h +28 -29
  756. data/src/core/lib/config/core_configuration.cc +8 -1
  757. data/src/core/lib/config/core_configuration.h +86 -39
  758. data/src/core/lib/debug/event_log.cc +88 -0
  759. data/src/core/lib/debug/event_log.h +81 -0
  760. data/src/core/lib/debug/histogram_view.cc +69 -0
  761. data/src/core/lib/debug/histogram_view.h +37 -0
  762. data/src/core/lib/debug/stats.cc +48 -152
  763. data/src/core/lib/debug/stats.h +50 -57
  764. data/src/core/lib/debug/stats_data.cc +302 -649
  765. data/src/core/lib/debug/stats_data.h +293 -548
  766. data/src/core/lib/debug/trace.cc +18 -20
  767. data/src/core/lib/debug/trace.h +27 -48
  768. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
  769. data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
  770. data/src/core/lib/event_engine/common_closures.h +71 -0
  771. data/src/core/lib/event_engine/default_event_engine.cc +99 -0
  772. data/src/core/lib/event_engine/default_event_engine.h +73 -0
  773. data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
  774. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
  775. data/src/core/lib/event_engine/event_engine.cc +3 -30
  776. data/src/core/lib/event_engine/executor/executor.h +38 -0
  777. data/src/core/lib/event_engine/forkable.cc +106 -0
  778. data/src/core/lib/event_engine/forkable.h +61 -0
  779. data/src/core/lib/event_engine/handle_containers.h +74 -0
  780. data/src/core/lib/event_engine/memory_allocator.cc +11 -3
  781. data/src/core/lib/event_engine/poller.h +62 -0
  782. data/src/core/lib/event_engine/posix.h +158 -0
  783. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
  784. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
  785. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -0
  786. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  787. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  788. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  789. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  790. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  791. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  792. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  793. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  794. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1305 -0
  795. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
  796. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
  797. data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
  798. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  799. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +289 -0
  800. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
  801. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -0
  802. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  803. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  804. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  805. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  806. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  807. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  808. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  809. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
  810. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  811. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  812. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  813. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  814. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  815. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  816. data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
  817. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  818. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  819. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  820. data/src/core/lib/event_engine/resolved_address.cc +23 -2
  821. data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
  822. data/src/core/lib/event_engine/shim.cc +56 -0
  823. data/src/core/lib/event_engine/shim.h +33 -0
  824. data/src/core/lib/event_engine/slice.cc +103 -0
  825. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  826. data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
  827. data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
  828. data/src/core/lib/event_engine/thread_local.cc +29 -0
  829. data/src/core/lib/event_engine/thread_local.h +32 -0
  830. data/src/core/lib/event_engine/thread_pool.cc +253 -0
  831. data/src/core/lib/event_engine/thread_pool.h +141 -0
  832. data/src/core/lib/event_engine/time_util.cc +30 -0
  833. data/src/core/lib/event_engine/time_util.h +32 -0
  834. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/event_engine/trace.cc} +9 -13
  835. data/src/core/lib/event_engine/trace.h +43 -0
  836. data/src/core/lib/event_engine/utils.cc +44 -0
  837. data/src/core/lib/event_engine/utils.h +44 -0
  838. data/src/core/lib/event_engine/windows/iocp.cc +140 -0
  839. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  840. data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
  841. data/src/core/lib/event_engine/windows/win_socket.h +129 -0
  842. data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
  843. data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
  844. data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
  845. data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
  846. data/src/core/lib/experiments/config.cc +161 -0
  847. data/src/core/lib/experiments/config.h +53 -0
  848. data/src/core/lib/experiments/experiments.cc +81 -0
  849. data/src/core/lib/experiments/experiments.h +117 -0
  850. data/src/core/lib/gpr/alloc.cc +19 -25
  851. data/src/core/lib/gpr/alloc.h +20 -20
  852. data/src/core/lib/gpr/atm.cc +17 -17
  853. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  854. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  855. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  856. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  857. data/src/core/lib/gpr/log.cc +30 -17
  858. data/src/core/lib/gpr/log_android.cc +22 -20
  859. data/src/core/lib/gpr/log_linux.cc +24 -24
  860. data/src/core/lib/gpr/log_posix.cc +20 -19
  861. data/src/core/lib/gpr/log_windows.cc +25 -25
  862. data/src/core/lib/gpr/spinlock.h +20 -20
  863. data/src/core/lib/gpr/string.cc +25 -24
  864. data/src/core/lib/gpr/string.h +61 -61
  865. data/src/core/lib/gpr/string_posix.cc +24 -24
  866. data/src/core/lib/gpr/string_util_windows.cc +25 -52
  867. data/src/core/lib/gpr/string_windows.cc +24 -24
  868. data/src/core/lib/gpr/sync.cc +25 -25
  869. data/src/core/lib/gpr/sync_abseil.cc +36 -40
  870. data/src/core/lib/gpr/sync_posix.cc +22 -34
  871. data/src/core/lib/gpr/sync_windows.cc +29 -27
  872. data/src/core/lib/gpr/time.cc +34 -30
  873. data/src/core/lib/gpr/time_posix.cc +41 -45
  874. data/src/core/lib/gpr/time_precise.cc +22 -22
  875. data/src/core/lib/gpr/time_precise.h +21 -22
  876. data/src/core/lib/gpr/time_windows.cc +35 -29
  877. data/src/core/lib/gpr/tmpfile.h +24 -24
  878. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  879. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  880. data/src/core/lib/gpr/tmpfile_windows.cc +28 -29
  881. data/src/core/lib/gpr/useful.h +83 -30
  882. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  883. data/src/core/lib/gprpp/atomic_utils.h +20 -20
  884. data/src/core/lib/gprpp/bitset.h +47 -17
  885. data/src/core/lib/gprpp/chunked_vector.h +7 -3
  886. data/src/core/lib/gprpp/construct_destruct.h +4 -3
  887. data/src/core/lib/gprpp/cpp_impl_of.h +7 -3
  888. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  889. data/src/core/lib/gprpp/crash.h +34 -0
  890. data/src/core/lib/gprpp/debug_location.h +60 -31
  891. data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
  892. data/src/core/lib/gprpp/env.h +53 -0
  893. data/src/core/lib/gprpp/env_linux.cc +80 -0
  894. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/gprpp/env_posix.cc} +25 -9
  895. data/src/core/lib/gprpp/env_windows.cc +56 -0
  896. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  897. data/src/core/lib/gprpp/examine_stack.h +21 -22
  898. data/src/core/lib/gprpp/fork.cc +58 -53
  899. data/src/core/lib/gprpp/fork.h +29 -35
  900. data/src/core/lib/gprpp/global_config.h +22 -24
  901. data/src/core/lib/gprpp/global_config_custom.h +20 -20
  902. data/src/core/lib/gprpp/global_config_env.cc +28 -25
  903. data/src/core/lib/gprpp/global_config_env.h +29 -27
  904. data/src/core/lib/gprpp/global_config_generic.h +21 -25
  905. data/src/core/lib/gprpp/host_port.cc +30 -26
  906. data/src/core/lib/gprpp/host_port.h +32 -31
  907. data/src/core/lib/gprpp/load_file.cc +75 -0
  908. data/src/core/lib/gprpp/load_file.h +33 -0
  909. data/src/core/lib/gprpp/manual_constructor.h +21 -89
  910. data/src/core/lib/gprpp/match.h +75 -0
  911. data/src/core/lib/gprpp/memory.h +22 -26
  912. data/src/core/lib/gprpp/mpscq.cc +17 -17
  913. data/src/core/lib/gprpp/mpscq.h +21 -21
  914. data/src/core/lib/gprpp/no_destruct.h +95 -0
  915. data/src/core/lib/gprpp/notification.h +67 -0
  916. data/src/core/lib/gprpp/orphanable.h +22 -25
  917. data/src/core/lib/gprpp/overload.h +59 -0
  918. data/src/core/lib/gprpp/packed_table.h +40 -0
  919. data/src/core/lib/gprpp/per_cpu.h +46 -0
  920. data/src/core/lib/gprpp/ref_counted.h +24 -24
  921. data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
  922. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  923. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  924. data/src/core/lib/gprpp/stat.h +3 -5
  925. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  926. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  927. data/src/core/lib/gprpp/status_helper.cc +56 -20
  928. data/src/core/lib/gprpp/status_helper.h +13 -5
  929. data/src/core/lib/gprpp/strerror.cc +43 -0
  930. data/src/core/lib/gprpp/strerror.h +29 -0
  931. data/src/core/lib/gprpp/sync.h +26 -24
  932. data/src/core/lib/gprpp/table.h +22 -4
  933. data/src/core/lib/gprpp/tchar.cc +49 -0
  934. data/src/core/lib/gprpp/tchar.h +33 -0
  935. data/src/core/lib/gprpp/thd.h +25 -28
  936. data/src/core/lib/gprpp/thd_posix.cc +33 -32
  937. data/src/core/lib/gprpp/thd_windows.cc +28 -26
  938. data/src/core/lib/gprpp/time.cc +64 -9
  939. data/src/core/lib/gprpp/time.h +79 -5
  940. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  941. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  942. data/src/core/lib/gprpp/time_util.cc +4 -0
  943. data/src/core/lib/gprpp/time_util.h +3 -3
  944. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  945. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  946. data/src/core/lib/gprpp/validation_errors.h +127 -0
  947. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  948. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
  949. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  950. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  951. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  952. data/src/core/lib/http/format_request.cc +54 -24
  953. data/src/core/lib/http/format_request.h +23 -21
  954. data/src/core/lib/http/httpcli.cc +139 -141
  955. data/src/core/lib/http/httpcli.h +86 -38
  956. data/src/core/lib/http/httpcli_security_connector.cc +53 -45
  957. data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
  958. data/src/core/lib/http/parser.cc +144 -85
  959. data/src/core/lib/http/parser.h +51 -35
  960. data/src/core/lib/iomgr/block_annotate.h +23 -23
  961. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  962. data/src/core/lib/iomgr/buffer_list.h +123 -101
  963. data/src/core/lib/iomgr/call_combiner.cc +32 -64
  964. data/src/core/lib/iomgr/call_combiner.h +24 -25
  965. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  966. data/src/core/lib/iomgr/cfstream_handle.h +25 -25
  967. data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
  968. data/src/core/lib/iomgr/closure.h +95 -58
  969. data/src/core/lib/iomgr/combiner.cc +20 -39
  970. data/src/core/lib/iomgr/combiner.h +20 -20
  971. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  972. data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
  973. data/src/core/lib/iomgr/endpoint.cc +21 -21
  974. data/src/core/lib/iomgr/endpoint.h +53 -51
  975. data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
  976. data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
  977. data/src/core/lib/iomgr/endpoint_pair.h +20 -20
  978. data/src/core/lib/iomgr/endpoint_pair_posix.cc +34 -27
  979. data/src/core/lib/iomgr/endpoint_pair_windows.cc +30 -21
  980. data/src/core/lib/iomgr/error.cc +51 -834
  981. data/src/core/lib/iomgr/error.h +45 -317
  982. data/src/core/lib/iomgr/error_cfstream.cc +18 -23
  983. data/src/core/lib/iomgr/error_cfstream.h +21 -21
  984. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  985. data/src/core/lib/iomgr/ev_apple.h +21 -21
  986. data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
  987. data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
  988. data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
  989. data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
  990. data/src/core/lib/iomgr/ev_posix.cc +88 -122
  991. data/src/core/lib/iomgr/ev_posix.h +93 -87
  992. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  993. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
  994. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
  995. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
  996. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
  997. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
  998. data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
  999. data/src/core/lib/iomgr/exec_ctx.cc +34 -56
  1000. data/src/core/lib/iomgr/exec_ctx.h +152 -177
  1001. data/src/core/lib/iomgr/executor.cc +21 -31
  1002. data/src/core/lib/iomgr/executor.h +27 -30
  1003. data/src/core/lib/iomgr/fork_posix.cc +31 -28
  1004. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  1005. data/src/core/lib/iomgr/gethostname.h +20 -20
  1006. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  1007. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  1008. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  1009. data/src/core/lib/iomgr/grpc_if_nametoindex.h +22 -22
  1010. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  1011. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  1012. data/src/core/lib/iomgr/internal_errqueue.cc +41 -48
  1013. data/src/core/lib/iomgr/internal_errqueue.h +84 -89
  1014. data/src/core/lib/iomgr/iocp_windows.cc +23 -23
  1015. data/src/core/lib/iomgr/iocp_windows.h +21 -21
  1016. data/src/core/lib/iomgr/iomgr.cc +25 -20
  1017. data/src/core/lib/iomgr/iomgr.h +35 -35
  1018. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  1019. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  1020. data/src/core/lib/iomgr/iomgr_internal.h +28 -28
  1021. data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
  1022. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -19
  1023. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  1024. data/src/core/lib/iomgr/load_file.cc +24 -27
  1025. data/src/core/lib/iomgr/load_file.h +22 -22
  1026. data/src/core/lib/iomgr/lockfree_event.cc +114 -131
  1027. data/src/core/lib/iomgr/lockfree_event.h +23 -23
  1028. data/src/core/lib/iomgr/nameser.h +86 -86
  1029. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  1030. data/src/core/lib/iomgr/polling_entity.h +29 -29
  1031. data/src/core/lib/iomgr/pollset.cc +17 -17
  1032. data/src/core/lib/iomgr/pollset.h +55 -55
  1033. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  1034. data/src/core/lib/iomgr/pollset_set.h +26 -28
  1035. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  1036. data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
  1037. data/src/core/lib/iomgr/pollset_windows.cc +32 -31
  1038. data/src/core/lib/iomgr/pollset_windows.h +24 -24
  1039. data/src/core/lib/iomgr/port.h +59 -39
  1040. data/src/core/lib/iomgr/python_util.h +24 -24
  1041. data/src/core/lib/iomgr/resolve_address.cc +34 -20
  1042. data/src/core/lib/iomgr/resolve_address.h +73 -43
  1043. data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
  1044. data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
  1045. data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
  1046. data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
  1047. data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
  1048. data/src/core/lib/iomgr/resolved_address.h +3 -3
  1049. data/src/core/lib/iomgr/sockaddr.h +25 -26
  1050. data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
  1051. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
  1052. data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
  1053. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  1054. data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
  1055. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  1056. data/src/core/lib/iomgr/socket_mutator.h +39 -39
  1057. data/src/core/lib/iomgr/socket_utils.h +27 -27
  1058. data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
  1059. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  1060. data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
  1061. data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
  1062. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  1063. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  1064. data/src/core/lib/iomgr/socket_windows.h +59 -61
  1065. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  1066. data/src/core/lib/iomgr/systemd_utils.h +33 -0
  1067. data/src/core/lib/iomgr/tcp_client.cc +28 -24
  1068. data/src/core/lib/iomgr/tcp_client.h +49 -38
  1069. data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
  1070. data/src/core/lib/iomgr/tcp_client_posix.cc +244 -106
  1071. data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
  1072. data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
  1073. data/src/core/lib/iomgr/tcp_posix.cc +562 -361
  1074. data/src/core/lib/iomgr/tcp_posix.h +32 -30
  1075. data/src/core/lib/iomgr/tcp_server.cc +33 -24
  1076. data/src/core/lib/iomgr/tcp_server.h +78 -69
  1077. data/src/core/lib/iomgr/tcp_server_posix.cc +402 -145
  1078. data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
  1079. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
  1080. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
  1081. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  1082. data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
  1083. data/src/core/lib/iomgr/tcp_windows.cc +116 -98
  1084. data/src/core/lib/iomgr/tcp_windows.h +34 -35
  1085. data/src/core/lib/iomgr/timer.cc +17 -17
  1086. data/src/core/lib/iomgr/timer.h +68 -68
  1087. data/src/core/lib/iomgr/timer_generic.cc +125 -134
  1088. data/src/core/lib/iomgr/timer_generic.h +21 -21
  1089. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  1090. data/src/core/lib/iomgr/timer_heap.h +22 -22
  1091. data/src/core/lib/iomgr/timer_manager.cc +31 -31
  1092. data/src/core/lib/iomgr/timer_manager.h +27 -27
  1093. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  1094. data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
  1095. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  1096. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
  1097. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  1098. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  1099. data/src/core/lib/iomgr/wakeup_fd_pipe.h +20 -20
  1100. data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
  1101. data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
  1102. data/src/core/lib/json/json.h +23 -27
  1103. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
  1104. data/src/core/lib/json/json_channel_args.h +42 -0
  1105. data/src/core/lib/json/json_object_loader.cc +217 -0
  1106. data/src/core/lib/json/json_object_loader.h +634 -0
  1107. data/src/core/lib/json/json_reader.cc +123 -90
  1108. data/src/core/lib/json/json_util.cc +14 -34
  1109. data/src/core/lib/json/json_util.h +19 -10
  1110. data/src/core/lib/json/json_writer.cc +62 -57
  1111. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
  1112. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
  1113. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1114. data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
  1115. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1116. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
  1117. data/src/core/lib/matchers/matchers.cc +12 -7
  1118. data/src/core/lib/matchers/matchers.h +5 -3
  1119. data/src/core/lib/promise/activity.cc +23 -8
  1120. data/src/core/lib/promise/activity.h +116 -58
  1121. data/src/core/lib/promise/arena_promise.h +115 -72
  1122. data/src/core/lib/promise/context.h +18 -11
  1123. data/src/core/lib/promise/detail/basic_join.h +197 -0
  1124. data/src/core/lib/promise/detail/basic_seq.h +28 -33
  1125. data/src/core/lib/promise/detail/promise_factory.h +61 -14
  1126. data/src/core/lib/promise/detail/promise_like.h +3 -3
  1127. data/src/core/lib/promise/detail/status.h +33 -4
  1128. data/src/core/lib/promise/detail/switch.h +21 -21
  1129. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
  1130. data/src/core/lib/promise/if.h +195 -0
  1131. data/src/core/lib/promise/interceptor_list.h +308 -0
  1132. data/src/core/lib/promise/intra_activity_waiter.h +55 -0
  1133. data/src/core/lib/promise/latch.h +191 -0
  1134. data/src/core/lib/promise/loop.h +13 -9
  1135. data/src/core/lib/promise/map.h +4 -6
  1136. data/src/core/lib/promise/pipe.h +608 -0
  1137. data/src/core/lib/promise/poll.h +129 -11
  1138. data/src/core/lib/promise/promise.h +5 -5
  1139. data/src/core/lib/promise/race.h +6 -10
  1140. data/src/core/lib/promise/seq.h +32 -14
  1141. data/src/core/lib/promise/sleep.cc +58 -42
  1142. data/src/core/lib/promise/sleep.h +44 -26
  1143. data/src/core/lib/promise/trace.cc +20 -0
  1144. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/promise/trace.h} +6 -8
  1145. data/src/core/lib/promise/try_join.h +82 -0
  1146. data/src/core/lib/promise/try_seq.h +41 -23
  1147. data/src/core/lib/resolver/resolver.cc +17 -59
  1148. data/src/core/lib/resolver/resolver.h +21 -18
  1149. data/src/core/lib/resolver/resolver_factory.h +11 -10
  1150. data/src/core/lib/resolver/resolver_registry.cc +17 -9
  1151. data/src/core/lib/resolver/resolver_registry.h +15 -5
  1152. data/src/core/lib/resolver/server_address.cc +46 -34
  1153. data/src/core/lib/resolver/server_address.h +36 -35
  1154. data/src/core/lib/resource_quota/api.cc +25 -29
  1155. data/src/core/lib/resource_quota/api.h +14 -5
  1156. data/src/core/lib/resource_quota/arena.cc +85 -27
  1157. data/src/core/lib/resource_quota/arena.h +197 -25
  1158. data/src/core/lib/resource_quota/memory_quota.cc +322 -101
  1159. data/src/core/lib/resource_quota/memory_quota.h +191 -56
  1160. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1161. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1162. data/src/core/lib/resource_quota/resource_quota.h +20 -4
  1163. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  1164. data/src/core/lib/resource_quota/thread_quota.h +7 -3
  1165. data/src/core/lib/resource_quota/trace.h +3 -3
  1166. data/src/core/lib/security/authorization/authorization_engine.h +3 -3
  1167. data/src/core/lib/security/authorization/authorization_policy_provider.h +17 -3
  1168. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
  1169. data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
  1170. data/src/core/lib/security/authorization/evaluate_args.h +9 -6
  1171. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
  1172. data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
  1173. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +26 -13
  1174. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +20 -10
  1175. data/src/core/lib/security/authorization/matchers.cc +44 -30
  1176. data/src/core/lib/security/authorization/matchers.h +10 -3
  1177. data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
  1178. data/src/core/lib/security/authorization/rbac_policy.h +10 -3
  1179. data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
  1180. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1181. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1182. data/src/core/lib/security/context/security_context.cc +27 -25
  1183. data/src/core/lib/security/context/security_context.h +64 -35
  1184. data/src/core/lib/security/credentials/alts/alts_credentials.cc +35 -27
  1185. data/src/core/lib/security/credentials/alts/alts_credentials.h +65 -57
  1186. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  1187. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
  1188. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  1189. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  1190. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  1191. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +20 -22
  1192. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  1193. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +38 -39
  1194. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
  1195. data/src/core/lib/security/credentials/call_creds_util.cc +13 -3
  1196. data/src/core/lib/security/credentials/call_creds_util.h +6 -5
  1197. data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
  1198. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
  1199. data/src/core/lib/security/credentials/composite/composite_credentials.cc +46 -41
  1200. data/src/core/lib/security/credentials/composite/composite_credentials.h +51 -38
  1201. data/src/core/lib/security/credentials/credentials.cc +23 -26
  1202. data/src/core/lib/security/credentials/credentials.h +91 -94
  1203. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
  1204. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
  1205. data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
  1206. data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
  1207. data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
  1208. data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
  1209. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
  1210. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
  1211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
  1212. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
  1213. data/src/core/lib/security/credentials/fake/fake_credentials.cc +48 -48
  1214. data/src/core/lib/security/credentials/fake/fake_credentials.h +57 -47
  1215. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
  1216. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +148 -112
  1217. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +35 -29
  1218. data/src/core/lib/security/credentials/iam/iam_credentials.cc +35 -24
  1219. data/src/core/lib/security/credentials/iam/iam_credentials.h +37 -23
  1220. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +32 -29
  1221. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1222. data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
  1223. data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
  1224. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +37 -30
  1225. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +41 -23
  1226. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
  1227. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
  1228. data/src/core/lib/security/credentials/local/local_credentials.cc +36 -30
  1229. data/src/core/lib/security/credentials/local/local_credentials.h +36 -26
  1230. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +107 -91
  1231. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +56 -27
  1232. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +42 -36
  1233. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +55 -29
  1234. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +48 -44
  1235. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +43 -23
  1236. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
  1237. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
  1238. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
  1239. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +69 -9
  1240. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +44 -4
  1241. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +75 -13
  1242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
  1243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +69 -98
  1244. data/src/core/lib/security/credentials/tls/tls_credentials.cc +55 -50
  1245. data/src/core/lib/security/credentials/tls/tls_credentials.h +33 -30
  1246. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1247. data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
  1248. data/src/core/lib/security/credentials/xds/xds_credentials.cc +77 -81
  1249. data/src/core/lib/security/credentials/xds/xds_credentials.h +50 -10
  1250. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
  1251. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
  1252. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
  1253. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
  1254. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
  1255. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
  1256. data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
  1257. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
  1258. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
  1259. data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
  1260. data/src/core/lib/security/security_connector/local/local_security_connector.cc +66 -49
  1261. data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
  1262. data/src/core/lib/security/security_connector/security_connector.cc +37 -35
  1263. data/src/core/lib/security/security_connector/security_connector.h +67 -45
  1264. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +59 -48
  1265. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
  1266. data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
  1267. data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
  1268. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  1269. data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
  1270. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -58
  1271. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
  1272. data/src/core/lib/security/transport/auth_filters.h +59 -30
  1273. data/src/core/lib/security/transport/client_auth_filter.cc +73 -48
  1274. data/src/core/lib/security/transport/secure_endpoint.cc +305 -181
  1275. data/src/core/lib/security/transport/secure_endpoint.h +29 -28
  1276. data/src/core/lib/security/transport/security_handshaker.cc +142 -110
  1277. data/src/core/lib/security/transport/security_handshaker.h +28 -23
  1278. data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
  1279. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  1280. data/src/core/lib/security/transport/tsi_error.h +20 -20
  1281. data/src/core/lib/security/util/json_util.cc +24 -24
  1282. data/src/core/lib/security/util/json_util.h +21 -23
  1283. data/src/core/lib/service_config/service_config.h +19 -12
  1284. data/src/core/lib/service_config/service_config_call_data.h +15 -5
  1285. data/src/core/lib/service_config/service_config_impl.cc +111 -150
  1286. data/src/core/lib/service_config/service_config_impl.h +27 -27
  1287. data/src/core/lib/service_config/service_config_parser.cc +16 -28
  1288. data/src/core/lib/service_config/service_config_parser.h +18 -19
  1289. data/src/core/lib/slice/b64.cc +26 -26
  1290. data/src/core/lib/slice/b64.h +34 -32
  1291. data/src/core/lib/slice/percent_encoding.cc +24 -30
  1292. data/src/core/lib/slice/percent_encoding.h +28 -34
  1293. data/src/core/lib/slice/slice.cc +59 -46
  1294. data/src/core/lib/slice/slice.h +64 -20
  1295. data/src/core/lib/slice/slice_buffer.cc +136 -76
  1296. data/src/core/lib/slice/slice_buffer.h +168 -0
  1297. data/src/core/lib/slice/slice_internal.h +38 -45
  1298. data/src/core/lib/slice/slice_refcount.cc +3 -18
  1299. data/src/core/lib/slice/slice_refcount.h +53 -19
  1300. data/src/core/lib/slice/slice_string_helpers.cc +17 -33
  1301. data/src/core/lib/slice/slice_string_helpers.h +23 -30
  1302. data/src/core/lib/surface/api_trace.cc +17 -17
  1303. data/src/core/lib/surface/api_trace.h +25 -25
  1304. data/src/core/lib/surface/builtins.cc +7 -2
  1305. data/src/core/lib/surface/builtins.h +3 -3
  1306. data/src/core/lib/surface/byte_buffer.cc +26 -21
  1307. data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
  1308. data/src/core/lib/surface/call.cc +3000 -1131
  1309. data/src/core/lib/surface/call.h +135 -56
  1310. data/src/core/lib/surface/call_details.cc +22 -23
  1311. data/src/core/lib/surface/call_log_batch.cc +25 -18
  1312. data/src/core/lib/surface/call_test_only.h +34 -31
  1313. data/src/core/lib/surface/call_trace.cc +123 -0
  1314. data/src/core/lib/surface/call_trace.h +30 -0
  1315. data/src/core/lib/surface/channel.cc +218 -284
  1316. data/src/core/lib/surface/channel.h +137 -90
  1317. data/src/core/lib/surface/channel_init.cc +19 -20
  1318. data/src/core/lib/surface/channel_init.h +24 -26
  1319. data/src/core/lib/surface/channel_ping.cc +26 -20
  1320. data/src/core/lib/surface/channel_stack_type.cc +21 -19
  1321. data/src/core/lib/surface/channel_stack_type.h +22 -22
  1322. data/src/core/lib/surface/completion_queue.cc +200 -222
  1323. data/src/core/lib/surface/completion_queue.h +42 -40
  1324. data/src/core/lib/surface/completion_queue_factory.cc +34 -28
  1325. data/src/core/lib/surface/completion_queue_factory.h +21 -23
  1326. data/src/core/lib/surface/event_string.cc +19 -24
  1327. data/src/core/lib/surface/event_string.h +21 -21
  1328. data/src/core/lib/surface/init.cc +57 -114
  1329. data/src/core/lib/surface/init.h +20 -28
  1330. data/src/core/lib/surface/init_internally.cc +25 -0
  1331. data/src/core/lib/surface/init_internally.h +37 -0
  1332. data/src/core/lib/surface/lame_client.cc +87 -130
  1333. data/src/core/lib/surface/lame_client.h +62 -24
  1334. data/src/core/lib/surface/metadata_array.cc +18 -17
  1335. data/src/core/lib/surface/server.cc +409 -188
  1336. data/src/core/lib/surface/server.h +57 -26
  1337. data/src/core/lib/surface/validate_metadata.cc +34 -48
  1338. data/src/core/lib/surface/validate_metadata.h +24 -21
  1339. data/src/core/lib/surface/version.cc +21 -21
  1340. data/src/core/lib/transport/bdp_estimator.cc +19 -19
  1341. data/src/core/lib/transport/bdp_estimator.h +22 -24
  1342. data/src/core/lib/transport/connectivity_state.cc +24 -23
  1343. data/src/core/lib/transport/connectivity_state.h +24 -25
  1344. data/src/core/lib/transport/error_utils.cc +57 -79
  1345. data/src/core/lib/transport/error_utils.h +29 -25
  1346. data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
  1347. data/src/core/lib/{channel → transport}/handshaker.h +59 -48
  1348. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1349. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1350. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1351. data/src/core/lib/transport/http2_errors.h +22 -22
  1352. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
  1353. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1354. data/src/core/lib/transport/metadata_batch.cc +305 -0
  1355. data/src/core/lib/transport/metadata_batch.h +269 -302
  1356. data/src/core/lib/transport/parsed_metadata.cc +2 -4
  1357. data/src/core/lib/transport/parsed_metadata.h +17 -8
  1358. data/src/core/lib/transport/pid_controller.cc +20 -20
  1359. data/src/core/lib/transport/pid_controller.h +27 -27
  1360. data/src/core/lib/transport/status_conversion.cc +23 -23
  1361. data/src/core/lib/transport/status_conversion.h +24 -24
  1362. data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
  1363. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1364. data/src/core/lib/transport/timeout_encoding.cc +24 -28
  1365. data/src/core/lib/transport/timeout_encoding.h +25 -21
  1366. data/src/core/lib/transport/transport.cc +97 -57
  1367. data/src/core/lib/transport/transport.h +252 -207
  1368. data/src/core/lib/transport/transport_fwd.h +20 -0
  1369. data/src/core/lib/transport/transport_impl.h +59 -48
  1370. data/src/core/lib/transport/transport_op_string.cc +40 -39
  1371. data/src/core/lib/uri/uri_parser.cc +12 -4
  1372. data/src/core/lib/uri/uri_parser.h +3 -5
  1373. data/src/core/plugin_registry/grpc_plugin_registry.cc +62 -73
  1374. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
  1375. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  1376. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  1377. data/src/core/tsi/alts/crypt/gsec.h +336 -336
  1378. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  1379. data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
  1380. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  1381. data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
  1382. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  1383. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
  1384. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  1385. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +82 -83
  1386. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  1387. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  1388. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  1389. data/src/core/tsi/alts/frame_protector/frame_handler.h +169 -169
  1390. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
  1391. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
  1392. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  1393. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
  1394. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +53 -45
  1395. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
  1396. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
  1397. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  1398. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
  1399. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  1400. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
  1401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  1402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +40 -41
  1403. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  1404. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +35 -36
  1405. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
  1406. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  1407. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +55 -56
  1408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  1409. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +141 -142
  1410. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
  1411. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
  1412. data/src/core/tsi/fake_transport_security.cc +146 -110
  1413. data/src/core/tsi/fake_transport_security.h +36 -30
  1414. data/src/core/tsi/local_transport_security.cc +43 -38
  1415. data/src/core/tsi/local_transport_security.h +33 -33
  1416. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
  1417. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
  1418. data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
  1419. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -19
  1420. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  1421. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +31 -22
  1422. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
  1423. data/src/core/tsi/ssl_transport_security.cc +356 -390
  1424. data/src/core/tsi/ssl_transport_security.h +210 -201
  1425. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  1426. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  1427. data/src/core/tsi/ssl_types.h +27 -27
  1428. data/src/core/tsi/transport_security.cc +44 -32
  1429. data/src/core/tsi/transport_security.h +49 -48
  1430. data/src/core/tsi/transport_security_grpc.cc +23 -22
  1431. data/src/core/tsi/transport_security_grpc.h +44 -41
  1432. data/src/core/tsi/transport_security_interface.h +346 -332
  1433. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
  1434. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -0
  1435. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  1436. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  1437. data/src/ruby/ext/grpc/ext-export.gcc +1 -1
  1438. data/src/ruby/ext/grpc/extconf.rb +98 -20
  1439. data/src/ruby/ext/grpc/rb_call.c +1 -0
  1440. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  1441. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  1442. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  1443. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  1444. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  1445. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +60 -60
  1446. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1447. data/src/ruby/lib/grpc/errors.rb +1 -1
  1448. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1449. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  1450. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1451. data/src/ruby/lib/grpc/version.rb +1 -1
  1452. data/src/ruby/pb/generate_proto_ruby.sh +1 -6
  1453. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1454. data/src/ruby/pb/test/client.rb +769 -0
  1455. data/src/ruby/pb/test/server.rb +252 -0
  1456. data/src/ruby/pb/test/xds_client.rb +415 -0
  1457. data/src/ruby/spec/channel_spec.rb +5 -43
  1458. data/src/ruby/spec/client_server_spec.rb +20 -8
  1459. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1460. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1461. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1462. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1463. data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
  1464. data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
  1465. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1466. data/third_party/abseil-cpp/absl/base/config.h +221 -39
  1467. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1468. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
  1469. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  1470. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
  1471. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1472. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  1473. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
  1474. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1475. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
  1476. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
  1477. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1478. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
  1479. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
  1480. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
  1481. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
  1482. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1483. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
  1484. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1485. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1486. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
  1487. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
  1488. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1489. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
  1490. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  1491. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
  1492. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  1493. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1494. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1495. data/third_party/abseil-cpp/absl/base/macros.h +4 -21
  1496. data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
  1497. data/third_party/abseil-cpp/absl/base/options.h +1 -7
  1498. data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
  1499. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1500. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1501. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1502. data/third_party/abseil-cpp/absl/container/fixed_array.h +9 -5
  1503. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1504. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  1505. data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
  1506. data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
  1507. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
  1508. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
  1509. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
  1510. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
  1511. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
  1512. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
  1513. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
  1514. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
  1515. data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
  1516. data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
  1517. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
  1518. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
  1519. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
  1520. data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
  1521. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
  1522. data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  1523. data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  1524. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
  1525. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  1526. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
  1527. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
  1528. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
  1529. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
  1530. data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  1531. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
  1532. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
  1533. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
  1534. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1535. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
  1536. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
  1537. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
  1538. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  1539. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
  1540. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1541. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  1542. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
  1543. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1544. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
  1545. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
  1546. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
  1547. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
  1548. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  1549. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
  1550. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
  1551. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
  1552. data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
  1553. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1554. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  1555. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
  1556. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  1557. data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
  1558. data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
  1559. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
  1560. data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
  1561. data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
  1562. data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
  1563. data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
  1564. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  1565. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
  1566. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  1567. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  1568. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  1569. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
  1570. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  1571. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  1572. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
  1573. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
  1574. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  1575. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  1576. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  1577. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  1578. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
  1579. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  1580. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  1581. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  1582. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  1583. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  1584. data/third_party/abseil-cpp/absl/random/random.h +6 -6
  1585. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  1586. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  1587. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  1588. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  1589. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  1590. data/third_party/abseil-cpp/absl/status/status.cc +193 -14
  1591. data/third_party/abseil-cpp/absl/status/status.h +24 -14
  1592. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  1593. data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
  1594. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1595. data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
  1596. data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
  1597. data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
  1598. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1599. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1600. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1601. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
  1602. data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
  1603. data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
  1604. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
  1605. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
  1606. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  1607. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1608. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  1609. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
  1610. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
  1611. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
  1612. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
  1613. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  1614. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  1615. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  1616. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  1617. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
  1618. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
  1619. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  1620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  1621. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
  1622. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
  1623. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
  1624. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
  1625. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
  1626. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  1627. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
  1628. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
  1629. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
  1630. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
  1631. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
  1632. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
  1633. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
  1634. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
  1635. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
  1636. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
  1637. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
  1638. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
  1639. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
  1640. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
  1641. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1642. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
  1643. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
  1644. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1645. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
  1646. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
  1647. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1648. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
  1649. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1650. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  1651. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  1652. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1653. data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
  1654. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  1655. data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
  1656. data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
  1657. data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
  1658. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1659. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1660. data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
  1661. data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
  1662. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1663. data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
  1664. data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
  1665. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1666. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1667. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
  1668. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
  1669. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
  1670. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1671. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1672. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  1673. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1674. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
  1675. data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
  1676. data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
  1677. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
  1678. data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
  1679. data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
  1680. data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
  1681. data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
  1682. data/third_party/abseil-cpp/absl/time/format.cc +2 -1
  1683. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1684. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  1685. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
  1686. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
  1687. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
  1688. data/third_party/abseil-cpp/absl/time/time.cc +2 -2
  1689. data/third_party/abseil-cpp/absl/time/time.h +268 -169
  1690. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1691. data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
  1692. data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
  1693. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1694. data/third_party/abseil-cpp/absl/types/span.h +31 -8
  1695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
  1696. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
  1697. data/third_party/re2/re2/bitstate.cc +3 -3
  1698. data/third_party/re2/re2/dfa.cc +13 -13
  1699. data/third_party/re2/re2/nfa.cc +4 -4
  1700. data/third_party/re2/re2/onepass.cc +2 -2
  1701. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  1702. data/third_party/re2/re2/prefilter_tree.h +3 -2
  1703. data/third_party/re2/re2/prog.cc +11 -2
  1704. data/third_party/re2/re2/prog.h +17 -5
  1705. data/third_party/re2/re2/re2.cc +6 -11
  1706. data/third_party/re2/re2/re2.h +1 -1
  1707. data/third_party/re2/re2/regexp.cc +1 -2
  1708. data/third_party/re2/re2/stringpiece.h +10 -7
  1709. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  1710. data/third_party/re2/re2/unicode_groups.cc +319 -151
  1711. data/third_party/re2/re2/walker-inl.h +3 -2
  1712. data/third_party/re2/util/mutex.h +4 -4
  1713. data/third_party/upb/upb/arena.c +277 -0
  1714. data/third_party/upb/upb/arena.h +225 -0
  1715. data/third_party/upb/upb/array.c +114 -0
  1716. data/third_party/upb/upb/array.h +83 -0
  1717. data/third_party/upb/upb/collections.h +36 -0
  1718. data/third_party/upb/upb/decode.c +188 -76
  1719. data/third_party/upb/upb/decode.h +1 -0
  1720. data/third_party/upb/upb/decode_fast.c +1 -1
  1721. data/third_party/upb/upb/def.c +128 -57
  1722. data/third_party/upb/upb/def.h +20 -4
  1723. data/third_party/upb/upb/def.hpp +7 -4
  1724. data/third_party/upb/upb/encode.c +43 -28
  1725. data/third_party/upb/upb/encode.h +16 -6
  1726. data/third_party/upb/upb/extension_registry.c +93 -0
  1727. data/third_party/upb/upb/extension_registry.h +84 -0
  1728. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  1729. data/third_party/upb/upb/internal/table.h +385 -0
  1730. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  1731. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1732. data/third_party/upb/upb/json_decode.c +1512 -0
  1733. data/third_party/upb/upb/json_decode.h +47 -0
  1734. data/third_party/upb/upb/json_encode.c +780 -0
  1735. data/third_party/upb/upb/json_encode.h +65 -0
  1736. data/third_party/upb/upb/map.c +108 -0
  1737. data/third_party/upb/upb/map.h +117 -0
  1738. data/third_party/upb/upb/message_value.h +66 -0
  1739. data/third_party/upb/upb/mini_table.c +1147 -0
  1740. data/third_party/upb/upb/mini_table.h +189 -0
  1741. data/third_party/upb/upb/mini_table.hpp +112 -0
  1742. data/third_party/upb/upb/msg.c +6 -68
  1743. data/third_party/upb/upb/msg.h +2 -46
  1744. data/third_party/upb/upb/msg_internal.h +77 -58
  1745. data/third_party/upb/upb/port_def.inc +10 -1
  1746. data/third_party/upb/upb/port_undef.inc +2 -0
  1747. data/third_party/upb/upb/reflection.c +2 -159
  1748. data/third_party/upb/upb/reflection.h +2 -112
  1749. data/third_party/upb/upb/status.c +86 -0
  1750. data/third_party/upb/upb/status.h +66 -0
  1751. data/third_party/upb/upb/table.c +12 -8
  1752. data/third_party/upb/upb/table_internal.h +3 -350
  1753. data/third_party/upb/upb/text_encode.c +3 -2
  1754. data/third_party/upb/upb/upb.c +4 -290
  1755. data/third_party/upb/upb/upb.h +8 -167
  1756. data/third_party/zlib/compress.c +3 -3
  1757. data/third_party/zlib/crc32.c +975 -292
  1758. data/third_party/zlib/crc32.h +9441 -436
  1759. data/third_party/zlib/deflate.c +183 -129
  1760. data/third_party/zlib/deflate.h +12 -15
  1761. data/third_party/zlib/gzguts.h +3 -2
  1762. data/third_party/zlib/gzlib.c +6 -4
  1763. data/third_party/zlib/gzread.c +8 -12
  1764. data/third_party/zlib/gzwrite.c +26 -14
  1765. data/third_party/zlib/infback.c +12 -8
  1766. data/third_party/zlib/inffast.c +14 -14
  1767. data/third_party/zlib/inflate.c +44 -10
  1768. data/third_party/zlib/inflate.h +3 -2
  1769. data/third_party/zlib/inftrees.c +3 -3
  1770. data/third_party/zlib/inftrees.h +1 -1
  1771. data/third_party/zlib/trees.c +85 -107
  1772. data/third_party/zlib/uncompr.c +2 -2
  1773. data/third_party/zlib/zconf.h +16 -3
  1774. data/third_party/zlib/zlib.h +129 -106
  1775. data/third_party/zlib/zutil.c +11 -9
  1776. data/third_party/zlib/zutil.h +13 -9
  1777. metadata +424 -135
  1778. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  1779. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1780. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1781. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1782. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1783. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1784. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1785. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1786. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
  1787. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  1788. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
  1789. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
  1790. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
  1791. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
  1792. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  1793. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -67
  1794. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1795. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1796. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1797. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1798. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1799. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1800. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1801. data/src/core/lib/gpr/env.h +0 -40
  1802. data/src/core/lib/gpr/env_linux.cc +0 -75
  1803. data/src/core/lib/gpr/env_posix.cc +0 -46
  1804. data/src/core/lib/gpr/env_windows.cc +0 -74
  1805. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1806. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1807. data/src/core/lib/gpr/string_windows.h +0 -32
  1808. data/src/core/lib/gpr/tls.h +0 -157
  1809. data/src/core/lib/gprpp/capture.h +0 -76
  1810. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
  1811. data/src/core/lib/iomgr/error_internal.h +0 -66
  1812. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  1813. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1814. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  1815. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1816. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  1817. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  1818. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  1819. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  1820. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  1821. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  1822. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1823. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1824. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1825. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1826. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1827. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1828. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1829. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1830. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  1831. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  1832. data/src/core/lib/profiling/basic_timers.cc +0 -295
  1833. data/src/core/lib/profiling/stap_timers.cc +0 -50
  1834. data/src/core/lib/profiling/timers.h +0 -94
  1835. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  1836. data/src/core/lib/slice/slice_api.cc +0 -39
  1837. data/src/core/lib/slice/slice_refcount_base.h +0 -61
  1838. data/src/core/lib/slice/slice_split.cc +0 -100
  1839. data/src/core/lib/slice/slice_split.h +0 -40
  1840. data/src/core/lib/transport/byte_stream.cc +0 -162
  1841. data/src/core/lib/transport/byte_stream.h +0 -166
  1842. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -19,47 +19,32 @@
19
19
  #include "src/core/ext/xds/xds_client.h"
20
20
 
21
21
  #include <inttypes.h>
22
- #include <limits.h>
23
22
  #include <string.h>
24
23
 
25
- #include "absl/container/inlined_vector.h"
26
- #include "absl/strings/str_format.h"
24
+ #include <algorithm>
25
+ #include <type_traits>
26
+
27
+ #include "absl/strings/match.h"
28
+ #include "absl/strings/str_cat.h"
27
29
  #include "absl/strings/str_join.h"
30
+ #include "absl/strings/str_split.h"
28
31
  #include "absl/strings/string_view.h"
32
+ #include "absl/strings/strip.h"
33
+ #include "absl/types/optional.h"
34
+ #include "upb/arena.h"
29
35
 
30
- #include <grpc/byte_buffer_reader.h>
31
- #include <grpc/grpc.h>
32
- #include <grpc/support/alloc.h>
33
- #include <grpc/support/time.h>
36
+ #include <grpc/event_engine/event_engine.h>
37
+ #include <grpc/support/log.h>
34
38
 
35
- #include "src/core/ext/filters/client_channel/client_channel.h"
36
39
  #include "src/core/ext/xds/xds_api.h"
37
40
  #include "src/core/ext/xds/xds_bootstrap.h"
38
- #include "src/core/ext/xds/xds_channel_args.h"
39
41
  #include "src/core/ext/xds/xds_client_stats.h"
40
- #include "src/core/ext/xds/xds_cluster.h"
41
- #include "src/core/ext/xds/xds_endpoint.h"
42
- #include "src/core/ext/xds/xds_http_filters.h"
43
- #include "src/core/ext/xds/xds_listener.h"
44
- #include "src/core/lib/address_utils/sockaddr_utils.h"
45
42
  #include "src/core/lib/backoff/backoff.h"
46
- #include "src/core/lib/channel/channel_args.h"
47
- #include "src/core/lib/channel/channel_stack.h"
48
- #include "src/core/lib/config/core_configuration.h"
49
- #include "src/core/lib/gpr/env.h"
50
- #include "src/core/lib/gpr/string.h"
51
- #include "src/core/lib/gprpp/memory.h"
43
+ #include "src/core/lib/gprpp/debug_location.h"
52
44
  #include "src/core/lib/gprpp/orphanable.h"
53
45
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
54
46
  #include "src/core/lib/gprpp/sync.h"
55
- #include "src/core/lib/iomgr/sockaddr.h"
56
- #include "src/core/lib/iomgr/timer.h"
57
- #include "src/core/lib/security/credentials/channel_creds_registry.h"
58
- #include "src/core/lib/slice/slice_internal.h"
59
- #include "src/core/lib/slice/slice_string_helpers.h"
60
- #include "src/core/lib/surface/call.h"
61
- #include "src/core/lib/surface/channel.h"
62
- #include "src/core/lib/surface/lame_client.h"
47
+ #include "src/core/lib/iomgr/exec_ctx.h"
63
48
  #include "src/core/lib/uri/uri_parser.h"
64
49
 
65
50
  #define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
@@ -70,56 +55,11 @@
70
55
 
71
56
  namespace grpc_core {
72
57
 
58
+ using ::grpc_event_engine::experimental::EventEngine;
59
+
73
60
  TraceFlag grpc_xds_client_trace(false, "xds_client");
74
61
  TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
75
62
 
76
- namespace {
77
-
78
- Mutex* g_mu = nullptr;
79
-
80
- const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
81
- XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
82
- char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
83
-
84
- } // namespace
85
-
86
- class XdsClient::Notifier {
87
- public:
88
- // Helper template function to invoke `OnError()` on a list of watchers \a
89
- // watchers_list within \a work_serializer. Works with all 4 resource types.
90
- template <class T>
91
- static void ScheduleNotifyWatchersOnErrorInWorkSerializer(
92
- XdsClient* xds_client, const T& watchers_list, grpc_error_handle error,
93
- const DebugLocation& location) {
94
- xds_client->work_serializer_.Schedule(
95
- [watchers_list, error]()
96
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
97
- for (const auto& p : watchers_list) {
98
- p.first->OnError(GRPC_ERROR_REF(error));
99
- }
100
- GRPC_ERROR_UNREF(error);
101
- },
102
- location);
103
- }
104
-
105
- // Helper template function to invoke `OnResourceDoesNotExist()` on a list of
106
- // watchers \a watchers_list within \a work_serializer. Works with all 4
107
- // resource types.
108
- template <class T>
109
- static void ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
110
- XdsClient* xds_client, const T& watchers_list,
111
- const DebugLocation& location) {
112
- xds_client->work_serializer_.Schedule(
113
- [watchers_list]()
114
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
115
- for (const auto& p : watchers_list) {
116
- p.first->OnResourceDoesNotExist();
117
- }
118
- },
119
- location);
120
- }
121
- };
122
-
123
63
  //
124
64
  // Internal class declarations
125
65
  //
@@ -132,9 +72,12 @@ class XdsClient::ChannelState::RetryableCall
132
72
  public:
133
73
  explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
134
74
 
135
- void Orphan() override;
75
+ // Disable thread-safety analysis because this method is called via
76
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
77
+ // through there.
78
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
136
79
 
137
- void OnCallFinishedLocked();
80
+ void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
138
81
 
139
82
  T* calld() const { return calld_.get(); }
140
83
  ChannelState* chand() const { return chand_.get(); }
@@ -143,9 +86,9 @@ class XdsClient::ChannelState::RetryableCall
143
86
 
144
87
  private:
145
88
  void StartNewCallLocked();
146
- void StartRetryTimerLocked();
147
- static void OnRetryTimer(void* arg, grpc_error_handle error);
148
- void OnRetryTimerLocked(grpc_error_handle error);
89
+ void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
90
+
91
+ void OnRetryTimer();
149
92
 
150
93
  // The wrapped xds call that talks to the xds server. It's instantiated
151
94
  // every time we start a new call. It's null during call retry backoff.
@@ -155,9 +98,8 @@ class XdsClient::ChannelState::RetryableCall
155
98
 
156
99
  // Retry state.
157
100
  BackOff backoff_;
158
- grpc_timer retry_timer_;
159
- grpc_closure on_retry_timer_;
160
- bool retry_timer_callback_pending_ = false;
101
+ absl::optional<EventEngine::TaskHandle> timer_handle_
102
+ ABSL_GUARDED_BY(&XdsClient::mu_);
161
103
 
162
104
  bool shutting_down_ = false;
163
105
  };
@@ -168,7 +110,6 @@ class XdsClient::ChannelState::AdsCallState
168
110
  public:
169
111
  // The ctor and dtor should not be used directly.
170
112
  explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
171
- ~AdsCallState() override;
172
113
 
173
114
  void Orphan() override;
174
115
 
@@ -177,7 +118,8 @@ class XdsClient::ChannelState::AdsCallState
177
118
  XdsClient* xds_client() const { return chand()->xds_client(); }
178
119
  bool seen_response() const { return seen_response_; }
179
120
 
180
- void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name)
121
+ void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name,
122
+ bool delay_send)
181
123
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
182
124
  void UnsubscribeLocked(const XdsResourceType* type,
183
125
  const XdsResourceName& name, bool delay_unsubscription)
@@ -205,110 +147,159 @@ class XdsClient::ChannelState::AdsCallState
205
147
  absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
206
148
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
207
149
 
208
- void ParseResource(const XdsEncodingContext& context, size_t idx,
209
- absl::string_view type_url,
150
+ void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
151
+ absl::string_view resource_name,
210
152
  absl::string_view serialized_resource) override
211
153
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
212
154
 
155
+ void ResourceWrapperParsingFailed(size_t idx) override;
156
+
213
157
  Result TakeResult() { return std::move(result_); }
214
158
 
215
159
  private:
216
160
  XdsClient* xds_client() const { return ads_call_state_->xds_client(); }
217
161
 
218
162
  AdsCallState* ads_call_state_;
219
- const Timestamp update_time_ = ExecCtx::Get()->Now();
163
+ const Timestamp update_time_ = Timestamp::Now();
220
164
  Result result_;
221
165
  };
222
166
 
223
167
  class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
224
168
  public:
225
169
  ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
226
- : type_(type), name_(name) {
227
- GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
228
- grpc_schedule_on_exec_ctx);
229
- }
170
+ : type_(type), name_(name) {}
230
171
 
231
- void Orphan() override {
172
+ // Disable thread-safety analysis because this method is called via
173
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
174
+ // through there.
175
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
232
176
  MaybeCancelTimer();
233
177
  Unref(DEBUG_LOCATION, "Orphan");
234
178
  }
235
179
 
236
- void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld) {
237
- if (timer_started_) return;
238
- timer_started_ = true;
239
- ads_calld_ = std::move(ads_calld);
240
- Ref(DEBUG_LOCATION, "timer").release();
241
- timer_pending_ = true;
242
- grpc_timer_init(
243
- &timer_,
244
- ExecCtx::Get()->Now() + ads_calld_->xds_client()->request_timeout_,
245
- &timer_callback_);
180
+ void MarkSubscriptionSendStarted()
181
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
182
+ subscription_sent_ = true;
246
183
  }
247
184
 
248
- void MaybeCancelTimer() {
249
- if (timer_pending_) {
250
- grpc_timer_cancel(&timer_);
251
- timer_pending_ = false;
252
- }
185
+ void MaybeMarkSubscriptionSendComplete(
186
+ RefCountedPtr<AdsCallState> ads_calld)
187
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
188
+ if (subscription_sent_) MaybeStartTimer(std::move(ads_calld));
253
189
  }
254
190
 
255
- private:
256
- static void OnTimer(void* arg, grpc_error_handle error) {
257
- ResourceTimer* self = static_cast<ResourceTimer*>(arg);
258
- {
259
- MutexLock lock(&self->ads_calld_->xds_client()->mu_);
260
- self->OnTimerLocked(GRPC_ERROR_REF(error));
191
+ void MarkSeen() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
192
+ resource_seen_ = true;
193
+ MaybeCancelTimer();
194
+ }
195
+
196
+ void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
197
+ if (timer_handle_.has_value() &&
198
+ ads_calld_->xds_client()->engine()->Cancel(*timer_handle_)) {
199
+ timer_handle_.reset();
261
200
  }
262
- self->ads_calld_->xds_client()->work_serializer_.DrainQueue();
263
- self->ads_calld_.reset();
264
- self->Unref(DEBUG_LOCATION, "timer");
265
201
  }
266
202
 
267
- void OnTimerLocked(grpc_error_handle error)
203
+ private:
204
+ void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld)
268
205
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
269
- if (error == GRPC_ERROR_NONE && timer_pending_) {
270
- timer_pending_ = false;
271
- grpc_error_handle watcher_error =
272
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
273
- "timeout obtaining resource {type=%s name=%s} from xds server",
274
- type_->type_url(),
206
+ // Don't start timer if we've already either seen the resource or
207
+ // marked it as non-existing.
208
+ // Note: There are edge cases where we can have seen the resource
209
+ // before we have sent the initial subscription request, such as
210
+ // when we unsubscribe and then resubscribe to a given resource
211
+ // and then get a response containing that resource, all while a
212
+ // send_message op is in flight.
213
+ if (resource_seen_) return;
214
+ // Don't start timer if we haven't yet sent the initial subscription
215
+ // request for the resource.
216
+ if (!subscription_sent_) return;
217
+ // Don't start timer if it's already running.
218
+ if (timer_handle_.has_value()) return;
219
+ // Check if we already have a cached version of this resource
220
+ // (i.e., if this is the initial request for the resource after an
221
+ // ADS stream restart). If so, we don't start the timer, because
222
+ // (a) we already have the resource and (b) the server may
223
+ // optimize by not resending the resource that we already have.
224
+ auto& authority_state =
225
+ ads_calld->xds_client()->authority_state_map_[name_.authority];
226
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
227
+ if (state.resource != nullptr) return;
228
+ // Start timer.
229
+ ads_calld_ = std::move(ads_calld);
230
+ timer_handle_ = ads_calld_->xds_client()->engine()->RunAfter(
231
+ ads_calld_->xds_client()->request_timeout_,
232
+ [self = Ref(DEBUG_LOCATION, "timer")]() {
233
+ ApplicationCallbackExecCtx callback_exec_ctx;
234
+ ExecCtx exec_ctx;
235
+ self->OnTimer();
236
+ });
237
+ }
238
+
239
+ void OnTimer() {
240
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
241
+ gpr_log(GPR_INFO,
242
+ "[xds_client %p] xds server %s: timeout obtaining resource "
243
+ "{type=%s name=%s} from xds server",
244
+ ads_calld_->xds_client(),
245
+ ads_calld_->chand()->server_.server_uri().c_str(),
246
+ std::string(type_->type_url()).c_str(),
275
247
  XdsClient::ConstructFullXdsResourceName(
276
- name_.authority, type_->type_url(), name_.key)));
277
- watcher_error = grpc_error_set_int(
278
- watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
279
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
280
- gpr_log(GPR_INFO, "[xds_client %p] xds server %s: %s",
281
- ads_calld_->xds_client(),
282
- ads_calld_->chand()->server_.server_uri.c_str(),
283
- grpc_error_std_string(watcher_error).c_str());
284
- }
248
+ name_.authority, type_->type_url(), name_.key)
249
+ .c_str());
250
+ }
251
+ {
252
+ MutexLock lock(&ads_calld_->xds_client()->mu_);
253
+ timer_handle_.reset();
254
+ resource_seen_ = true;
285
255
  auto& authority_state =
286
256
  ads_calld_->xds_client()->authority_state_map_[name_.authority];
287
257
  ResourceState& state = authority_state.resource_map[type_][name_.key];
288
258
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
289
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
290
- ads_calld_->xds_client(), state.watchers, watcher_error,
291
- DEBUG_LOCATION);
259
+ ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
260
+ state.watchers);
292
261
  }
293
- GRPC_ERROR_UNREF(error);
262
+ ads_calld_->xds_client()->work_serializer_.DrainQueue();
263
+ ads_calld_.reset();
294
264
  }
295
265
 
296
266
  const XdsResourceType* type_;
297
267
  const XdsResourceName name_;
298
268
 
299
269
  RefCountedPtr<AdsCallState> ads_calld_;
300
- bool timer_started_ = false;
301
- bool timer_pending_ = false;
302
- grpc_timer timer_;
303
- grpc_closure timer_callback_;
270
+ // True if we have sent the initial subscription request for this
271
+ // resource on this ADS stream.
272
+ bool subscription_sent_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
273
+ // True if we have either (a) seen the resource in a response on this
274
+ // stream or (b) declared the resource to not exist due to the timer
275
+ // firing.
276
+ bool resource_seen_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
277
+ absl::optional<EventEngine::TaskHandle> timer_handle_
278
+ ABSL_GUARDED_BY(&XdsClient::mu_);
304
279
  };
305
280
 
306
- struct ResourceTypeState {
307
- ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
281
+ class StreamEventHandler
282
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
283
+ public:
284
+ explicit StreamEventHandler(RefCountedPtr<AdsCallState> ads_calld)
285
+ : ads_calld_(std::move(ads_calld)) {}
308
286
 
309
- // Nonce and error for this resource type.
287
+ void OnRequestSent(bool ok) override { ads_calld_->OnRequestSent(ok); }
288
+ void OnRecvMessage(absl::string_view payload) override {
289
+ ads_calld_->OnRecvMessage(payload);
290
+ }
291
+ void OnStatusReceived(absl::Status status) override {
292
+ ads_calld_->OnStatusReceived(std::move(status));
293
+ }
294
+
295
+ private:
296
+ RefCountedPtr<AdsCallState> ads_calld_;
297
+ };
298
+
299
+ struct ResourceTypeState {
300
+ // Nonce and status for this resource type.
310
301
  std::string nonce;
311
- grpc_error_handle error = GRPC_ERROR_NONE;
302
+ absl::Status status;
312
303
 
313
304
  // Subscribed resources of this type.
314
305
  std::map<std::string /*authority*/,
@@ -319,47 +310,27 @@ class XdsClient::ChannelState::AdsCallState
319
310
  void SendMessageLocked(const XdsResourceType* type)
320
311
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
321
312
 
322
- static void OnRequestSent(void* arg, grpc_error_handle error);
323
- void OnRequestSentLocked(grpc_error_handle error)
324
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
325
- static void OnResponseReceived(void* arg, grpc_error_handle error);
326
- bool OnResponseReceivedLocked()
327
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
328
- static void OnStatusReceived(void* arg, grpc_error_handle error);
329
- void OnStatusReceivedLocked(grpc_error_handle error)
330
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
313
+ void OnRequestSent(bool ok);
314
+ void OnRecvMessage(absl::string_view payload);
315
+ void OnStatusReceived(absl::Status status);
331
316
 
332
317
  bool IsCurrentCallOnChannel() const;
333
318
 
334
319
  // Constructs a list of resource names of a given type for an ADS
335
320
  // request. Also starts the timer for each resource if needed.
336
- std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type);
321
+ std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type)
322
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
337
323
 
338
324
  // The owning RetryableCall<>.
339
325
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
340
326
 
327
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
328
+
341
329
  bool sent_initial_message_ = false;
342
330
  bool seen_response_ = false;
343
331
 
344
- // Always non-NULL.
345
- grpc_call* call_;
346
-
347
- // recv_initial_metadata
348
- grpc_metadata_array initial_metadata_recv_;
349
-
350
- // send_message
351
- grpc_byte_buffer* send_message_payload_ = nullptr;
352
- grpc_closure on_request_sent_;
353
-
354
- // recv_message
355
- grpc_byte_buffer* recv_message_payload_ = nullptr;
356
- grpc_closure on_response_received_;
357
-
358
- // recv_trailing_metadata
359
- grpc_metadata_array trailing_metadata_recv_;
360
- grpc_status_code status_code_;
361
- grpc_slice status_details_;
362
- grpc_closure on_status_received_;
332
+ const XdsResourceType* send_message_pending_
333
+ ABSL_GUARDED_BY(&XdsClient::mu_) = nullptr;
363
334
 
364
335
  // Resource types for which requests need to be sent.
365
336
  std::set<const XdsResourceType*> buffered_requests_;
@@ -374,11 +345,11 @@ class XdsClient::ChannelState::LrsCallState
374
345
  public:
375
346
  // The ctor and dtor should not be used directly.
376
347
  explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
377
- ~LrsCallState() override;
378
348
 
379
349
  void Orphan() override;
380
350
 
381
- void MaybeStartReportingLocked();
351
+ void MaybeStartReportingLocked()
352
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
382
353
 
383
354
  RetryableCall<LrsCallState>* parent() { return parent_.get(); }
384
355
  ChannelState* chand() const { return parent_->chand(); }
@@ -386,30 +357,44 @@ class XdsClient::ChannelState::LrsCallState
386
357
  bool seen_response() const { return seen_response_; }
387
358
 
388
359
  private:
360
+ class StreamEventHandler
361
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
362
+ public:
363
+ explicit StreamEventHandler(RefCountedPtr<LrsCallState> lrs_calld)
364
+ : lrs_calld_(std::move(lrs_calld)) {}
365
+
366
+ void OnRequestSent(bool ok) override { lrs_calld_->OnRequestSent(ok); }
367
+ void OnRecvMessage(absl::string_view payload) override {
368
+ lrs_calld_->OnRecvMessage(payload);
369
+ }
370
+ void OnStatusReceived(absl::Status status) override {
371
+ lrs_calld_->OnStatusReceived(std::move(status));
372
+ }
373
+
374
+ private:
375
+ RefCountedPtr<LrsCallState> lrs_calld_;
376
+ };
377
+
389
378
  // Reports client-side load stats according to a fixed interval.
390
379
  class Reporter : public InternallyRefCounted<Reporter> {
391
380
  public:
392
381
  Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
393
382
  : parent_(std::move(parent)), report_interval_(report_interval) {
394
- GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
395
- grpc_schedule_on_exec_ctx);
396
- GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
397
- grpc_schedule_on_exec_ctx);
398
383
  ScheduleNextReportLocked();
399
384
  }
400
385
 
401
- void Orphan() override;
386
+ // Disable thread-safety analysis because this method is called via
387
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
388
+ // through there.
389
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
390
+
391
+ void OnReportDoneLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
402
392
 
403
393
  private:
404
394
  void ScheduleNextReportLocked()
405
395
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
406
- static void OnNextReportTimer(void* arg, grpc_error_handle error);
407
- bool OnNextReportTimerLocked(grpc_error_handle error)
408
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
396
+ bool OnNextReportTimer();
409
397
  bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
410
- static void OnReportDone(void* arg, grpc_error_handle error);
411
- bool OnReportDoneLocked(grpc_error_handle error)
412
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
413
398
 
414
399
  bool IsCurrentReporterOnCall() const {
415
400
  return this == parent_->reporter_.get();
@@ -422,47 +407,23 @@ class XdsClient::ChannelState::LrsCallState
422
407
  // The load reporting state.
423
408
  const Duration report_interval_;
424
409
  bool last_report_counters_were_zero_ = false;
425
- bool next_report_timer_callback_pending_ = false;
426
- grpc_timer next_report_timer_;
427
- grpc_closure on_next_report_timer_;
428
- grpc_closure on_report_done_;
410
+ absl::optional<EventEngine::TaskHandle> timer_handle_
411
+ ABSL_GUARDED_BY(&XdsClient::mu_);
429
412
  };
430
413
 
431
- static void OnInitialRequestSent(void* arg, grpc_error_handle error);
432
- void OnInitialRequestSentLocked()
433
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
434
- static void OnResponseReceived(void* arg, grpc_error_handle error);
435
- bool OnResponseReceivedLocked()
436
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
437
- static void OnStatusReceived(void* arg, grpc_error_handle error);
438
- void OnStatusReceivedLocked(grpc_error_handle error)
439
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
414
+ void OnRequestSent(bool ok);
415
+ void OnRecvMessage(absl::string_view payload);
416
+ void OnStatusReceived(absl::Status status);
440
417
 
441
418
  bool IsCurrentCallOnChannel() const;
442
419
 
443
420
  // The owning RetryableCall<>.
444
421
  RefCountedPtr<RetryableCall<LrsCallState>> parent_;
445
- bool seen_response_ = false;
446
-
447
- // Always non-NULL.
448
- grpc_call* call_;
449
422
 
450
- // recv_initial_metadata
451
- grpc_metadata_array initial_metadata_recv_;
423
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
452
424
 
453
- // send_message
454
- grpc_byte_buffer* send_message_payload_ = nullptr;
455
- grpc_closure on_initial_request_sent_;
456
-
457
- // recv_message
458
- grpc_byte_buffer* recv_message_payload_ = nullptr;
459
- grpc_closure on_response_received_;
460
-
461
- // recv_trailing_metadata
462
- grpc_metadata_array trailing_metadata_recv_;
463
- grpc_status_code status_code_;
464
- grpc_slice status_details_;
465
- grpc_closure on_status_received_;
425
+ bool seen_response_ = false;
426
+ bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
466
427
 
467
428
  // Load reporting state.
468
429
  bool send_all_clusters_ = false;
@@ -471,58 +432,10 @@ class XdsClient::ChannelState::LrsCallState
471
432
  OrphanablePtr<Reporter> reporter_;
472
433
  };
473
434
 
474
- //
475
- // XdsClient::ChannelState::StateWatcher
476
- //
477
-
478
- class XdsClient::ChannelState::StateWatcher
479
- : public AsyncConnectivityStateWatcherInterface {
480
- public:
481
- explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
482
- : parent_(std::move(parent)) {}
483
-
484
- private:
485
- void OnConnectivityStateChange(grpc_connectivity_state new_state,
486
- const absl::Status& status) override {
487
- {
488
- MutexLock lock(&parent_->xds_client_->mu_);
489
- if (!parent_->shutting_down_ &&
490
- new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
491
- // In TRANSIENT_FAILURE. Notify all watchers of error.
492
- gpr_log(GPR_INFO,
493
- "[xds_client %p] xds channel for server %s in "
494
- "state TRANSIENT_FAILURE: %s",
495
- parent_->xds_client(), parent_->server_.server_uri.c_str(),
496
- status.ToString().c_str());
497
- parent_->xds_client_->NotifyOnErrorLocked(
498
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
499
- "xds channel in TRANSIENT_FAILURE, connectivity error: ",
500
- status.ToString())));
501
- }
502
- }
503
- parent_->xds_client()->work_serializer_.DrainQueue();
504
- }
505
-
506
- WeakRefCountedPtr<ChannelState> parent_;
507
- };
508
-
509
435
  //
510
436
  // XdsClient::ChannelState
511
437
  //
512
438
 
513
- namespace {
514
-
515
- grpc_channel* CreateXdsChannel(grpc_channel_args* args,
516
- const XdsBootstrap::XdsServer& server) {
517
- RefCountedPtr<grpc_channel_credentials> channel_creds =
518
- CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
519
- server.channel_creds_type, server.channel_creds_config);
520
- return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
521
- args);
522
- }
523
-
524
- } // namespace
525
-
526
439
  XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
527
440
  const XdsBootstrap::XdsServer& server)
528
441
  : DualRefCounted<ChannelState>(
@@ -533,37 +446,45 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
533
446
  server_(server) {
534
447
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
535
448
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
536
- xds_client_.get(), server.server_uri.c_str());
537
- }
538
- channel_ = CreateXdsChannel(xds_client_->args_, server);
539
- GPR_ASSERT(channel_ != nullptr);
540
- StartConnectivityWatchLocked();
449
+ xds_client_.get(), server.server_uri().c_str());
450
+ }
451
+ absl::Status status;
452
+ transport_ = xds_client_->transport_factory_->Create(
453
+ server,
454
+ [self = WeakRef(DEBUG_LOCATION, "OnConnectivityFailure")](
455
+ absl::Status status) {
456
+ self->OnConnectivityFailure(std::move(status));
457
+ },
458
+ &status);
459
+ GPR_ASSERT(transport_ != nullptr);
460
+ if (!status.ok()) SetChannelStatusLocked(std::move(status));
541
461
  }
542
462
 
543
463
  XdsClient::ChannelState::~ChannelState() {
544
464
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
545
465
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
546
- xds_client(), this, server_.server_uri.c_str());
466
+ xds_client(), this, server_.server_uri().c_str());
547
467
  }
548
- grpc_channel_destroy(channel_);
549
468
  xds_client_.reset(DEBUG_LOCATION, "ChannelState");
550
469
  }
551
470
 
552
471
  // This method should only ever be called when holding the lock, but we can't
553
472
  // use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
554
- // called from DualRefCounted::Unref, which cannot have a lock annotation for a
555
- // lock in this subclass.
473
+ // called from DualRefCounted::Unref, which cannot have a lock annotation for
474
+ // a lock in this subclass.
556
475
  void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
557
476
  shutting_down_ = true;
558
- CancelConnectivityWatchLocked();
477
+ transport_.reset();
559
478
  // At this time, all strong refs are removed, remove from channel map to
560
- // prevent subsequent subscription from trying to use this ChannelState as it
561
- // is shutting down.
562
- xds_client_->xds_server_channel_map_.erase(server_);
479
+ // prevent subsequent subscription from trying to use this ChannelState as
480
+ // it is shutting down.
481
+ xds_client_->xds_server_channel_map_.erase(&server_);
563
482
  ads_calld_.reset();
564
483
  lrs_calld_.reset();
565
484
  }
566
485
 
486
+ void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
487
+
567
488
  XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
568
489
  const {
569
490
  return ads_calld_->calld();
@@ -574,10 +495,6 @@ XdsClient::ChannelState::LrsCallState* XdsClient::ChannelState::lrs_calld()
574
495
  return lrs_calld_->calld();
575
496
  }
576
497
 
577
- bool XdsClient::ChannelState::HasActiveAdsCall() const {
578
- return ads_calld_ != nullptr && ads_calld_->calld() != nullptr;
579
- }
580
-
581
498
  void XdsClient::ChannelState::MaybeStartLrsCall() {
582
499
  if (lrs_calld_ != nullptr) return;
583
500
  lrs_calld_.reset(new RetryableCall<LrsCallState>(
@@ -585,43 +502,10 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
585
502
  }
586
503
 
587
504
  void XdsClient::ChannelState::StopLrsCallLocked() {
588
- xds_client_->xds_load_report_server_map_.erase(server_);
505
+ xds_client_->xds_load_report_server_map_.erase(&server_);
589
506
  lrs_calld_.reset();
590
507
  }
591
508
 
592
- namespace {
593
-
594
- bool IsLameChannel(grpc_channel* channel) {
595
- grpc_channel_element* elem =
596
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
597
- return elem->filter == &grpc_lame_filter;
598
- }
599
-
600
- } // namespace
601
-
602
- void XdsClient::ChannelState::StartConnectivityWatchLocked() {
603
- if (IsLameChannel(channel_)) {
604
- xds_client()->NotifyOnErrorLocked(
605
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds client has a lame channel"));
606
- return;
607
- }
608
- ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
609
- GPR_ASSERT(client_channel != nullptr);
610
- watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
611
- client_channel->AddConnectivityWatcher(
612
- GRPC_CHANNEL_IDLE,
613
- OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
614
- }
615
-
616
- void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
617
- if (IsLameChannel(channel_)) {
618
- return;
619
- }
620
- ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
621
- GPR_ASSERT(client_channel != nullptr);
622
- client_channel->RemoveConnectivityWatcher(watcher_);
623
- }
624
-
625
509
  void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
626
510
  const XdsResourceName& name) {
627
511
  if (ads_calld_ == nullptr) {
@@ -637,7 +521,7 @@ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
637
521
  // because when the call is restarted it will resend all necessary requests.
638
522
  if (ads_calld() == nullptr) return;
639
523
  // Subscribe to this resource if the ADS call is active.
640
- ads_calld()->SubscribeLocked(type, name);
524
+ ads_calld()->SubscribeLocked(type, name, /*delay_send=*/false);
641
525
  }
642
526
 
643
527
  void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
@@ -654,6 +538,56 @@ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
654
538
  }
655
539
  }
656
540
 
541
+ void XdsClient::ChannelState::OnConnectivityFailure(absl::Status status) {
542
+ {
543
+ MutexLock lock(&xds_client_->mu_);
544
+ SetChannelStatusLocked(std::move(status));
545
+ }
546
+ xds_client_->work_serializer_.DrainQueue();
547
+ }
548
+
549
+ void XdsClient::ChannelState::SetChannelStatusLocked(absl::Status status) {
550
+ if (shutting_down_) return;
551
+ status = absl::Status(status.code(), absl::StrCat("xDS channel for server ",
552
+ server_.server_uri(), ": ",
553
+ status.message()));
554
+ gpr_log(GPR_INFO, "[xds_client %p] %s", xds_client(),
555
+ status.ToString().c_str());
556
+ // If the node ID is set, append that to the status message that we send to
557
+ // the watchers, so that it will appear in log messages visible to users.
558
+ const auto* node = xds_client_->bootstrap_->node();
559
+ if (node != nullptr) {
560
+ status = absl::Status(
561
+ status.code(),
562
+ absl::StrCat(status.message(),
563
+ " (node ID:", xds_client_->bootstrap_->node()->id(), ")"));
564
+ }
565
+ // Save status in channel, so that we can immediately generate an
566
+ // error for any new watchers that may be started.
567
+ status_ = status;
568
+ // Find all watchers for this channel.
569
+ std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
570
+ for (const auto& a : xds_client_->authority_state_map_) { // authority
571
+ if (a.second.channel_state != this) continue;
572
+ for (const auto& t : a.second.resource_map) { // type
573
+ for (const auto& r : t.second) { // resource id
574
+ for (const auto& w : r.second.watchers) { // watchers
575
+ watchers.insert(w.second);
576
+ }
577
+ }
578
+ }
579
+ }
580
+ // Enqueue notification for the watchers.
581
+ xds_client_->work_serializer_.Schedule(
582
+ [watchers = std::move(watchers), status = std::move(status)]()
583
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(xds_client_->work_serializer_) {
584
+ for (const auto& watcher : watchers) {
585
+ watcher->OnError(status);
586
+ }
587
+ },
588
+ DEBUG_LOCATION);
589
+ }
590
+
657
591
  //
658
592
  // XdsClient::ChannelState::RetryableCall<>
659
593
  //
@@ -669,9 +603,6 @@ XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
669
603
  .set_jitter(GRPC_XDS_RECONNECT_JITTER)
670
604
  .set_max_backoff(Duration::Seconds(
671
605
  GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
672
- // Closure Initialization
673
- GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
674
- grpc_schedule_on_exec_ctx);
675
606
  StartNewCallLocked();
676
607
  }
677
608
 
@@ -679,35 +610,32 @@ template <typename T>
679
610
  void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
680
611
  shutting_down_ = true;
681
612
  calld_.reset();
682
- if (retry_timer_callback_pending_) grpc_timer_cancel(&retry_timer_);
613
+ if (timer_handle_.has_value()) {
614
+ chand()->xds_client()->engine()->Cancel(*timer_handle_);
615
+ timer_handle_.reset();
616
+ }
683
617
  this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
684
618
  }
685
619
 
686
620
  template <typename T>
687
621
  void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
688
- const bool seen_response = calld_->seen_response();
622
+ // If we saw a response on the current stream, reset backoff.
623
+ if (calld_->seen_response()) backoff_.Reset();
689
624
  calld_.reset();
690
- if (seen_response) {
691
- // If we lost connection to the xds server, reset backoff and restart the
692
- // call immediately.
693
- backoff_.Reset();
694
- StartNewCallLocked();
695
- } else {
696
- // If we failed to connect to the xds server, retry later.
697
- StartRetryTimerLocked();
698
- }
625
+ // Start retry timer.
626
+ StartRetryTimerLocked();
699
627
  }
700
628
 
701
629
  template <typename T>
702
630
  void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
703
631
  if (shutting_down_) return;
704
- GPR_ASSERT(chand_->channel_ != nullptr);
632
+ GPR_ASSERT(chand_->transport_ != nullptr);
705
633
  GPR_ASSERT(calld_ == nullptr);
706
634
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
707
- gpr_log(
708
- GPR_INFO,
709
- "[xds_client %p] xds server %s: start new call from retryable call %p",
710
- chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
635
+ gpr_log(GPR_INFO,
636
+ "[xds_client %p] xds server %s: start new call from retryable "
637
+ "call %p",
638
+ chand()->xds_client(), chand()->server_.server_uri().c_str(), this);
711
639
  }
712
640
  calld_ = MakeOrphanable<T>(
713
641
  this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
@@ -717,45 +645,39 @@ template <typename T>
717
645
  void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
718
646
  if (shutting_down_) return;
719
647
  const Timestamp next_attempt_time = backoff_.NextAttemptTime();
648
+ const Duration timeout =
649
+ std::max(next_attempt_time - Timestamp::Now(), Duration::Zero());
720
650
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
721
- Duration timeout =
722
- std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
723
651
  gpr_log(GPR_INFO,
724
652
  "[xds_client %p] xds server %s: call attempt failed; "
725
653
  "retry timer will fire in %" PRId64 "ms.",
726
- chand()->xds_client(), chand()->server_.server_uri.c_str(),
654
+ chand()->xds_client(), chand()->server_.server_uri().c_str(),
727
655
  timeout.millis());
728
656
  }
729
- this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
730
- grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
731
- retry_timer_callback_pending_ = true;
657
+ timer_handle_ = chand()->xds_client()->engine()->RunAfter(
658
+ timeout,
659
+ [self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
660
+ ApplicationCallbackExecCtx callback_exec_ctx;
661
+ ExecCtx exec_ctx;
662
+ self->OnRetryTimer();
663
+ });
732
664
  }
733
665
 
734
666
  template <typename T>
735
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
736
- void* arg, grpc_error_handle error) {
737
- RetryableCall* calld = static_cast<RetryableCall*>(arg);
738
- {
739
- MutexLock lock(&calld->chand_->xds_client()->mu_);
740
- calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
741
- }
742
- calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
743
- }
744
-
745
- template <typename T>
746
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
747
- grpc_error_handle error) {
748
- retry_timer_callback_pending_ = false;
749
- if (!shutting_down_ && error == GRPC_ERROR_NONE) {
667
+ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer() {
668
+ MutexLock lock(&chand_->xds_client()->mu_);
669
+ if (timer_handle_.has_value()) {
670
+ timer_handle_.reset();
671
+ if (shutting_down_) return;
750
672
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
751
673
  gpr_log(GPR_INFO,
752
674
  "[xds_client %p] xds server %s: retry timer fired (retryable "
753
675
  "call: %p)",
754
- chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
676
+ chand()->xds_client(), chand()->server_.server_uri().c_str(),
677
+ this);
755
678
  }
756
679
  StartNewCallLocked();
757
680
  }
758
- GRPC_ERROR_UNREF(error);
759
681
  }
760
682
 
761
683
  //
@@ -770,7 +692,7 @@ absl::Status XdsClient::ChannelState::AdsCallState::AdsResponseParser::
770
692
  "[xds_client %p] xds server %s: received ADS response: type_url=%s, "
771
693
  "version=%s, nonce=%s, num_resources=%" PRIuPTR,
772
694
  ads_call_state_->xds_client(),
773
- ads_call_state_->chand()->server_.server_uri.c_str(),
695
+ ads_call_state_->chand()->server_.server_uri().c_str(),
774
696
  fields.type_url.c_str(), fields.version.c_str(), fields.nonce.c_str(),
775
697
  fields.num_resources);
776
698
  }
@@ -813,48 +735,68 @@ void UpdateResourceMetadataNacked(const std::string& version,
813
735
  } // namespace
814
736
 
815
737
  void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
816
- const XdsEncodingContext& context, size_t idx, absl::string_view type_url,
817
- absl::string_view serialized_resource) {
738
+ upb_Arena* arena, size_t idx, absl::string_view type_url,
739
+ absl::string_view resource_name, absl::string_view serialized_resource) {
740
+ std::string error_prefix = absl::StrCat(
741
+ "resource index ", idx, ": ",
742
+ resource_name.empty() ? "" : absl::StrCat(resource_name, ": "));
818
743
  // Check the type_url of the resource.
819
- bool is_v2 = false;
820
- if (!result_.type->IsType(type_url, &is_v2)) {
744
+ if (result_.type_url != type_url) {
821
745
  result_.errors.emplace_back(
822
- absl::StrCat("resource index ", idx, ": incorrect resource type ",
823
- type_url, " (should be ", result_.type_url, ")"));
746
+ absl::StrCat(error_prefix, "incorrect resource type \"", type_url,
747
+ "\" (should be \"", result_.type_url, "\")"));
824
748
  return;
825
749
  }
826
750
  // Parse the resource.
827
- absl::StatusOr<XdsResourceType::DecodeResult> result =
828
- result_.type->Decode(context, serialized_resource, is_v2);
829
- if (!result.ok()) {
751
+ XdsResourceType::DecodeContext context = {
752
+ xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
753
+ xds_client()->symtab_.ptr(), arena};
754
+ XdsResourceType::DecodeResult decode_result =
755
+ result_.type->Decode(context, serialized_resource);
756
+ // If we didn't already have the resource name from the Resource
757
+ // wrapper, try to get it from the decoding result.
758
+ if (resource_name.empty()) {
759
+ if (decode_result.name.has_value()) {
760
+ resource_name = *decode_result.name;
761
+ error_prefix =
762
+ absl::StrCat("resource index ", idx, ": ", resource_name, ": ");
763
+ } else {
764
+ // We don't have any way of determining the resource name, so
765
+ // there's nothing more we can do here.
766
+ result_.errors.emplace_back(absl::StrCat(
767
+ error_prefix, decode_result.resource.status().ToString()));
768
+ return;
769
+ }
770
+ }
771
+ // If decoding failed, make sure we include the error in the NACK.
772
+ const absl::Status& decode_status = decode_result.resource.status();
773
+ if (!decode_status.ok()) {
830
774
  result_.errors.emplace_back(
831
- absl::StrCat("resource index ", idx, ": ", result.status().ToString()));
832
- return;
775
+ absl::StrCat(error_prefix, decode_status.ToString()));
833
776
  }
834
777
  // Check the resource name.
835
- auto resource_name =
836
- XdsClient::ParseXdsResourceName(result->name, result_.type);
837
- if (!resource_name.ok()) {
838
- result_.errors.emplace_back(absl::StrCat(
839
- "resource index ", idx, ": Cannot parse xDS resource name \"",
840
- result->name, "\""));
778
+ auto parsed_resource_name =
779
+ xds_client()->ParseXdsResourceName(resource_name, result_.type);
780
+ if (!parsed_resource_name.ok()) {
781
+ result_.errors.emplace_back(
782
+ absl::StrCat(error_prefix, "Cannot parse xDS resource name"));
841
783
  return;
842
784
  }
843
785
  // Cancel resource-does-not-exist timer, if needed.
844
786
  auto timer_it = ads_call_state_->state_map_.find(result_.type);
845
787
  if (timer_it != ads_call_state_->state_map_.end()) {
846
- auto it =
847
- timer_it->second.subscribed_resources.find(resource_name->authority);
788
+ auto it = timer_it->second.subscribed_resources.find(
789
+ parsed_resource_name->authority);
848
790
  if (it != timer_it->second.subscribed_resources.end()) {
849
- auto res_it = it->second.find(resource_name->key);
791
+ auto res_it = it->second.find(parsed_resource_name->key);
850
792
  if (res_it != it->second.end()) {
851
- res_it->second->MaybeCancelTimer();
793
+ res_it->second->MarkSeen();
852
794
  }
853
795
  }
854
796
  }
855
797
  // Lookup the authority in the cache.
856
798
  auto authority_it =
857
- xds_client()->authority_state_map_.find(resource_name->authority);
799
+ xds_client()->authority_state_map_.find(parsed_resource_name->authority);
858
800
  if (authority_it == xds_client()->authority_state_map_.end()) {
859
801
  return; // Skip resource -- we don't have a subscription for it.
860
802
  }
@@ -866,29 +808,35 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
866
808
  }
867
809
  auto& type_map = type_it->second;
868
810
  // Found type, so look up resource key.
869
- auto it = type_map.find(resource_name->key);
811
+ auto it = type_map.find(parsed_resource_name->key);
870
812
  if (it == type_map.end()) {
871
813
  return; // Skip resource -- we don't have a subscription for it.
872
814
  }
873
815
  ResourceState& resource_state = it->second;
874
816
  // If needed, record that we've seen this resource.
875
817
  if (result_.type->AllResourcesRequiredInSotW()) {
876
- result_.resources_seen[resource_name->authority].insert(resource_name->key);
818
+ result_.resources_seen[parsed_resource_name->authority].insert(
819
+ parsed_resource_name->key);
820
+ }
821
+ // If we previously ignored the resource's deletion, log that we're
822
+ // now re-adding it.
823
+ if (resource_state.ignored_deletion) {
824
+ gpr_log(GPR_INFO,
825
+ "[xds_client %p] xds server %s: server returned new version of "
826
+ "resource for which we previously ignored a deletion: type %s "
827
+ "name %s",
828
+ xds_client(),
829
+ ads_call_state_->chand()->server_.server_uri().c_str(),
830
+ std::string(type_url).c_str(), std::string(resource_name).c_str());
831
+ resource_state.ignored_deletion = false;
877
832
  }
878
833
  // Update resource state based on whether the resource is valid.
879
- if (!result->resource.ok()) {
880
- result_.errors.emplace_back(absl::StrCat(
881
- "resource index ", idx, ": ", result->name,
882
- ": validation error: ", result->resource.status().ToString()));
883
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
884
- xds_client(), resource_state.watchers,
885
- grpc_error_set_int(
886
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
887
- "invalid resource: ", result->resource.status().ToString())),
888
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE),
889
- DEBUG_LOCATION);
890
- UpdateResourceMetadataNacked(result_.version,
891
- result->resource.status().ToString(),
834
+ if (!decode_status.ok()) {
835
+ xds_client()->NotifyWatchersOnErrorLocked(
836
+ resource_state.watchers,
837
+ absl::UnavailableError(
838
+ absl::StrCat("invalid resource: ", decode_status.ToString())));
839
+ UpdateResourceMetadataNacked(result_.version, decode_status.ToString(),
892
840
  update_time_, &resource_state.meta);
893
841
  return;
894
842
  }
@@ -897,16 +845,17 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
897
845
  // If it didn't change, ignore it.
898
846
  if (resource_state.resource != nullptr &&
899
847
  result_.type->ResourcesEqual(resource_state.resource.get(),
900
- result->resource->get())) {
848
+ decode_result.resource->get())) {
901
849
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
902
850
  gpr_log(GPR_INFO,
903
851
  "[xds_client %p] %s resource %s identical to current, ignoring.",
904
- xds_client(), result_.type_url.c_str(), result->name.c_str());
852
+ xds_client(), result_.type_url.c_str(),
853
+ std::string(resource_name).c_str());
905
854
  }
906
855
  return;
907
856
  }
908
857
  // Update the resource state.
909
- resource_state.resource = std::move(*result->resource);
858
+ resource_state.resource = std::move(*decode_result.resource);
910
859
  resource_state.meta = CreateResourceMetadataAcked(
911
860
  std::string(serialized_resource), result_.version, update_time_);
912
861
  // Notify watchers.
@@ -924,6 +873,12 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
924
873
  DEBUG_LOCATION);
925
874
  }
926
875
 
876
+ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::
877
+ ResourceWrapperParsingFailed(size_t idx) {
878
+ result_.errors.emplace_back(absl::StrCat(
879
+ "resource index ", idx, ": Can't decode Resource proto wrapper"));
880
+ }
881
+
927
882
  //
928
883
  // XdsClient::ChannelState::AdsCallState
929
884
  //
@@ -935,51 +890,27 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
935
890
  ? "AdsCallState"
936
891
  : nullptr),
937
892
  parent_(std::move(parent)) {
938
- // Init the ADS call. Note that the call will progress every time there's
939
- // activity in xds_client()->interested_parties_, which is comprised of
940
- // the polling entities from client_channel.
941
893
  GPR_ASSERT(xds_client() != nullptr);
942
- // Create a call with the specified method name.
894
+ // Init the ADS call.
943
895
  const char* method =
944
- chand()->server_.ShouldUseV3()
945
- ? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
946
- "StreamAggregatedResources"
947
- : "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
948
- "StreamAggregatedResources";
949
- call_ = grpc_channel_create_pollset_set_call(
950
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
951
- xds_client()->interested_parties_,
952
- StaticSlice::FromStaticString(method).c_slice(), nullptr,
953
- Timestamp::InfFuture(), nullptr);
896
+ "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
897
+ "StreamAggregatedResources";
898
+ call_ = chand()->transport_->CreateStreamingCall(
899
+ method, std::make_unique<StreamEventHandler>(
900
+ // Passing the initial ref here. This ref will go away when
901
+ // the StreamEventHandler is destroyed.
902
+ RefCountedPtr<AdsCallState>(this)));
954
903
  GPR_ASSERT(call_ != nullptr);
955
- // Init data associated with the call.
956
- grpc_metadata_array_init(&initial_metadata_recv_);
957
- grpc_metadata_array_init(&trailing_metadata_recv_);
958
904
  // Start the call.
959
905
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
960
906
  gpr_log(GPR_INFO,
961
907
  "[xds_client %p] xds server %s: starting ADS call "
962
908
  "(calld: %p, call: %p)",
963
- xds_client(), chand()->server_.server_uri.c_str(), this, call_);
964
- }
965
- // Create the ops.
966
- grpc_call_error call_error;
967
- grpc_op ops[3];
968
- memset(ops, 0, sizeof(ops));
969
- // Op: send initial metadata.
970
- grpc_op* op = ops;
971
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
972
- op->data.send_initial_metadata.count = 0;
973
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
974
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
975
- op->reserved = nullptr;
976
- op++;
977
- call_error = grpc_call_start_batch_and_execute(
978
- call_, ops, static_cast<size_t>(op - ops), nullptr);
979
- GPR_ASSERT(GRPC_CALL_OK == call_error);
980
- // Op: send request message.
981
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
982
- grpc_schedule_on_exec_ctx);
909
+ xds_client(), chand()->server_.server_uri().c_str(), this,
910
+ call_.get());
911
+ }
912
+ // If this is a reconnect, add any necessary subscriptions from what's
913
+ // already in the cache.
983
914
  for (const auto& a : xds_client()->authority_state_map_) {
984
915
  const std::string& authority = a.first;
985
916
  // Skip authorities that are not using this xDS channel.
@@ -988,129 +919,57 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
988
919
  const XdsResourceType* type = t.first;
989
920
  for (const auto& r : t.second) {
990
921
  const XdsResourceKey& resource_key = r.first;
991
- SubscribeLocked(type, {authority, resource_key});
922
+ SubscribeLocked(type, {authority, resource_key}, /*delay_send=*/true);
992
923
  }
993
924
  }
994
925
  }
995
- // Op: recv initial metadata.
996
- op = ops;
997
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
998
- op->data.recv_initial_metadata.recv_initial_metadata =
999
- &initial_metadata_recv_;
1000
- op->flags = 0;
1001
- op->reserved = nullptr;
1002
- op++;
1003
- // Op: recv response.
1004
- op->op = GRPC_OP_RECV_MESSAGE;
1005
- op->data.recv_message.recv_message = &recv_message_payload_;
1006
- op->flags = 0;
1007
- op->reserved = nullptr;
1008
- op++;
1009
- Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
1010
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1011
- grpc_schedule_on_exec_ctx);
1012
- call_error = grpc_call_start_batch_and_execute(
1013
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1014
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1015
- // Op: recv server status.
1016
- op = ops;
1017
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
1018
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
1019
- op->data.recv_status_on_client.status = &status_code_;
1020
- op->data.recv_status_on_client.status_details = &status_details_;
1021
- op->flags = 0;
1022
- op->reserved = nullptr;
1023
- op++;
1024
- // This callback signals the end of the call, so it relies on the initial
1025
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
1026
- // unreffed.
1027
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1028
- grpc_schedule_on_exec_ctx);
1029
- call_error = grpc_call_start_batch_and_execute(
1030
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1031
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1032
- }
1033
-
1034
- XdsClient::ChannelState::AdsCallState::~AdsCallState() {
1035
- grpc_metadata_array_destroy(&initial_metadata_recv_);
1036
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
1037
- grpc_byte_buffer_destroy(send_message_payload_);
1038
- grpc_byte_buffer_destroy(recv_message_payload_);
1039
- grpc_slice_unref_internal(status_details_);
1040
- GPR_ASSERT(call_ != nullptr);
1041
- grpc_call_unref(call_);
926
+ // Send initial message if we added any subscriptions above.
927
+ for (const auto& p : state_map_) {
928
+ SendMessageLocked(p.first);
929
+ }
1042
930
  }
1043
931
 
1044
932
  void XdsClient::ChannelState::AdsCallState::Orphan() {
1045
- GPR_ASSERT(call_ != nullptr);
1046
- // If we are here because xds_client wants to cancel the call,
1047
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
1048
- // we are here because xds_client has to orphan a failed call, then the
1049
- // following cancellation will be a no-op.
1050
- grpc_call_cancel_internal(call_);
1051
933
  state_map_.clear();
1052
- // Note that the initial ref is hold by on_status_received_. So the
1053
- // corresponding unref happens in on_status_received_ instead of here.
934
+ // Note that the initial ref is held by the StreamEventHandler, which
935
+ // will be destroyed when call_ is destroyed, which may not happen
936
+ // here, since there may be other refs held to call_ by internal callbacks.
937
+ call_.reset();
1054
938
  }
1055
939
 
1056
940
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
1057
941
  const XdsResourceType* type)
1058
942
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
1059
943
  // Buffer message sending if an existing message is in flight.
1060
- if (send_message_payload_ != nullptr) {
944
+ if (send_message_pending_ != nullptr) {
1061
945
  buffered_requests_.insert(type);
1062
946
  return;
1063
947
  }
1064
948
  auto& state = state_map_[type];
1065
- grpc_slice request_payload_slice;
1066
- request_payload_slice = xds_client()->api_.CreateAdsRequest(
1067
- chand()->server_,
1068
- chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
1069
- chand()->resource_type_version_map_[type], state.nonce,
1070
- ResourceNamesForRequest(type), GRPC_ERROR_REF(state.error),
1071
- !sent_initial_message_);
949
+ std::string serialized_message = xds_client()->api_.CreateAdsRequest(
950
+ type->type_url(), chand()->resource_type_version_map_[type], state.nonce,
951
+ ResourceNamesForRequest(type), state.status, !sent_initial_message_);
1072
952
  sent_initial_message_ = true;
1073
953
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1074
954
  gpr_log(GPR_INFO,
1075
955
  "[xds_client %p] xds server %s: sending ADS request: type=%s "
1076
956
  "version=%s nonce=%s error=%s",
1077
- xds_client(), chand()->server_.server_uri.c_str(),
957
+ xds_client(), chand()->server_.server_uri().c_str(),
1078
958
  std::string(type->type_url()).c_str(),
1079
959
  chand()->resource_type_version_map_[type].c_str(),
1080
- state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
1081
- }
1082
- GRPC_ERROR_UNREF(state.error);
1083
- state.error = GRPC_ERROR_NONE;
1084
- // Create message payload.
1085
- send_message_payload_ =
1086
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1087
- grpc_slice_unref_internal(request_payload_slice);
1088
- // Send the message.
1089
- grpc_op op;
1090
- memset(&op, 0, sizeof(op));
1091
- op.op = GRPC_OP_SEND_MESSAGE;
1092
- op.data.send_message.send_message = send_message_payload_;
1093
- Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
1094
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
1095
- grpc_schedule_on_exec_ctx);
1096
- grpc_call_error call_error =
1097
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
1098
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1099
- gpr_log(GPR_ERROR,
1100
- "[xds_client %p] xds server %s: error starting ADS send_message "
1101
- "batch on calld=%p: call_error=%d",
1102
- xds_client(), chand()->server_.server_uri.c_str(), this,
1103
- call_error);
1104
- GPR_ASSERT(GRPC_CALL_OK == call_error);
960
+ state.nonce.c_str(), state.status.ToString().c_str());
1105
961
  }
962
+ state.status = absl::OkStatus();
963
+ call_->SendMessage(std::move(serialized_message));
964
+ send_message_pending_ = type;
1106
965
  }
1107
966
 
1108
967
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
1109
- const XdsResourceType* type, const XdsResourceName& name) {
968
+ const XdsResourceType* type, const XdsResourceName& name, bool delay_send) {
1110
969
  auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
1111
970
  if (state == nullptr) {
1112
971
  state = MakeOrphanable<ResourceTimer>(type, name);
1113
- SendMessageLocked(type);
972
+ if (!delay_send) SendMessageLocked(type);
1114
973
  }
1115
974
  }
1116
975
 
@@ -1123,7 +982,12 @@ void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
1123
982
  if (authority_map.empty()) {
1124
983
  type_state_map.subscribed_resources.erase(name.authority);
1125
984
  }
1126
- if (!delay_unsubscription) SendMessageLocked(type);
985
+ // Don't need to send unsubscription message if this was the last
986
+ // resource we were subscribed to, since we'll be closing the stream
987
+ // immediately in that case.
988
+ if (!delay_unsubscription && HasSubscribedResources()) {
989
+ SendMessageLocked(type);
990
+ }
1127
991
  }
1128
992
 
1129
993
  bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
@@ -1133,22 +997,21 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
1133
997
  return false;
1134
998
  }
1135
999
 
1136
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1137
- void* arg, grpc_error_handle error) {
1138
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1139
- {
1140
- MutexLock lock(&ads_calld->xds_client()->mu_);
1141
- ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
1000
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
1001
+ MutexLock lock(&xds_client()->mu_);
1002
+ // For each resource that was in the message we just sent, start the
1003
+ // resource timer if needed.
1004
+ if (ok) {
1005
+ auto& resource_type_state = state_map_[send_message_pending_];
1006
+ for (const auto& p : resource_type_state.subscribed_resources) {
1007
+ for (auto& q : p.second) {
1008
+ q.second->MaybeMarkSubscriptionSendComplete(
1009
+ Ref(DEBUG_LOCATION, "ResourceTimer"));
1010
+ }
1011
+ }
1142
1012
  }
1143
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1144
- }
1145
-
1146
- void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1147
- grpc_error_handle error) {
1148
- if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1149
- // Clean up the sent message.
1150
- grpc_byte_buffer_destroy(send_message_payload_);
1151
- send_message_payload_ = nullptr;
1013
+ send_message_pending_ = nullptr;
1014
+ if (ok && IsCurrentCallOnChannel()) {
1152
1015
  // Continue to send another pending message if any.
1153
1016
  // TODO(roth): The current code to handle buffered messages has the
1154
1017
  // advantage of sending only the most recent list of resource names for
@@ -1164,173 +1027,149 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1164
1027
  buffered_requests_.erase(it);
1165
1028
  }
1166
1029
  }
1167
- GRPC_ERROR_UNREF(error);
1168
1030
  }
1169
1031
 
1170
- void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1171
- void* arg, grpc_error_handle /* error */) {
1172
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1173
- bool done;
1032
+ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
1033
+ absl::string_view payload) {
1174
1034
  {
1175
- MutexLock lock(&ads_calld->xds_client()->mu_);
1176
- done = ads_calld->OnResponseReceivedLocked();
1177
- }
1178
- ads_calld->xds_client()->work_serializer_.DrainQueue();
1179
- if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1180
- }
1181
-
1182
- bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1183
- // Empty payload means the call was cancelled.
1184
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1185
- return true;
1186
- }
1187
- // Read the response.
1188
- grpc_byte_buffer_reader bbr;
1189
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1190
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1191
- grpc_byte_buffer_reader_destroy(&bbr);
1192
- grpc_byte_buffer_destroy(recv_message_payload_);
1193
- recv_message_payload_ = nullptr;
1194
- // Parse and validate the response.
1195
- AdsResponseParser parser(this);
1196
- absl::Status status = xds_client()->api_.ParseAdsResponse(
1197
- chand()->server_, response_slice, &parser);
1198
- grpc_slice_unref_internal(response_slice);
1199
- if (!status.ok()) {
1200
- // Ignore unparsable response.
1201
- gpr_log(GPR_ERROR,
1202
- "[xds_client %p] xds server %s: error parsing ADS response (%s) "
1203
- "-- ignoring",
1204
- xds_client(), chand()->server_.server_uri.c_str(),
1205
- status.ToString().c_str());
1206
- } else {
1207
- AdsResponseParser::Result result = parser.TakeResult();
1208
- // Update nonce.
1209
- auto& state = state_map_[result.type];
1210
- state.nonce = result.nonce;
1211
- // If we got an error, set state.error so that we'll NACK the update.
1212
- if (!result.errors.empty()) {
1213
- std::string error = absl::StrJoin(result.errors, "; ");
1214
- gpr_log(
1215
- GPR_ERROR,
1216
- "[xds_client %p] xds server %s: ADS response invalid for resource "
1217
- "type %s version %s, will NACK: nonce=%s error=%s",
1218
- xds_client(), chand()->server_.server_uri.c_str(),
1219
- result.type_url.c_str(), result.version.c_str(), state.nonce.c_str(),
1220
- error.c_str());
1221
- GRPC_ERROR_UNREF(state.error);
1222
- state.error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(error),
1223
- GRPC_ERROR_INT_GRPC_STATUS,
1224
- GRPC_STATUS_UNAVAILABLE);
1225
- }
1226
- // Delete resources not seen in update if needed.
1227
- if (result.type->AllResourcesRequiredInSotW()) {
1228
- for (auto& a : xds_client()->authority_state_map_) {
1229
- const std::string& authority = a.first;
1230
- AuthorityState& authority_state = a.second;
1231
- // Skip authorities that are not using this xDS channel.
1232
- if (authority_state.channel_state != chand()) continue;
1233
- auto seen_authority_it = result.resources_seen.find(authority);
1234
- // Find this resource type.
1235
- auto type_it = authority_state.resource_map.find(result.type);
1236
- if (type_it == authority_state.resource_map.end()) continue;
1237
- // Iterate over resource ids.
1238
- for (auto& r : type_it->second) {
1239
- const XdsResourceKey& resource_key = r.first;
1240
- ResourceState& resource_state = r.second;
1241
- if (seen_authority_it == result.resources_seen.end() ||
1242
- seen_authority_it->second.find(resource_key) ==
1243
- seen_authority_it->second.end()) {
1244
- // If the resource was newly requested but has not yet been
1245
- // received, we don't want to generate an error for the watchers,
1246
- // because this ADS response may be in reaction to an earlier
1247
- // request that did not yet request the new resource, so its absence
1248
- // from the response does not necessarily indicate that the resource
1249
- // does not exist. For that case, we rely on the request timeout
1250
- // instead.
1251
- if (resource_state.resource == nullptr) continue;
1252
- resource_state.resource.reset();
1253
- Notifier::
1254
- ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1255
- xds_client(), resource_state.watchers, DEBUG_LOCATION);
1035
+ MutexLock lock(&xds_client()->mu_);
1036
+ if (!IsCurrentCallOnChannel()) return;
1037
+ // Parse and validate the response.
1038
+ AdsResponseParser parser(this);
1039
+ absl::Status status = xds_client()->api_.ParseAdsResponse(payload, &parser);
1040
+ if (!status.ok()) {
1041
+ // Ignore unparsable response.
1042
+ gpr_log(GPR_ERROR,
1043
+ "[xds_client %p] xds server %s: error parsing ADS response (%s) "
1044
+ "-- ignoring",
1045
+ xds_client(), chand()->server_.server_uri().c_str(),
1046
+ status.ToString().c_str());
1047
+ } else {
1048
+ seen_response_ = true;
1049
+ chand()->status_ = absl::OkStatus();
1050
+ AdsResponseParser::Result result = parser.TakeResult();
1051
+ // Update nonce.
1052
+ auto& state = state_map_[result.type];
1053
+ state.nonce = result.nonce;
1054
+ // If we got an error, set state.status so that we'll NACK the update.
1055
+ if (!result.errors.empty()) {
1056
+ state.status = absl::UnavailableError(
1057
+ absl::StrCat("xDS response validation errors: [",
1058
+ absl::StrJoin(result.errors, "; "), "]"));
1059
+ gpr_log(GPR_ERROR,
1060
+ "[xds_client %p] xds server %s: ADS response invalid for "
1061
+ "resource "
1062
+ "type %s version %s, will NACK: nonce=%s status=%s",
1063
+ xds_client(), chand()->server_.server_uri().c_str(),
1064
+ result.type_url.c_str(), result.version.c_str(),
1065
+ state.nonce.c_str(), state.status.ToString().c_str());
1066
+ }
1067
+ // Delete resources not seen in update if needed.
1068
+ if (result.type->AllResourcesRequiredInSotW()) {
1069
+ for (auto& a : xds_client()->authority_state_map_) {
1070
+ const std::string& authority = a.first;
1071
+ AuthorityState& authority_state = a.second;
1072
+ // Skip authorities that are not using this xDS channel.
1073
+ if (authority_state.channel_state != chand()) continue;
1074
+ auto seen_authority_it = result.resources_seen.find(authority);
1075
+ // Find this resource type.
1076
+ auto type_it = authority_state.resource_map.find(result.type);
1077
+ if (type_it == authority_state.resource_map.end()) continue;
1078
+ // Iterate over resource ids.
1079
+ for (auto& r : type_it->second) {
1080
+ const XdsResourceKey& resource_key = r.first;
1081
+ ResourceState& resource_state = r.second;
1082
+ if (seen_authority_it == result.resources_seen.end() ||
1083
+ seen_authority_it->second.find(resource_key) ==
1084
+ seen_authority_it->second.end()) {
1085
+ // If the resource was newly requested but has not yet been
1086
+ // received, we don't want to generate an error for the
1087
+ // watchers, because this ADS response may be in reaction to an
1088
+ // earlier request that did not yet request the new resource, so
1089
+ // its absence from the response does not necessarily indicate
1090
+ // that the resource does not exist. For that case, we rely on
1091
+ // the request timeout instead.
1092
+ if (resource_state.resource == nullptr) continue;
1093
+ if (chand()->server_.IgnoreResourceDeletion()) {
1094
+ if (!resource_state.ignored_deletion) {
1095
+ gpr_log(GPR_ERROR,
1096
+ "[xds_client %p] xds server %s: ignoring deletion "
1097
+ "for resource type %s name %s",
1098
+ xds_client(), chand()->server_.server_uri().c_str(),
1099
+ result.type_url.c_str(),
1100
+ XdsClient::ConstructFullXdsResourceName(
1101
+ authority, result.type_url.c_str(), resource_key)
1102
+ .c_str());
1103
+ resource_state.ignored_deletion = true;
1104
+ }
1105
+ } else {
1106
+ resource_state.resource.reset();
1107
+ resource_state.meta.client_status =
1108
+ XdsApi::ResourceMetadata::DOES_NOT_EXIST;
1109
+ xds_client()->NotifyWatchersOnResourceDoesNotExist(
1110
+ resource_state.watchers);
1111
+ }
1112
+ }
1256
1113
  }
1257
1114
  }
1258
1115
  }
1259
- }
1260
- // If we had valid resources, update the version.
1261
- if (result.have_valid_resources) {
1262
- seen_response_ = true;
1263
- chand()->resource_type_version_map_[result.type] =
1264
- std::move(result.version);
1265
- // Start load reporting if needed.
1266
- auto& lrs_call = chand()->lrs_calld_;
1267
- if (lrs_call != nullptr) {
1268
- LrsCallState* lrs_calld = lrs_call->calld();
1269
- if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1116
+ // If we had valid resources or the update was empty, update the version.
1117
+ if (result.have_valid_resources || result.errors.empty()) {
1118
+ chand()->resource_type_version_map_[result.type] =
1119
+ std::move(result.version);
1120
+ // Start load reporting if needed.
1121
+ auto& lrs_call = chand()->lrs_calld_;
1122
+ if (lrs_call != nullptr) {
1123
+ LrsCallState* lrs_calld = lrs_call->calld();
1124
+ if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1125
+ }
1270
1126
  }
1127
+ // Send ACK or NACK.
1128
+ SendMessageLocked(result.type);
1271
1129
  }
1272
- // Send ACK or NACK.
1273
- SendMessageLocked(result.type);
1274
- }
1275
- if (xds_client()->shutting_down_) return true;
1276
- // Keep listening for updates.
1277
- grpc_op op;
1278
- memset(&op, 0, sizeof(op));
1279
- op.op = GRPC_OP_RECV_MESSAGE;
1280
- op.data.recv_message.recv_message = &recv_message_payload_;
1281
- op.flags = 0;
1282
- op.reserved = nullptr;
1283
- GPR_ASSERT(call_ != nullptr);
1284
- // Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
1285
- const grpc_call_error call_error =
1286
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1287
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1288
- return false;
1130
+ }
1131
+ xds_client()->work_serializer_.DrainQueue();
1289
1132
  }
1290
1133
 
1291
1134
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1292
- void* arg, grpc_error_handle error) {
1293
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1135
+ absl::Status status) {
1294
1136
  {
1295
- MutexLock lock(&ads_calld->xds_client()->mu_);
1296
- ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1297
- }
1298
- ads_calld->xds_client()->work_serializer_.DrainQueue();
1299
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1300
- }
1301
-
1302
- void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1303
- grpc_error_handle error) {
1304
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1305
- char* status_details = grpc_slice_to_c_string(status_details_);
1306
- gpr_log(GPR_INFO,
1307
- "[xds_client %p] xds server %s: ADS call status received "
1308
- "(chand=%p, ads_calld=%p, call=%p): "
1309
- "status=%d, details='%s', error='%s'",
1310
- xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1311
- call_, status_code_, status_details,
1312
- grpc_error_std_string(error).c_str());
1313
- gpr_free(status_details);
1314
- }
1315
- // Ignore status from a stale call.
1316
- if (IsCurrentCallOnChannel()) {
1317
- // Try to restart the call.
1318
- parent_->OnCallFinishedLocked();
1319
- // Send error to all watchers.
1320
- xds_client()->NotifyOnErrorLocked(
1321
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
1322
- "xDS call failed: xDS server: %s, ADS call status code=%d, "
1323
- "details='%s', error='%s'",
1324
- chand()->server_.server_uri, status_code_,
1325
- StringViewFromSlice(status_details_),
1326
- grpc_error_std_string(error))));
1137
+ MutexLock lock(&xds_client()->mu_);
1138
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1139
+ gpr_log(GPR_INFO,
1140
+ "[xds_client %p] xds server %s: ADS call status received "
1141
+ "(chand=%p, ads_calld=%p, call=%p): %s",
1142
+ xds_client(), chand()->server_.server_uri().c_str(), chand(),
1143
+ this, call_.get(), status.ToString().c_str());
1144
+ }
1145
+ // Cancel any does-not-exist timers that may be pending.
1146
+ for (const auto& p : state_map_) {
1147
+ for (const auto& q : p.second.subscribed_resources) {
1148
+ for (auto& r : q.second) {
1149
+ r.second->MaybeCancelTimer();
1150
+ }
1151
+ }
1152
+ }
1153
+ // Ignore status from a stale call.
1154
+ if (IsCurrentCallOnChannel()) {
1155
+ // Try to restart the call.
1156
+ parent_->OnCallFinishedLocked();
1157
+ // If we didn't receive a response on the stream, report the
1158
+ // stream failure as a connectivity failure, which will report the
1159
+ // error to all watchers of resources on this channel.
1160
+ if (!seen_response_) {
1161
+ chand()->SetChannelStatusLocked(absl::UnavailableError(
1162
+ absl::StrCat("xDS call failed with no responses received; status: ",
1163
+ status.ToString())));
1164
+ }
1165
+ }
1327
1166
  }
1328
- GRPC_ERROR_UNREF(error);
1167
+ xds_client()->work_serializer_.DrainQueue();
1329
1168
  }
1330
1169
 
1331
1170
  bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1332
- // If the retryable ADS call is null (which only happens when the xds channel
1333
- // is shutting down), all the ADS calls are stale.
1171
+ // If the retryable ADS call is null (which only happens when the xds
1172
+ // channel is shutting down), all the ADS calls are stale.
1334
1173
  if (chand()->ads_calld_ == nullptr) return false;
1335
1174
  return this == chand()->ads_calld_->calld();
1336
1175
  }
@@ -1348,7 +1187,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1348
1187
  resource_names.emplace_back(XdsClient::ConstructFullXdsResourceName(
1349
1188
  authority, type->type_url(), resource_key));
1350
1189
  OrphanablePtr<ResourceTimer>& resource_timer = p.second;
1351
- resource_timer->MaybeStartTimer(Ref(DEBUG_LOCATION, "ResourceTimer"));
1190
+ resource_timer->MarkSubscriptionSendStarted();
1352
1191
  }
1353
1192
  }
1354
1193
  }
@@ -1360,38 +1199,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1360
1199
  //
1361
1200
 
1362
1201
  void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1363
- if (next_report_timer_callback_pending_) {
1364
- grpc_timer_cancel(&next_report_timer_);
1202
+ if (timer_handle_.has_value() &&
1203
+ xds_client()->engine()->Cancel(*timer_handle_)) {
1204
+ timer_handle_.reset();
1205
+ Unref(DEBUG_LOCATION, "Orphan");
1365
1206
  }
1366
1207
  }
1367
1208
 
1368
1209
  void XdsClient::ChannelState::LrsCallState::Reporter::
1369
1210
  ScheduleNextReportLocked() {
1370
- const Timestamp next_report_time = ExecCtx::Get()->Now() + report_interval_;
1371
- grpc_timer_init(&next_report_timer_, next_report_time,
1372
- &on_next_report_timer_);
1373
- next_report_timer_callback_pending_ = true;
1374
- }
1375
-
1376
- void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1377
- void* arg, grpc_error_handle error) {
1378
- Reporter* self = static_cast<Reporter*>(arg);
1379
- bool done;
1380
- {
1381
- MutexLock lock(&self->xds_client()->mu_);
1382
- done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
1383
- }
1384
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
1211
+ timer_handle_ = xds_client()->engine()->RunAfter(report_interval_, [this]() {
1212
+ ApplicationCallbackExecCtx callback_exec_ctx;
1213
+ ExecCtx exec_ctx;
1214
+ if (OnNextReportTimer()) {
1215
+ Unref(DEBUG_LOCATION, "OnNextReportTimer()");
1216
+ }
1217
+ });
1385
1218
  }
1386
1219
 
1387
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1388
- grpc_error_handle error) {
1389
- next_report_timer_callback_pending_ = false;
1390
- if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1391
- GRPC_ERROR_UNREF(error);
1392
- return true;
1393
- }
1394
- return SendReportLocked();
1220
+ bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer() {
1221
+ MutexLock lock(&xds_client()->mu_);
1222
+ timer_handle_.reset();
1223
+ if (!IsCurrentReporterOnCall()) return true;
1224
+ SendReportLocked();
1225
+ return false;
1395
1226
  }
1396
1227
 
1397
1228
  namespace {
@@ -1422,7 +1253,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1422
1253
  last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
1423
1254
  if (old_val && last_report_counters_were_zero_) {
1424
1255
  auto it = xds_client()->xds_load_report_server_map_.find(
1425
- parent_->chand()->server_);
1256
+ &parent_->chand()->server_);
1426
1257
  if (it == xds_client()->xds_load_report_server_map_.end() ||
1427
1258
  it->second.load_report_map.empty()) {
1428
1259
  it->second.channel_state->StopLrsCallLocked();
@@ -1431,65 +1262,34 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1431
1262
  ScheduleNextReportLocked();
1432
1263
  return false;
1433
1264
  }
1434
- // Create a request that contains the snapshot.
1435
- grpc_slice request_payload_slice =
1265
+ // Send a request that contains the snapshot.
1266
+ std::string serialized_payload =
1436
1267
  xds_client()->api_.CreateLrsRequest(std::move(snapshot));
1437
- parent_->send_message_payload_ =
1438
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1439
- grpc_slice_unref_internal(request_payload_slice);
1440
- // Send the report.
1441
- grpc_op op;
1442
- memset(&op, 0, sizeof(op));
1443
- op.op = GRPC_OP_SEND_MESSAGE;
1444
- op.data.send_message.send_message = parent_->send_message_payload_;
1445
- grpc_call_error call_error = grpc_call_start_batch_and_execute(
1446
- parent_->call_, &op, 1, &on_report_done_);
1447
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1448
- gpr_log(GPR_ERROR,
1449
- "[xds_client %p] xds server %s: error starting LRS send_message "
1450
- "batch on calld=%p: call_error=%d",
1451
- xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
1452
- call_error);
1453
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1454
- }
1268
+ parent_->call_->SendMessage(std::move(serialized_payload));
1269
+ parent_->send_message_pending_ = true;
1455
1270
  return false;
1456
1271
  }
1457
1272
 
1458
- void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1459
- void* arg, grpc_error_handle error) {
1460
- Reporter* self = static_cast<Reporter*>(arg);
1461
- bool done;
1462
- {
1463
- MutexLock lock(&self->xds_client()->mu_);
1464
- done = self->OnReportDoneLocked(GRPC_ERROR_REF(error));
1465
- }
1466
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
1467
- }
1468
-
1469
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1470
- grpc_error_handle error) {
1471
- grpc_byte_buffer_destroy(parent_->send_message_payload_);
1472
- parent_->send_message_payload_ = nullptr;
1273
+ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked() {
1274
+ // If a reporter starts a send_message op, then the reporting interval
1275
+ // changes and we destroy that reporter and create a new one, and then
1276
+ // the send_message op started by the old reporter finishes, this
1277
+ // method will be called even though it was for a completion started
1278
+ // by the old reporter. In that case, the timer will be pending, so
1279
+ // we just ignore the completion and wait for the timer to fire.
1280
+ if (timer_handle_.has_value()) return;
1473
1281
  // If there are no more registered stats to report, cancel the call.
1474
- auto it =
1475
- xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
1476
- if (it == xds_client()->xds_load_report_server_map_.end() ||
1477
- it->second.load_report_map.empty()) {
1478
- it->second.channel_state->StopLrsCallLocked();
1479
- GRPC_ERROR_UNREF(error);
1480
- return true;
1481
- }
1482
- if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1483
- GRPC_ERROR_UNREF(error);
1484
- // If this reporter is no longer the current one on the call, the reason
1485
- // might be that it was orphaned for a new one due to config update.
1486
- if (!IsCurrentReporterOnCall()) {
1487
- parent_->MaybeStartReportingLocked();
1282
+ auto it = xds_client()->xds_load_report_server_map_.find(
1283
+ &parent_->chand()->server_);
1284
+ if (it == xds_client()->xds_load_report_server_map_.end()) return;
1285
+ if (it->second.load_report_map.empty()) {
1286
+ if (it->second.channel_state != nullptr) {
1287
+ it->second.channel_state->StopLrsCallLocked();
1488
1288
  }
1489
- return true;
1289
+ return;
1490
1290
  }
1291
+ // Otherwise, schedule the next load report.
1491
1292
  ScheduleNextReportLocked();
1492
- return false;
1493
1293
  }
1494
1294
 
1495
1295
  //
@@ -1508,123 +1308,41 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1508
1308
  // the polling entities from client_channel.
1509
1309
  GPR_ASSERT(xds_client() != nullptr);
1510
1310
  const char* method =
1511
- chand()->server_.ShouldUseV3()
1512
- ? "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats"
1513
- : "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats";
1514
- call_ = grpc_channel_create_pollset_set_call(
1515
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
1516
- xds_client()->interested_parties_,
1517
- Slice::FromStaticString(method).c_slice(), nullptr,
1518
- Timestamp::InfFuture(), nullptr);
1311
+ "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats";
1312
+ call_ = chand()->transport_->CreateStreamingCall(
1313
+ method, std::make_unique<StreamEventHandler>(
1314
+ // Passing the initial ref here. This ref will go away when
1315
+ // the StreamEventHandler is destroyed.
1316
+ RefCountedPtr<LrsCallState>(this)));
1519
1317
  GPR_ASSERT(call_ != nullptr);
1520
- // Init the request payload.
1521
- grpc_slice request_payload_slice =
1522
- xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1523
- send_message_payload_ =
1524
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1525
- grpc_slice_unref_internal(request_payload_slice);
1526
- // Init other data associated with the LRS call.
1527
- grpc_metadata_array_init(&initial_metadata_recv_);
1528
- grpc_metadata_array_init(&trailing_metadata_recv_);
1529
1318
  // Start the call.
1530
1319
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1531
- gpr_log(
1532
- GPR_INFO,
1533
- "[xds_client %p] xds server %s: starting LRS call (calld=%p, call=%p)",
1534
- xds_client(), chand()->server_.server_uri.c_str(), this, call_);
1535
- }
1536
- // Create the ops.
1537
- grpc_call_error call_error;
1538
- grpc_op ops[3];
1539
- memset(ops, 0, sizeof(ops));
1540
- // Op: send initial metadata.
1541
- grpc_op* op = ops;
1542
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
1543
- op->data.send_initial_metadata.count = 0;
1544
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
1545
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
1546
- op->reserved = nullptr;
1547
- op++;
1548
- // Op: send request message.
1549
- GPR_ASSERT(send_message_payload_ != nullptr);
1550
- op->op = GRPC_OP_SEND_MESSAGE;
1551
- op->data.send_message.send_message = send_message_payload_;
1552
- op->flags = 0;
1553
- op->reserved = nullptr;
1554
- op++;
1555
- Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
1556
- GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
1557
- grpc_schedule_on_exec_ctx);
1558
- call_error = grpc_call_start_batch_and_execute(
1559
- call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
1560
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1561
- // Op: recv initial metadata.
1562
- op = ops;
1563
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
1564
- op->data.recv_initial_metadata.recv_initial_metadata =
1565
- &initial_metadata_recv_;
1566
- op->flags = 0;
1567
- op->reserved = nullptr;
1568
- op++;
1569
- // Op: recv response.
1570
- op->op = GRPC_OP_RECV_MESSAGE;
1571
- op->data.recv_message.recv_message = &recv_message_payload_;
1572
- op->flags = 0;
1573
- op->reserved = nullptr;
1574
- op++;
1575
- Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
1576
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1577
- grpc_schedule_on_exec_ctx);
1578
- call_error = grpc_call_start_batch_and_execute(
1579
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1580
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1581
- // Op: recv server status.
1582
- op = ops;
1583
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
1584
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
1585
- op->data.recv_status_on_client.status = &status_code_;
1586
- op->data.recv_status_on_client.status_details = &status_details_;
1587
- op->flags = 0;
1588
- op->reserved = nullptr;
1589
- op++;
1590
- // This callback signals the end of the call, so it relies on the initial
1591
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
1592
- // unreffed.
1593
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1594
- grpc_schedule_on_exec_ctx);
1595
- call_error = grpc_call_start_batch_and_execute(
1596
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1597
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1598
- }
1599
-
1600
- XdsClient::ChannelState::LrsCallState::~LrsCallState() {
1601
- grpc_metadata_array_destroy(&initial_metadata_recv_);
1602
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
1603
- grpc_byte_buffer_destroy(send_message_payload_);
1604
- grpc_byte_buffer_destroy(recv_message_payload_);
1605
- grpc_slice_unref_internal(status_details_);
1606
- GPR_ASSERT(call_ != nullptr);
1607
- grpc_call_unref(call_);
1320
+ gpr_log(GPR_INFO,
1321
+ "[xds_client %p] xds server %s: starting LRS call (calld=%p, "
1322
+ "call=%p)",
1323
+ xds_client(), chand()->server_.server_uri().c_str(), this,
1324
+ call_.get());
1325
+ }
1326
+ // Send the initial request.
1327
+ std::string serialized_payload = xds_client()->api_.CreateLrsInitialRequest();
1328
+ call_->SendMessage(std::move(serialized_payload));
1329
+ send_message_pending_ = true;
1608
1330
  }
1609
1331
 
1610
1332
  void XdsClient::ChannelState::LrsCallState::Orphan() {
1611
1333
  reporter_.reset();
1612
- GPR_ASSERT(call_ != nullptr);
1613
- // If we are here because xds_client wants to cancel the call,
1614
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
1615
- // we are here because xds_client has to orphan a failed call, then the
1616
- // following cancellation will be a no-op.
1617
- grpc_call_cancel_internal(call_);
1618
- // Note that the initial ref is hold by on_status_received_. So the
1619
- // corresponding unref happens in on_status_received_ instead of here.
1334
+ // Note that the initial ref is held by the StreamEventHandler, which
1335
+ // will be destroyed when call_ is destroyed, which may not happen
1336
+ // here, since there may be other refs held to call_ by internal callbacks.
1337
+ call_.reset();
1620
1338
  }
1621
1339
 
1622
1340
  void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1623
1341
  // Don't start again if already started.
1624
1342
  if (reporter_ != nullptr) return;
1625
- // Don't start if the previous send_message op (of the initial request or the
1626
- // last report of the previous reporter) hasn't completed.
1627
- if (send_message_payload_ != nullptr) return;
1343
+ // Don't start if the previous send_message op (of the initial request or
1344
+ // the last report of the previous reporter) hasn't completed.
1345
+ if (call_ != nullptr && send_message_pending_) return;
1628
1346
  // Don't start if no LRS response has arrived.
1629
1347
  if (!seen_response()) return;
1630
1348
  // Don't start if the ADS call hasn't received any valid response. Note that
@@ -1640,166 +1358,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1640
1358
  Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
1641
1359
  }
1642
1360
 
1643
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1644
- void* arg, grpc_error_handle /*error*/) {
1645
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1646
- {
1647
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1648
- lrs_calld->OnInitialRequestSentLocked();
1361
+ void XdsClient::ChannelState::LrsCallState::OnRequestSent(bool /*ok*/) {
1362
+ MutexLock lock(&xds_client()->mu_);
1363
+ send_message_pending_ = false;
1364
+ if (reporter_ != nullptr) {
1365
+ reporter_->OnReportDoneLocked();
1366
+ } else {
1367
+ MaybeStartReportingLocked();
1649
1368
  }
1650
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1651
1369
  }
1652
1370
 
1653
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1654
- // Clear the send_message_payload_.
1655
- grpc_byte_buffer_destroy(send_message_payload_);
1656
- send_message_payload_ = nullptr;
1657
- MaybeStartReportingLocked();
1658
- }
1659
-
1660
- void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1661
- void* arg, grpc_error_handle /*error*/) {
1662
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1663
- bool done;
1664
- {
1665
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1666
- done = lrs_calld->OnResponseReceivedLocked();
1667
- }
1668
- if (done) lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1669
- }
1670
-
1671
- bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1672
- // Empty payload means the call was cancelled.
1673
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1674
- return true;
1675
- }
1676
- // Read the response.
1677
- grpc_byte_buffer_reader bbr;
1678
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1679
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1680
- grpc_byte_buffer_reader_destroy(&bbr);
1681
- grpc_byte_buffer_destroy(recv_message_payload_);
1682
- recv_message_payload_ = nullptr;
1683
- // This anonymous lambda is a hack to avoid the usage of goto.
1684
- [&]() {
1685
- // Parse the response.
1686
- bool send_all_clusters = false;
1687
- std::set<std::string> new_cluster_names;
1688
- Duration new_load_reporting_interval;
1689
- grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1690
- response_slice, &send_all_clusters, &new_cluster_names,
1691
- &new_load_reporting_interval);
1692
- if (parse_error != GRPC_ERROR_NONE) {
1693
- gpr_log(GPR_ERROR,
1694
- "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1695
- xds_client(), chand()->server_.server_uri.c_str(),
1696
- grpc_error_std_string(parse_error).c_str());
1697
- GRPC_ERROR_UNREF(parse_error);
1698
- return;
1371
+ void XdsClient::ChannelState::LrsCallState::OnRecvMessage(
1372
+ absl::string_view payload) {
1373
+ MutexLock lock(&xds_client()->mu_);
1374
+ // If we're no longer the current call, ignore the result.
1375
+ if (!IsCurrentCallOnChannel()) return;
1376
+ // Parse the response.
1377
+ bool send_all_clusters = false;
1378
+ std::set<std::string> new_cluster_names;
1379
+ Duration new_load_reporting_interval;
1380
+ absl::Status status = xds_client()->api_.ParseLrsResponse(
1381
+ payload, &send_all_clusters, &new_cluster_names,
1382
+ &new_load_reporting_interval);
1383
+ if (!status.ok()) {
1384
+ gpr_log(GPR_ERROR,
1385
+ "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1386
+ xds_client(), chand()->server_.server_uri().c_str(),
1387
+ status.ToString().c_str());
1388
+ return;
1389
+ }
1390
+ seen_response_ = true;
1391
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1392
+ gpr_log(
1393
+ GPR_INFO,
1394
+ "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1395
+ " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1396
+ "ms",
1397
+ xds_client(), chand()->server_.server_uri().c_str(),
1398
+ new_cluster_names.size(), send_all_clusters,
1399
+ new_load_reporting_interval.millis());
1400
+ size_t i = 0;
1401
+ for (const auto& name : new_cluster_names) {
1402
+ gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1403
+ xds_client(), i++, name.c_str());
1699
1404
  }
1700
- seen_response_ = true;
1405
+ }
1406
+ if (new_load_reporting_interval <
1407
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1408
+ new_load_reporting_interval =
1409
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1701
1410
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1702
- gpr_log(
1703
- GPR_INFO,
1704
- "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1705
- " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1706
- "ms",
1707
- xds_client(), chand()->server_.server_uri.c_str(),
1708
- new_cluster_names.size(), send_all_clusters,
1709
- new_load_reporting_interval.millis());
1710
- size_t i = 0;
1711
- for (const auto& name : new_cluster_names) {
1712
- gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1713
- xds_client(), i++, name.c_str());
1714
- }
1715
- }
1716
- if (new_load_reporting_interval <
1717
- Duration::Milliseconds(
1718
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1719
- new_load_reporting_interval = Duration::Milliseconds(
1720
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1721
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1722
- gpr_log(GPR_INFO,
1723
- "[xds_client %p] xds server %s: increased load_report_interval "
1724
- "to minimum value %dms",
1725
- xds_client(), chand()->server_.server_uri.c_str(),
1726
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1727
- }
1411
+ gpr_log(GPR_INFO,
1412
+ "[xds_client %p] xds server %s: increased load_report_interval "
1413
+ "to minimum value %dms",
1414
+ xds_client(), chand()->server_.server_uri().c_str(),
1415
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1728
1416
  }
1729
- // Ignore identical update.
1730
- if (send_all_clusters == send_all_clusters_ &&
1731
- cluster_names_ == new_cluster_names &&
1732
- load_reporting_interval_ == new_load_reporting_interval) {
1733
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1734
- gpr_log(
1735
- GPR_INFO,
1736
- "[xds_client %p] xds server %s: incoming LRS response identical "
1737
- "to current, ignoring.",
1738
- xds_client(), chand()->server_.server_uri.c_str());
1739
- }
1740
- return;
1417
+ }
1418
+ // Ignore identical update.
1419
+ if (send_all_clusters == send_all_clusters_ &&
1420
+ cluster_names_ == new_cluster_names &&
1421
+ load_reporting_interval_ == new_load_reporting_interval) {
1422
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1423
+ gpr_log(GPR_INFO,
1424
+ "[xds_client %p] xds server %s: incoming LRS response identical "
1425
+ "to current, ignoring.",
1426
+ xds_client(), chand()->server_.server_uri().c_str());
1741
1427
  }
1742
- // Stop current load reporting (if any) to adopt the new config.
1743
- reporter_.reset();
1744
- // Record the new config.
1745
- send_all_clusters_ = send_all_clusters;
1746
- cluster_names_ = std::move(new_cluster_names);
1747
- load_reporting_interval_ = new_load_reporting_interval;
1748
- // Try starting sending load report.
1749
- MaybeStartReportingLocked();
1750
- }();
1751
- grpc_slice_unref_internal(response_slice);
1752
- if (xds_client()->shutting_down_) return true;
1753
- // Keep listening for LRS config updates.
1754
- grpc_op op;
1755
- memset(&op, 0, sizeof(op));
1756
- op.op = GRPC_OP_RECV_MESSAGE;
1757
- op.data.recv_message.recv_message = &recv_message_payload_;
1758
- op.flags = 0;
1759
- op.reserved = nullptr;
1760
- GPR_ASSERT(call_ != nullptr);
1761
- // Reuse the "OnResponseReceivedLocked" ref taken in ctor.
1762
- const grpc_call_error call_error =
1763
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1764
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1765
- return false;
1766
- }
1767
-
1768
- void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1769
- void* arg, grpc_error_handle error) {
1770
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1771
- {
1772
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1773
- lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1428
+ return;
1774
1429
  }
1775
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1430
+ // Stop current load reporting (if any) to adopt the new config.
1431
+ reporter_.reset();
1432
+ // Record the new config.
1433
+ send_all_clusters_ = send_all_clusters;
1434
+ cluster_names_ = std::move(new_cluster_names);
1435
+ load_reporting_interval_ = new_load_reporting_interval;
1436
+ // Try starting sending load report.
1437
+ MaybeStartReportingLocked();
1776
1438
  }
1777
1439
 
1778
- void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1779
- grpc_error_handle error) {
1780
- GPR_ASSERT(call_ != nullptr);
1440
+ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1441
+ absl::Status status) {
1442
+ MutexLock lock(&xds_client()->mu_);
1781
1443
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1782
- char* status_details = grpc_slice_to_c_string(status_details_);
1783
1444
  gpr_log(GPR_INFO,
1784
1445
  "[xds_client %p] xds server %s: LRS call status received "
1785
- "(chand=%p, calld=%p, call=%p): "
1786
- "status=%d, details='%s', error='%s'",
1787
- xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1788
- call_, status_code_, status_details,
1789
- grpc_error_std_string(error).c_str());
1790
- gpr_free(status_details);
1446
+ "(chand=%p, calld=%p, call=%p): %s",
1447
+ xds_client(), chand()->server_.server_uri().c_str(), chand(), this,
1448
+ call_.get(), status.ToString().c_str());
1791
1449
  }
1792
1450
  // Ignore status from a stale call.
1793
1451
  if (IsCurrentCallOnChannel()) {
1794
1452
  // Try to restart the call.
1795
1453
  parent_->OnCallFinishedLocked();
1796
1454
  }
1797
- GRPC_ERROR_UNREF(error);
1798
1455
  }
1799
1456
 
1800
1457
  bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1801
- // If the retryable LRS call is null (which only happens when the xds channel
1802
- // is shutting down), all the LRS calls are stale.
1458
+ // If the retryable LRS call is null (which only happens when the xds
1459
+ // channel is shutting down), all the LRS calls are stale.
1803
1460
  if (chand()->lrs_calld_ == nullptr) return false;
1804
1461
  return this == chand()->lrs_calld_->calld();
1805
1462
  }
@@ -1808,85 +1465,66 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1808
1465
  // XdsClient
1809
1466
  //
1810
1467
 
1811
- namespace {
1812
-
1813
- Duration GetRequestTimeout(const grpc_channel_args* args) {
1814
- return Duration::Milliseconds(grpc_channel_args_find_integer(
1815
- args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1816
- {15000, 0, INT_MAX}));
1817
- }
1818
-
1819
- grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1820
- absl::InlinedVector<grpc_arg, 1> args_to_add = {
1821
- grpc_channel_arg_integer_create(
1822
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1823
- 5 * 60 * GPR_MS_PER_SEC),
1824
- };
1825
- return grpc_channel_args_copy_and_add(args, args_to_add.data(),
1826
- args_to_add.size());
1827
- }
1828
-
1829
- } // namespace
1830
-
1831
- XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1832
- const grpc_channel_args* args)
1468
+ XdsClient::XdsClient(
1469
+ std::unique_ptr<XdsBootstrap> bootstrap,
1470
+ OrphanablePtr<XdsTransportFactory> transport_factory,
1471
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine,
1472
+ std::string user_agent_name, std::string user_agent_version,
1473
+ Duration resource_request_timeout)
1833
1474
  : DualRefCounted<XdsClient>(
1834
1475
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1835
1476
  : nullptr),
1836
1477
  bootstrap_(std::move(bootstrap)),
1837
- args_(ModifyChannelArgs(args)),
1838
- request_timeout_(GetRequestTimeout(args)),
1839
- interested_parties_(grpc_pollset_set_create()),
1840
- certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1841
- bootstrap_->certificate_providers())),
1842
- api_(this, &grpc_xds_client_trace, bootstrap_->node(),
1843
- &bootstrap_->certificate_providers(), &symtab_) {
1478
+ transport_factory_(std::move(transport_factory)),
1479
+ request_timeout_(resource_request_timeout),
1480
+ xds_federation_enabled_(XdsFederationEnabled()),
1481
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_,
1482
+ std::move(user_agent_name), std::move(user_agent_version)),
1483
+ engine_(std::move(engine)) {
1844
1484
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1845
1485
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1846
1486
  }
1847
- // Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
1848
- // destroyed.
1849
- grpc_init();
1487
+ GPR_ASSERT(bootstrap_ != nullptr);
1488
+ if (bootstrap_->node() != nullptr) {
1489
+ gpr_log(GPR_INFO, "[xds_client %p] xDS node ID: %s", this,
1490
+ bootstrap_->node()->id().c_str());
1491
+ }
1850
1492
  }
1851
1493
 
1852
1494
  XdsClient::~XdsClient() {
1853
1495
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1854
1496
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1855
1497
  }
1856
- grpc_channel_args_destroy(args_);
1857
- grpc_pollset_set_destroy(interested_parties_);
1858
- // Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
1859
- // is destroyed.
1860
- grpc_shutdown();
1861
1498
  }
1862
1499
 
1863
1500
  void XdsClient::Orphan() {
1864
1501
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1865
1502
  gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
1866
1503
  }
1867
- {
1868
- MutexLock lock(g_mu);
1869
- if (g_xds_client == this) g_xds_client = nullptr;
1870
- }
1871
- {
1872
- MutexLock lock(&mu_);
1873
- shutting_down_ = true;
1874
- // Clear cache and any remaining watchers that may not have been cancelled.
1875
- authority_state_map_.clear();
1876
- invalid_watchers_.clear();
1504
+ MutexLock lock(&mu_);
1505
+ shutting_down_ = true;
1506
+ // Clear cache and any remaining watchers that may not have been cancelled.
1507
+ authority_state_map_.clear();
1508
+ invalid_watchers_.clear();
1509
+ // We may still be sending lingering queued load report data, so don't
1510
+ // just clear the load reporting map, but we do want to clear the refs
1511
+ // we're holding to the ChannelState objects, to make sure that
1512
+ // everything shuts down properly.
1513
+ for (auto& p : xds_load_report_server_map_) {
1514
+ p.second.channel_state.reset(DEBUG_LOCATION, "XdsClient::Orphan()");
1877
1515
  }
1878
1516
  }
1879
1517
 
1880
1518
  RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
1881
- const XdsBootstrap::XdsServer& server) {
1882
- auto it = xds_server_channel_map_.find(server);
1519
+ const XdsBootstrap::XdsServer& server, const char* reason) {
1520
+ auto it = xds_server_channel_map_.find(&server);
1883
1521
  if (it != xds_server_channel_map_.end()) {
1884
- return it->second->Ref(DEBUG_LOCATION, "Authority");
1522
+ return it->second->Ref(DEBUG_LOCATION, reason);
1885
1523
  }
1886
1524
  // Channel not found, so create a new one.
1887
1525
  auto channel_state = MakeRefCounted<ChannelState>(
1888
1526
  WeakRef(DEBUG_LOCATION, "ChannelState"), server);
1889
- xds_server_channel_map_[server] = channel_state.get();
1527
+ xds_server_channel_map_[&server] = channel_state.get();
1890
1528
  return channel_state;
1891
1529
  }
1892
1530
 
@@ -1895,24 +1533,23 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1895
1533
  RefCountedPtr<ResourceWatcherInterface> watcher) {
1896
1534
  ResourceWatcherInterface* w = watcher.get();
1897
1535
  // Lambda for handling failure cases.
1898
- auto fail = [&](grpc_error_handle error) mutable {
1536
+ auto fail = [&](absl::Status status) mutable {
1899
1537
  {
1900
1538
  MutexLock lock(&mu_);
1901
1539
  MaybeRegisterResourceTypeLocked(type);
1902
1540
  invalid_watchers_[w] = watcher;
1903
1541
  }
1904
1542
  work_serializer_.Run(
1905
- // TODO(yashykt): When we move to C++14, capture watcher using
1906
- // std::move()
1907
- [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1908
- watcher->OnError(error);
1909
- },
1543
+ [watcher = std::move(watcher), status = std::move(status)]()
1544
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1545
+ watcher->OnError(status);
1546
+ },
1910
1547
  DEBUG_LOCATION);
1911
1548
  };
1912
1549
  auto resource_name = ParseXdsResourceName(name, type);
1913
1550
  if (!resource_name.ok()) {
1914
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
1915
- "Unable to parse resource name for listener %s", name)));
1551
+ fail(absl::UnavailableError(
1552
+ absl::StrCat("Unable to parse resource name ", name)));
1916
1553
  return;
1917
1554
  }
1918
1555
  // Find server to use.
@@ -1921,14 +1558,12 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1921
1558
  if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
1922
1559
  auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
1923
1560
  if (authority == nullptr) {
1924
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(
1561
+ fail(absl::UnavailableError(
1925
1562
  absl::StrCat("authority \"", authority_name,
1926
1563
  "\" not present in bootstrap config")));
1927
1564
  return;
1928
1565
  }
1929
- if (!authority->xds_servers.empty()) {
1930
- xds_server = &authority->xds_servers[0];
1931
- }
1566
+ xds_server = authority->server();
1932
1567
  }
1933
1568
  if (xds_server == nullptr) xds_server = &bootstrap_->server();
1934
1569
  {
@@ -1954,12 +1589,60 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1954
1589
  delete value;
1955
1590
  },
1956
1591
  DEBUG_LOCATION);
1592
+ } else if (resource_state.meta.client_status ==
1593
+ XdsApi::ResourceMetadata::DOES_NOT_EXIST) {
1594
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1595
+ gpr_log(GPR_INFO,
1596
+ "[xds_client %p] reporting cached does-not-exist for %s", this,
1597
+ std::string(name).c_str());
1598
+ }
1599
+ work_serializer_.Schedule(
1600
+ [watcher]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1601
+ watcher->OnResourceDoesNotExist();
1602
+ },
1603
+ DEBUG_LOCATION);
1604
+ } else if (resource_state.meta.client_status ==
1605
+ XdsApi::ResourceMetadata::NACKED) {
1606
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1607
+ gpr_log(
1608
+ GPR_INFO,
1609
+ "[xds_client %p] reporting cached validation failure for %s: %s",
1610
+ this, std::string(name).c_str(),
1611
+ resource_state.meta.failed_details.c_str());
1612
+ }
1613
+ std::string details = resource_state.meta.failed_details;
1614
+ const auto* node = bootstrap_->node();
1615
+ if (node != nullptr) {
1616
+ absl::StrAppend(&details, " (node ID:", bootstrap_->node()->id(), ")");
1617
+ }
1618
+ work_serializer_.Schedule(
1619
+ [watcher, details = std::move(details)]()
1620
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1621
+ watcher->OnError(absl::UnavailableError(
1622
+ absl::StrCat("invalid resource: ", details)));
1623
+ },
1624
+ DEBUG_LOCATION);
1957
1625
  }
1958
1626
  // If the authority doesn't yet have a channel, set it, creating it if
1959
1627
  // needed.
1960
1628
  if (authority_state.channel_state == nullptr) {
1961
1629
  authority_state.channel_state =
1962
- GetOrCreateChannelStateLocked(*xds_server);
1630
+ GetOrCreateChannelStateLocked(*xds_server, "start watch");
1631
+ }
1632
+ absl::Status channel_status = authority_state.channel_state->status();
1633
+ if (!channel_status.ok()) {
1634
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1635
+ gpr_log(GPR_INFO,
1636
+ "[xds_client %p] returning cached channel error for %s: %s",
1637
+ this, std::string(name).c_str(),
1638
+ channel_status.ToString().c_str());
1639
+ }
1640
+ work_serializer_.Schedule(
1641
+ [watcher = std::move(watcher), status = std::move(channel_status)]()
1642
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) mutable {
1643
+ watcher->OnError(std::move(status));
1644
+ },
1645
+ DEBUG_LOCATION);
1963
1646
  }
1964
1647
  authority_state.channel_state->SubscribeLocked(type, *resource_name);
1965
1648
  }
@@ -1972,12 +1655,11 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
1972
1655
  bool delay_unsubscription) {
1973
1656
  auto resource_name = ParseXdsResourceName(name, type);
1974
1657
  MutexLock lock(&mu_);
1975
- if (!resource_name.ok()) {
1976
- invalid_watchers_.erase(watcher);
1977
- return;
1978
- }
1979
- if (shutting_down_) return;
1658
+ // We cannot be sure whether the watcher is in invalid_watchers_ or in
1659
+ // authority_state_map_, so we check both, just to be safe.
1660
+ invalid_watchers_.erase(watcher);
1980
1661
  // Find authority.
1662
+ if (!resource_name.ok()) return;
1981
1663
  auto authority_it = authority_state_map_.find(resource_name->authority);
1982
1664
  if (authority_it == authority_state_map_.end()) return;
1983
1665
  AuthorityState& authority_state = authority_it->second;
@@ -1993,6 +1675,13 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
1993
1675
  resource_state.watchers.erase(watcher);
1994
1676
  // Clean up empty map entries, if any.
1995
1677
  if (resource_state.watchers.empty()) {
1678
+ if (resource_state.ignored_deletion) {
1679
+ gpr_log(GPR_INFO,
1680
+ "[xds_client %p] unsubscribing from a resource for which we "
1681
+ "previously ignored a deletion: type %s name %s",
1682
+ this, std::string(type->type_url()).c_str(),
1683
+ std::string(name).c_str());
1684
+ }
1996
1685
  authority_state.channel_state->UnsubscribeLocked(type, *resource_name,
1997
1686
  delay_unsubscription);
1998
1687
  type_map.erase(resource_it);
@@ -2013,24 +1702,22 @@ void XdsClient::MaybeRegisterResourceTypeLocked(
2013
1702
  return;
2014
1703
  }
2015
1704
  resource_types_.emplace(resource_type->type_url(), resource_type);
2016
- v2_resource_types_.emplace(resource_type->v2_type_url(), resource_type);
2017
- resource_type->InitUpbSymtab(symtab_.ptr());
1705
+ resource_type->InitUpbSymtab(this, symtab_.ptr());
2018
1706
  }
2019
1707
 
2020
1708
  const XdsResourceType* XdsClient::GetResourceTypeLocked(
2021
1709
  absl::string_view resource_type) {
2022
1710
  auto it = resource_types_.find(resource_type);
2023
1711
  if (it != resource_types_.end()) return it->second;
2024
- auto it2 = v2_resource_types_.find(resource_type);
2025
- if (it2 != v2_resource_types_.end()) return it2->second;
2026
1712
  return nullptr;
2027
1713
  }
2028
1714
 
2029
1715
  absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
2030
1716
  absl::string_view name, const XdsResourceType* type) {
2031
1717
  // Old-style names use the empty string for authority.
2032
- // authority is prefixed with "old:" to indicate that it's an old-style name.
2033
- if (!absl::StartsWith(name, "xdstp:")) {
1718
+ // authority is prefixed with "old:" to indicate that it's an old-style
1719
+ // name.
1720
+ if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
2034
1721
  return XdsResourceName{"old:", {std::string(name), {}}};
2035
1722
  }
2036
1723
  // New style name. Parse URI.
@@ -2039,7 +1726,7 @@ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
2039
1726
  // Split the resource type off of the path to get the id.
2040
1727
  std::pair<absl::string_view, absl::string_view> path_parts = absl::StrSplit(
2041
1728
  absl::StripPrefix(uri->path(), "/"), absl::MaxSplits('/', 1));
2042
- if (!type->IsType(path_parts.first, nullptr)) {
1729
+ if (type->type_url() != path_parts.first) {
2043
1730
  return absl::InvalidArgumentError(
2044
1731
  "xdstp URI path must indicate valid xDS resource type");
2045
1732
  }
@@ -2071,40 +1758,45 @@ std::string XdsClient::ConstructFullXdsResourceName(
2071
1758
  RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2072
1759
  const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2073
1760
  absl::string_view eds_service_name) {
2074
- if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
1761
+ const auto* server = bootstrap_->FindXdsServer(xds_server);
1762
+ if (server == nullptr) return nullptr;
2075
1763
  auto key =
2076
1764
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2077
- MutexLock lock(&mu_);
2078
- // We jump through some hoops here to make sure that the const
2079
- // XdsBootstrap::XdsServer& and absl::string_views
2080
- // stored in the XdsClusterDropStats object point to the
2081
- // XdsBootstrap::XdsServer and strings
2082
- // in the load_report_map_ key, so that they have the same lifetime.
2083
- auto server_it =
2084
- xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2085
- if (server_it->second.channel_state == nullptr) {
2086
- server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2087
- }
2088
- auto load_report_it = server_it->second.load_report_map
2089
- .emplace(std::move(key), LoadReportState())
2090
- .first;
2091
- LoadReportState& load_report_state = load_report_it->second;
2092
1765
  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
2093
- if (load_report_state.drop_stats != nullptr) {
2094
- cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
2095
- }
2096
- if (cluster_drop_stats == nullptr) {
1766
+ {
1767
+ MutexLock lock(&mu_);
1768
+ // We jump through some hoops here to make sure that the const
1769
+ // XdsBootstrap::XdsServer& and absl::string_views
1770
+ // stored in the XdsClusterDropStats object point to the
1771
+ // XdsBootstrap::XdsServer and strings
1772
+ // in the load_report_map_ key, so that they have the same lifetime.
1773
+ auto server_it =
1774
+ xds_load_report_server_map_.emplace(server, LoadReportServer()).first;
1775
+ if (server_it->second.channel_state == nullptr) {
1776
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1777
+ *server, "load report map (drop stats)");
1778
+ }
1779
+ auto load_report_it = server_it->second.load_report_map
1780
+ .emplace(std::move(key), LoadReportState())
1781
+ .first;
1782
+ LoadReportState& load_report_state = load_report_it->second;
2097
1783
  if (load_report_state.drop_stats != nullptr) {
2098
- load_report_state.deleted_drop_stats +=
2099
- load_report_state.drop_stats->GetSnapshotAndReset();
1784
+ cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
1785
+ }
1786
+ if (cluster_drop_stats == nullptr) {
1787
+ if (load_report_state.drop_stats != nullptr) {
1788
+ load_report_state.deleted_drop_stats +=
1789
+ load_report_state.drop_stats->GetSnapshotAndReset();
1790
+ }
1791
+ cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1792
+ Ref(DEBUG_LOCATION, "DropStats"), *server,
1793
+ load_report_it->first.first /*cluster_name*/,
1794
+ load_report_it->first.second /*eds_service_name*/);
1795
+ load_report_state.drop_stats = cluster_drop_stats.get();
2100
1796
  }
2101
- cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
2102
- Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
2103
- load_report_it->first.first /*cluster_name*/,
2104
- load_report_it->first.second /*eds_service_name*/);
2105
- load_report_state.drop_stats = cluster_drop_stats.get();
1797
+ server_it->second.channel_state->MaybeStartLrsCall();
2106
1798
  }
2107
- server_it->second.channel_state->MaybeStartLrsCall();
1799
+ work_serializer_.DrainQueue();
2108
1800
  return cluster_drop_stats;
2109
1801
  }
2110
1802
 
@@ -2112,8 +1804,10 @@ void XdsClient::RemoveClusterDropStats(
2112
1804
  const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2113
1805
  absl::string_view eds_service_name,
2114
1806
  XdsClusterDropStats* cluster_drop_stats) {
1807
+ const auto* server = bootstrap_->FindXdsServer(xds_server);
1808
+ if (server == nullptr) return;
2115
1809
  MutexLock lock(&mu_);
2116
- auto server_it = xds_load_report_server_map_.find(xds_server);
1810
+ auto server_it = xds_load_report_server_map_.find(server);
2117
1811
  if (server_it == xds_load_report_server_map_.end()) return;
2118
1812
  auto load_report_it = server_it->second.load_report_map.find(
2119
1813
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
@@ -2132,42 +1826,48 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2132
1826
  const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2133
1827
  absl::string_view eds_service_name,
2134
1828
  RefCountedPtr<XdsLocalityName> locality) {
2135
- if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
1829
+ const auto* server = bootstrap_->FindXdsServer(xds_server);
1830
+ if (server == nullptr) return nullptr;
2136
1831
  auto key =
2137
1832
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2138
- MutexLock lock(&mu_);
2139
- // We jump through some hoops here to make sure that the const
2140
- // XdsBootstrap::XdsServer& and absl::string_views
2141
- // stored in the XdsClusterDropStats object point to the
2142
- // XdsBootstrap::XdsServer and strings
2143
- // in the load_report_map_ key, so that they have the same lifetime.
2144
- auto server_it =
2145
- xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2146
- if (server_it->second.channel_state == nullptr) {
2147
- server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2148
- }
2149
- auto load_report_it = server_it->second.load_report_map
2150
- .emplace(std::move(key), LoadReportState())
2151
- .first;
2152
- LoadReportState& load_report_state = load_report_it->second;
2153
- LoadReportState::LocalityState& locality_state =
2154
- load_report_state.locality_stats[locality];
2155
1833
  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
2156
- if (locality_state.locality_stats != nullptr) {
2157
- cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
2158
- }
2159
- if (cluster_locality_stats == nullptr) {
1834
+ {
1835
+ MutexLock lock(&mu_);
1836
+ // We jump through some hoops here to make sure that the const
1837
+ // XdsBootstrap::XdsServer& and absl::string_views
1838
+ // stored in the XdsClusterDropStats object point to the
1839
+ // XdsBootstrap::XdsServer and strings
1840
+ // in the load_report_map_ key, so that they have the same lifetime.
1841
+ auto server_it =
1842
+ xds_load_report_server_map_.emplace(server, LoadReportServer()).first;
1843
+ if (server_it->second.channel_state == nullptr) {
1844
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1845
+ *server, "load report map (locality stats)");
1846
+ }
1847
+ auto load_report_it = server_it->second.load_report_map
1848
+ .emplace(std::move(key), LoadReportState())
1849
+ .first;
1850
+ LoadReportState& load_report_state = load_report_it->second;
1851
+ LoadReportState::LocalityState& locality_state =
1852
+ load_report_state.locality_stats[locality];
2160
1853
  if (locality_state.locality_stats != nullptr) {
2161
- locality_state.deleted_locality_stats +=
2162
- locality_state.locality_stats->GetSnapshotAndReset();
1854
+ cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
1855
+ }
1856
+ if (cluster_locality_stats == nullptr) {
1857
+ if (locality_state.locality_stats != nullptr) {
1858
+ locality_state.deleted_locality_stats +=
1859
+ locality_state.locality_stats->GetSnapshotAndReset();
1860
+ }
1861
+ cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
1862
+ Ref(DEBUG_LOCATION, "LocalityStats"), *server,
1863
+ load_report_it->first.first /*cluster_name*/,
1864
+ load_report_it->first.second /*eds_service_name*/,
1865
+ std::move(locality));
1866
+ locality_state.locality_stats = cluster_locality_stats.get();
2163
1867
  }
2164
- cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
2165
- Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
2166
- load_report_it->first.first /*cluster_name*/,
2167
- load_report_it->first.second /*eds_service_name*/, std::move(locality));
2168
- locality_state.locality_stats = cluster_locality_stats.get();
1868
+ server_it->second.channel_state->MaybeStartLrsCall();
2169
1869
  }
2170
- server_it->second.channel_state->MaybeStartLrsCall();
1870
+ work_serializer_.DrainQueue();
2171
1871
  return cluster_locality_stats;
2172
1872
  }
2173
1873
 
@@ -2176,8 +1876,10 @@ void XdsClient::RemoveClusterLocalityStats(
2176
1876
  absl::string_view eds_service_name,
2177
1877
  const RefCountedPtr<XdsLocalityName>& locality,
2178
1878
  XdsClusterLocalityStats* cluster_locality_stats) {
1879
+ const auto* server = bootstrap_->FindXdsServer(xds_server);
1880
+ if (server == nullptr) return;
2179
1881
  MutexLock lock(&mu_);
2180
- auto server_it = xds_load_report_server_map_.find(xds_server);
1882
+ auto server_it = xds_load_report_server_map_.find(server);
2181
1883
  if (server_it == xds_load_report_server_map_.end()) return;
2182
1884
  auto load_report_it = server_it->second.load_report_map.find(
2183
1885
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
@@ -2198,29 +1900,38 @@ void XdsClient::RemoveClusterLocalityStats(
2198
1900
  void XdsClient::ResetBackoff() {
2199
1901
  MutexLock lock(&mu_);
2200
1902
  for (auto& p : xds_server_channel_map_) {
2201
- grpc_channel_reset_connect_backoff(p.second->channel());
1903
+ p.second->ResetBackoff();
2202
1904
  }
2203
1905
  }
2204
1906
 
2205
- void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2206
- std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
2207
- for (const auto& a : authority_state_map_) { // authority
2208
- for (const auto& t : a.second.resource_map) { // type
2209
- for (const auto& r : t.second) { // resource id
2210
- for (const auto& w : r.second.watchers) { // watchers
2211
- watchers.insert(w.second);
2212
- }
2213
- }
2214
- }
1907
+ void XdsClient::NotifyWatchersOnErrorLocked(
1908
+ const std::map<ResourceWatcherInterface*,
1909
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
1910
+ absl::Status status) {
1911
+ const auto* node = bootstrap_->node();
1912
+ if (node != nullptr) {
1913
+ status = absl::Status(
1914
+ status.code(),
1915
+ absl::StrCat(status.message(), " (node ID:", node->id(), ")"));
2215
1916
  }
2216
1917
  work_serializer_.Schedule(
2217
- // TODO(yashykt): When we move to C++14, capture watchers using
2218
- // std::move()
2219
- [watchers, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2220
- for (const auto& watcher : watchers) {
2221
- watcher->OnError(GRPC_ERROR_REF(error));
1918
+ [watchers, status = std::move(status)]()
1919
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1920
+ for (const auto& p : watchers) {
1921
+ p.first->OnError(status);
1922
+ }
1923
+ },
1924
+ DEBUG_LOCATION);
1925
+ }
1926
+
1927
+ void XdsClient::NotifyWatchersOnResourceDoesNotExist(
1928
+ const std::map<ResourceWatcherInterface*,
1929
+ RefCountedPtr<ResourceWatcherInterface>>& watchers) {
1930
+ work_serializer_.Schedule(
1931
+ [watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1932
+ for (const auto& p : watchers) {
1933
+ p.first->OnResourceDoesNotExist();
2222
1934
  }
2223
- GRPC_ERROR_UNREF(error);
2224
1935
  },
2225
1936
  DEBUG_LOCATION);
2226
1937
  }
@@ -2232,7 +1943,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2232
1943
  gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
2233
1944
  }
2234
1945
  XdsApi::ClusterLoadReportMap snapshot_map;
2235
- auto server_it = xds_load_report_server_map_.find(xds_server);
1946
+ auto server_it = xds_load_report_server_map_.find(&xds_server);
2236
1947
  if (server_it == xds_load_report_server_map_.end()) return snapshot_map;
2237
1948
  auto& load_report_map = server_it->second.load_report_map;
2238
1949
  for (auto load_report_it = load_report_map.begin();
@@ -2291,7 +2002,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2291
2002
  }
2292
2003
  }
2293
2004
  // Compute load report interval.
2294
- const Timestamp now = ExecCtx::Get()->Now();
2005
+ const Timestamp now = Timestamp::Now();
2295
2006
  snapshot.load_report_interval = now - load_report.last_report_time;
2296
2007
  load_report.last_report_time = now;
2297
2008
  // Record snapshot.
@@ -2331,190 +2042,4 @@ std::string XdsClient::DumpClientConfigBinary() {
2331
2042
  return api_.AssembleClientConfig(resource_type_metadata_map);
2332
2043
  }
2333
2044
 
2334
- //
2335
- // accessors for global state
2336
- //
2337
-
2338
- void XdsClientGlobalInit() {
2339
- g_mu = new Mutex;
2340
- XdsHttpFilterRegistry::Init();
2341
- }
2342
-
2343
- // TODO(roth): Find a better way to clear the fallback config that does
2344
- // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2345
- void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2346
- gpr_free(g_fallback_bootstrap_config);
2347
- g_fallback_bootstrap_config = nullptr;
2348
- delete g_mu;
2349
- g_mu = nullptr;
2350
- XdsHttpFilterRegistry::Shutdown();
2351
- }
2352
-
2353
- namespace {
2354
-
2355
- std::string GetBootstrapContents(const char* fallback_config,
2356
- grpc_error_handle* error) {
2357
- // First, try GRPC_XDS_BOOTSTRAP env var.
2358
- UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2359
- if (path != nullptr) {
2360
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2361
- gpr_log(GPR_INFO,
2362
- "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2363
- "environment variable: %s",
2364
- path.get());
2365
- }
2366
- grpc_slice contents;
2367
- *error =
2368
- grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2369
- if (*error != GRPC_ERROR_NONE) return "";
2370
- std::string contents_str(StringViewFromSlice(contents));
2371
- grpc_slice_unref_internal(contents);
2372
- return contents_str;
2373
- }
2374
- // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2375
- UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2376
- if (env_config != nullptr) {
2377
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2378
- gpr_log(GPR_INFO,
2379
- "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2380
- "environment variable");
2381
- }
2382
- return env_config.get();
2383
- }
2384
- // Finally, try fallback config.
2385
- if (fallback_config != nullptr) {
2386
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2387
- gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2388
- }
2389
- return fallback_config;
2390
- }
2391
- // No bootstrap config found.
2392
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2393
- "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2394
- "not defined");
2395
- return "";
2396
- }
2397
-
2398
- } // namespace
2399
-
2400
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2401
- grpc_error_handle* error) {
2402
- RefCountedPtr<XdsClient> xds_client;
2403
- // If getting bootstrap from channel args, create a local XdsClient
2404
- // instance for the channel or server instead of using the global instance.
2405
- const char* bootstrap_config = grpc_channel_args_find_string(
2406
- args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2407
- if (bootstrap_config != nullptr) {
2408
- std::unique_ptr<XdsBootstrap> bootstrap =
2409
- XdsBootstrap::Create(bootstrap_config, error);
2410
- if (*error == GRPC_ERROR_NONE) {
2411
- grpc_channel_args* xds_channel_args =
2412
- grpc_channel_args_find_pointer<grpc_channel_args>(
2413
- args,
2414
- GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2415
- return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2416
- }
2417
- return nullptr;
2418
- }
2419
- // Otherwise, use the global instance.
2420
- {
2421
- MutexLock lock(g_mu);
2422
- if (g_xds_client != nullptr) {
2423
- auto xds_client = g_xds_client->RefIfNonZero();
2424
- if (xds_client != nullptr) return xds_client;
2425
- }
2426
- // Find bootstrap contents.
2427
- std::string bootstrap_contents =
2428
- GetBootstrapContents(g_fallback_bootstrap_config, error);
2429
- if (*error != GRPC_ERROR_NONE) return nullptr;
2430
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2431
- gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2432
- bootstrap_contents.c_str());
2433
- }
2434
- // Parse bootstrap.
2435
- std::unique_ptr<XdsBootstrap> bootstrap =
2436
- XdsBootstrap::Create(bootstrap_contents, error);
2437
- if (*error != GRPC_ERROR_NONE) return nullptr;
2438
- // Instantiate XdsClient.
2439
- xds_client =
2440
- MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2441
- g_xds_client = xds_client.get();
2442
- }
2443
- return xds_client;
2444
- }
2445
-
2446
- namespace internal {
2447
-
2448
- void SetXdsChannelArgsForTest(grpc_channel_args* args) {
2449
- MutexLock lock(g_mu);
2450
- g_channel_args = args;
2451
- }
2452
-
2453
- void UnsetGlobalXdsClientForTest() {
2454
- MutexLock lock(g_mu);
2455
- g_xds_client = nullptr;
2456
- }
2457
-
2458
- void SetXdsFallbackBootstrapConfig(const char* config) {
2459
- MutexLock lock(g_mu);
2460
- gpr_free(g_fallback_bootstrap_config);
2461
- g_fallback_bootstrap_config = gpr_strdup(config);
2462
- }
2463
-
2464
- } // namespace internal
2465
-
2466
- //
2467
- // embedding XdsClient in channel args
2468
- //
2469
-
2470
- #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2471
-
2472
- namespace {
2473
-
2474
- void* XdsClientArgCopy(void* p) {
2475
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2476
- xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2477
- return p;
2478
- }
2479
-
2480
- void XdsClientArgDestroy(void* p) {
2481
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2482
- xds_client->Unref(DEBUG_LOCATION, "channel arg");
2483
- }
2484
-
2485
- int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
2486
-
2487
- const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2488
- XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2489
-
2490
- } // namespace
2491
-
2492
- grpc_arg XdsClient::MakeChannelArg() const {
2493
- return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2494
- const_cast<XdsClient*>(this),
2495
- &kXdsClientArgVtable);
2496
- }
2497
-
2498
- RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2499
- const grpc_channel_args& args) {
2500
- XdsClient* xds_client =
2501
- grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2502
- if (xds_client == nullptr) return nullptr;
2503
- return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2504
- }
2505
-
2506
2045
  } // namespace grpc_core
2507
-
2508
- // The returned bytes may contain NULL(0), so we can't use c-string.
2509
- grpc_slice grpc_dump_xds_configs() {
2510
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2511
- grpc_core::ExecCtx exec_ctx;
2512
- grpc_error_handle error = GRPC_ERROR_NONE;
2513
- auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2514
- if (error != GRPC_ERROR_NONE) {
2515
- // If we isn't using xDS, just return an empty string.
2516
- GRPC_ERROR_UNREF(error);
2517
- return grpc_empty_slice();
2518
- }
2519
- return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
2520
- }