grpc 1.46.3 → 1.53.1

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