grpc 1.42.0 → 1.49.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 (1877) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +622 -358
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +114 -43
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  6. data/include/grpc/event_engine/memory_allocator.h +27 -26
  7. data/include/grpc/event_engine/memory_request.h +57 -0
  8. data/include/grpc/event_engine/port.h +1 -1
  9. data/include/grpc/event_engine/slice.h +286 -0
  10. data/include/grpc/event_engine/slice_buffer.h +118 -0
  11. data/include/grpc/grpc.h +43 -17
  12. data/include/grpc/grpc_posix.h +20 -19
  13. data/include/grpc/grpc_security.h +323 -195
  14. data/include/grpc/grpc_security_constants.h +1 -14
  15. data/include/grpc/impl/codegen/compression_types.h +2 -3
  16. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  17. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  18. data/include/grpc/impl/codegen/grpc_types.h +24 -25
  19. data/include/grpc/impl/codegen/port_platform.h +107 -44
  20. data/include/grpc/impl/codegen/slice.h +5 -2
  21. data/include/grpc/slice.h +0 -11
  22. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  23. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  24. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +141 -0
  25. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  26. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +7 -5
  27. data/src/core/ext/filters/client_channel/backend_metric.cc +20 -16
  28. data/src/core/ext/filters/client_channel/backend_metric.h +19 -8
  29. data/src/core/ext/filters/client_channel/backup_poller.cc +20 -14
  30. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  31. data/src/core/ext/filters/client_channel/channel_connectivity.cc +48 -26
  32. data/src/core/ext/filters/client_channel/client_channel.cc +574 -496
  33. data/src/core/ext/filters/client_channel/client_channel.h +100 -54
  34. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  35. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  36. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -26
  37. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -8
  38. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -25
  39. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  40. data/src/core/ext/filters/client_channel/config_selector.h +21 -11
  41. data/src/core/ext/filters/client_channel/connector.h +12 -7
  42. data/src/core/ext/filters/client_channel/dynamic_filters.cc +24 -12
  43. data/src/core/ext/filters/client_channel/dynamic_filters.h +14 -4
  44. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +4 -22
  45. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +6 -15
  46. data/src/core/ext/filters/client_channel/health/health_check_client.cc +140 -583
  47. data/src/core/ext/filters/client_channel/health/health_check_client.h +26 -160
  48. data/src/core/ext/filters/client_channel/http_proxy.cc +100 -126
  49. data/src/core/ext/filters/client_channel/http_proxy.h +23 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +10 -5
  51. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  52. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  53. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +25 -11
  54. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +10 -5
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +15 -12
  56. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  57. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +285 -225
  58. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  59. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +16 -3
  60. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +6 -2
  61. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  62. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +8 -2
  63. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +26 -16
  64. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +10 -8
  65. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +407 -0
  66. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  67. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1142 -0
  68. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +78 -0
  69. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +206 -190
  70. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +420 -292
  71. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +419 -272
  72. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +11 -5
  73. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +302 -236
  74. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +269 -241
  75. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +142 -124
  76. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +210 -164
  77. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +231 -205
  78. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +7 -1
  79. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +252 -167
  80. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +103 -86
  81. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +534 -548
  82. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  83. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  84. data/src/core/ext/filters/client_channel/proxy_mapper.h +14 -15
  85. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +20 -16
  86. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +12 -6
  87. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +38 -28
  88. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +676 -325
  89. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +30 -13
  90. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +29 -23
  91. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +37 -56
  92. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +332 -329
  93. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +55 -40
  94. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +3 -2
  95. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  96. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  97. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +126 -255
  98. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +39 -49
  99. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +18 -3
  100. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +167 -85
  101. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +212 -0
  102. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +112 -0
  103. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +58 -61
  104. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +598 -472
  105. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  106. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +52 -54
  107. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +26 -17
  108. data/src/core/ext/filters/client_channel/retry_filter.cc +322 -208
  109. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  110. data/src/core/ext/filters/client_channel/retry_service_config.cc +52 -44
  111. data/src/core/ext/filters/client_channel/retry_service_config.h +31 -19
  112. data/src/core/ext/filters/client_channel/retry_throttle.cc +10 -31
  113. data/src/core/ext/filters/client_channel/retry_throttle.h +18 -6
  114. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  115. data/src/core/ext/filters/client_channel/subchannel.cc +250 -298
  116. data/src/core/ext/filters/client_channel/subchannel.h +91 -47
  117. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  118. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  119. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +20 -26
  120. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +472 -0
  121. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  122. data/src/core/ext/filters/deadline/deadline_filter.cc +35 -25
  123. data/src/core/ext/filters/deadline/deadline_filter.h +11 -4
  124. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +171 -402
  125. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +31 -3
  126. data/src/core/ext/filters/fault_injection/service_config_parser.cc +30 -24
  127. data/src/core/ext/filters/fault_injection/service_config_parser.h +29 -10
  128. data/src/core/ext/filters/http/client/http_client_filter.cc +107 -551
  129. data/src/core/ext/filters/http/client/http_client_filter.h +35 -5
  130. data/src/core/ext/filters/http/client_authority_filter.cc +43 -112
  131. data/src/core/ext/filters/http/client_authority_filter.h +28 -6
  132. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -28
  133. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +101 -320
  134. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  135. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +59 -133
  136. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  137. data/src/core/ext/filters/http/server/http_server_filter.cc +100 -476
  138. data/src/core/ext/filters/http/server/http_server_filter.h +37 -3
  139. data/src/core/ext/filters/message_size/message_size_filter.cc +78 -76
  140. data/src/core/ext/filters/message_size/message_size_filter.h +25 -8
  141. data/src/core/ext/filters/rbac/rbac_filter.cc +174 -0
  142. data/src/core/ext/filters/rbac/rbac_filter.h +84 -0
  143. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +621 -0
  144. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +85 -0
  145. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +62 -0
  146. data/src/core/ext/filters/server_config_selector/server_config_selector.h +85 -0
  147. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +161 -0
  148. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +33 -0
  149. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +256 -98
  150. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -9
  151. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +346 -166
  152. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -5
  153. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  154. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  155. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  156. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +646 -888
  157. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +16 -5
  158. data/src/core/ext/transport/chttp2/transport/context_list.cc +6 -3
  159. data/src/core/ext/transport/chttp2/transport/context_list.h +6 -4
  160. data/src/core/ext/transport/chttp2/transport/flow_control.cc +215 -266
  161. data/src/core/ext/transport/chttp2/transport/flow_control.h +183 -291
  162. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  163. data/src/core/ext/transport/chttp2/transport/frame_data.cc +59 -212
  164. data/src/core/ext/transport/chttp2/transport/frame_data.h +13 -36
  165. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  166. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  167. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +9 -4
  168. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  169. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +11 -2
  170. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  171. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -42
  172. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  173. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +10 -12
  174. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  175. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  176. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +389 -249
  177. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +106 -147
  178. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -1
  179. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +12 -1
  180. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +106 -170
  181. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -2
  182. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +146 -37
  183. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +41 -46
  184. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  185. data/src/core/ext/transport/chttp2/transport/internal.h +48 -155
  186. data/src/core/ext/transport/chttp2/transport/parsing.cc +87 -51
  187. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +11 -11
  188. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  189. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  190. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  191. data/src/core/ext/transport/chttp2/transport/writing.cc +135 -157
  192. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -5
  193. data/src/core/ext/transport/inproc/inproc_transport.cc +161 -227
  194. data/src/core/ext/transport/inproc/inproc_transport.h +4 -5
  195. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  196. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +502 -0
  197. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  198. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +569 -0
  199. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +60 -341
  200. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +280 -1355
  201. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  202. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  203. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  204. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +159 -0
  205. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +64 -0
  206. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +189 -0
  207. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  208. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +128 -0
  209. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  210. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +106 -0
  211. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  212. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +101 -0
  213. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  214. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +613 -0
  215. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  216. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +107 -0
  217. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +43 -0
  218. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +51 -0
  219. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +30 -4
  220. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -17
  221. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +143 -116
  222. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +730 -385
  223. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +241 -199
  224. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1360 -663
  225. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +49 -28
  226. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +213 -90
  227. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +321 -271
  228. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1776 -826
  229. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +20 -7
  230. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +47 -23
  231. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +60 -27
  232. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +277 -98
  233. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  234. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1437 -0
  235. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +74 -53
  236. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +383 -189
  237. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +21 -7
  238. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +50 -24
  239. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +215 -176
  240. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1179 -583
  241. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +105 -45
  242. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +554 -166
  243. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +19 -6
  244. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +43 -23
  245. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +16 -22
  246. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +46 -100
  247. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  248. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +159 -0
  249. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +145 -117
  250. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +821 -409
  251. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +141 -92
  252. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +773 -348
  253. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +21 -8
  254. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +62 -30
  255. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +204 -125
  256. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +1068 -398
  257. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +17 -4
  258. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +33 -16
  259. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +27 -13
  260. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +92 -48
  261. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +22 -9
  262. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +80 -33
  263. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +26 -13
  264. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +98 -48
  265. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +21 -8
  266. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +51 -25
  267. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +51 -35
  268. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +207 -108
  269. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +74 -55
  270. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +374 -189
  271. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +70 -53
  272. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +378 -187
  273. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +19 -6
  274. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +39 -20
  275. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +122 -71
  276. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +660 -259
  277. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +104 -79
  278. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +589 -300
  279. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +31 -16
  280. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +109 -48
  281. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +27 -10
  282. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +98 -39
  283. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  284. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +140 -0
  285. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +82 -61
  286. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +446 -234
  287. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +86 -65
  288. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +443 -236
  289. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +139 -103
  290. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +649 -293
  291. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +45 -41
  292. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +255 -165
  293. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +706 -570
  294. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +4125 -1898
  295. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +38 -19
  296. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +161 -71
  297. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +241 -0
  298. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1191 -0
  299. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  300. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +92 -0
  301. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  302. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +107 -0
  303. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +27 -13
  304. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +86 -45
  305. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  306. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +138 -0
  307. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  308. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +254 -0
  309. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  310. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  311. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  312. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +98 -0
  313. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  314. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +221 -0
  315. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +33 -0
  316. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +43 -0
  317. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  318. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +226 -0
  319. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  320. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +150 -0
  321. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +17 -4
  322. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +39 -23
  323. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +45 -28
  324. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +208 -111
  325. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +51 -36
  326. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +273 -131
  327. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +71 -0
  328. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +237 -0
  329. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +26 -13
  330. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +91 -42
  331. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +292 -224
  332. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1679 -733
  333. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  334. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +168 -0
  335. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  336. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  337. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +9 -0
  338. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -3
  339. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +107 -60
  340. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +607 -234
  341. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +41 -26
  342. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +169 -86
  343. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +126 -83
  344. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +651 -262
  345. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  346. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +168 -0
  347. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +15 -2
  348. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +26 -14
  349. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +206 -72
  350. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +1095 -255
  351. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +31 -17
  352. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +116 -61
  353. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +74 -57
  354. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +368 -185
  355. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  356. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +116 -0
  357. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +34 -18
  358. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +140 -80
  359. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  360. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +230 -0
  361. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +28 -14
  362. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +108 -56
  363. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +21 -8
  364. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +55 -30
  365. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +20 -7
  366. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +53 -26
  367. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +19 -6
  368. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +43 -23
  369. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +35 -20
  370. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +130 -68
  371. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +31 -17
  372. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +132 -64
  373. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +26 -12
  374. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +94 -52
  375. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +37 -22
  376. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +163 -82
  377. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +50 -31
  378. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -144
  379. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +53 -36
  380. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +256 -130
  381. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  382. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +213 -0
  383. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +9 -0
  384. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -0
  385. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  386. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +143 -0
  387. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +23 -9
  388. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +71 -35
  389. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +30 -15
  390. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -51
  391. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  392. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  393. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  394. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  395. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +19 -6
  396. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +45 -18
  397. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  398. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +131 -0
  399. data/src/core/ext/upb-generated/google/api/annotations.upb.c +22 -0
  400. data/src/core/ext/upb-generated/google/api/annotations.upb.h +23 -0
  401. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +154 -125
  402. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +765 -381
  403. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +158 -126
  404. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +844 -401
  405. data/src/core/ext/upb-generated/google/api/http.upb.c +43 -28
  406. data/src/core/ext/upb-generated/google/api/http.upb.h +229 -114
  407. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  408. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +115 -0
  409. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +18 -5
  410. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +43 -21
  411. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +374 -282
  412. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2199 -1029
  413. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +18 -5
  414. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +41 -19
  415. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +15 -2
  416. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +26 -14
  417. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +47 -31
  418. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +190 -92
  419. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +18 -5
  420. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +41 -19
  421. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +57 -36
  422. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +277 -148
  423. data/src/core/ext/upb-generated/google/rpc/status.upb.c +21 -8
  424. data/src/core/ext/upb-generated/google/rpc/status.upb.h +57 -29
  425. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  426. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +335 -0
  427. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +32 -18
  428. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +108 -47
  429. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +135 -107
  430. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +726 -358
  431. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +27 -12
  432. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +85 -40
  433. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +22 -8
  434. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +65 -34
  435. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +81 -61
  436. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +435 -237
  437. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +34 -19
  438. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +124 -62
  439. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  440. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  441. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +75 -13
  442. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +206 -56
  443. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -5
  444. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +59 -17
  445. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +21 -0
  446. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +16 -0
  447. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +31 -5
  448. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +61 -19
  449. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +30 -4
  450. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +54 -17
  451. data/src/core/ext/upb-generated/validate/validate.upb.c +406 -310
  452. data/src/core/ext/upb-generated/validate/validate.upb.h +2822 -1164
  453. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  454. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +290 -0
  455. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  456. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +112 -0
  457. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  458. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  459. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +64 -17
  460. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +191 -67
  461. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  462. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +103 -0
  463. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +17 -4
  464. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +35 -18
  465. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +30 -16
  466. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +107 -54
  467. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +25 -11
  468. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +58 -29
  469. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  470. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +107 -0
  471. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +22 -9
  472. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +60 -29
  473. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +33 -19
  474. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +139 -69
  475. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +22 -9
  476. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +63 -29
  477. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +36 -21
  478. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +106 -45
  479. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  480. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  481. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  482. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +914 -0
  483. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  484. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +151 -0
  485. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  486. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +226 -0
  487. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +20 -7
  488. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +47 -23
  489. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  490. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  491. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  492. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  493. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +75 -327
  494. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +16 -101
  495. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  496. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  497. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  498. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  499. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +56 -0
  500. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  501. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  502. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  503. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  504. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  505. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  506. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  507. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  508. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  509. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  510. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  511. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +10 -8
  512. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  513. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +10 -13
  514. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  515. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +120 -150
  516. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  517. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +253 -280
  518. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  519. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +60 -62
  520. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  521. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +387 -424
  522. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  523. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +16 -18
  524. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  525. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +25 -23
  526. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  527. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  528. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  529. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +17 -32
  530. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  531. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +17 -19
  532. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  533. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +203 -246
  534. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  535. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +140 -116
  536. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +26 -16
  537. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +16 -19
  538. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  539. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +24 -43
  540. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +4 -9
  541. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  542. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  543. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +23 -51
  544. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  545. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +179 -187
  546. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +30 -25
  547. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +16 -19
  548. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  549. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +254 -254
  550. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  551. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +14 -16
  552. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  553. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +16 -20
  554. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  555. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +16 -18
  556. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  557. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +26 -28
  558. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  559. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +15 -18
  560. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  561. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +20 -28
  562. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  563. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +21 -33
  564. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  565. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +20 -30
  566. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  567. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +16 -18
  568. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  569. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +180 -165
  570. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +24 -19
  571. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +155 -166
  572. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  573. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +21 -23
  574. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  575. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +46 -42
  576. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  577. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  578. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  579. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +19 -35
  580. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  581. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +19 -37
  582. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  583. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +194 -0
  584. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +75 -0
  585. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -85
  586. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +7 -12
  587. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +874 -917
  588. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +170 -160
  589. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +54 -48
  590. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  591. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +199 -0
  592. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +90 -0
  593. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  595. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  596. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  597. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +17 -21
  598. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  599. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  600. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  602. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  603. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  604. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  605. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  606. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  607. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  608. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  609. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +61 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  611. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  612. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  613. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  615. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +17 -18
  616. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  617. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +19 -29
  618. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  619. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +20 -26
  620. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  621. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +80 -0
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +19 -20
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +405 -410
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +63 -58
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +17 -13
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +174 -157
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +21 -27
  632. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  633. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +219 -216
  634. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +24 -19
  635. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  636. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  637. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +16 -18
  638. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  639. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +162 -107
  640. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +57 -22
  641. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +18 -22
  642. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  643. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +125 -135
  644. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  645. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  646. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  647. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +15 -23
  648. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  649. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  650. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  651. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +17 -21
  652. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  653. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +17 -19
  654. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  655. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +17 -19
  656. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  657. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +17 -19
  658. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  659. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +38 -43
  660. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  661. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +17 -21
  662. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  663. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +16 -21
  664. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  665. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +18 -24
  666. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  667. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +15 -29
  668. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  669. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +16 -26
  670. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  671. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  672. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  673. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +12 -10
  674. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  675. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  676. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  677. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +14 -19
  678. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  679. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +13 -19
  680. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  681. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  682. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  683. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  684. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  685. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +13 -16
  686. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  687. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  688. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  689. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +7 -7
  690. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  691. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  692. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  693. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  694. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  695. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +5 -14
  696. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  697. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  698. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  699. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +5 -10
  700. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  701. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +96 -151
  702. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  703. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +5 -10
  704. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  705. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +5 -10
  706. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  707. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +5 -16
  708. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  709. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +5 -10
  710. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  711. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +5 -26
  712. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  713. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +6 -11
  714. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  715. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  716. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  717. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  718. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  719. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +6 -15
  720. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  721. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +7 -12
  722. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  723. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -6
  724. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  725. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +6 -11
  726. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  727. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +6 -11
  728. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  729. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +8 -57
  730. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  731. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  732. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  733. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  734. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  735. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  736. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  737. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +6 -17
  738. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  739. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  740. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  741. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +7 -12
  742. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  743. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +9 -16
  744. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  745. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +6 -13
  746. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  747. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  748. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  749. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +8 -13
  750. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  751. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +8 -15
  752. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  753. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +8 -13
  754. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  755. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  756. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  757. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  758. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  759. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  760. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  761. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +7 -12
  762. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  763. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  764. data/src/core/ext/xds/certificate_provider_registry.cc +9 -9
  765. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  766. data/src/core/ext/xds/certificate_provider_store.cc +12 -0
  767. data/src/core/ext/xds/certificate_provider_store.h +19 -1
  768. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +13 -4
  769. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +10 -2
  770. data/src/core/ext/xds/upb_utils.h +45 -0
  771. data/src/core/ext/xds/xds_api.cc +331 -3601
  772. data/src/core/ext/xds/xds_api.h +75 -630
  773. data/src/core/ext/xds/xds_bootstrap.cc +279 -180
  774. data/src/core/ext/xds/xds_bootstrap.h +64 -28
  775. data/src/core/ext/xds/xds_certificate_provider.cc +17 -3
  776. data/src/core/ext/xds/xds_certificate_provider.h +35 -3
  777. data/src/core/ext/xds/xds_channel_stack_modifier.cc +27 -20
  778. data/src/core/ext/xds/xds_channel_stack_modifier.h +17 -4
  779. data/src/core/ext/xds/xds_client.cc +1185 -2050
  780. data/src/core/ext/xds/xds_client.h +143 -189
  781. data/src/core/ext/xds/xds_client_grpc.cc +291 -0
  782. data/src/core/ext/xds/xds_client_grpc.h +102 -0
  783. data/src/core/ext/xds/xds_client_stats.cc +18 -19
  784. data/src/core/ext/xds/xds_client_stats.h +9 -7
  785. data/src/core/ext/xds/xds_cluster.cc +543 -0
  786. data/src/core/ext/xds/xds_cluster.h +120 -0
  787. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +147 -0
  788. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +73 -0
  789. data/src/core/ext/xds/xds_common_types.cc +426 -0
  790. data/src/core/ext/xds/xds_common_types.h +102 -0
  791. data/src/core/ext/xds/xds_endpoint.cc +381 -0
  792. data/src/core/ext/xds/xds_endpoint.h +143 -0
  793. data/src/core/ext/xds/xds_http_fault_filter.cc +21 -26
  794. data/src/core/ext/xds/xds_http_fault_filter.h +8 -6
  795. data/src/core/ext/xds/xds_http_filters.cc +18 -5
  796. data/src/core/ext/xds/xds_http_filters.h +9 -9
  797. data/src/core/ext/xds/xds_http_rbac_filter.cc +560 -0
  798. data/src/core/ext/xds/xds_http_rbac_filter.h +61 -0
  799. data/src/core/ext/xds/xds_lb_policy_registry.cc +288 -0
  800. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  801. data/src/core/ext/xds/xds_listener.cc +1097 -0
  802. data/src/core/ext/xds/xds_listener.h +229 -0
  803. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  804. data/src/core/ext/xds/xds_resource_type.h +109 -0
  805. data/src/core/ext/xds/xds_resource_type_impl.h +91 -0
  806. data/src/core/ext/xds/xds_route_config.cc +1153 -0
  807. data/src/core/ext/xds/xds_route_config.h +241 -0
  808. data/src/core/ext/xds/xds_routing.cc +263 -0
  809. data/src/core/ext/xds/xds_routing.h +104 -0
  810. data/src/core/ext/xds/xds_server_config_fetcher.cc +1138 -324
  811. data/src/core/ext/xds/xds_transport.h +86 -0
  812. data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
  813. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  814. data/src/core/lib/address_utils/parse_address.cc +27 -8
  815. data/src/core/lib/address_utils/parse_address.h +11 -2
  816. data/src/core/lib/address_utils/sockaddr_utils.cc +82 -51
  817. data/src/core/lib/address_utils/sockaddr_utils.h +9 -19
  818. data/src/core/lib/avl/avl.h +476 -88
  819. data/src/core/lib/backoff/backoff.cc +10 -39
  820. data/src/core/lib/backoff/backoff.h +12 -12
  821. data/src/core/lib/channel/call_finalization.h +90 -0
  822. data/src/core/lib/channel/call_tracer.h +16 -7
  823. data/src/core/lib/channel/channel_args.cc +274 -48
  824. data/src/core/lib/channel/channel_args.h +298 -12
  825. data/src/core/lib/channel/channel_args_preconditioning.cc +43 -0
  826. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  827. data/src/core/lib/channel/channel_fwd.h +26 -0
  828. data/src/core/lib/channel/channel_stack.cc +54 -10
  829. data/src/core/lib/channel/channel_stack.h +83 -14
  830. data/src/core/lib/channel/channel_stack_builder.cc +19 -278
  831. data/src/core/lib/channel/channel_stack_builder.h +104 -150
  832. data/src/core/lib/channel/channel_stack_builder_impl.cc +95 -0
  833. data/src/core/lib/channel/channel_stack_builder_impl.h +46 -0
  834. data/src/core/lib/channel/channel_trace.cc +11 -19
  835. data/src/core/lib/channel/channel_trace.h +6 -3
  836. data/src/core/lib/channel/channelz.cc +36 -49
  837. data/src/core/lib/channel/channelz.h +24 -7
  838. data/src/core/lib/channel/channelz_registry.cc +11 -19
  839. data/src/core/lib/channel/channelz_registry.h +10 -9
  840. data/src/core/lib/channel/connected_channel.cc +26 -30
  841. data/src/core/lib/channel/connected_channel.h +4 -1
  842. data/src/core/lib/channel/context.h +11 -0
  843. data/src/core/lib/channel/promise_based_filter.cc +1263 -0
  844. data/src/core/lib/channel/promise_based_filter.h +571 -0
  845. data/src/core/lib/channel/status_util.cc +2 -0
  846. data/src/core/lib/channel/status_util.h +0 -3
  847. data/src/core/lib/compression/compression.cc +26 -113
  848. data/src/core/lib/compression/compression_internal.cc +170 -204
  849. data/src/core/lib/compression/compression_internal.h +68 -72
  850. data/src/core/lib/compression/message_compress.cc +14 -12
  851. data/src/core/lib/compression/message_compress.h +4 -5
  852. data/src/core/lib/config/core_configuration.cc +14 -3
  853. data/src/core/lib/config/core_configuration.h +100 -36
  854. data/src/core/lib/debug/stats.cc +15 -18
  855. data/src/core/lib/debug/stats.h +13 -4
  856. data/src/core/lib/debug/stats_data.cc +4 -7
  857. data/src/core/lib/debug/stats_data.h +18 -25
  858. data/src/core/lib/debug/trace.h +15 -14
  859. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +6 -3
  860. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +6 -5
  861. data/src/core/lib/event_engine/default_event_engine.cc +71 -0
  862. data/src/core/lib/{iomgr/event_engine/resolved_address_internal.cc → event_engine/default_event_engine.h} +13 -17
  863. data/src/core/lib/event_engine/default_event_engine_factory.cc +50 -0
  864. data/src/core/lib/{iomgr/event_engine/resolved_address_internal.h → event_engine/default_event_engine_factory.h} +8 -10
  865. data/src/core/lib/event_engine/executor/executor.h +38 -0
  866. data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
  867. data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/executor/threaded_executor.h} +18 -25
  868. data/src/core/lib/event_engine/forkable.cc +101 -0
  869. data/src/core/lib/event_engine/forkable.h +61 -0
  870. data/src/core/lib/event_engine/handle_containers.h +67 -0
  871. data/src/core/lib/event_engine/memory_allocator.cc +74 -0
  872. data/src/core/lib/event_engine/poller.h +54 -0
  873. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +142 -0
  874. data/src/core/lib/event_engine/posix_engine/posix_engine.h +121 -0
  875. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  876. data/src/core/lib/event_engine/posix_engine/timer.h +193 -0
  877. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  878. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  879. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +290 -0
  880. data/src/core/lib/event_engine/posix_engine/timer_manager.h +120 -0
  881. data/src/core/lib/event_engine/promise.h +78 -0
  882. data/src/core/lib/event_engine/{event_engine.cc → resolved_address.cc} +3 -12
  883. data/src/core/lib/event_engine/slice.cc +102 -0
  884. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  885. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  886. data/src/core/lib/event_engine/thread_pool.cc +158 -0
  887. data/src/core/lib/event_engine/thread_pool.h +81 -0
  888. data/src/core/lib/event_engine/trace.cc +18 -0
  889. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  890. data/src/core/lib/event_engine/utils.cc +49 -0
  891. data/src/core/lib/event_engine/utils.h +40 -0
  892. data/src/core/lib/event_engine/windows/iocp.cc +149 -0
  893. data/src/core/lib/event_engine/windows/iocp.h +68 -0
  894. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  895. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  896. data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
  897. data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
  898. data/src/core/lib/gpr/log.cc +5 -0
  899. data/src/core/lib/gpr/sync_posix.cc +1 -0
  900. data/src/core/lib/gpr/time.cc +13 -10
  901. data/src/core/lib/gpr/time_posix.cc +6 -9
  902. data/src/core/lib/gpr/time_windows.cc +10 -7
  903. data/src/core/lib/gpr/tls.h +10 -5
  904. data/src/core/lib/gpr/useful.h +47 -0
  905. data/src/core/lib/gprpp/bitset.h +27 -14
  906. data/src/core/lib/gprpp/chunked_vector.h +49 -3
  907. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  908. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  909. data/src/core/lib/gprpp/debug_location.h +41 -7
  910. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  911. data/src/core/lib/gprpp/examine_stack.h +0 -1
  912. data/src/core/lib/gprpp/fork.cc +3 -6
  913. data/src/core/lib/gprpp/global_config.h +2 -4
  914. data/src/core/lib/gprpp/global_config_env.cc +10 -9
  915. data/src/core/lib/gprpp/global_config_env.h +5 -3
  916. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  917. data/src/core/lib/gprpp/host_port.cc +2 -0
  918. data/src/core/lib/gprpp/manual_constructor.h +0 -70
  919. data/src/core/lib/gprpp/match.h +2 -0
  920. data/src/core/lib/gprpp/memory.h +1 -5
  921. data/src/core/lib/gprpp/no_destruct.h +94 -0
  922. data/src/core/lib/gprpp/orphanable.h +2 -5
  923. data/src/core/lib/gprpp/ref_counted.h +4 -4
  924. data/src/core/lib/gprpp/ref_counted_ptr.h +3 -6
  925. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  926. data/src/core/lib/gprpp/stat.h +0 -2
  927. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  928. data/src/core/lib/gprpp/status_helper.cc +75 -48
  929. data/src/core/lib/gprpp/status_helper.h +10 -19
  930. data/src/core/lib/gprpp/sync.h +3 -1
  931. data/src/core/lib/gprpp/table.h +33 -1
  932. data/src/core/lib/gprpp/thd.h +2 -5
  933. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  934. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  935. data/src/core/lib/gprpp/time.cc +214 -0
  936. data/src/core/lib/gprpp/time.h +301 -0
  937. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  938. data/src/core/lib/{iomgr → gprpp}/time_averaged_stats.h +29 -22
  939. data/src/core/lib/gprpp/time_util.cc +4 -0
  940. data/src/core/lib/gprpp/time_util.h +1 -1
  941. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  942. data/src/core/lib/gprpp/work_serializer.cc +247 -0
  943. data/src/core/lib/gprpp/work_serializer.h +86 -0
  944. data/src/core/lib/http/format_request.cc +62 -29
  945. data/src/core/lib/http/format_request.h +10 -7
  946. data/src/core/lib/http/httpcli.cc +316 -243
  947. data/src/core/lib/http/httpcli.h +233 -90
  948. data/src/core/lib/http/httpcli_security_connector.cc +80 -80
  949. data/src/core/lib/http/httpcli_ssl_credentials.h +39 -0
  950. data/src/core/lib/http/parser.cc +85 -15
  951. data/src/core/lib/http/parser.h +18 -2
  952. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  953. data/src/core/lib/iomgr/buffer_list.h +18 -18
  954. data/src/core/lib/iomgr/call_combiner.cc +10 -26
  955. data/src/core/lib/iomgr/closure.h +20 -9
  956. data/src/core/lib/iomgr/combiner.cc +9 -7
  957. data/src/core/lib/iomgr/endpoint.cc +4 -4
  958. data/src/core/lib/iomgr/endpoint.h +7 -6
  959. data/src/core/lib/iomgr/endpoint_cfstream.cc +16 -30
  960. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  961. data/src/core/lib/iomgr/endpoint_pair_posix.cc +11 -11
  962. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  963. data/src/core/lib/iomgr/error.cc +7 -775
  964. data/src/core/lib/iomgr/error.h +6 -149
  965. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  966. data/src/core/lib/iomgr/ev_apple.cc +6 -5
  967. data/src/core/lib/iomgr/ev_epoll1_linux.cc +65 -25
  968. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  969. data/src/core/lib/iomgr/ev_poll_posix.cc +101 -68
  970. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  971. data/src/core/lib/iomgr/ev_posix.cc +58 -100
  972. data/src/core/lib/iomgr/ev_posix.h +6 -4
  973. data/src/core/lib/iomgr/exec_ctx.cc +14 -98
  974. data/src/core/lib/iomgr/exec_ctx.h +19 -36
  975. data/src/core/lib/iomgr/executor.cc +16 -20
  976. data/src/core/lib/iomgr/executor.h +1 -4
  977. data/src/core/lib/iomgr/fork_posix.cc +1 -0
  978. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  979. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  980. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  981. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  982. data/src/core/lib/iomgr/iomgr.cc +7 -1
  983. data/src/core/lib/iomgr/iomgr_fwd.h +25 -0
  984. data/src/core/lib/iomgr/iomgr_posix.cc +3 -2
  985. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +3 -2
  986. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  987. data/src/core/lib/iomgr/load_file.cc +1 -1
  988. data/src/core/lib/iomgr/lockfree_event.cc +0 -17
  989. data/src/core/lib/iomgr/polling_entity.h +6 -0
  990. data/src/core/lib/iomgr/pollset.cc +1 -1
  991. data/src/core/lib/iomgr/pollset.h +4 -4
  992. data/src/core/lib/iomgr/pollset_set.h +1 -2
  993. data/src/core/lib/iomgr/pollset_windows.cc +2 -2
  994. data/src/core/lib/iomgr/port.h +29 -12
  995. data/src/core/lib/iomgr/resolve_address.cc +12 -23
  996. data/src/core/lib/iomgr/resolve_address.h +79 -46
  997. data/src/core/lib/iomgr/resolve_address_impl.h +58 -0
  998. data/src/core/lib/iomgr/resolve_address_posix.cc +109 -65
  999. data/src/core/lib/iomgr/resolve_address_posix.h +64 -0
  1000. data/src/core/lib/iomgr/resolve_address_windows.cc +122 -76
  1001. data/src/core/lib/iomgr/resolve_address_windows.h +64 -0
  1002. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/resolved_address.h} +21 -10
  1003. data/src/core/lib/iomgr/sockaddr.h +2 -3
  1004. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  1005. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +62 -0
  1006. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  1007. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -19
  1008. data/src/core/lib/iomgr/socket_windows.h +0 -2
  1009. data/src/core/lib/iomgr/tcp_client.cc +12 -9
  1010. data/src/core/lib/iomgr/tcp_client.h +25 -15
  1011. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -19
  1012. data/src/core/lib/iomgr/tcp_client_posix.cc +161 -52
  1013. data/src/core/lib/iomgr/tcp_client_posix.h +4 -5
  1014. data/src/core/lib/iomgr/tcp_client_windows.cc +28 -26
  1015. data/src/core/lib/iomgr/tcp_posix.cc +307 -97
  1016. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  1017. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  1018. data/src/core/lib/iomgr/tcp_server.h +6 -8
  1019. data/src/core/lib/iomgr/tcp_server_posix.cc +72 -53
  1020. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  1021. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +42 -38
  1022. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -6
  1023. data/src/core/lib/iomgr/tcp_server_windows.cc +25 -24
  1024. data/src/core/lib/iomgr/tcp_windows.cc +31 -26
  1025. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  1026. data/src/core/lib/iomgr/timer.cc +2 -2
  1027. data/src/core/lib/iomgr/timer.h +11 -6
  1028. data/src/core/lib/iomgr/timer_generic.cc +100 -83
  1029. data/src/core/lib/iomgr/timer_manager.cc +15 -14
  1030. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  1031. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  1032. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  1033. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  1034. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  1035. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  1036. data/src/core/lib/json/json.h +20 -24
  1037. data/src/core/lib/json/json_args.h +34 -0
  1038. data/src/core/lib/json/json_object_loader.cc +233 -0
  1039. data/src/core/lib/json/json_object_loader.h +618 -0
  1040. data/src/core/lib/json/json_reader.cc +155 -75
  1041. data/src/core/lib/json/json_util.cc +11 -32
  1042. data/src/core/lib/json/json_util.h +15 -6
  1043. data/src/core/lib/json/json_writer.cc +6 -1
  1044. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +7 -45
  1045. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +105 -95
  1046. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1047. data/src/core/lib/load_balancing/lb_policy_registry.cc +167 -0
  1048. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +31 -26
  1049. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -47
  1050. data/src/core/lib/matchers/matchers.cc +7 -4
  1051. data/src/core/lib/matchers/matchers.h +2 -0
  1052. data/src/core/lib/promise/activity.cc +120 -0
  1053. data/src/core/lib/promise/activity.h +582 -0
  1054. data/src/core/lib/promise/arena_promise.h +201 -0
  1055. data/src/core/lib/promise/call_push_pull.h +148 -0
  1056. data/src/core/lib/promise/context.h +85 -0
  1057. data/src/core/lib/promise/detail/basic_seq.h +516 -0
  1058. data/src/core/lib/promise/detail/promise_factory.h +187 -0
  1059. data/src/core/lib/promise/detail/promise_like.h +85 -0
  1060. data/src/core/lib/promise/detail/status.h +50 -0
  1061. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  1062. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  1063. data/src/core/lib/promise/latch.h +103 -0
  1064. data/src/core/lib/promise/loop.h +136 -0
  1065. data/src/core/lib/promise/map.h +87 -0
  1066. data/src/core/lib/promise/poll.h +66 -0
  1067. data/src/core/lib/promise/promise.h +96 -0
  1068. data/src/core/lib/promise/race.h +83 -0
  1069. data/src/core/lib/promise/seq.h +108 -0
  1070. data/src/core/lib/promise/sleep.cc +77 -0
  1071. data/src/core/lib/promise/sleep.h +79 -0
  1072. data/src/core/lib/promise/try_seq.h +177 -0
  1073. data/src/core/lib/{iomgr/ev_epollex_linux.h → resolver/resolver.cc} +15 -8
  1074. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +45 -53
  1075. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +36 -34
  1076. data/src/core/lib/resolver/resolver_registry.cc +149 -0
  1077. data/src/core/lib/resolver/resolver_registry.h +123 -0
  1078. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +28 -18
  1079. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +19 -16
  1080. data/src/core/lib/resource_quota/api.cc +96 -0
  1081. data/src/core/lib/resource_quota/api.h +43 -0
  1082. data/src/core/lib/{gprpp → resource_quota}/arena.cc +37 -20
  1083. data/src/core/lib/{gprpp → resource_quota}/arena.h +49 -17
  1084. data/src/core/lib/resource_quota/memory_quota.cc +618 -0
  1085. data/src/core/lib/resource_quota/memory_quota.h +543 -0
  1086. data/src/core/lib/resource_quota/periodic_update.cc +79 -0
  1087. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1088. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/resource_quota/resource_quota.cc} +13 -11
  1089. data/src/core/lib/resource_quota/resource_quota.h +74 -0
  1090. data/src/core/lib/resource_quota/thread_quota.cc +45 -0
  1091. data/src/core/lib/resource_quota/thread_quota.h +61 -0
  1092. data/src/core/lib/{iomgr/event_engine/pollset.h → resource_quota/trace.cc} +3 -9
  1093. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/resource_quota/trace.h} +6 -8
  1094. data/src/core/lib/security/authorization/authorization_policy_provider.h +14 -0
  1095. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  1096. data/src/core/lib/security/authorization/evaluate_args.cc +53 -45
  1097. data/src/core/lib/security/authorization/evaluate_args.h +9 -5
  1098. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +66 -0
  1099. data/src/core/lib/security/authorization/grpc_authorization_engine.h +69 -0
  1100. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +120 -0
  1101. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +61 -0
  1102. data/src/core/lib/security/authorization/matchers.cc +238 -0
  1103. data/src/core/lib/security/authorization/matchers.h +218 -0
  1104. data/src/core/lib/security/authorization/rbac_policy.cc +446 -0
  1105. data/src/core/lib/security/authorization/rbac_policy.h +178 -0
  1106. data/src/core/lib/security/context/security_context.cc +9 -4
  1107. data/src/core/lib/security/context/security_context.h +23 -4
  1108. data/src/core/lib/security/credentials/alts/alts_credentials.cc +18 -10
  1109. data/src/core/lib/security/credentials/alts/alts_credentials.h +18 -4
  1110. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  1111. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  1112. data/src/core/lib/security/credentials/call_creds_util.cc +97 -0
  1113. data/src/core/lib/security/credentials/call_creds_util.h +43 -0
  1114. data/src/core/lib/security/credentials/channel_creds_registry.h +103 -0
  1115. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +80 -0
  1116. data/src/core/lib/security/credentials/composite/composite_credentials.cc +32 -91
  1117. data/src/core/lib/security/credentials/composite/composite_credentials.h +42 -16
  1118. data/src/core/lib/security/credentials/credentials.cc +6 -11
  1119. data/src/core/lib/security/credentials/credentials.h +106 -99
  1120. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +173 -52
  1121. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +19 -0
  1122. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  1123. data/src/core/lib/security/credentials/external/external_account_credentials.cc +108 -64
  1124. data/src/core/lib/security/credentials/external/external_account_credentials.h +16 -9
  1125. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +15 -9
  1126. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  1127. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +58 -23
  1128. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +11 -0
  1129. data/src/core/lib/security/credentials/fake/fake_credentials.cc +42 -43
  1130. data/src/core/lib/security/credentials/fake/fake_credentials.h +35 -26
  1131. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  1132. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +91 -56
  1133. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +20 -7
  1134. data/src/core/lib/security/credentials/iam/iam_credentials.cc +31 -30
  1135. data/src/core/lib/security/credentials/iam/iam_credentials.h +25 -9
  1136. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +35 -26
  1137. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1138. data/src/core/lib/security/credentials/jwt/json_token.cc +21 -11
  1139. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  1140. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +46 -55
  1141. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +30 -12
  1142. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +90 -56
  1143. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +5 -3
  1144. data/src/core/lib/security/credentials/local/local_credentials.cc +19 -13
  1145. data/src/core/lib/security/credentials/local/local_credentials.h +19 -3
  1146. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +201 -202
  1147. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +81 -34
  1148. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +103 -156
  1149. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +80 -27
  1150. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +31 -35
  1151. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +29 -6
  1152. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  1153. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  1154. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +50 -22
  1155. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +69 -12
  1156. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +241 -0
  1157. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +168 -0
  1158. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +37 -92
  1159. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +73 -149
  1160. data/src/core/lib/security/credentials/tls/tls_credentials.cc +59 -42
  1161. data/src/core/lib/security/credentials/tls/tls_credentials.h +13 -4
  1162. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  1163. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  1164. data/src/core/lib/security/credentials/xds/xds_credentials.cc +81 -89
  1165. data/src/core/lib/security/credentials/xds/xds_credentials.h +53 -8
  1166. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +41 -35
  1167. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +9 -6
  1168. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +50 -55
  1169. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -5
  1170. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +21 -22
  1171. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +32 -21
  1172. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  1173. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +28 -21
  1174. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  1175. data/src/core/lib/security/security_connector/local/local_security_connector.cc +45 -29
  1176. data/src/core/lib/security/security_connector/local/local_security_connector.h +7 -3
  1177. data/src/core/lib/security/security_connector/security_connector.cc +22 -32
  1178. data/src/core/lib/security/security_connector/security_connector.h +49 -31
  1179. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +32 -22
  1180. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  1181. data/src/core/lib/security/security_connector/ssl_utils.cc +50 -34
  1182. data/src/core/lib/security/security_connector/ssl_utils.h +23 -24
  1183. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  1184. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +387 -220
  1185. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +97 -54
  1186. data/src/core/lib/security/transport/auth_filters.h +45 -5
  1187. data/src/core/lib/security/transport/client_auth_filter.cc +111 -368
  1188. data/src/core/lib/security/transport/secure_endpoint.cc +267 -137
  1189. data/src/core/lib/security/transport/secure_endpoint.h +5 -4
  1190. data/src/core/lib/security/transport/security_handshaker.cc +81 -50
  1191. data/src/core/lib/security/transport/security_handshaker.h +7 -2
  1192. data/src/core/lib/security/transport/server_auth_filter.cc +70 -41
  1193. data/src/core/lib/security/util/json_util.cc +3 -2
  1194. data/src/core/lib/security/util/json_util.h +0 -2
  1195. data/src/core/lib/service_config/service_config.h +89 -0
  1196. data/src/core/{ext → lib}/service_config/service_config_call_data.h +11 -7
  1197. data/src/core/lib/service_config/service_config_impl.cc +238 -0
  1198. data/src/core/{ext/service_config/service_config.h → lib/service_config/service_config_impl.h} +33 -32
  1199. data/src/core/lib/service_config/service_config_parser.cc +98 -0
  1200. data/src/core/lib/service_config/service_config_parser.h +101 -0
  1201. data/src/core/lib/slice/b64.cc +1 -1
  1202. data/src/core/lib/slice/b64.h +2 -0
  1203. data/src/core/lib/slice/percent_encoding.cc +35 -97
  1204. data/src/core/lib/slice/percent_encoding.h +4 -16
  1205. data/src/core/lib/slice/slice.cc +88 -184
  1206. data/src/core/lib/slice/slice.h +389 -0
  1207. data/src/core/lib/slice/slice_api.cc +1 -1
  1208. data/src/core/lib/slice/slice_buffer.cc +83 -23
  1209. data/src/core/lib/slice/slice_buffer.h +137 -0
  1210. data/src/core/lib/{iomgr/is_epollexclusive_available.h → slice/slice_buffer_api.cc} +11 -12
  1211. data/src/core/lib/slice/slice_internal.h +16 -34
  1212. data/src/core/lib/slice/slice_refcount.cc +18 -0
  1213. data/src/core/lib/slice/slice_refcount.h +7 -83
  1214. data/src/core/lib/slice/slice_refcount_base.h +20 -133
  1215. data/src/core/lib/slice/slice_string_helpers.cc +0 -16
  1216. data/src/core/lib/slice/slice_string_helpers.h +1 -8
  1217. data/src/core/lib/surface/builtins.cc +11 -6
  1218. data/src/core/lib/surface/byte_buffer.cc +7 -1
  1219. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  1220. data/src/core/lib/surface/call.cc +1159 -1289
  1221. data/src/core/lib/surface/call.h +26 -22
  1222. data/src/core/lib/surface/call_details.cc +4 -4
  1223. data/src/core/lib/surface/call_log_batch.cc +7 -1
  1224. data/src/core/lib/surface/call_test_only.h +4 -1
  1225. data/src/core/lib/surface/channel.cc +218 -312
  1226. data/src/core/lib/surface/channel.h +102 -74
  1227. data/src/core/lib/surface/channel_init.cc +2 -3
  1228. data/src/core/lib/surface/channel_init.h +4 -6
  1229. data/src/core/lib/surface/channel_ping.cc +8 -2
  1230. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  1231. data/src/core/lib/surface/channel_stack_type.h +0 -2
  1232. data/src/core/lib/surface/completion_queue.cc +41 -33
  1233. data/src/core/lib/surface/completion_queue.h +7 -5
  1234. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  1235. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  1236. data/src/core/lib/surface/event_string.cc +1 -7
  1237. data/src/core/lib/surface/event_string.h +1 -1
  1238. data/src/core/lib/surface/init.cc +68 -33
  1239. data/src/core/lib/surface/init.h +0 -10
  1240. data/src/core/lib/surface/lame_client.cc +63 -103
  1241. data/src/core/lib/surface/lame_client.h +41 -3
  1242. data/src/core/lib/surface/metadata_array.cc +2 -0
  1243. data/src/core/lib/surface/server.cc +121 -146
  1244. data/src/core/lib/surface/server.h +60 -29
  1245. data/src/core/lib/surface/validate_metadata.cc +7 -20
  1246. data/src/core/lib/surface/validate_metadata.h +3 -0
  1247. data/src/core/lib/surface/version.cc +2 -2
  1248. data/src/core/lib/transport/bdp_estimator.cc +13 -12
  1249. data/src/core/lib/transport/bdp_estimator.h +4 -5
  1250. data/src/core/lib/transport/connectivity_state.cc +5 -4
  1251. data/src/core/lib/transport/connectivity_state.h +3 -4
  1252. data/src/core/lib/transport/error_utils.cc +17 -43
  1253. data/src/core/lib/transport/error_utils.h +7 -2
  1254. data/src/core/lib/{channel → transport}/handshaker.cc +20 -17
  1255. data/src/core/lib/{channel → transport}/handshaker.h +16 -10
  1256. data/src/core/lib/{channel → transport}/handshaker_factory.h +10 -12
  1257. data/src/core/lib/{channel → transport}/handshaker_registry.cc +7 -2
  1258. data/src/core/lib/{channel → transport}/handshaker_registry.h +7 -8
  1259. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +62 -53
  1260. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  1261. data/src/core/lib/transport/metadata_batch.cc +267 -69
  1262. data/src/core/lib/transport/metadata_batch.h +1088 -835
  1263. data/src/core/lib/transport/parsed_metadata.cc +39 -0
  1264. data/src/core/lib/transport/parsed_metadata.h +237 -93
  1265. data/src/core/lib/transport/pid_controller.cc +4 -4
  1266. data/src/core/lib/transport/status_conversion.cc +4 -2
  1267. data/src/core/lib/transport/status_conversion.h +3 -3
  1268. data/src/core/lib/transport/tcp_connect_handshaker.cc +247 -0
  1269. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1270. data/src/core/lib/transport/timeout_encoding.cc +203 -70
  1271. data/src/core/lib/transport/timeout_encoding.h +44 -10
  1272. data/src/core/lib/transport/transport.cc +25 -47
  1273. data/src/core/lib/transport/transport.h +151 -27
  1274. data/src/core/lib/transport/transport_fwd.h +20 -0
  1275. data/src/core/lib/transport/transport_impl.h +25 -0
  1276. data/src/core/lib/transport/transport_op_string.cc +21 -64
  1277. data/src/core/lib/uri/uri_parser.cc +248 -66
  1278. data/src/core/lib/uri/uri_parser.h +39 -25
  1279. data/src/core/plugin_registry/grpc_plugin_registry.cc +35 -92
  1280. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +85 -0
  1281. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +67 -43
  1282. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  1283. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1284. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +36 -21
  1285. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  1286. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -2
  1287. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1288. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  1289. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1290. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  1291. data/src/core/tsi/fake_transport_security.cc +66 -31
  1292. data/src/core/tsi/fake_transport_security.h +6 -0
  1293. data/src/core/tsi/local_transport_security.cc +24 -28
  1294. data/src/core/tsi/local_transport_security.h +1 -4
  1295. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +141 -0
  1296. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1297. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -3
  1298. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  1299. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +13 -6
  1300. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  1301. data/src/core/tsi/ssl_transport_security.cc +249 -68
  1302. data/src/core/tsi/ssl_transport_security.h +47 -8
  1303. data/src/core/tsi/transport_security.cc +18 -6
  1304. data/src/core/tsi/transport_security.h +2 -1
  1305. data/src/core/tsi/transport_security_grpc.cc +3 -2
  1306. data/src/core/tsi/transport_security_grpc.h +5 -2
  1307. data/src/core/tsi/transport_security_interface.h +19 -5
  1308. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  1309. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  1310. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  1311. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  1312. data/src/ruby/ext/grpc/extconf.rb +61 -21
  1313. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  1314. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -34
  1315. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +40 -52
  1316. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1317. data/src/ruby/ext/grpc/rb_server.c +7 -4
  1318. data/src/ruby/lib/grpc/errors.rb +1 -1
  1319. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1320. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1321. data/src/ruby/lib/grpc/version.rb +1 -1
  1322. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1323. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1324. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  1325. data/src/ruby/pb/test/client.rb +769 -0
  1326. data/src/ruby/pb/test/server.rb +252 -0
  1327. data/src/ruby/pb/test/xds_client.rb +415 -0
  1328. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1329. data/third_party/abseil-cpp/absl/algorithm/container.h +102 -92
  1330. data/third_party/abseil-cpp/absl/base/attributes.h +112 -52
  1331. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1332. data/third_party/abseil-cpp/absl/base/config.h +245 -74
  1333. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  1334. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1335. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  1336. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  1337. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1338. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +50 -0
  1339. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1340. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1341. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  1342. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  1343. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  1344. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +11 -1
  1345. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1346. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  1347. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1348. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1349. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +68 -0
  1350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  1352. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +22 -7
  1353. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +15 -6
  1354. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1355. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1356. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  1357. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  1358. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1359. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -5
  1360. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1361. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +510 -0
  1362. data/third_party/abseil-cpp/absl/container/inlined_vector.h +118 -99
  1363. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  1364. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  1365. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  1366. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +77 -113
  1367. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +62 -85
  1368. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +417 -431
  1369. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  1370. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +18 -8
  1371. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +724 -262
  1372. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1373. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  1374. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -11
  1375. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +7 -2
  1376. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  1377. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +13 -5
  1379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1381. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +236 -0
  1382. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +33 -10
  1383. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1384. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +35 -4
  1385. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1386. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +7 -0
  1387. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +60 -7
  1388. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1389. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  1390. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1391. data/third_party/abseil-cpp/absl/functional/function_ref.h +6 -2
  1392. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  1393. data/third_party/abseil-cpp/absl/hash/hash.h +104 -8
  1394. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1395. data/third_party/abseil-cpp/absl/hash/internal/hash.h +297 -51
  1396. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  1397. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  1398. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1399. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1400. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  1401. data/third_party/abseil-cpp/absl/numeric/int128.cc +7 -12
  1402. data/third_party/abseil-cpp/absl/numeric/int128.h +148 -75
  1403. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1404. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1405. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  1406. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  1407. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +245 -0
  1408. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1409. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1410. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1411. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1412. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1413. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1415. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1416. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +95 -0
  1417. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +269 -0
  1418. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1419. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1420. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1421. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +161 -0
  1422. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1423. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1424. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1425. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1426. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1427. data/third_party/abseil-cpp/absl/random/internal/randen.h +96 -0
  1428. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +225 -0
  1429. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1430. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +264 -0
  1431. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1432. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1433. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1434. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1435. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1436. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1437. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +165 -0
  1438. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1439. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1440. data/third_party/abseil-cpp/absl/random/internal/traits.h +149 -0
  1441. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1442. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +96 -0
  1443. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +256 -0
  1444. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +261 -0
  1445. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1446. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1447. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1448. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1449. data/third_party/abseil-cpp/absl/random/seed_sequences.h +111 -0
  1450. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1451. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1452. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +272 -0
  1453. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +22 -5
  1454. data/third_party/abseil-cpp/absl/status/status.cc +183 -19
  1455. data/third_party/abseil-cpp/absl/status/status.h +41 -27
  1456. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1457. data/third_party/abseil-cpp/absl/status/statusor.h +40 -24
  1458. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1459. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1460. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1461. data/third_party/abseil-cpp/absl/strings/cord.cc +469 -1094
  1462. data/third_party/abseil-cpp/absl/strings/cord.h +392 -144
  1463. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1464. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1465. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1466. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  1467. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1468. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1469. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +23 -29
  1470. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +208 -96
  1471. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1228 -0
  1472. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +924 -0
  1473. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +187 -0
  1474. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +267 -0
  1475. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +69 -0
  1476. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +212 -0
  1477. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +62 -0
  1478. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1479. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  1480. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  1481. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +60 -19
  1482. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +48 -172
  1483. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1484. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1485. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1486. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1487. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1488. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1489. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +418 -0
  1490. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1491. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +88 -0
  1492. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1493. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +123 -0
  1494. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  1495. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  1496. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1497. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  1498. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +9 -1
  1499. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1500. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +39 -8
  1501. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  1502. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +10 -11
  1503. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +41 -20
  1504. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1505. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1506. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +28 -18
  1507. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1508. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1509. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1510. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1511. data/third_party/abseil-cpp/absl/strings/numbers.cc +9 -9
  1512. data/third_party/abseil-cpp/absl/strings/numbers.h +60 -23
  1513. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1514. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  1515. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1516. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1517. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1518. data/third_party/abseil-cpp/absl/strings/string_view.cc +18 -34
  1519. data/third_party/abseil-cpp/absl/strings/string_view.h +123 -41
  1520. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1521. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1522. data/third_party/abseil-cpp/absl/strings/substitute.h +109 -76
  1523. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1524. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1525. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1526. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1527. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1528. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1529. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -26
  1530. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1531. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  1532. data/third_party/abseil-cpp/absl/synchronization/mutex.h +20 -12
  1533. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  1534. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1535. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  1536. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1537. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1538. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1539. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1540. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1541. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1542. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1543. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1544. data/third_party/abseil-cpp/absl/time/time.h +82 -47
  1545. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1546. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1547. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1548. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  1549. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1550. data/third_party/abseil-cpp/absl/types/span.h +5 -4
  1551. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  1552. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1553. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1554. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1555. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1556. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1557. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1558. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  1559. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1560. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1561. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1562. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1563. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1564. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1565. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1566. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1567. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1568. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1569. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1570. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1571. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1572. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1573. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1574. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1575. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1576. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1577. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1578. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1579. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1580. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1581. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1582. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1583. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1584. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1585. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1586. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1587. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1588. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1589. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  1590. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1591. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  1592. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1593. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1594. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1595. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1596. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1597. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1598. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1599. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1600. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1601. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1602. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1603. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1604. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +29 -11
  1605. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  1606. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1607. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1608. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1609. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1610. data/third_party/cares/cares/{ares.h → include/ares.h} +73 -1
  1611. data/third_party/cares/cares/{ares_dns.h → include/ares_dns.h} +9 -0
  1612. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1613. data/third_party/cares/cares/{ares_version.h → include/ares_version.h} +3 -3
  1614. data/third_party/cares/cares/{ares__close_sockets.c → src/lib/ares__close_sockets.c} +2 -2
  1615. data/third_party/cares/cares/{ares__get_hostent.c → src/lib/ares__get_hostent.c} +1 -2
  1616. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1617. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1618. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1619. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1620. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1621. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1622. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1623. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1624. data/third_party/cares/cares/{ares_create_query.c → src/lib/ares_create_query.c} +8 -17
  1625. data/third_party/cares/cares/{ares_data.c → src/lib/ares_data.c} +18 -0
  1626. data/third_party/cares/cares/{ares_data.h → src/lib/ares_data.h} +2 -0
  1627. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1628. data/third_party/cares/cares/{ares_expand_name.c → src/lib/ares_expand_name.c} +114 -23
  1629. data/third_party/cares/cares/{ares_expand_string.c → src/lib/ares_expand_string.c} +2 -5
  1630. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1631. data/third_party/cares/cares/{ares_free_hostent.c → src/lib/ares_free_hostent.c} +6 -4
  1632. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1633. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1634. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1635. data/third_party/cares/cares/{ares_getenv.c → src/lib/ares_getenv.c} +0 -2
  1636. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1637. data/third_party/cares/cares/{ares_gethostbyaddr.c → src/lib/ares_gethostbyaddr.c} +2 -9
  1638. data/third_party/cares/cares/{ares_gethostbyname.c → src/lib/ares_gethostbyname.c} +25 -20
  1639. data/third_party/cares/cares/{ares_getnameinfo.c → src/lib/ares_getnameinfo.c} +4 -10
  1640. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1641. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1642. data/third_party/cares/cares/{ares_init.c → src/lib/ares_init.c} +79 -40
  1643. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1644. data/third_party/cares/cares/{ares_ipv6.h → src/lib/ares_ipv6.h} +7 -0
  1645. data/third_party/cares/cares/{ares_library_init.c → src/lib/ares_library_init.c} +7 -2
  1646. data/third_party/cares/cares/{ares_library_init.h → src/lib/ares_library_init.h} +1 -1
  1647. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1648. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1649. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1650. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1651. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1652. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1653. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1654. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1655. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1656. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1657. data/third_party/cares/cares/{ares_parse_mx_reply.c → src/lib/ares_parse_mx_reply.c} +2 -8
  1658. data/third_party/cares/cares/{ares_parse_naptr_reply.c → src/lib/ares_parse_naptr_reply.c} +2 -13
  1659. data/third_party/cares/cares/{ares_parse_ns_reply.c → src/lib/ares_parse_ns_reply.c} +5 -11
  1660. data/third_party/cares/cares/{ares_parse_ptr_reply.c → src/lib/ares_parse_ptr_reply.c} +53 -46
  1661. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1662. data/third_party/cares/cares/{ares_parse_srv_reply.c → src/lib/ares_parse_srv_reply.c} +2 -13
  1663. data/third_party/cares/cares/{ares_parse_txt_reply.c → src/lib/ares_parse_txt_reply.c} +3 -9
  1664. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1665. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1666. data/third_party/cares/cares/{ares_private.h → src/lib/ares_private.h} +52 -11
  1667. data/third_party/cares/cares/{ares_process.c → src/lib/ares_process.c} +127 -52
  1668. data/third_party/cares/cares/{ares_query.c → src/lib/ares_query.c} +3 -9
  1669. data/third_party/cares/cares/{ares_search.c → src/lib/ares_search.c} +5 -7
  1670. data/third_party/cares/cares/{ares_send.c → src/lib/ares_send.c} +2 -8
  1671. data/third_party/cares/cares/{ares_setup.h → src/lib/ares_setup.h} +4 -1
  1672. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1673. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1674. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1675. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1676. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1677. data/third_party/cares/cares/{ares_strsplit.c → src/lib/ares_strsplit.c} +4 -0
  1678. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1679. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1680. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1681. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1682. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1683. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1684. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1685. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1686. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1687. data/third_party/cares/cares/{inet_net_pton.c → src/lib/inet_net_pton.c} +2 -8
  1688. data/third_party/cares/cares/{inet_ntop.c → src/lib/inet_ntop.c} +2 -8
  1689. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1690. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1691. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1692. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1693. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1694. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1695. data/third_party/upb/upb/arena.c +277 -0
  1696. data/third_party/upb/upb/arena.h +225 -0
  1697. data/third_party/upb/upb/array.c +114 -0
  1698. data/third_party/upb/upb/array.h +83 -0
  1699. data/third_party/upb/upb/collections.h +36 -0
  1700. data/third_party/upb/upb/decode.c +832 -382
  1701. data/third_party/upb/upb/decode.h +44 -17
  1702. data/third_party/upb/upb/decode_fast.c +304 -302
  1703. data/third_party/upb/upb/decode_fast.h +18 -18
  1704. data/third_party/upb/upb/def.c +2083 -982
  1705. data/third_party/upb/upb/def.h +339 -260
  1706. data/third_party/upb/upb/def.hpp +144 -171
  1707. data/third_party/upb/upb/encode.c +287 -185
  1708. data/third_party/upb/upb/encode.h +24 -16
  1709. data/third_party/upb/upb/extension_registry.c +93 -0
  1710. data/third_party/upb/upb/extension_registry.h +84 -0
  1711. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +76 -58
  1712. data/third_party/upb/upb/internal/table.h +385 -0
  1713. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +23 -13
  1714. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1715. data/third_party/upb/upb/json_decode.c +1512 -0
  1716. data/third_party/upb/upb/json_decode.h +47 -0
  1717. data/third_party/upb/upb/json_encode.c +780 -0
  1718. data/third_party/upb/upb/json_encode.h +65 -0
  1719. data/third_party/upb/upb/map.c +108 -0
  1720. data/third_party/upb/upb/map.h +117 -0
  1721. data/third_party/upb/upb/message_value.h +66 -0
  1722. data/third_party/upb/upb/mini_table.c +1147 -0
  1723. data/third_party/upb/upb/mini_table.h +189 -0
  1724. data/third_party/upb/upb/mini_table.hpp +112 -0
  1725. data/third_party/upb/upb/msg.c +132 -161
  1726. data/third_party/upb/upb/msg.h +18 -55
  1727. data/third_party/upb/upb/msg_internal.h +404 -254
  1728. data/third_party/upb/upb/port_def.inc +10 -1
  1729. data/third_party/upb/upb/port_undef.inc +2 -0
  1730. data/third_party/upb/upb/reflection.c +203 -280
  1731. data/third_party/upb/upb/reflection.h +40 -126
  1732. data/third_party/upb/upb/reflection.hpp +6 -6
  1733. data/third_party/upb/upb/status.c +86 -0
  1734. data/third_party/upb/upb/status.h +66 -0
  1735. data/third_party/upb/upb/table.c +233 -149
  1736. data/third_party/upb/upb/table_internal.h +9 -324
  1737. data/third_party/upb/upb/text_encode.c +116 -92
  1738. data/third_party/upb/upb/text_encode.h +10 -10
  1739. data/third_party/upb/upb/upb.c +34 -273
  1740. data/third_party/upb/upb/upb.h +79 -262
  1741. data/third_party/upb/upb/upb.hpp +31 -28
  1742. data/third_party/xxhash/xxhash.h +607 -352
  1743. data/third_party/zlib/crc32.c +966 -292
  1744. data/third_party/zlib/crc32.h +9441 -436
  1745. data/third_party/zlib/deflate.c +78 -30
  1746. data/third_party/zlib/deflate.h +12 -15
  1747. data/third_party/zlib/gzguts.h +3 -2
  1748. data/third_party/zlib/gzlib.c +5 -3
  1749. data/third_party/zlib/gzread.c +5 -7
  1750. data/third_party/zlib/gzwrite.c +25 -13
  1751. data/third_party/zlib/infback.c +2 -1
  1752. data/third_party/zlib/inffast.c +14 -14
  1753. data/third_party/zlib/inflate.c +39 -8
  1754. data/third_party/zlib/inflate.h +3 -2
  1755. data/third_party/zlib/inftrees.c +3 -3
  1756. data/third_party/zlib/trees.c +27 -48
  1757. data/third_party/zlib/zlib.h +123 -100
  1758. data/third_party/zlib/zutil.c +2 -2
  1759. data/third_party/zlib/zutil.h +12 -9
  1760. metadata +637 -270
  1761. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1762. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1763. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1764. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1765. data/src/core/ext/filters/client_channel/resolver.cc +0 -87
  1766. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -195
  1767. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  1768. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -264
  1769. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -560
  1770. data/src/core/ext/service_config/service_config.cc +0 -227
  1771. data/src/core/ext/service_config/service_config_parser.cc +0 -89
  1772. data/src/core/ext/service_config/service_config_parser.h +0 -97
  1773. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -119
  1774. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -95
  1775. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -189
  1776. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -53
  1777. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -83
  1778. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1779. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1780. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1781. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1782. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1783. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -27
  1784. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -62
  1785. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -27
  1786. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -62
  1787. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -27
  1788. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -62
  1789. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -27
  1790. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -62
  1791. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -27
  1792. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -62
  1793. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -72
  1794. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1795. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -73
  1796. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1797. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -72
  1798. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1799. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -80
  1800. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1801. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -74
  1802. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1803. data/src/core/lib/avl/avl.cc +0 -306
  1804. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1805. data/src/core/lib/compression/compression_args.cc +0 -138
  1806. data/src/core/lib/compression/compression_args.h +0 -56
  1807. data/src/core/lib/compression/stream_compression.cc +0 -81
  1808. data/src/core/lib/compression/stream_compression.h +0 -117
  1809. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1810. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1811. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1812. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1813. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1814. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1815. data/src/core/lib/iomgr/error_internal.h +0 -66
  1816. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1654
  1817. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  1818. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  1819. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -173
  1820. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1821. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -104
  1822. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1823. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -88
  1824. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -114
  1825. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -293
  1826. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1827. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1828. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1829. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1830. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1831. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1832. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1833. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1834. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1835. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1836. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1837. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1838. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1839. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1840. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  1841. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1842. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1843. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -152
  1844. data/src/core/lib/iomgr/tcp_custom.cc +0 -377
  1845. data/src/core/lib/iomgr/tcp_custom.h +0 -86
  1846. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -467
  1847. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  1848. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  1849. data/src/core/lib/iomgr/timer_custom.h +0 -43
  1850. data/src/core/lib/iomgr/work_serializer.cc +0 -155
  1851. data/src/core/lib/iomgr/work_serializer.h +0 -81
  1852. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -171
  1853. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  1854. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  1855. data/src/core/lib/slice/slice_intern.cc +0 -367
  1856. data/src/core/lib/slice/slice_split.cc +0 -100
  1857. data/src/core/lib/slice/slice_split.h +0 -40
  1858. data/src/core/lib/slice/slice_utils.h +0 -200
  1859. data/src/core/lib/slice/static_slice.cc +0 -529
  1860. data/src/core/lib/slice/static_slice.h +0 -331
  1861. data/src/core/lib/surface/init_secure.cc +0 -103
  1862. data/src/core/lib/transport/byte_stream.cc +0 -158
  1863. data/src/core/lib/transport/byte_stream.h +0 -166
  1864. data/src/core/lib/transport/metadata.cc +0 -714
  1865. data/src/core/lib/transport/metadata.h +0 -449
  1866. data/src/core/lib/transport/static_metadata.cc +0 -1117
  1867. data/src/core/lib/transport/static_metadata.h +0 -340
  1868. data/src/core/lib/transport/status_metadata.cc +0 -63
  1869. data/src/core/lib/transport/status_metadata.h +0 -48
  1870. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
  1871. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1872. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  1873. data/third_party/cares/cares/ares_getopt.c +0 -122
  1874. data/third_party/cares/cares/ares_getopt.h +0 -53
  1875. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  1876. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  1877. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
@@ -19,42 +19,33 @@
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"
24
+ #include <algorithm>
25
+
26
+ #include "absl/memory/memory.h"
27
+ #include "absl/strings/match.h"
28
+ #include "absl/strings/str_cat.h"
26
29
  #include "absl/strings/str_format.h"
27
30
  #include "absl/strings/str_join.h"
31
+ #include "absl/strings/str_split.h"
28
32
  #include "absl/strings/string_view.h"
33
+ #include "absl/strings/strip.h"
34
+ #include "absl/types/optional.h"
35
+ #include "upb/arena.h"
29
36
 
30
- #include <grpc/byte_buffer_reader.h>
31
- #include <grpc/grpc.h>
32
- #include <grpc/support/alloc.h>
33
- #include <grpc/support/time.h>
37
+ #include <grpc/event_engine/event_engine.h>
38
+ #include <grpc/support/log.h>
34
39
 
35
- #include "src/core/ext/filters/client_channel/client_channel.h"
36
40
  #include "src/core/ext/xds/xds_api.h"
37
41
  #include "src/core/ext/xds/xds_bootstrap.h"
38
- #include "src/core/ext/xds/xds_channel_args.h"
39
42
  #include "src/core/ext/xds/xds_client_stats.h"
40
- #include "src/core/ext/xds/xds_http_filters.h"
41
- #include "src/core/lib/address_utils/sockaddr_utils.h"
42
43
  #include "src/core/lib/backoff/backoff.h"
43
- #include "src/core/lib/channel/channel_args.h"
44
- #include "src/core/lib/channel/channel_stack.h"
45
- #include "src/core/lib/gpr/env.h"
46
- #include "src/core/lib/gpr/string.h"
47
- #include "src/core/lib/gprpp/memory.h"
44
+ #include "src/core/lib/event_engine/default_event_engine.h"
45
+ #include "src/core/lib/gprpp/debug_location.h"
48
46
  #include "src/core/lib/gprpp/orphanable.h"
49
47
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
50
48
  #include "src/core/lib/gprpp/sync.h"
51
- #include "src/core/lib/iomgr/sockaddr.h"
52
- #include "src/core/lib/iomgr/timer.h"
53
- #include "src/core/lib/slice/slice_internal.h"
54
- #include "src/core/lib/slice/slice_string_helpers.h"
55
- #include "src/core/lib/surface/call.h"
56
- #include "src/core/lib/surface/channel.h"
57
- #include "src/core/lib/transport/static_metadata.h"
58
49
  #include "src/core/lib/uri/uri_parser.h"
59
50
 
60
51
  #define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
@@ -65,19 +56,12 @@
65
56
 
66
57
  namespace grpc_core {
67
58
 
59
+ using ::grpc_event_engine::experimental::EventEngine;
60
+ using ::grpc_event_engine::experimental::GetDefaultEventEngine;
61
+
68
62
  TraceFlag grpc_xds_client_trace(false, "xds_client");
69
63
  TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
70
64
 
71
- namespace {
72
-
73
- Mutex* g_mu = nullptr;
74
-
75
- const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
76
- XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
77
- char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
78
-
79
- } // namespace
80
-
81
65
  //
82
66
  // Internal class declarations
83
67
  //
@@ -90,9 +74,12 @@ class XdsClient::ChannelState::RetryableCall
90
74
  public:
91
75
  explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
92
76
 
93
- void Orphan() override;
77
+ // Disable thread-safety analysis because this method is called via
78
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
79
+ // through there.
80
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
94
81
 
95
- void OnCallFinishedLocked();
82
+ void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
96
83
 
97
84
  T* calld() const { return calld_.get(); }
98
85
  ChannelState* chand() const { return chand_.get(); }
@@ -101,9 +88,9 @@ class XdsClient::ChannelState::RetryableCall
101
88
 
102
89
  private:
103
90
  void StartNewCallLocked();
104
- void StartRetryTimerLocked();
105
- static void OnRetryTimer(void* arg, grpc_error_handle error);
106
- void OnRetryTimerLocked(grpc_error_handle error);
91
+ void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
92
+
93
+ void OnRetryTimer();
107
94
 
108
95
  // The wrapped xds call that talks to the xds server. It's instantiated
109
96
  // every time we start a new call. It's null during call retry backoff.
@@ -113,9 +100,8 @@ class XdsClient::ChannelState::RetryableCall
113
100
 
114
101
  // Retry state.
115
102
  BackOff backoff_;
116
- grpc_timer retry_timer_;
117
- grpc_closure on_retry_timer_;
118
- bool retry_timer_callback_pending_ = false;
103
+ absl::optional<EventEngine::TaskHandle> timer_handle_
104
+ ABSL_GUARDED_BY(&XdsClient::mu_);
119
105
 
120
106
  bool shutting_down_ = false;
121
107
  };
@@ -126,7 +112,6 @@ class XdsClient::ChannelState::AdsCallState
126
112
  public:
127
113
  // The ctor and dtor should not be used directly.
128
114
  explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
129
- ~AdsCallState() override;
130
115
 
131
116
  void Orphan() override;
132
117
 
@@ -135,217 +120,200 @@ class XdsClient::ChannelState::AdsCallState
135
120
  XdsClient* xds_client() const { return chand()->xds_client(); }
136
121
  bool seen_response() const { return seen_response_; }
137
122
 
138
- void SubscribeLocked(const std::string& type_url,
139
- const XdsApi::ResourceName& resource)
123
+ void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name,
124
+ bool delay_send)
140
125
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
141
- void UnsubscribeLocked(const std::string& type_url,
142
- const XdsApi::ResourceName& resource,
143
- bool delay_unsubscription)
126
+ void UnsubscribeLocked(const XdsResourceType* type,
127
+ const XdsResourceName& name, bool delay_unsubscription)
144
128
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
145
129
 
146
130
  bool HasSubscribedResources() const;
147
131
 
148
132
  private:
149
- class ResourceState : public InternallyRefCounted<ResourceState> {
133
+ class AdsResponseParser : public XdsApi::AdsResponseParserInterface {
150
134
  public:
151
- ResourceState(const std::string& type_url,
152
- const XdsApi::ResourceName& resource,
153
- bool sent_initial_request)
154
- : type_url_(type_url),
155
- resource_(resource),
156
- sent_initial_request_(sent_initial_request) {
157
- GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
158
- grpc_schedule_on_exec_ctx);
159
- }
135
+ struct Result {
136
+ const XdsResourceType* type;
137
+ std::string type_url;
138
+ std::string version;
139
+ std::string nonce;
140
+ std::vector<std::string> errors;
141
+ std::map<std::string /*authority*/, std::set<XdsResourceKey>>
142
+ resources_seen;
143
+ bool have_valid_resources = false;
144
+ };
145
+
146
+ explicit AdsResponseParser(AdsCallState* ads_call_state)
147
+ : ads_call_state_(ads_call_state) {}
148
+
149
+ absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
150
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
151
+
152
+ void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
153
+ absl::string_view serialized_resource) override
154
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
155
+
156
+ Result TakeResult() { return std::move(result_); }
157
+
158
+ private:
159
+ XdsClient* xds_client() const { return ads_call_state_->xds_client(); }
160
+
161
+ AdsCallState* ads_call_state_;
162
+ const Timestamp update_time_ = ExecCtx::Get()->Now();
163
+ Result result_;
164
+ };
160
165
 
161
- void Orphan() override {
162
- Finish();
166
+ class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
167
+ public:
168
+ ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
169
+ : type_(type), name_(name) {}
170
+
171
+ // Disable thread-safety analysis because this method is called via
172
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
173
+ // through there.
174
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
175
+ MaybeCancelTimer();
163
176
  Unref(DEBUG_LOCATION, "Orphan");
164
177
  }
165
178
 
166
- void Start(RefCountedPtr<AdsCallState> ads_calld) {
167
- if (sent_initial_request_) return;
168
- sent_initial_request_ = true;
179
+ void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld)
180
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
181
+ if (!timer_start_needed_) return;
182
+ timer_start_needed_ = false;
183
+ // Check if we already have a cached version of this resource
184
+ // (i.e., if this is the initial request for the resource after an
185
+ // ADS stream restart). If so, we don't start the timer, because
186
+ // (a) we already have the resource and (b) the server may
187
+ // optimize by not resending the resource that we already have.
188
+ auto& authority_state =
189
+ ads_calld->xds_client()->authority_state_map_[name_.authority];
190
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
191
+ if (state.resource != nullptr) return;
192
+ // Start timer.
169
193
  ads_calld_ = std::move(ads_calld);
170
- Ref(DEBUG_LOCATION, "timer").release();
171
- timer_pending_ = true;
172
- grpc_timer_init(
173
- &timer_,
174
- ExecCtx::Get()->Now() + ads_calld_->xds_client()->request_timeout_,
175
- &timer_callback_);
176
- }
177
-
178
- void Finish() {
179
- if (timer_pending_) {
180
- grpc_timer_cancel(&timer_);
181
- timer_pending_ = false;
194
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(
195
+ ads_calld_->xds_client()->request_timeout_,
196
+ [self = Ref(DEBUG_LOCATION, "timer")]() {
197
+ ApplicationCallbackExecCtx callback_exec_ctx;
198
+ ExecCtx exec_ctx;
199
+ self->OnTimer();
200
+ });
201
+ }
202
+
203
+ void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
204
+ // If the timer hasn't been started yet, make sure we don't start
205
+ // it later. This can happen if the last watch for an LDS or CDS
206
+ // resource is cancelled and then restarted, both while an ADS
207
+ // request for a different resource type is being sent (causing
208
+ // the unsubscription and then resubscription requests to be
209
+ // queued), and then we get a response for the LDS or CDS resource.
210
+ // In that case, we would call MaybeCancelTimer() when we receive the
211
+ // response and then MaybeStartTimer() when we finally send the new
212
+ // LDS or CDS request, thus causing the timer to fire when it shouldn't.
213
+ // For details, see https://github.com/grpc/grpc/issues/29583.
214
+ // TODO(roth): Find a way to write a test for this case.
215
+ timer_start_needed_ = false;
216
+ if (timer_handle_.has_value()) {
217
+ GetDefaultEventEngine()->Cancel(*timer_handle_);
218
+ timer_handle_.reset();
182
219
  }
183
220
  }
184
221
 
185
222
  private:
186
- static void OnTimer(void* arg, grpc_error_handle error) {
187
- ResourceState* self = static_cast<ResourceState*>(arg);
223
+ void OnTimer() {
188
224
  {
189
- MutexLock lock(&self->ads_calld_->xds_client()->mu_);
190
- self->OnTimerLocked(GRPC_ERROR_REF(error));
191
- }
192
- self->ads_calld_.reset();
193
- self->Unref(DEBUG_LOCATION, "timer");
194
- }
195
-
196
- void OnTimerLocked(grpc_error_handle error)
197
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
198
- if (error == GRPC_ERROR_NONE && timer_pending_) {
199
- timer_pending_ = false;
200
- grpc_error_handle watcher_error =
201
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
202
- "timeout obtaining resource {type=%s name=%s} from xds server",
203
- type_url_,
204
- XdsApi::ConstructFullResourceName(resource_.authority,
205
- type_url_, resource_.id)));
206
- watcher_error = grpc_error_set_int(
207
- watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
208
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
209
- gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
210
- grpc_error_std_string(watcher_error).c_str());
211
- }
212
- auto& authority_state =
213
- ads_calld_->xds_client()->authority_state_map_[resource_.authority];
214
- if (type_url_ == XdsApi::kLdsTypeUrl) {
215
- ListenerState& state = authority_state.listener_map[resource_.id];
216
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
217
- for (const auto& p : state.watchers) {
218
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
219
- }
220
- } else if (type_url_ == XdsApi::kRdsTypeUrl) {
221
- RouteConfigState& state =
222
- authority_state.route_config_map[resource_.id];
223
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
224
- for (const auto& p : state.watchers) {
225
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
225
+ MutexLock lock(&ads_calld_->xds_client()->mu_);
226
+ if (timer_handle_.has_value()) {
227
+ timer_handle_.reset();
228
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
229
+ gpr_log(GPR_INFO,
230
+ "[xds_client %p] xds server %s: timeout obtaining resource "
231
+ "{type=%s name=%s} from xds server",
232
+ ads_calld_->xds_client(),
233
+ ads_calld_->chand()->server_.server_uri.c_str(),
234
+ std::string(type_->type_url()).c_str(),
235
+ XdsClient::ConstructFullXdsResourceName(
236
+ name_.authority, type_->type_url(), name_.key)
237
+ .c_str());
226
238
  }
227
- } else if (type_url_ == XdsApi::kCdsTypeUrl) {
228
- ClusterState& state = authority_state.cluster_map[resource_.id];
239
+ auto& authority_state =
240
+ ads_calld_->xds_client()->authority_state_map_[name_.authority];
241
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
229
242
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
230
- for (const auto& p : state.watchers) {
231
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
232
- }
233
- } else if (type_url_ == XdsApi::kEdsTypeUrl) {
234
- EndpointState& state = authority_state.endpoint_map[resource_.id];
235
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
236
- for (const auto& p : state.watchers) {
237
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
238
- }
239
- } else {
240
- GPR_UNREACHABLE_CODE(return );
243
+ ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
244
+ state.watchers);
241
245
  }
242
- GRPC_ERROR_UNREF(watcher_error);
243
246
  }
244
- GRPC_ERROR_UNREF(error);
247
+ ads_calld_->xds_client()->work_serializer_.DrainQueue();
248
+ ads_calld_.reset();
245
249
  }
246
250
 
247
- const std::string type_url_;
248
- const XdsApi::ResourceName resource_;
251
+ const XdsResourceType* type_;
252
+ const XdsResourceName name_;
249
253
 
250
254
  RefCountedPtr<AdsCallState> ads_calld_;
251
- bool sent_initial_request_;
252
- bool timer_pending_ = false;
253
- grpc_timer timer_;
254
- grpc_closure timer_callback_;
255
+ bool timer_start_needed_ ABSL_GUARDED_BY(&XdsClient::mu_) = true;
256
+ absl::optional<EventEngine::TaskHandle> timer_handle_
257
+ ABSL_GUARDED_BY(&XdsClient::mu_);
255
258
  };
256
259
 
257
- struct ResourceTypeState {
258
- ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
260
+ class StreamEventHandler
261
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
262
+ public:
263
+ explicit StreamEventHandler(RefCountedPtr<AdsCallState> ads_calld)
264
+ : ads_calld_(std::move(ads_calld)) {}
265
+
266
+ void OnRequestSent(bool ok) override { ads_calld_->OnRequestSent(ok); }
267
+ void OnRecvMessage(absl::string_view payload) override {
268
+ ads_calld_->OnRecvMessage(payload);
269
+ }
270
+ void OnStatusReceived(absl::Status status) override {
271
+ ads_calld_->OnStatusReceived(std::move(status));
272
+ }
259
273
 
260
- // Nonce and error for this resource type.
274
+ private:
275
+ RefCountedPtr<AdsCallState> ads_calld_;
276
+ };
277
+
278
+ struct ResourceTypeState {
279
+ // Nonce and status for this resource type.
261
280
  std::string nonce;
262
- grpc_error_handle error = GRPC_ERROR_NONE;
281
+ absl::Status status;
263
282
 
264
283
  // Subscribed resources of this type.
265
284
  std::map<std::string /*authority*/,
266
- std::map<std::string /*name*/, OrphanablePtr<ResourceState>>>
285
+ std::map<XdsResourceKey, OrphanablePtr<ResourceTimer>>>
267
286
  subscribed_resources;
268
287
  };
269
288
 
270
- void SendMessageLocked(const std::string& type_url)
271
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
272
-
273
- void AcceptLdsUpdateLocked(
274
- std::string version, grpc_millis update_time,
275
- XdsApi::LdsUpdateMap lds_update_map,
276
- const std::set<XdsApi::ResourceName>& resource_names_failed)
277
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
278
- void AcceptRdsUpdateLocked(std::string version, grpc_millis update_time,
279
- XdsApi::RdsUpdateMap rds_update_map)
280
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
281
- void AcceptCdsUpdateLocked(
282
- std::string version, grpc_millis update_time,
283
- XdsApi::CdsUpdateMap cds_update_map,
284
- const std::set<XdsApi::ResourceName>& resource_names_failed)
285
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
286
- void AcceptEdsUpdateLocked(std::string version, grpc_millis update_time,
287
- XdsApi::EdsUpdateMap eds_update_map)
288
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
289
-
290
- template <typename StateMap>
291
- void RejectAdsUpdateHelperLocked(const std::string& resource_name,
292
- grpc_millis update_time,
293
- const XdsApi::AdsParseResult& result,
294
- const std::string& error_details,
295
- StateMap* state_map)
289
+ void SendMessageLocked(const XdsResourceType* type)
296
290
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
297
291
 
298
- void RejectAdsUpdateLocked(grpc_millis update_time,
299
- const XdsApi::AdsParseResult& result)
300
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
301
-
302
- static void OnRequestSent(void* arg, grpc_error_handle error);
303
- void OnRequestSentLocked(grpc_error_handle error)
304
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
305
- static void OnResponseReceived(void* arg, grpc_error_handle error);
306
- bool OnResponseReceivedLocked()
307
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
308
- static void OnStatusReceived(void* arg, grpc_error_handle error);
309
- void OnStatusReceivedLocked(grpc_error_handle error)
310
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
292
+ void OnRequestSent(bool ok);
293
+ void OnRecvMessage(absl::string_view payload);
294
+ void OnStatusReceived(absl::Status status);
311
295
 
312
296
  bool IsCurrentCallOnChannel() const;
313
297
 
314
- std::map<absl::string_view /*authority*/,
315
- std::set<absl::string_view /*name*/>>
316
- ResourceNamesForRequest(const std::string& type_url);
298
+ // Constructs a list of resource names of a given type for an ADS
299
+ // request. Also starts the timer for each resource if needed.
300
+ std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type)
301
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
317
302
 
318
303
  // The owning RetryableCall<>.
319
304
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
320
305
 
306
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
307
+
321
308
  bool sent_initial_message_ = false;
322
309
  bool seen_response_ = false;
323
-
324
- // Always non-NULL.
325
- grpc_call* call_;
326
-
327
- // recv_initial_metadata
328
- grpc_metadata_array initial_metadata_recv_;
329
-
330
- // send_message
331
- grpc_byte_buffer* send_message_payload_ = nullptr;
332
- grpc_closure on_request_sent_;
333
-
334
- // recv_message
335
- grpc_byte_buffer* recv_message_payload_ = nullptr;
336
- grpc_closure on_response_received_;
337
-
338
- // recv_trailing_metadata
339
- grpc_metadata_array trailing_metadata_recv_;
340
- grpc_status_code status_code_;
341
- grpc_slice status_details_;
342
- grpc_closure on_status_received_;
310
+ bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
343
311
 
344
312
  // Resource types for which requests need to be sent.
345
- std::set<std::string /*type_url*/> buffered_requests_;
313
+ std::set<const XdsResourceType*> buffered_requests_;
346
314
 
347
315
  // State for each resource type.
348
- std::map<std::string /*type_url*/, ResourceTypeState> state_map_;
316
+ std::map<const XdsResourceType*, ResourceTypeState> state_map_;
349
317
  };
350
318
 
351
319
  // Contains an LRS call to the xds server.
@@ -354,11 +322,11 @@ class XdsClient::ChannelState::LrsCallState
354
322
  public:
355
323
  // The ctor and dtor should not be used directly.
356
324
  explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
357
- ~LrsCallState() override;
358
325
 
359
326
  void Orphan() override;
360
327
 
361
- void MaybeStartReportingLocked();
328
+ void MaybeStartReportingLocked()
329
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
362
330
 
363
331
  RetryableCall<LrsCallState>* parent() { return parent_.get(); }
364
332
  ChannelState* chand() const { return parent_->chand(); }
@@ -366,30 +334,44 @@ class XdsClient::ChannelState::LrsCallState
366
334
  bool seen_response() const { return seen_response_; }
367
335
 
368
336
  private:
337
+ class StreamEventHandler
338
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
339
+ public:
340
+ explicit StreamEventHandler(RefCountedPtr<LrsCallState> lrs_calld)
341
+ : lrs_calld_(std::move(lrs_calld)) {}
342
+
343
+ void OnRequestSent(bool ok) override { lrs_calld_->OnRequestSent(ok); }
344
+ void OnRecvMessage(absl::string_view payload) override {
345
+ lrs_calld_->OnRecvMessage(payload);
346
+ }
347
+ void OnStatusReceived(absl::Status status) override {
348
+ lrs_calld_->OnStatusReceived(std::move(status));
349
+ }
350
+
351
+ private:
352
+ RefCountedPtr<LrsCallState> lrs_calld_;
353
+ };
354
+
369
355
  // Reports client-side load stats according to a fixed interval.
370
356
  class Reporter : public InternallyRefCounted<Reporter> {
371
357
  public:
372
- Reporter(RefCountedPtr<LrsCallState> parent, grpc_millis report_interval)
358
+ Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
373
359
  : parent_(std::move(parent)), report_interval_(report_interval) {
374
- GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
375
- grpc_schedule_on_exec_ctx);
376
- GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
377
- grpc_schedule_on_exec_ctx);
378
360
  ScheduleNextReportLocked();
379
361
  }
380
362
 
381
- void Orphan() override;
363
+ // Disable thread-safety analysis because this method is called via
364
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
365
+ // through there.
366
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
367
+
368
+ void OnReportDoneLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
382
369
 
383
370
  private:
384
371
  void ScheduleNextReportLocked()
385
372
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
386
- static void OnNextReportTimer(void* arg, grpc_error_handle error);
387
- bool OnNextReportTimerLocked(grpc_error_handle error)
388
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
373
+ bool OnNextReportTimer();
389
374
  bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
390
- static void OnReportDone(void* arg, grpc_error_handle error);
391
- bool OnReportDoneLocked(grpc_error_handle error)
392
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
393
375
 
394
376
  bool IsCurrentReporterOnCall() const {
395
377
  return this == parent_->reporter_.get();
@@ -400,104 +382,37 @@ class XdsClient::ChannelState::LrsCallState
400
382
  RefCountedPtr<LrsCallState> parent_;
401
383
 
402
384
  // The load reporting state.
403
- const grpc_millis report_interval_;
385
+ const Duration report_interval_;
404
386
  bool last_report_counters_were_zero_ = false;
405
- bool next_report_timer_callback_pending_ = false;
406
- grpc_timer next_report_timer_;
407
- grpc_closure on_next_report_timer_;
408
- grpc_closure on_report_done_;
387
+ absl::optional<EventEngine::TaskHandle> timer_handle_
388
+ ABSL_GUARDED_BY(&XdsClient::mu_);
409
389
  };
410
390
 
411
- static void OnInitialRequestSent(void* arg, grpc_error_handle error);
412
- void OnInitialRequestSentLocked()
413
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
414
- static void OnResponseReceived(void* arg, grpc_error_handle error);
415
- bool OnResponseReceivedLocked()
416
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
417
- static void OnStatusReceived(void* arg, grpc_error_handle error);
418
- void OnStatusReceivedLocked(grpc_error_handle error)
419
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
391
+ void OnRequestSent(bool ok);
392
+ void OnRecvMessage(absl::string_view payload);
393
+ void OnStatusReceived(absl::Status status);
420
394
 
421
395
  bool IsCurrentCallOnChannel() const;
422
396
 
423
397
  // The owning RetryableCall<>.
424
398
  RefCountedPtr<RetryableCall<LrsCallState>> parent_;
425
- bool seen_response_ = false;
426
399
 
427
- // Always non-NULL.
428
- grpc_call* call_;
400
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
429
401
 
430
- // recv_initial_metadata
431
- grpc_metadata_array initial_metadata_recv_;
432
-
433
- // send_message
434
- grpc_byte_buffer* send_message_payload_ = nullptr;
435
- grpc_closure on_initial_request_sent_;
436
-
437
- // recv_message
438
- grpc_byte_buffer* recv_message_payload_ = nullptr;
439
- grpc_closure on_response_received_;
440
-
441
- // recv_trailing_metadata
442
- grpc_metadata_array trailing_metadata_recv_;
443
- grpc_status_code status_code_;
444
- grpc_slice status_details_;
445
- grpc_closure on_status_received_;
402
+ bool seen_response_ = false;
403
+ bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
446
404
 
447
405
  // Load reporting state.
448
406
  bool send_all_clusters_ = false;
449
407
  std::set<std::string> cluster_names_; // Asked for by the LRS server.
450
- grpc_millis load_reporting_interval_ = 0;
408
+ Duration load_reporting_interval_;
451
409
  OrphanablePtr<Reporter> reporter_;
452
410
  };
453
411
 
454
- //
455
- // XdsClient::ChannelState::StateWatcher
456
- //
457
-
458
- class XdsClient::ChannelState::StateWatcher
459
- : public AsyncConnectivityStateWatcherInterface {
460
- public:
461
- explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
462
- : parent_(std::move(parent)) {}
463
-
464
- private:
465
- void OnConnectivityStateChange(grpc_connectivity_state new_state,
466
- const absl::Status& status) override {
467
- MutexLock lock(&parent_->xds_client_->mu_);
468
- if (!parent_->shutting_down_ &&
469
- new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
470
- // In TRANSIENT_FAILURE. Notify all watchers of error.
471
- gpr_log(GPR_INFO,
472
- "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
473
- "status_message:(%s)",
474
- parent_->xds_client(), status.ToString().c_str());
475
- parent_->xds_client_->NotifyOnErrorLocked(
476
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
477
- "xds channel in TRANSIENT_FAILURE"));
478
- }
479
- }
480
-
481
- WeakRefCountedPtr<ChannelState> parent_;
482
- };
483
-
484
412
  //
485
413
  // XdsClient::ChannelState
486
414
  //
487
415
 
488
- namespace {
489
-
490
- grpc_channel* CreateXdsChannel(grpc_channel_args* args,
491
- const XdsBootstrap::XdsServer& server) {
492
- RefCountedPtr<grpc_channel_credentials> channel_creds =
493
- XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
494
- server.channel_creds_config);
495
- return grpc_secure_channel_create(channel_creds.get(),
496
- server.server_uri.c_str(), args, nullptr);
497
- }
498
-
499
- } // namespace
500
-
501
416
  XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
502
417
  const XdsBootstrap::XdsServer& server)
503
418
  : DualRefCounted<ChannelState>(
@@ -510,35 +425,43 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
510
425
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
511
426
  xds_client_.get(), server.server_uri.c_str());
512
427
  }
513
- channel_ = CreateXdsChannel(xds_client_->args_, server);
514
- GPR_ASSERT(channel_ != nullptr);
515
- StartConnectivityWatchLocked();
428
+ absl::Status status;
429
+ transport_ = xds_client_->transport_factory_->Create(
430
+ server,
431
+ [self = WeakRef(DEBUG_LOCATION, "OnConnectivityFailure")](
432
+ absl::Status status) {
433
+ self->OnConnectivityStateChange(std::move(status));
434
+ },
435
+ &status);
436
+ GPR_ASSERT(transport_ != nullptr);
437
+ if (!status.ok()) OnConnectivityStateChangeLocked(std::move(status));
516
438
  }
517
439
 
518
440
  XdsClient::ChannelState::~ChannelState() {
519
441
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
520
- gpr_log(GPR_INFO, "[xds_client %p] Destroying xds channel %p", xds_client(),
521
- this);
442
+ gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
443
+ xds_client(), this, server_.server_uri.c_str());
522
444
  }
523
- grpc_channel_destroy(channel_);
524
445
  xds_client_.reset(DEBUG_LOCATION, "ChannelState");
525
446
  }
526
447
 
527
448
  // This method should only ever be called when holding the lock, but we can't
528
449
  // use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
529
- // called from DualRefCounted::Unref, which cannot have a lock annotation for a
530
- // lock in this subclass.
450
+ // called from DualRefCounted::Unref, which cannot have a lock annotation for
451
+ // a lock in this subclass.
531
452
  void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
532
453
  shutting_down_ = true;
533
- CancelConnectivityWatchLocked();
454
+ transport_.reset();
534
455
  // At this time, all strong refs are removed, remove from channel map to
535
- // prevent subsequent subscription from trying to use this ChannelState as it
536
- // is shutting down.
456
+ // prevent subsequent subscription from trying to use this ChannelState as
457
+ // it is shutting down.
537
458
  xds_client_->xds_server_channel_map_.erase(server_);
538
459
  ads_calld_.reset();
539
460
  lrs_calld_.reset();
540
461
  }
541
462
 
463
+ void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
464
+
542
465
  XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
543
466
  const {
544
467
  return ads_calld_->calld();
@@ -559,25 +482,13 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
559
482
  WeakRef(DEBUG_LOCATION, "ChannelState+lrs")));
560
483
  }
561
484
 
562
- void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
563
-
564
- void XdsClient::ChannelState::StartConnectivityWatchLocked() {
565
- ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
566
- GPR_ASSERT(client_channel != nullptr);
567
- watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
568
- client_channel->AddConnectivityWatcher(
569
- GRPC_CHANNEL_IDLE,
570
- OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
571
- }
572
-
573
- void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
574
- ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
575
- GPR_ASSERT(client_channel != nullptr);
576
- client_channel->RemoveConnectivityWatcher(watcher_);
485
+ void XdsClient::ChannelState::StopLrsCallLocked() {
486
+ xds_client_->xds_load_report_server_map_.erase(server_);
487
+ lrs_calld_.reset();
577
488
  }
578
489
 
579
- void XdsClient::ChannelState::SubscribeLocked(
580
- const std::string& type_url, const XdsApi::ResourceName& resource) {
490
+ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
491
+ const XdsResourceName& name) {
581
492
  if (ads_calld_ == nullptr) {
582
493
  // Start the ADS call if this is the first request.
583
494
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -591,16 +502,16 @@ void XdsClient::ChannelState::SubscribeLocked(
591
502
  // because when the call is restarted it will resend all necessary requests.
592
503
  if (ads_calld() == nullptr) return;
593
504
  // Subscribe to this resource if the ADS call is active.
594
- ads_calld()->SubscribeLocked(type_url, resource);
505
+ ads_calld()->SubscribeLocked(type, name, /*delay_send=*/false);
595
506
  }
596
507
 
597
- void XdsClient::ChannelState::UnsubscribeLocked(
598
- const std::string& type_url, const XdsApi::ResourceName& resource,
599
- bool delay_unsubscription) {
508
+ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
509
+ const XdsResourceName& name,
510
+ bool delay_unsubscription) {
600
511
  if (ads_calld_ != nullptr) {
601
512
  auto* calld = ads_calld_->calld();
602
513
  if (calld != nullptr) {
603
- calld->UnsubscribeLocked(type_url, resource, delay_unsubscription);
514
+ calld->UnsubscribeLocked(type, name, delay_unsubscription);
604
515
  if (!calld->HasSubscribedResources()) {
605
516
  ads_calld_.reset();
606
517
  }
@@ -608,6 +519,29 @@ void XdsClient::ChannelState::UnsubscribeLocked(
608
519
  }
609
520
  }
610
521
 
522
+ void XdsClient::ChannelState::OnConnectivityStateChange(absl::Status status) {
523
+ {
524
+ MutexLock lock(&xds_client_->mu_);
525
+ OnConnectivityStateChangeLocked(std::move(status));
526
+ }
527
+ xds_client_->work_serializer_.DrainQueue();
528
+ }
529
+
530
+ void XdsClient::ChannelState::OnConnectivityStateChangeLocked(
531
+ absl::Status status) {
532
+ if (!shutting_down_) {
533
+ // Notify all watchers of error.
534
+ gpr_log(GPR_INFO,
535
+ "[xds_client %p] xds channel for server %s in "
536
+ "state TRANSIENT_FAILURE: %s",
537
+ xds_client(), server_.server_uri.c_str(),
538
+ status.ToString().c_str());
539
+ xds_client_->NotifyOnErrorLocked(absl::UnavailableError(
540
+ absl::StrCat("xds channel in TRANSIENT_FAILURE, connectivity error: ",
541
+ status.ToString())));
542
+ }
543
+ }
544
+
611
545
  //
612
546
  // XdsClient::ChannelState::RetryableCall<>
613
547
  //
@@ -616,16 +550,13 @@ template <typename T>
616
550
  XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
617
551
  WeakRefCountedPtr<ChannelState> chand)
618
552
  : chand_(std::move(chand)),
619
- backoff_(
620
- BackOff::Options()
621
- .set_initial_backoff(GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS *
622
- 1000)
623
- .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER)
624
- .set_jitter(GRPC_XDS_RECONNECT_JITTER)
625
- .set_max_backoff(GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
626
- // Closure Initialization
627
- GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
628
- grpc_schedule_on_exec_ctx);
553
+ backoff_(BackOff::Options()
554
+ .set_initial_backoff(Duration::Seconds(
555
+ GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS))
556
+ .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER)
557
+ .set_jitter(GRPC_XDS_RECONNECT_JITTER)
558
+ .set_max_backoff(Duration::Seconds(
559
+ GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
629
560
  StartNewCallLocked();
630
561
  }
631
562
 
@@ -633,35 +564,32 @@ template <typename T>
633
564
  void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
634
565
  shutting_down_ = true;
635
566
  calld_.reset();
636
- if (retry_timer_callback_pending_) grpc_timer_cancel(&retry_timer_);
567
+ if (timer_handle_.has_value()) {
568
+ GetDefaultEventEngine()->Cancel(*timer_handle_);
569
+ timer_handle_.reset();
570
+ }
637
571
  this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
638
572
  }
639
573
 
640
574
  template <typename T>
641
575
  void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
642
- const bool seen_response = calld_->seen_response();
576
+ // If we saw a response on the current stream, reset backoff.
577
+ if (calld_->seen_response()) backoff_.Reset();
643
578
  calld_.reset();
644
- if (seen_response) {
645
- // If we lost connection to the xds server, reset backoff and restart the
646
- // call immediately.
647
- backoff_.Reset();
648
- StartNewCallLocked();
649
- } else {
650
- // If we failed to connect to the xds server, retry later.
651
- StartRetryTimerLocked();
652
- }
579
+ // Start retry timer.
580
+ StartRetryTimerLocked();
653
581
  }
654
582
 
655
583
  template <typename T>
656
584
  void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
657
585
  if (shutting_down_) return;
658
- GPR_ASSERT(chand_->channel_ != nullptr);
586
+ GPR_ASSERT(chand_->transport_ != nullptr);
659
587
  GPR_ASSERT(calld_ == nullptr);
660
588
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
661
589
  gpr_log(GPR_INFO,
662
- "[xds_client %p] Start new call from retryable call (chand: %p, "
663
- "retryable call: %p)",
664
- chand()->xds_client(), chand(), this);
590
+ "[xds_client %p] xds server %s: start new call from retryable "
591
+ "call %p",
592
+ chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
665
593
  }
666
594
  calld_ = MakeOrphanable<T>(
667
595
  this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
@@ -670,45 +598,216 @@ void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
670
598
  template <typename T>
671
599
  void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
672
600
  if (shutting_down_) return;
673
- const grpc_millis next_attempt_time = backoff_.NextAttemptTime();
601
+ const Timestamp next_attempt_time = backoff_.NextAttemptTime();
602
+ const Duration timeout =
603
+ std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
674
604
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
675
- grpc_millis timeout =
676
- std::max(next_attempt_time - ExecCtx::Get()->Now(), grpc_millis(0));
677
605
  gpr_log(GPR_INFO,
678
- "[xds_client %p] Failed to connect to xds server (chand: %p) "
606
+ "[xds_client %p] xds server %s: call attempt failed; "
679
607
  "retry timer will fire in %" PRId64 "ms.",
680
- chand()->xds_client(), chand(), timeout);
608
+ chand()->xds_client(), chand()->server_.server_uri.c_str(),
609
+ timeout.millis());
681
610
  }
682
- this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
683
- grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
684
- retry_timer_callback_pending_ = true;
611
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(
612
+ timeout,
613
+ [self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
614
+ ApplicationCallbackExecCtx callback_exec_ctx;
615
+ ExecCtx exec_ctx;
616
+ self->OnRetryTimer();
617
+ });
685
618
  }
686
619
 
687
620
  template <typename T>
688
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
689
- void* arg, grpc_error_handle error) {
690
- RetryableCall* calld = static_cast<RetryableCall*>(arg);
691
- {
692
- MutexLock lock(&calld->chand_->xds_client()->mu_);
693
- calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
621
+ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer() {
622
+ MutexLock lock(&chand_->xds_client()->mu_);
623
+ if (timer_handle_.has_value()) {
624
+ timer_handle_.reset();
625
+ if (shutting_down_) return;
626
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
627
+ gpr_log(GPR_INFO,
628
+ "[xds_client %p] xds server %s: retry timer fired (retryable "
629
+ "call: %p)",
630
+ chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
631
+ }
632
+ StartNewCallLocked();
694
633
  }
695
- calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
696
634
  }
697
635
 
698
- template <typename T>
699
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
700
- grpc_error_handle error) {
701
- retry_timer_callback_pending_ = false;
702
- if (!shutting_down_ && error == GRPC_ERROR_NONE) {
636
+ //
637
+ // XdsClient::ChannelState::AdsCallState::AdsResponseParser
638
+ //
639
+
640
+ absl::Status XdsClient::ChannelState::AdsCallState::AdsResponseParser::
641
+ ProcessAdsResponseFields(AdsResponseFields fields) {
642
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
643
+ gpr_log(
644
+ GPR_INFO,
645
+ "[xds_client %p] xds server %s: received ADS response: type_url=%s, "
646
+ "version=%s, nonce=%s, num_resources=%" PRIuPTR,
647
+ ads_call_state_->xds_client(),
648
+ ads_call_state_->chand()->server_.server_uri.c_str(),
649
+ fields.type_url.c_str(), fields.version.c_str(), fields.nonce.c_str(),
650
+ fields.num_resources);
651
+ }
652
+ result_.type =
653
+ ads_call_state_->xds_client()->GetResourceTypeLocked(fields.type_url);
654
+ if (result_.type == nullptr) {
655
+ return absl::InvalidArgumentError(
656
+ absl::StrCat("unknown resource type ", fields.type_url));
657
+ }
658
+ result_.type_url = std::move(fields.type_url);
659
+ result_.version = std::move(fields.version);
660
+ result_.nonce = std::move(fields.nonce);
661
+ return absl::OkStatus();
662
+ }
663
+
664
+ namespace {
665
+
666
+ // Build a resource metadata struct for ADS result accepting methods and CSDS.
667
+ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
668
+ std::string serialized_proto, std::string version, Timestamp update_time) {
669
+ XdsApi::ResourceMetadata resource_metadata;
670
+ resource_metadata.serialized_proto = std::move(serialized_proto);
671
+ resource_metadata.update_time = update_time;
672
+ resource_metadata.version = std::move(version);
673
+ resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
674
+ return resource_metadata;
675
+ }
676
+
677
+ // Update resource_metadata for NACK.
678
+ void UpdateResourceMetadataNacked(const std::string& version,
679
+ const std::string& details,
680
+ Timestamp update_time,
681
+ XdsApi::ResourceMetadata* resource_metadata) {
682
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
683
+ resource_metadata->failed_version = version;
684
+ resource_metadata->failed_details = details;
685
+ resource_metadata->failed_update_time = update_time;
686
+ }
687
+
688
+ } // namespace
689
+
690
+ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
691
+ upb_Arena* arena, size_t idx, absl::string_view type_url,
692
+ absl::string_view serialized_resource) {
693
+ // Check the type_url of the resource.
694
+ bool is_v2 = false;
695
+ if (!result_.type->IsType(type_url, &is_v2)) {
696
+ result_.errors.emplace_back(
697
+ absl::StrCat("resource index ", idx, ": incorrect resource type ",
698
+ type_url, " (should be ", result_.type_url, ")"));
699
+ return;
700
+ }
701
+ // Parse the resource.
702
+ XdsResourceType::DecodeContext context = {
703
+ xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
704
+ xds_client()->symtab_.ptr(), arena};
705
+ absl::StatusOr<XdsResourceType::DecodeResult> result =
706
+ result_.type->Decode(context, serialized_resource, is_v2);
707
+ if (!result.ok()) {
708
+ result_.errors.emplace_back(
709
+ absl::StrCat("resource index ", idx, ": ", result.status().ToString()));
710
+ return;
711
+ }
712
+ // Check the resource name.
713
+ auto resource_name =
714
+ xds_client()->ParseXdsResourceName(result->name, result_.type);
715
+ if (!resource_name.ok()) {
716
+ result_.errors.emplace_back(absl::StrCat(
717
+ "resource index ", idx, ": Cannot parse xDS resource name \"",
718
+ result->name, "\""));
719
+ return;
720
+ }
721
+ // Cancel resource-does-not-exist timer, if needed.
722
+ auto timer_it = ads_call_state_->state_map_.find(result_.type);
723
+ if (timer_it != ads_call_state_->state_map_.end()) {
724
+ auto it =
725
+ timer_it->second.subscribed_resources.find(resource_name->authority);
726
+ if (it != timer_it->second.subscribed_resources.end()) {
727
+ auto res_it = it->second.find(resource_name->key);
728
+ if (res_it != it->second.end()) {
729
+ res_it->second->MaybeCancelTimer();
730
+ }
731
+ }
732
+ }
733
+ // Lookup the authority in the cache.
734
+ auto authority_it =
735
+ xds_client()->authority_state_map_.find(resource_name->authority);
736
+ if (authority_it == xds_client()->authority_state_map_.end()) {
737
+ return; // Skip resource -- we don't have a subscription for it.
738
+ }
739
+ // Found authority, so look up type.
740
+ AuthorityState& authority_state = authority_it->second;
741
+ auto type_it = authority_state.resource_map.find(result_.type);
742
+ if (type_it == authority_state.resource_map.end()) {
743
+ return; // Skip resource -- we don't have a subscription for it.
744
+ }
745
+ auto& type_map = type_it->second;
746
+ // Found type, so look up resource key.
747
+ auto it = type_map.find(resource_name->key);
748
+ if (it == type_map.end()) {
749
+ return; // Skip resource -- we don't have a subscription for it.
750
+ }
751
+ ResourceState& resource_state = it->second;
752
+ // If needed, record that we've seen this resource.
753
+ if (result_.type->AllResourcesRequiredInSotW()) {
754
+ result_.resources_seen[resource_name->authority].insert(resource_name->key);
755
+ }
756
+ // If we previously ignored the resource's deletion, log that we're
757
+ // now re-adding it.
758
+ if (resource_state.ignored_deletion) {
759
+ gpr_log(GPR_INFO,
760
+ "[xds_client %p] xds server %s: server returned new version of "
761
+ "resource for which we previously ignored a deletion: type %s "
762
+ "name %s",
763
+ xds_client(), ads_call_state_->chand()->server_.server_uri.c_str(),
764
+ std::string(type_url).c_str(), result->name.c_str());
765
+ resource_state.ignored_deletion = false;
766
+ }
767
+ // Update resource state based on whether the resource is valid.
768
+ if (!result->resource.ok()) {
769
+ result_.errors.emplace_back(absl::StrCat(
770
+ "resource index ", idx, ": ", result->name,
771
+ ": validation error: ", result->resource.status().ToString()));
772
+ xds_client()->NotifyWatchersOnErrorLocked(
773
+ resource_state.watchers,
774
+ absl::UnavailableError(absl::StrCat(
775
+ "invalid resource: ", result->resource.status().ToString())));
776
+ UpdateResourceMetadataNacked(result_.version,
777
+ result->resource.status().ToString(),
778
+ update_time_, &resource_state.meta);
779
+ return;
780
+ }
781
+ // Resource is valid.
782
+ result_.have_valid_resources = true;
783
+ // If it didn't change, ignore it.
784
+ if (resource_state.resource != nullptr &&
785
+ result_.type->ResourcesEqual(resource_state.resource.get(),
786
+ result->resource->get())) {
703
787
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
704
- gpr_log(
705
- GPR_INFO,
706
- "[xds_client %p] Retry timer fires (chand: %p, retryable call: %p)",
707
- chand()->xds_client(), chand(), this);
788
+ gpr_log(GPR_INFO,
789
+ "[xds_client %p] %s resource %s identical to current, ignoring.",
790
+ xds_client(), result_.type_url.c_str(), result->name.c_str());
708
791
  }
709
- StartNewCallLocked();
792
+ return;
710
793
  }
711
- GRPC_ERROR_UNREF(error);
794
+ // Update the resource state.
795
+ resource_state.resource = std::move(*result->resource);
796
+ resource_state.meta = CreateResourceMetadataAcked(
797
+ std::string(serialized_resource), result_.version, update_time_);
798
+ // Notify watchers.
799
+ auto& watchers_list = resource_state.watchers;
800
+ auto* value =
801
+ result_.type->CopyResource(resource_state.resource.get()).release();
802
+ xds_client()->work_serializer_.Schedule(
803
+ [watchers_list, value]()
804
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
805
+ for (const auto& p : watchers_list) {
806
+ p.first->OnGenericResourceChanged(value);
807
+ }
808
+ delete value;
809
+ },
810
+ DEBUG_LOCATION);
712
811
  }
713
812
 
714
813
  //
@@ -722,206 +821,104 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
722
821
  ? "AdsCallState"
723
822
  : nullptr),
724
823
  parent_(std::move(parent)) {
725
- // Init the ADS call. Note that the call will progress every time there's
726
- // activity in xds_client()->interested_parties_, which is comprised of
727
- // the polling entities from client_channel.
728
824
  GPR_ASSERT(xds_client() != nullptr);
729
- // Create a call with the specified method name.
730
- const auto& method =
825
+ // Init the ADS call.
826
+ const char* method =
731
827
  chand()->server_.ShouldUseV3()
732
- ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES
733
- : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES;
734
- call_ = grpc_channel_create_pollset_set_call(
735
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
736
- xds_client()->interested_parties_, method, nullptr,
737
- GRPC_MILLIS_INF_FUTURE, nullptr);
828
+ ? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
829
+ "StreamAggregatedResources"
830
+ : "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
831
+ "StreamAggregatedResources";
832
+ call_ = chand()->transport_->CreateStreamingCall(
833
+ method, absl::make_unique<StreamEventHandler>(
834
+ // Passing the initial ref here. This ref will go away when
835
+ // the StreamEventHandler is destroyed.
836
+ RefCountedPtr<AdsCallState>(this)));
738
837
  GPR_ASSERT(call_ != nullptr);
739
- // Init data associated with the call.
740
- grpc_metadata_array_init(&initial_metadata_recv_);
741
- grpc_metadata_array_init(&trailing_metadata_recv_);
742
838
  // Start the call.
743
839
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
744
840
  gpr_log(GPR_INFO,
745
- "[xds_client %p] Starting ADS call (chand: %p, calld: %p, "
746
- "call: %p)",
747
- xds_client(), chand(), this, call_);
748
- }
749
- // Create the ops.
750
- grpc_call_error call_error;
751
- grpc_op ops[3];
752
- memset(ops, 0, sizeof(ops));
753
- // Op: send initial metadata.
754
- grpc_op* op = ops;
755
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
756
- op->data.send_initial_metadata.count = 0;
757
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
758
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
759
- op->reserved = nullptr;
760
- op++;
761
- call_error = grpc_call_start_batch_and_execute(
762
- call_, ops, static_cast<size_t>(op - ops), nullptr);
763
- GPR_ASSERT(GRPC_CALL_OK == call_error);
764
- // Op: send request message.
765
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
766
- grpc_schedule_on_exec_ctx);
841
+ "[xds_client %p] xds server %s: starting ADS call "
842
+ "(calld: %p, call: %p)",
843
+ xds_client(), chand()->server_.server_uri.c_str(), this,
844
+ call_.get());
845
+ }
846
+ // If this is a reconnect, add any necessary subscriptions from what's
847
+ // already in the cache.
767
848
  for (const auto& a : xds_client()->authority_state_map_) {
768
849
  const std::string& authority = a.first;
769
850
  // Skip authorities that are not using this xDS channel.
770
851
  if (a.second.channel_state != chand()) continue;
771
- for (const auto& l : a.second.listener_map) {
772
- const std::string& listener_name = l.first;
773
- SubscribeLocked(XdsApi::kLdsTypeUrl, {authority, listener_name});
774
- }
775
- for (const auto& r : a.second.route_config_map) {
776
- const std::string& route_config_name = r.first;
777
- SubscribeLocked(XdsApi::kRdsTypeUrl, {authority, route_config_name});
778
- }
779
- for (const auto& c : a.second.cluster_map) {
780
- const std::string& cluster_name = c.first;
781
- SubscribeLocked(XdsApi::kCdsTypeUrl, {authority, cluster_name});
782
- }
783
- for (const auto& e : a.second.endpoint_map) {
784
- const std::string& endpoint_name = e.first;
785
- SubscribeLocked(XdsApi::kEdsTypeUrl, {authority, endpoint_name});
852
+ for (const auto& t : a.second.resource_map) {
853
+ const XdsResourceType* type = t.first;
854
+ for (const auto& r : t.second) {
855
+ const XdsResourceKey& resource_key = r.first;
856
+ SubscribeLocked(type, {authority, resource_key}, /*delay_send=*/true);
857
+ }
786
858
  }
787
859
  }
788
- // Op: recv initial metadata.
789
- op = ops;
790
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
791
- op->data.recv_initial_metadata.recv_initial_metadata =
792
- &initial_metadata_recv_;
793
- op->flags = 0;
794
- op->reserved = nullptr;
795
- op++;
796
- // Op: recv response.
797
- op->op = GRPC_OP_RECV_MESSAGE;
798
- op->data.recv_message.recv_message = &recv_message_payload_;
799
- op->flags = 0;
800
- op->reserved = nullptr;
801
- op++;
802
- Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
803
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
804
- grpc_schedule_on_exec_ctx);
805
- call_error = grpc_call_start_batch_and_execute(
806
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
807
- GPR_ASSERT(GRPC_CALL_OK == call_error);
808
- // Op: recv server status.
809
- op = ops;
810
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
811
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
812
- op->data.recv_status_on_client.status = &status_code_;
813
- op->data.recv_status_on_client.status_details = &status_details_;
814
- op->flags = 0;
815
- op->reserved = nullptr;
816
- op++;
817
- // This callback signals the end of the call, so it relies on the initial
818
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
819
- // unreffed.
820
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
821
- grpc_schedule_on_exec_ctx);
822
- call_error = grpc_call_start_batch_and_execute(
823
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
824
- GPR_ASSERT(GRPC_CALL_OK == call_error);
825
- }
826
-
827
- XdsClient::ChannelState::AdsCallState::~AdsCallState() {
828
- grpc_metadata_array_destroy(&initial_metadata_recv_);
829
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
830
- grpc_byte_buffer_destroy(send_message_payload_);
831
- grpc_byte_buffer_destroy(recv_message_payload_);
832
- grpc_slice_unref_internal(status_details_);
833
- GPR_ASSERT(call_ != nullptr);
834
- grpc_call_unref(call_);
860
+ // Send initial message if we added any subscriptions above.
861
+ for (const auto& p : state_map_) {
862
+ SendMessageLocked(p.first);
863
+ }
835
864
  }
836
865
 
837
866
  void XdsClient::ChannelState::AdsCallState::Orphan() {
838
- GPR_ASSERT(call_ != nullptr);
839
- // If we are here because xds_client wants to cancel the call,
840
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
841
- // we are here because xds_client has to orphan a failed call, then the
842
- // following cancellation will be a no-op.
843
- grpc_call_cancel_internal(call_);
844
867
  state_map_.clear();
845
- // Note that the initial ref is hold by on_status_received_. So the
846
- // corresponding unref happens in on_status_received_ instead of here.
868
+ // Note that the initial ref is held by the StreamEventHandler, which
869
+ // will be destroyed when call_ is destroyed, which may not happen
870
+ // here, since there may be other refs held to call_ by internal callbacks.
871
+ call_.reset();
847
872
  }
848
873
 
849
874
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
850
- const std::string& type_url)
875
+ const XdsResourceType* type)
851
876
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
852
877
  // Buffer message sending if an existing message is in flight.
853
- if (send_message_payload_ != nullptr) {
854
- buffered_requests_.insert(type_url);
878
+ if (send_message_pending_) {
879
+ buffered_requests_.insert(type);
855
880
  return;
856
881
  }
857
- auto& state = state_map_[type_url];
858
- grpc_slice request_payload_slice;
859
- std::map<absl::string_view /*authority*/,
860
- std::set<absl::string_view /*name*/>>
861
- resource_map = ResourceNamesForRequest(type_url);
862
- request_payload_slice = xds_client()->api_.CreateAdsRequest(
863
- chand()->server_, type_url, resource_map,
864
- chand()->resource_type_version_map_[type_url], state.nonce,
865
- GRPC_ERROR_REF(state.error), !sent_initial_message_);
866
- if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
867
- type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
868
- state_map_.erase(type_url);
869
- }
882
+ auto& state = state_map_[type];
883
+ std::string serialized_message = xds_client()->api_.CreateAdsRequest(
884
+ chand()->server_,
885
+ chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
886
+ chand()->resource_type_version_map_[type], state.nonce,
887
+ ResourceNamesForRequest(type), state.status, !sent_initial_message_);
870
888
  sent_initial_message_ = true;
871
889
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
872
890
  gpr_log(GPR_INFO,
873
- "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
874
- "error=%s",
875
- xds_client(), type_url.c_str(),
876
- chand()->resource_type_version_map_[type_url].c_str(),
877
- state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
878
- }
879
- GRPC_ERROR_UNREF(state.error);
880
- state.error = GRPC_ERROR_NONE;
881
- // Create message payload.
882
- send_message_payload_ =
883
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
884
- grpc_slice_unref_internal(request_payload_slice);
885
- // Send the message.
886
- grpc_op op;
887
- memset(&op, 0, sizeof(op));
888
- op.op = GRPC_OP_SEND_MESSAGE;
889
- op.data.send_message.send_message = send_message_payload_;
890
- Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
891
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
892
- grpc_schedule_on_exec_ctx);
893
- grpc_call_error call_error =
894
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
895
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
896
- gpr_log(GPR_ERROR,
897
- "[xds_client %p] calld=%p call_error=%d sending ADS message",
898
- xds_client(), this, call_error);
899
- GPR_ASSERT(GRPC_CALL_OK == call_error);
891
+ "[xds_client %p] xds server %s: sending ADS request: type=%s "
892
+ "version=%s nonce=%s error=%s",
893
+ xds_client(), chand()->server_.server_uri.c_str(),
894
+ std::string(type->type_url()).c_str(),
895
+ chand()->resource_type_version_map_[type].c_str(),
896
+ state.nonce.c_str(), state.status.ToString().c_str());
900
897
  }
898
+ state.status = absl::OkStatus();
899
+ call_->SendMessage(std::move(serialized_message));
900
+ send_message_pending_ = true;
901
901
  }
902
902
 
903
903
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
904
- const std::string& type_url, const XdsApi::ResourceName& resource) {
905
- auto& state = state_map_[type_url]
906
- .subscribed_resources[resource.authority][resource.id];
904
+ const XdsResourceType* type, const XdsResourceName& name, bool delay_send) {
905
+ auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
907
906
  if (state == nullptr) {
908
- state = MakeOrphanable<ResourceState>(
909
- type_url, resource,
910
- !chand()->resource_type_version_map_[type_url].empty());
911
- SendMessageLocked(type_url);
907
+ state = MakeOrphanable<ResourceTimer>(type, name);
908
+ if (!delay_send) SendMessageLocked(type);
912
909
  }
913
910
  }
914
911
 
915
912
  void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
916
- const std::string& type_url, const XdsApi::ResourceName& resource,
913
+ const XdsResourceType* type, const XdsResourceName& name,
917
914
  bool delay_unsubscription) {
918
- auto& type_state_map = state_map_[type_url];
919
- auto& authority_map = type_state_map.subscribed_resources[resource.authority];
920
- authority_map.erase(resource.id);
915
+ auto& type_state_map = state_map_[type];
916
+ auto& authority_map = type_state_map.subscribed_resources[name.authority];
917
+ authority_map.erase(name.key);
921
918
  if (authority_map.empty()) {
922
- type_state_map.subscribed_resources.erase(resource.authority);
919
+ type_state_map.subscribed_resources.erase(name.authority);
923
920
  }
924
- if (!delay_unsubscription) SendMessageLocked(type_url);
921
+ if (!delay_unsubscription) SendMessageLocked(type);
925
922
  }
926
923
 
927
924
  bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
@@ -931,618 +928,176 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
931
928
  return false;
932
929
  }
933
930
 
934
- namespace {
935
-
936
- // Build a resource metadata struct for ADS result accepting methods and CSDS.
937
- XdsApi::ResourceMetadata CreateResourceMetadataAcked(
938
- std::string serialized_proto, std::string version,
939
- grpc_millis update_time) {
940
- XdsApi::ResourceMetadata resource_metadata;
941
- resource_metadata.serialized_proto = std::move(serialized_proto);
942
- resource_metadata.update_time = update_time;
943
- resource_metadata.version = std::move(version);
944
- resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
945
- return resource_metadata;
946
- }
947
-
948
- } // namespace
949
-
950
- void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
951
- std::string version, grpc_millis update_time,
952
- XdsApi::LdsUpdateMap lds_update_map,
953
- const std::set<XdsApi::ResourceName>& resource_names_failed) {
954
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
955
- gpr_log(GPR_INFO,
956
- "[xds_client %p] LDS update received containing %" PRIuPTR
957
- " resources",
958
- xds_client(), lds_update_map.size());
959
- }
960
- auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
961
- std::set<std::string> rds_resource_names_seen;
962
- for (auto& p : lds_update_map) {
963
- const XdsApi::ResourceName& resource = p.first;
964
- XdsApi::LdsUpdate& lds_update = p.second.resource;
965
- auto& state =
966
- lds_state.subscribed_resources[resource.authority][resource.id];
967
- if (state != nullptr) state->Finish();
968
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
969
- gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
970
- XdsApi::ConstructFullResourceName(
971
- resource.authority, XdsApi::kLdsTypeUrl, resource.id)
972
- .c_str(),
973
- lds_update.ToString().c_str());
974
- }
975
- // Record the RDS resource names seen.
976
- if (!lds_update.http_connection_manager.route_config_name.empty()) {
977
- rds_resource_names_seen.insert(
978
- lds_update.http_connection_manager.route_config_name);
979
- }
980
- ListenerState& listener_state =
981
- xds_client()
982
- ->authority_state_map_[resource.authority]
983
- .listener_map[resource.id];
984
- // Ignore identical update.
985
- if (listener_state.update.has_value() &&
986
- *listener_state.update == lds_update) {
987
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
988
- gpr_log(GPR_INFO,
989
- "[xds_client %p] LDS update for %s identical to current, "
990
- "ignoring.",
991
- xds_client(),
992
- XdsApi::ConstructFullResourceName(
993
- resource.authority, XdsApi::kLdsTypeUrl, resource.id)
994
- .c_str());
995
- }
996
- continue;
997
- }
998
- // Update the listener state.
999
- listener_state.update = std::move(lds_update);
1000
- listener_state.meta = CreateResourceMetadataAcked(
1001
- std::move(p.second.serialized_proto), version, update_time);
1002
- // Notify watchers.
1003
- for (const auto& p : listener_state.watchers) {
1004
- p.first->OnListenerChanged(*listener_state.update);
931
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
932
+ MutexLock lock(&xds_client()->mu_);
933
+ send_message_pending_ = false;
934
+ if (ok && IsCurrentCallOnChannel()) {
935
+ // Continue to send another pending message if any.
936
+ // TODO(roth): The current code to handle buffered messages has the
937
+ // advantage of sending only the most recent list of resource names for
938
+ // each resource type (no matter how many times that resource type has
939
+ // been requested to send while the current message sending is still
940
+ // pending). But its disadvantage is that we send the requests in fixed
941
+ // order of resource types. We need to fix this if we are seeing some
942
+ // resource type(s) starved due to frequent requests of other resource
943
+ // type(s).
944
+ auto it = buffered_requests_.begin();
945
+ if (it != buffered_requests_.end()) {
946
+ SendMessageLocked(*it);
947
+ buffered_requests_.erase(it);
1005
948
  }
1006
949
  }
1007
- // For invalid resources in the update, if they are already in the
1008
- // cache, pretend that they are present in the update, so that we
1009
- // don't incorrectly consider them deleted below.
1010
- for (const auto& resource : resource_names_failed) {
1011
- auto& listener_map =
1012
- xds_client()->authority_state_map_[resource.authority].listener_map;
1013
- auto it = listener_map.find(resource.id);
1014
- if (it != listener_map.end()) {
1015
- auto& update = it->second.update;
1016
- if (!update.has_value()) continue;
1017
- lds_update_map[resource];
1018
- if (!update->http_connection_manager.route_config_name.empty()) {
1019
- rds_resource_names_seen.insert(
1020
- update->http_connection_manager.route_config_name);
950
+ }
951
+
952
+ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
953
+ absl::string_view payload) {
954
+ {
955
+ MutexLock lock(&xds_client()->mu_);
956
+ if (!IsCurrentCallOnChannel()) return;
957
+ // Parse and validate the response.
958
+ AdsResponseParser parser(this);
959
+ absl::Status status =
960
+ xds_client()->api_.ParseAdsResponse(chand()->server_, payload, &parser);
961
+ if (!status.ok()) {
962
+ // Ignore unparsable response.
963
+ gpr_log(GPR_ERROR,
964
+ "[xds_client %p] xds server %s: error parsing ADS response (%s) "
965
+ "-- ignoring",
966
+ xds_client(), chand()->server_.server_uri.c_str(),
967
+ status.ToString().c_str());
968
+ } else {
969
+ seen_response_ = true;
970
+ AdsResponseParser::Result result = parser.TakeResult();
971
+ // Update nonce.
972
+ auto& state = state_map_[result.type];
973
+ state.nonce = result.nonce;
974
+ // If we got an error, set state.error so that we'll NACK the update.
975
+ if (!result.errors.empty()) {
976
+ state.status = absl::UnavailableError(
977
+ absl::StrCat("xDS response validation errors: [",
978
+ absl::StrJoin(result.errors, "; "), "]"));
979
+ gpr_log(GPR_ERROR,
980
+ "[xds_client %p] xds server %s: ADS response invalid for "
981
+ "resource "
982
+ "type %s version %s, will NACK: nonce=%s status=%s",
983
+ xds_client(), chand()->server_.server_uri.c_str(),
984
+ result.type_url.c_str(), result.version.c_str(),
985
+ state.nonce.c_str(), state.status.ToString().c_str());
1021
986
  }
1022
- }
1023
- }
1024
- // For any subscribed resource that is not present in the update,
1025
- // remove it from the cache and notify watchers that it does not exist.
1026
- for (const auto& a : lds_state.subscribed_resources) {
1027
- const std::string& authority_name = a.first;
1028
- for (const auto& p : a.second) {
1029
- const std::string& listener_name = p.first;
1030
- if (lds_update_map.find({authority_name, listener_name}) ==
1031
- lds_update_map.end()) {
1032
- ListenerState& listener_state =
1033
- xds_client()
1034
- ->authority_state_map_[authority_name]
1035
- .listener_map[listener_name];
1036
- // If the resource was newly requested but has not yet been received,
1037
- // we don't want to generate an error for the watchers, because this LDS
1038
- // response may be in reaction to an earlier request that did not yet
1039
- // request the new resource, so its absence from the response does not
1040
- // necessarily indicate that the resource does not exist.
1041
- // For that case, we rely on the request timeout instead.
1042
- if (!listener_state.update.has_value()) continue;
1043
- listener_state.update.reset();
1044
- for (const auto& p : listener_state.watchers) {
1045
- p.first->OnResourceDoesNotExist();
987
+ // Delete resources not seen in update if needed.
988
+ if (result.type->AllResourcesRequiredInSotW()) {
989
+ for (auto& a : xds_client()->authority_state_map_) {
990
+ const std::string& authority = a.first;
991
+ AuthorityState& authority_state = a.second;
992
+ // Skip authorities that are not using this xDS channel.
993
+ if (authority_state.channel_state != chand()) continue;
994
+ auto seen_authority_it = result.resources_seen.find(authority);
995
+ // Find this resource type.
996
+ auto type_it = authority_state.resource_map.find(result.type);
997
+ if (type_it == authority_state.resource_map.end()) continue;
998
+ // Iterate over resource ids.
999
+ for (auto& r : type_it->second) {
1000
+ const XdsResourceKey& resource_key = r.first;
1001
+ ResourceState& resource_state = r.second;
1002
+ if (seen_authority_it == result.resources_seen.end() ||
1003
+ seen_authority_it->second.find(resource_key) ==
1004
+ seen_authority_it->second.end()) {
1005
+ // If the resource was newly requested but has not yet been
1006
+ // received, we don't want to generate an error for the
1007
+ // watchers, because this ADS response may be in reaction to an
1008
+ // earlier request that did not yet request the new resource, so
1009
+ // its absence from the response does not necessarily indicate
1010
+ // that the resource does not exist. For that case, we rely on
1011
+ // the request timeout instead.
1012
+ if (resource_state.resource == nullptr) continue;
1013
+ if (chand()->server_.IgnoreResourceDeletion()) {
1014
+ if (!resource_state.ignored_deletion) {
1015
+ gpr_log(GPR_ERROR,
1016
+ "[xds_client %p] xds server %s: ignoring deletion "
1017
+ "for resource type %s name %s",
1018
+ xds_client(), chand()->server_.server_uri.c_str(),
1019
+ result.type_url.c_str(),
1020
+ XdsClient::ConstructFullXdsResourceName(
1021
+ authority, result.type_url.c_str(), resource_key)
1022
+ .c_str());
1023
+ resource_state.ignored_deletion = true;
1024
+ }
1025
+ } else {
1026
+ resource_state.resource.reset();
1027
+ xds_client()->NotifyWatchersOnResourceDoesNotExist(
1028
+ resource_state.watchers);
1029
+ }
1030
+ }
1031
+ }
1046
1032
  }
1047
1033
  }
1048
- }
1049
- }
1050
- // For any RDS resource that is no longer referred to by any LDS
1051
- // resources, remove it from the cache and notify watchers that it
1052
- // does not exist.
1053
- auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
1054
- for (const auto& a : rds_state.subscribed_resources) {
1055
- const std::string& authority_name = a.first;
1056
- for (const auto& p : a.second) {
1057
- const std::string& listener_name = p.first;
1058
- if (rds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
1059
- authority_name, XdsApi::kRdsTypeUrl, listener_name)) ==
1060
- rds_resource_names_seen.end()) {
1061
- RouteConfigState& route_config_state =
1062
- xds_client()
1063
- ->authority_state_map_[authority_name]
1064
- .route_config_map[listener_name];
1065
- route_config_state.update.reset();
1066
- for (const auto& p : route_config_state.watchers) {
1067
- p.first->OnResourceDoesNotExist();
1034
+ // If we had valid resources, update the version.
1035
+ if (result.have_valid_resources) {
1036
+ chand()->resource_type_version_map_[result.type] =
1037
+ std::move(result.version);
1038
+ // Start load reporting if needed.
1039
+ auto& lrs_call = chand()->lrs_calld_;
1040
+ if (lrs_call != nullptr) {
1041
+ LrsCallState* lrs_calld = lrs_call->calld();
1042
+ if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1068
1043
  }
1069
1044
  }
1045
+ // Send ACK or NACK.
1046
+ SendMessageLocked(result.type);
1070
1047
  }
1071
1048
  }
1049
+ xds_client()->work_serializer_.DrainQueue();
1072
1050
  }
1073
1051
 
1074
- void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
1075
- std::string version, grpc_millis update_time,
1076
- XdsApi::RdsUpdateMap rds_update_map) {
1077
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1078
- gpr_log(GPR_INFO,
1079
- "[xds_client %p] RDS update received containing %" PRIuPTR
1080
- " resources",
1081
- xds_client(), rds_update_map.size());
1082
- }
1083
- auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
1084
- for (auto& p : rds_update_map) {
1085
- const XdsApi::ResourceName& resource = p.first;
1086
- XdsApi::RdsUpdate& rds_update = p.second.resource;
1087
- auto& state =
1088
- rds_state.subscribed_resources[resource.authority][resource.id];
1089
- if (state != nullptr) state->Finish();
1052
+ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1053
+ absl::Status status) {
1054
+ {
1055
+ MutexLock lock(&xds_client()->mu_);
1090
1056
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1091
- gpr_log(GPR_INFO, "[xds_client %p] RDS resource:\n%s", xds_client(),
1092
- rds_update.ToString().c_str());
1093
- }
1094
- RouteConfigState& route_config_state =
1095
- xds_client()
1096
- ->authority_state_map_[resource.authority]
1097
- .route_config_map[resource.id];
1098
- // Ignore identical update.
1099
- if (route_config_state.update.has_value() &&
1100
- *route_config_state.update == rds_update) {
1101
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1102
- gpr_log(GPR_INFO,
1103
- "[xds_client %p] RDS resource identical to current, ignoring",
1104
- xds_client());
1105
- }
1106
- continue;
1057
+ gpr_log(GPR_INFO,
1058
+ "[xds_client %p] xds server %s: ADS call status received "
1059
+ "(chand=%p, ads_calld=%p, call=%p): %s",
1060
+ xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1061
+ call_.get(), status.ToString().c_str());
1107
1062
  }
1108
- // Update the cache.
1109
- route_config_state.update = std::move(rds_update);
1110
- route_config_state.meta = CreateResourceMetadataAcked(
1111
- std::move(p.second.serialized_proto), version, update_time);
1112
- // Notify all watchers.
1113
- for (const auto& p : route_config_state.watchers) {
1114
- p.first->OnRouteConfigChanged(*route_config_state.update);
1063
+ // Ignore status from a stale call.
1064
+ if (IsCurrentCallOnChannel()) {
1065
+ // Try to restart the call.
1066
+ parent_->OnCallFinishedLocked();
1067
+ // Send error to all watchers.
1068
+ xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
1069
+ "xDS call failed: xDS server: %s, ADS call status: %s",
1070
+ chand()->server_.server_uri, status.ToString().c_str())));
1115
1071
  }
1116
1072
  }
1073
+ xds_client()->work_serializer_.DrainQueue();
1117
1074
  }
1118
1075
 
1119
- void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1120
- std::string version, grpc_millis update_time,
1121
- XdsApi::CdsUpdateMap cds_update_map,
1122
- const std::set<XdsApi::ResourceName>& resource_names_failed) {
1123
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1124
- gpr_log(GPR_INFO,
1125
- "[xds_client %p] CDS update received containing %" PRIuPTR
1126
- " resources",
1127
- xds_client(), cds_update_map.size());
1128
- }
1129
- auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
1130
- std::set<std::string> eds_resource_names_seen;
1131
- for (auto& p : cds_update_map) {
1132
- const XdsApi::ResourceName& resource = p.first;
1133
- XdsApi::CdsUpdate& cds_update = p.second.resource;
1134
- auto& state =
1135
- cds_state.subscribed_resources[resource.authority][resource.id];
1136
- if (state != nullptr) state->Finish();
1137
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1138
- gpr_log(GPR_INFO, "[xds_client %p] cluster=%s: %s", xds_client(),
1139
- XdsApi::ConstructFullResourceName(
1140
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1141
- .c_str(),
1142
- cds_update.ToString().c_str());
1143
- }
1144
- // Record the EDS resource names seen.
1145
- eds_resource_names_seen.insert(
1146
- cds_update.eds_service_name.empty()
1147
- ? XdsApi::ConstructFullResourceName(
1148
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1149
- : cds_update.eds_service_name);
1150
- ClusterState& cluster_state = xds_client()
1151
- ->authority_state_map_[resource.authority]
1152
- .cluster_map[resource.id];
1153
- // Ignore identical update.
1154
- if (cluster_state.update.has_value() &&
1155
- *cluster_state.update == cds_update) {
1156
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1157
- gpr_log(GPR_INFO,
1158
- "[xds_client %p] CDS update identical to current, ignoring.",
1159
- xds_client());
1160
- }
1161
- continue;
1162
- }
1163
- // Update the cluster state.
1164
- cluster_state.update = std::move(cds_update);
1165
- cluster_state.meta = CreateResourceMetadataAcked(
1166
- std::move(p.second.serialized_proto), version, update_time);
1167
- // Notify all watchers.
1168
- for (const auto& p : cluster_state.watchers) {
1169
- p.first->OnClusterChanged(cluster_state.update.value());
1170
- }
1171
- }
1172
- // For invalid resources in the update, if they are already in the
1173
- // cache, pretend that they are present in the update, so that we
1174
- // don't incorrectly consider them deleted below.
1175
- for (const auto& resource : resource_names_failed) {
1176
- auto& cluster_map =
1177
- xds_client()->authority_state_map_[resource.authority].cluster_map;
1178
- auto it = cluster_map.find(resource.id);
1179
- if (it != cluster_map.end()) {
1180
- auto& update = it->second.update;
1181
- if (!update.has_value()) continue;
1182
- cds_update_map[resource];
1183
- eds_resource_names_seen.insert(
1184
- update->eds_service_name.empty()
1185
- ? XdsApi::ConstructFullResourceName(
1186
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1187
- : update->eds_service_name);
1188
- }
1189
- }
1190
- // For any subscribed resource that is not present in the update,
1191
- // remove it from the cache and notify watchers that it does not exist.
1192
- for (const auto& a : cds_state.subscribed_resources) {
1193
- const std::string& authority = a.first;
1194
- for (const auto& p : a.second) {
1195
- const std::string& cluster_name = p.first;
1196
- if (cds_update_map.find({authority, cluster_name}) ==
1197
- cds_update_map.end()) {
1198
- ClusterState& cluster_state = xds_client()
1199
- ->authority_state_map_[authority]
1200
- .cluster_map[cluster_name];
1201
- // If the resource was newly requested but has not yet been received,
1202
- // we don't want to generate an error for the watchers, because this CDS
1203
- // response may be in reaction to an earlier request that did not yet
1204
- // request the new resource, so its absence from the response does not
1205
- // necessarily indicate that the resource does not exist.
1206
- // For that case, we rely on the request timeout instead.
1207
- if (!cluster_state.update.has_value()) continue;
1208
- cluster_state.update.reset();
1209
- for (const auto& p : cluster_state.watchers) {
1210
- p.first->OnResourceDoesNotExist();
1211
- }
1212
- }
1213
- }
1214
- }
1215
- // For any EDS resource that is no longer referred to by any CDS
1216
- // resources, remove it from the cache and notify watchers that it
1217
- // does not exist.
1218
- auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1219
- for (const auto& a : eds_state.subscribed_resources) {
1220
- const std::string& authority = a.first;
1221
- for (const auto& p : a.second) {
1222
- const std::string& eds_resource_name = p.first;
1223
- if (eds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
1224
- authority, XdsApi::kEdsTypeUrl, eds_resource_name)) ==
1225
- eds_resource_names_seen.end()) {
1226
- EndpointState& endpoint_state = xds_client()
1227
- ->authority_state_map_[authority]
1228
- .endpoint_map[eds_resource_name];
1229
- endpoint_state.update.reset();
1230
- for (const auto& p : endpoint_state.watchers) {
1231
- p.first->OnResourceDoesNotExist();
1232
- }
1233
- }
1234
- }
1235
- }
1236
- }
1237
-
1238
- void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1239
- std::string version, grpc_millis update_time,
1240
- XdsApi::EdsUpdateMap eds_update_map) {
1241
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1242
- gpr_log(GPR_INFO,
1243
- "[xds_client %p] EDS update received containing %" PRIuPTR
1244
- " resources",
1245
- xds_client(), eds_update_map.size());
1246
- }
1247
- auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1248
- for (auto& p : eds_update_map) {
1249
- const XdsApi::ResourceName& resource = p.first;
1250
- XdsApi::EdsUpdate& eds_update = p.second.resource;
1251
- auto& state =
1252
- eds_state.subscribed_resources[resource.authority][resource.id];
1253
- if (state != nullptr) state->Finish();
1254
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1255
- gpr_log(GPR_INFO, "[xds_client %p] EDS resource %s: %s", xds_client(),
1256
- XdsApi::ConstructFullResourceName(
1257
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1258
- .c_str(),
1259
- eds_update.ToString().c_str());
1260
- }
1261
- EndpointState& endpoint_state =
1262
- xds_client()
1263
- ->authority_state_map_[resource.authority]
1264
- .endpoint_map[resource.id];
1265
- // Ignore identical update.
1266
- if (endpoint_state.update.has_value() &&
1267
- *endpoint_state.update == eds_update) {
1268
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1269
- gpr_log(GPR_INFO,
1270
- "[xds_client %p] EDS update identical to current, ignoring.",
1271
- xds_client());
1272
- }
1273
- continue;
1274
- }
1275
- // Update the cluster state.
1276
- endpoint_state.update = std::move(eds_update);
1277
- endpoint_state.meta = CreateResourceMetadataAcked(
1278
- std::move(p.second.serialized_proto), version, update_time);
1279
- // Notify all watchers.
1280
- for (const auto& p : endpoint_state.watchers) {
1281
- p.first->OnEndpointChanged(endpoint_state.update.value());
1282
- }
1283
- }
1284
- }
1285
-
1286
- namespace {
1287
-
1288
- // Update resource_metadata for NACK.
1289
- void UpdateResourceMetadataNacked(const std::string& version,
1290
- const std::string& details,
1291
- grpc_millis update_time,
1292
- XdsApi::ResourceMetadata* resource_metadata) {
1293
- resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
1294
- resource_metadata->failed_version = version;
1295
- resource_metadata->failed_details = details;
1296
- resource_metadata->failed_update_time = update_time;
1297
- }
1298
-
1299
- } // namespace
1300
-
1301
- template <typename StateMap>
1302
- void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateHelperLocked(
1303
- const std::string& resource_name, grpc_millis update_time,
1304
- const XdsApi::AdsParseResult& result, const std::string& error_details,
1305
- StateMap* state_map) {
1306
- auto it = state_map->find(resource_name);
1307
- if (it == state_map->end()) return;
1308
- auto& state = it->second;
1309
- for (const auto& p : state.watchers) {
1310
- p.first->OnError(GRPC_ERROR_REF(result.parse_error));
1311
- }
1312
- UpdateResourceMetadataNacked(result.version, error_details, update_time,
1313
- &state.meta);
1314
- }
1315
-
1316
- void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
1317
- grpc_millis update_time, const XdsApi::AdsParseResult& result) {
1318
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1319
- gpr_log(GPR_INFO,
1320
- "[xds_client %p] %s update NACKed containing %" PRIuPTR
1321
- " invalid resources",
1322
- xds_client(), result.type_url.c_str(),
1323
- result.resource_names_failed.size());
1324
- }
1325
- std::string details = grpc_error_std_string(result.parse_error);
1326
- for (auto& resource : result.resource_names_failed) {
1327
- auto authority_it =
1328
- xds_client()->authority_state_map_.find(resource.authority);
1329
- if (authority_it == xds_client()->authority_state_map_.end()) continue;
1330
- AuthorityState& authority_state = authority_it->second;
1331
- if (result.type_url == XdsApi::kLdsTypeUrl) {
1332
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1333
- &authority_state.listener_map);
1334
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1335
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1336
- &authority_state.route_config_map);
1337
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1338
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1339
- &authority_state.cluster_map);
1340
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1341
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1342
- &authority_state.endpoint_map);
1343
- } else {
1344
- GPR_ASSERT(0);
1345
- }
1346
- }
1347
- }
1348
-
1349
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1350
- void* arg, grpc_error_handle error) {
1351
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1352
- {
1353
- MutexLock lock(&ads_calld->xds_client()->mu_);
1354
- ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
1355
- }
1356
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1357
- }
1358
-
1359
- void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1360
- grpc_error_handle error) {
1361
- if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1362
- // Clean up the sent message.
1363
- grpc_byte_buffer_destroy(send_message_payload_);
1364
- send_message_payload_ = nullptr;
1365
- // Continue to send another pending message if any.
1366
- // TODO(roth): The current code to handle buffered messages has the
1367
- // advantage of sending only the most recent list of resource names for
1368
- // each resource type (no matter how many times that resource type has
1369
- // been requested to send while the current message sending is still
1370
- // pending). But its disadvantage is that we send the requests in fixed
1371
- // order of resource types. We need to fix this if we are seeing some
1372
- // resource type(s) starved due to frequent requests of other resource
1373
- // type(s).
1374
- auto it = buffered_requests_.begin();
1375
- if (it != buffered_requests_.end()) {
1376
- SendMessageLocked(*it);
1377
- buffered_requests_.erase(it);
1378
- }
1379
- }
1380
- GRPC_ERROR_UNREF(error);
1381
- }
1382
-
1383
- void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1384
- void* arg, grpc_error_handle /* error */) {
1385
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1386
- bool done;
1387
- {
1388
- MutexLock lock(&ads_calld->xds_client()->mu_);
1389
- done = ads_calld->OnResponseReceivedLocked();
1390
- }
1391
- if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1392
- }
1393
-
1394
- bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1395
- // Empty payload means the call was cancelled.
1396
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1397
- return true;
1398
- }
1399
- // Read the response.
1400
- grpc_byte_buffer_reader bbr;
1401
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1402
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1403
- grpc_byte_buffer_reader_destroy(&bbr);
1404
- grpc_byte_buffer_destroy(recv_message_payload_);
1405
- recv_message_payload_ = nullptr;
1406
- // Parse and validate the response.
1407
- XdsApi::AdsParseResult result = xds_client()->api_.ParseAdsResponse(
1408
- chand()->server_, response_slice,
1409
- ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1410
- ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1411
- ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1412
- ResourceNamesForRequest(XdsApi::kEdsTypeUrl));
1413
- grpc_slice_unref_internal(response_slice);
1414
- if (result.type_url.empty()) {
1415
- // Ignore unparsable response.
1416
- gpr_log(GPR_ERROR,
1417
- "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1418
- xds_client(), grpc_error_std_string(result.parse_error).c_str());
1419
- GRPC_ERROR_UNREF(result.parse_error);
1420
- } else {
1421
- grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
1422
- // Update nonce.
1423
- auto& state = state_map_[result.type_url];
1424
- state.nonce = std::move(result.nonce);
1425
- // If we got an error, we'll NACK the update.
1426
- if (result.parse_error != GRPC_ERROR_NONE) {
1427
- gpr_log(GPR_ERROR,
1428
- "[xds_client %p] ADS response invalid for resource type %s "
1429
- "version %s, will NACK: nonce=%s error=%s",
1430
- xds_client(), result.type_url.c_str(), result.version.c_str(),
1431
- state.nonce.c_str(),
1432
- grpc_error_std_string(result.parse_error).c_str());
1433
- result.parse_error =
1434
- grpc_error_set_int(result.parse_error, GRPC_ERROR_INT_GRPC_STATUS,
1435
- GRPC_STATUS_UNAVAILABLE);
1436
- GRPC_ERROR_UNREF(state.error);
1437
- state.error = result.parse_error;
1438
- RejectAdsUpdateLocked(update_time, result);
1439
- }
1440
- // Process any valid resources.
1441
- bool have_valid_resources = false;
1442
- if (result.type_url == XdsApi::kLdsTypeUrl) {
1443
- have_valid_resources = !result.lds_update_map.empty();
1444
- AcceptLdsUpdateLocked(result.version, update_time,
1445
- std::move(result.lds_update_map),
1446
- result.resource_names_failed);
1447
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1448
- have_valid_resources = !result.rds_update_map.empty();
1449
- AcceptRdsUpdateLocked(result.version, update_time,
1450
- std::move(result.rds_update_map));
1451
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1452
- have_valid_resources = !result.cds_update_map.empty();
1453
- AcceptCdsUpdateLocked(result.version, update_time,
1454
- std::move(result.cds_update_map),
1455
- result.resource_names_failed);
1456
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1457
- have_valid_resources = !result.eds_update_map.empty();
1458
- AcceptEdsUpdateLocked(result.version, update_time,
1459
- std::move(result.eds_update_map));
1460
- }
1461
- if (have_valid_resources) {
1462
- seen_response_ = true;
1463
- chand()->resource_type_version_map_[result.type_url] = result.version;
1464
- // Start load reporting if needed.
1465
- auto& lrs_call = chand()->lrs_calld_;
1466
- if (lrs_call != nullptr) {
1467
- LrsCallState* lrs_calld = lrs_call->calld();
1468
- if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1469
- }
1470
- }
1471
- // Send ACK or NACK.
1472
- SendMessageLocked(result.type_url);
1473
- }
1474
- if (xds_client()->shutting_down_) return true;
1475
- // Keep listening for updates.
1476
- grpc_op op;
1477
- memset(&op, 0, sizeof(op));
1478
- op.op = GRPC_OP_RECV_MESSAGE;
1479
- op.data.recv_message.recv_message = &recv_message_payload_;
1480
- op.flags = 0;
1481
- op.reserved = nullptr;
1482
- GPR_ASSERT(call_ != nullptr);
1483
- // Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
1484
- const grpc_call_error call_error =
1485
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1486
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1487
- return false;
1488
- }
1489
-
1490
- void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1491
- void* arg, grpc_error_handle error) {
1492
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1493
- {
1494
- MutexLock lock(&ads_calld->xds_client()->mu_);
1495
- ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1496
- }
1497
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1498
- }
1499
-
1500
- void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1501
- grpc_error_handle error) {
1502
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1503
- char* status_details = grpc_slice_to_c_string(status_details_);
1504
- gpr_log(GPR_INFO,
1505
- "[xds_client %p] ADS call status received. Status = %d, details "
1506
- "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
1507
- xds_client(), status_code_, status_details, chand(), this, call_,
1508
- grpc_error_std_string(error).c_str());
1509
- gpr_free(status_details);
1510
- }
1511
- // Ignore status from a stale call.
1512
- if (IsCurrentCallOnChannel()) {
1513
- // Try to restart the call.
1514
- parent_->OnCallFinishedLocked();
1515
- // Send error to all watchers.
1516
- xds_client()->NotifyOnErrorLocked(
1517
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds call failed"));
1518
- }
1519
- GRPC_ERROR_UNREF(error);
1520
- }
1521
-
1522
- bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1523
- // If the retryable ADS call is null (which only happens when the xds channel
1524
- // is shutting down), all the ADS calls are stale.
1525
- if (chand()->ads_calld_ == nullptr) return false;
1526
- return this == chand()->ads_calld_->calld();
1527
- }
1528
-
1529
- std::map<absl::string_view /*authority*/, std::set<absl::string_view /*name*/>>
1530
- XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1531
- const std::string& type_url) {
1532
- std::map<absl::string_view /*authority*/,
1533
- std::set<absl::string_view /*name*/>>
1534
- resource_map;
1535
- auto it = state_map_.find(type_url);
1536
- if (it != state_map_.end()) {
1537
- for (auto& a : it->second.subscribed_resources) {
1538
- for (auto& p : a.second) {
1539
- resource_map[a.first].insert(p.first);
1540
- OrphanablePtr<ResourceState>& state = p.second;
1541
- state->Start(Ref(DEBUG_LOCATION, "ResourceState"));
1542
- }
1076
+ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1077
+ // If the retryable ADS call is null (which only happens when the xds
1078
+ // channel is shutting down), all the ADS calls are stale.
1079
+ if (chand()->ads_calld_ == nullptr) return false;
1080
+ return this == chand()->ads_calld_->calld();
1081
+ }
1082
+
1083
+ std::vector<std::string>
1084
+ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1085
+ const XdsResourceType* type) {
1086
+ std::vector<std::string> resource_names;
1087
+ auto it = state_map_.find(type);
1088
+ if (it != state_map_.end()) {
1089
+ for (auto& a : it->second.subscribed_resources) {
1090
+ const std::string& authority = a.first;
1091
+ for (auto& p : a.second) {
1092
+ const XdsResourceKey& resource_key = p.first;
1093
+ resource_names.emplace_back(XdsClient::ConstructFullXdsResourceName(
1094
+ authority, type->type_url(), resource_key));
1095
+ OrphanablePtr<ResourceTimer>& resource_timer = p.second;
1096
+ resource_timer->MaybeStartTimer(Ref(DEBUG_LOCATION, "ResourceTimer"));
1097
+ }
1543
1098
  }
1544
1099
  }
1545
- return resource_map;
1100
+ return resource_names;
1546
1101
  }
1547
1102
 
1548
1103
  //
@@ -1550,38 +1105,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1550
1105
  //
1551
1106
 
1552
1107
  void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1553
- if (next_report_timer_callback_pending_) {
1554
- grpc_timer_cancel(&next_report_timer_);
1108
+ if (timer_handle_.has_value() &&
1109
+ GetDefaultEventEngine()->Cancel(*timer_handle_)) {
1110
+ timer_handle_.reset();
1111
+ Unref(DEBUG_LOCATION, "Orphan");
1555
1112
  }
1556
1113
  }
1557
1114
 
1558
1115
  void XdsClient::ChannelState::LrsCallState::Reporter::
1559
1116
  ScheduleNextReportLocked() {
1560
- const grpc_millis next_report_time = ExecCtx::Get()->Now() + report_interval_;
1561
- grpc_timer_init(&next_report_timer_, next_report_time,
1562
- &on_next_report_timer_);
1563
- next_report_timer_callback_pending_ = true;
1564
- }
1565
-
1566
- void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1567
- void* arg, grpc_error_handle error) {
1568
- Reporter* self = static_cast<Reporter*>(arg);
1569
- bool done;
1570
- {
1571
- MutexLock lock(&self->xds_client()->mu_);
1572
- done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
1573
- }
1574
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
1117
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(report_interval_, [this]() {
1118
+ ApplicationCallbackExecCtx callback_exec_ctx;
1119
+ ExecCtx exec_ctx;
1120
+ if (OnNextReportTimer()) {
1121
+ Unref(DEBUG_LOCATION, "OnNextReportTimer()");
1122
+ }
1123
+ });
1575
1124
  }
1576
1125
 
1577
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1578
- grpc_error_handle error) {
1579
- next_report_timer_callback_pending_ = false;
1580
- if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1581
- GRPC_ERROR_UNREF(error);
1582
- return true;
1583
- }
1584
- return SendReportLocked();
1126
+ bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer() {
1127
+ MutexLock lock(&xds_client()->mu_);
1128
+ timer_handle_.reset();
1129
+ if (!IsCurrentReporterOnCall()) return true;
1130
+ SendReportLocked();
1131
+ return false;
1585
1132
  }
1586
1133
 
1587
1134
  namespace {
@@ -1603,74 +1150,52 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1603
1150
  bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1604
1151
  // Construct snapshot from all reported stats.
1605
1152
  XdsApi::ClusterLoadReportMap snapshot =
1606
- xds_client()->BuildLoadReportSnapshotLocked(parent_->send_all_clusters_,
1153
+ xds_client()->BuildLoadReportSnapshotLocked(parent_->chand()->server_,
1154
+ parent_->send_all_clusters_,
1607
1155
  parent_->cluster_names_);
1608
1156
  // Skip client load report if the counters were all zero in the last
1609
1157
  // report and they are still zero in this one.
1610
1158
  const bool old_val = last_report_counters_were_zero_;
1611
1159
  last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
1612
1160
  if (old_val && last_report_counters_were_zero_) {
1613
- if (xds_client()->load_report_map_.empty()) {
1614
- parent_->chand()->StopLrsCall();
1161
+ auto it = xds_client()->xds_load_report_server_map_.find(
1162
+ parent_->chand()->server_);
1163
+ if (it == xds_client()->xds_load_report_server_map_.end() ||
1164
+ it->second.load_report_map.empty()) {
1165
+ it->second.channel_state->StopLrsCallLocked();
1615
1166
  return true;
1616
1167
  }
1617
1168
  ScheduleNextReportLocked();
1618
1169
  return false;
1619
1170
  }
1620
- // Create a request that contains the snapshot.
1621
- grpc_slice request_payload_slice =
1171
+ // Send a request that contains the snapshot.
1172
+ std::string serialized_payload =
1622
1173
  xds_client()->api_.CreateLrsRequest(std::move(snapshot));
1623
- parent_->send_message_payload_ =
1624
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1625
- grpc_slice_unref_internal(request_payload_slice);
1626
- // Send the report.
1627
- grpc_op op;
1628
- memset(&op, 0, sizeof(op));
1629
- op.op = GRPC_OP_SEND_MESSAGE;
1630
- op.data.send_message.send_message = parent_->send_message_payload_;
1631
- grpc_call_error call_error = grpc_call_start_batch_and_execute(
1632
- parent_->call_, &op, 1, &on_report_done_);
1633
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1634
- gpr_log(GPR_ERROR,
1635
- "[xds_client %p] calld=%p call_error=%d sending client load report",
1636
- xds_client(), this, call_error);
1637
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1638
- }
1174
+ parent_->call_->SendMessage(std::move(serialized_payload));
1175
+ parent_->send_message_pending_ = true;
1639
1176
  return false;
1640
1177
  }
1641
1178
 
1642
- void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1643
- void* arg, grpc_error_handle error) {
1644
- Reporter* self = static_cast<Reporter*>(arg);
1645
- bool done;
1646
- {
1647
- MutexLock lock(&self->xds_client()->mu_);
1648
- done = self->OnReportDoneLocked(GRPC_ERROR_REF(error));
1649
- }
1650
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
1651
- }
1652
-
1653
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1654
- grpc_error_handle error) {
1655
- grpc_byte_buffer_destroy(parent_->send_message_payload_);
1656
- parent_->send_message_payload_ = nullptr;
1179
+ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked() {
1180
+ // If a reporter starts a send_message op, then the reporting interval
1181
+ // changes and we destroy that reporter and create a new one, and then
1182
+ // the send_message op started by the old reporter finishes, this
1183
+ // method will be called even though it was for a completion started
1184
+ // by the old reporter. In that case, the timer will be pending, so
1185
+ // we just ignore the completion and wait for the timer to fire.
1186
+ if (timer_handle_.has_value()) return;
1657
1187
  // If there are no more registered stats to report, cancel the call.
1658
- if (xds_client()->load_report_map_.empty()) {
1659
- parent_->chand()->StopLrsCall();
1660
- GRPC_ERROR_UNREF(error);
1661
- return true;
1662
- }
1663
- if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1664
- GRPC_ERROR_UNREF(error);
1665
- // If this reporter is no longer the current one on the call, the reason
1666
- // might be that it was orphaned for a new one due to config update.
1667
- if (!IsCurrentReporterOnCall()) {
1668
- parent_->MaybeStartReportingLocked();
1188
+ auto it =
1189
+ xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
1190
+ if (it == xds_client()->xds_load_report_server_map_.end()) return;
1191
+ if (it->second.load_report_map.empty()) {
1192
+ if (it->second.channel_state != nullptr) {
1193
+ it->second.channel_state->StopLrsCallLocked();
1669
1194
  }
1670
- return true;
1195
+ return;
1671
1196
  }
1197
+ // Otherwise, schedule the next load report.
1672
1198
  ScheduleNextReportLocked();
1673
- return false;
1674
1199
  }
1675
1200
 
1676
1201
  //
@@ -1688,123 +1213,46 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1688
1213
  // activity in xds_client()->interested_parties_, which is comprised of
1689
1214
  // the polling entities from client_channel.
1690
1215
  GPR_ASSERT(xds_client() != nullptr);
1691
- const auto& method =
1692
- chand()->server_.ShouldUseV3()
1693
- ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS
1694
- : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS;
1695
- call_ = grpc_channel_create_pollset_set_call(
1696
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
1697
- xds_client()->interested_parties_, method, nullptr,
1698
- GRPC_MILLIS_INF_FUTURE, nullptr);
1216
+ const char* method = chand()->server_.ShouldUseV3()
1217
+ ? "/envoy.service.load_stats.v3."
1218
+ "LoadReportingService/StreamLoadStats"
1219
+ : "/envoy.service.load_stats.v2."
1220
+ "LoadReportingService/StreamLoadStats";
1221
+ call_ = chand()->transport_->CreateStreamingCall(
1222
+ method, absl::make_unique<StreamEventHandler>(
1223
+ // Passing the initial ref here. This ref will go away when
1224
+ // the StreamEventHandler is destroyed.
1225
+ RefCountedPtr<LrsCallState>(this)));
1699
1226
  GPR_ASSERT(call_ != nullptr);
1700
- // Init the request payload.
1701
- grpc_slice request_payload_slice =
1702
- xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1703
- send_message_payload_ =
1704
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1705
- grpc_slice_unref_internal(request_payload_slice);
1706
- // Init other data associated with the LRS call.
1707
- grpc_metadata_array_init(&initial_metadata_recv_);
1708
- grpc_metadata_array_init(&trailing_metadata_recv_);
1709
1227
  // Start the call.
1710
1228
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1711
1229
  gpr_log(GPR_INFO,
1712
- "[xds_client %p] Starting LRS call (chand: %p, calld: %p, "
1713
- "call: %p)",
1714
- xds_client(), chand(), this, call_);
1715
- }
1716
- // Create the ops.
1717
- grpc_call_error call_error;
1718
- grpc_op ops[3];
1719
- memset(ops, 0, sizeof(ops));
1720
- // Op: send initial metadata.
1721
- grpc_op* op = ops;
1722
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
1723
- op->data.send_initial_metadata.count = 0;
1724
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
1725
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
1726
- op->reserved = nullptr;
1727
- op++;
1728
- // Op: send request message.
1729
- GPR_ASSERT(send_message_payload_ != nullptr);
1730
- op->op = GRPC_OP_SEND_MESSAGE;
1731
- op->data.send_message.send_message = send_message_payload_;
1732
- op->flags = 0;
1733
- op->reserved = nullptr;
1734
- op++;
1735
- Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
1736
- GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
1737
- grpc_schedule_on_exec_ctx);
1738
- call_error = grpc_call_start_batch_and_execute(
1739
- call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
1740
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1741
- // Op: recv initial metadata.
1742
- op = ops;
1743
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
1744
- op->data.recv_initial_metadata.recv_initial_metadata =
1745
- &initial_metadata_recv_;
1746
- op->flags = 0;
1747
- op->reserved = nullptr;
1748
- op++;
1749
- // Op: recv response.
1750
- op->op = GRPC_OP_RECV_MESSAGE;
1751
- op->data.recv_message.recv_message = &recv_message_payload_;
1752
- op->flags = 0;
1753
- op->reserved = nullptr;
1754
- op++;
1755
- Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
1756
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1757
- grpc_schedule_on_exec_ctx);
1758
- call_error = grpc_call_start_batch_and_execute(
1759
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1760
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1761
- // Op: recv server status.
1762
- op = ops;
1763
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
1764
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
1765
- op->data.recv_status_on_client.status = &status_code_;
1766
- op->data.recv_status_on_client.status_details = &status_details_;
1767
- op->flags = 0;
1768
- op->reserved = nullptr;
1769
- op++;
1770
- // This callback signals the end of the call, so it relies on the initial
1771
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
1772
- // unreffed.
1773
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1774
- grpc_schedule_on_exec_ctx);
1775
- call_error = grpc_call_start_batch_and_execute(
1776
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1777
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1778
- }
1779
-
1780
- XdsClient::ChannelState::LrsCallState::~LrsCallState() {
1781
- grpc_metadata_array_destroy(&initial_metadata_recv_);
1782
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
1783
- grpc_byte_buffer_destroy(send_message_payload_);
1784
- grpc_byte_buffer_destroy(recv_message_payload_);
1785
- grpc_slice_unref_internal(status_details_);
1786
- GPR_ASSERT(call_ != nullptr);
1787
- grpc_call_unref(call_);
1230
+ "[xds_client %p] xds server %s: starting LRS call (calld=%p, "
1231
+ "call=%p)",
1232
+ xds_client(), chand()->server_.server_uri.c_str(), this,
1233
+ call_.get());
1234
+ }
1235
+ // Send the initial request.
1236
+ std::string serialized_payload =
1237
+ xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1238
+ call_->SendMessage(std::move(serialized_payload));
1239
+ send_message_pending_ = true;
1788
1240
  }
1789
1241
 
1790
1242
  void XdsClient::ChannelState::LrsCallState::Orphan() {
1791
1243
  reporter_.reset();
1792
- GPR_ASSERT(call_ != nullptr);
1793
- // If we are here because xds_client wants to cancel the call,
1794
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
1795
- // we are here because xds_client has to orphan a failed call, then the
1796
- // following cancellation will be a no-op.
1797
- grpc_call_cancel_internal(call_);
1798
- // Note that the initial ref is hold by on_status_received_. So the
1799
- // corresponding unref happens in on_status_received_ instead of here.
1244
+ // Note that the initial ref is held by the StreamEventHandler, which
1245
+ // will be destroyed when call_ is destroyed, which may not happen
1246
+ // here, since there may be other refs held to call_ by internal callbacks.
1247
+ call_.reset();
1800
1248
  }
1801
1249
 
1802
1250
  void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1803
1251
  // Don't start again if already started.
1804
1252
  if (reporter_ != nullptr) return;
1805
- // Don't start if the previous send_message op (of the initial request or the
1806
- // last report of the previous reporter) hasn't completed.
1807
- if (send_message_payload_ != nullptr) return;
1253
+ // Don't start if the previous send_message op (of the initial request or
1254
+ // the last report of the previous reporter) hasn't completed.
1255
+ if (call_ != nullptr && send_message_pending_) return;
1808
1256
  // Don't start if no LRS response has arrived.
1809
1257
  if (!seen_response()) return;
1810
1258
  // Don't start if the ADS call hasn't received any valid response. Note that
@@ -1820,160 +1268,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1820
1268
  Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
1821
1269
  }
1822
1270
 
1823
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1824
- void* arg, grpc_error_handle /*error*/) {
1825
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1826
- {
1827
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1828
- lrs_calld->OnInitialRequestSentLocked();
1271
+ void XdsClient::ChannelState::LrsCallState::OnRequestSent(bool /*ok*/) {
1272
+ MutexLock lock(&xds_client()->mu_);
1273
+ send_message_pending_ = false;
1274
+ if (reporter_ != nullptr) {
1275
+ reporter_->OnReportDoneLocked();
1276
+ } else {
1277
+ MaybeStartReportingLocked();
1829
1278
  }
1830
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1831
- }
1832
-
1833
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1834
- // Clear the send_message_payload_.
1835
- grpc_byte_buffer_destroy(send_message_payload_);
1836
- send_message_payload_ = nullptr;
1837
- MaybeStartReportingLocked();
1838
1279
  }
1839
1280
 
1840
- void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1841
- void* arg, grpc_error_handle /*error*/) {
1842
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1843
- bool done;
1844
- {
1845
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1846
- done = lrs_calld->OnResponseReceivedLocked();
1847
- }
1848
- if (done) lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1849
- }
1850
-
1851
- bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1852
- // Empty payload means the call was cancelled.
1853
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1854
- return true;
1855
- }
1856
- // Read the response.
1857
- grpc_byte_buffer_reader bbr;
1858
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1859
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1860
- grpc_byte_buffer_reader_destroy(&bbr);
1861
- grpc_byte_buffer_destroy(recv_message_payload_);
1862
- recv_message_payload_ = nullptr;
1863
- // This anonymous lambda is a hack to avoid the usage of goto.
1864
- [&]() {
1865
- // Parse the response.
1866
- bool send_all_clusters = false;
1867
- std::set<std::string> new_cluster_names;
1868
- grpc_millis new_load_reporting_interval;
1869
- grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1870
- response_slice, &send_all_clusters, &new_cluster_names,
1871
- &new_load_reporting_interval);
1872
- if (parse_error != GRPC_ERROR_NONE) {
1873
- gpr_log(GPR_ERROR,
1874
- "[xds_client %p] LRS response parsing failed. error=%s",
1875
- xds_client(), grpc_error_std_string(parse_error).c_str());
1876
- GRPC_ERROR_UNREF(parse_error);
1877
- return;
1878
- }
1879
- seen_response_ = true;
1281
+ void XdsClient::ChannelState::LrsCallState::OnRecvMessage(
1282
+ absl::string_view payload) {
1283
+ MutexLock lock(&xds_client()->mu_);
1284
+ // If we're no longer the current call, ignore the result.
1285
+ if (!IsCurrentCallOnChannel()) return;
1286
+ // Parse the response.
1287
+ bool send_all_clusters = false;
1288
+ std::set<std::string> new_cluster_names;
1289
+ Duration new_load_reporting_interval;
1290
+ absl::Status status = xds_client()->api_.ParseLrsResponse(
1291
+ payload, &send_all_clusters, &new_cluster_names,
1292
+ &new_load_reporting_interval);
1293
+ if (!status.ok()) {
1294
+ gpr_log(GPR_ERROR,
1295
+ "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1296
+ xds_client(), chand()->server_.server_uri.c_str(),
1297
+ status.ToString().c_str());
1298
+ return;
1299
+ }
1300
+ seen_response_ = true;
1301
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1302
+ gpr_log(
1303
+ GPR_INFO,
1304
+ "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1305
+ " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1306
+ "ms",
1307
+ xds_client(), chand()->server_.server_uri.c_str(),
1308
+ new_cluster_names.size(), send_all_clusters,
1309
+ new_load_reporting_interval.millis());
1310
+ size_t i = 0;
1311
+ for (const auto& name : new_cluster_names) {
1312
+ gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1313
+ xds_client(), i++, name.c_str());
1314
+ }
1315
+ }
1316
+ if (new_load_reporting_interval <
1317
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1318
+ new_load_reporting_interval =
1319
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1880
1320
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1881
- gpr_log(
1882
- GPR_INFO,
1883
- "[xds_client %p] LRS response received, %" PRIuPTR
1884
- " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1885
- "ms",
1886
- xds_client(), new_cluster_names.size(), send_all_clusters,
1887
- new_load_reporting_interval);
1888
- size_t i = 0;
1889
- for (const auto& name : new_cluster_names) {
1890
- gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1891
- xds_client(), i++, name.c_str());
1892
- }
1893
- }
1894
- if (new_load_reporting_interval <
1895
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS) {
1896
- new_load_reporting_interval =
1897
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS;
1898
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1899
- gpr_log(GPR_INFO,
1900
- "[xds_client %p] Increased load_report_interval to minimum "
1901
- "value %dms",
1902
- xds_client(), GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1903
- }
1321
+ gpr_log(GPR_INFO,
1322
+ "[xds_client %p] xds server %s: increased load_report_interval "
1323
+ "to minimum value %dms",
1324
+ xds_client(), chand()->server_.server_uri.c_str(),
1325
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1904
1326
  }
1905
- // Ignore identical update.
1906
- if (send_all_clusters == send_all_clusters_ &&
1907
- cluster_names_ == new_cluster_names &&
1908
- load_reporting_interval_ == new_load_reporting_interval) {
1909
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1910
- gpr_log(GPR_INFO,
1911
- "[xds_client %p] Incoming LRS response identical to current, "
1912
- "ignoring.",
1913
- xds_client());
1914
- }
1915
- return;
1327
+ }
1328
+ // Ignore identical update.
1329
+ if (send_all_clusters == send_all_clusters_ &&
1330
+ cluster_names_ == new_cluster_names &&
1331
+ load_reporting_interval_ == new_load_reporting_interval) {
1332
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1333
+ gpr_log(GPR_INFO,
1334
+ "[xds_client %p] xds server %s: incoming LRS response identical "
1335
+ "to current, ignoring.",
1336
+ xds_client(), chand()->server_.server_uri.c_str());
1916
1337
  }
1917
- // Stop current load reporting (if any) to adopt the new config.
1918
- reporter_.reset();
1919
- // Record the new config.
1920
- send_all_clusters_ = send_all_clusters;
1921
- cluster_names_ = std::move(new_cluster_names);
1922
- load_reporting_interval_ = new_load_reporting_interval;
1923
- // Try starting sending load report.
1924
- MaybeStartReportingLocked();
1925
- }();
1926
- grpc_slice_unref_internal(response_slice);
1927
- if (xds_client()->shutting_down_) return true;
1928
- // Keep listening for LRS config updates.
1929
- grpc_op op;
1930
- memset(&op, 0, sizeof(op));
1931
- op.op = GRPC_OP_RECV_MESSAGE;
1932
- op.data.recv_message.recv_message = &recv_message_payload_;
1933
- op.flags = 0;
1934
- op.reserved = nullptr;
1935
- GPR_ASSERT(call_ != nullptr);
1936
- // Reuse the "OnResponseReceivedLocked" ref taken in ctor.
1937
- const grpc_call_error call_error =
1938
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1939
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1940
- return false;
1941
- }
1942
-
1943
- void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1944
- void* arg, grpc_error_handle error) {
1945
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1946
- {
1947
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1948
- lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1338
+ return;
1949
1339
  }
1950
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1340
+ // Stop current load reporting (if any) to adopt the new config.
1341
+ reporter_.reset();
1342
+ // Record the new config.
1343
+ send_all_clusters_ = send_all_clusters;
1344
+ cluster_names_ = std::move(new_cluster_names);
1345
+ load_reporting_interval_ = new_load_reporting_interval;
1346
+ // Try starting sending load report.
1347
+ MaybeStartReportingLocked();
1951
1348
  }
1952
1349
 
1953
- void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1954
- grpc_error_handle error) {
1955
- GPR_ASSERT(call_ != nullptr);
1350
+ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1351
+ absl::Status status) {
1352
+ MutexLock lock(&xds_client()->mu_);
1956
1353
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1957
- char* status_details = grpc_slice_to_c_string(status_details_);
1958
1354
  gpr_log(GPR_INFO,
1959
- "[xds_client %p] LRS call status received. Status = %d, details "
1960
- "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1961
- xds_client(), status_code_, status_details, chand(), this, call_,
1962
- grpc_error_std_string(error).c_str());
1963
- gpr_free(status_details);
1355
+ "[xds_client %p] xds server %s: LRS call status received "
1356
+ "(chand=%p, calld=%p, call=%p): %s",
1357
+ xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1358
+ call_.get(), status.ToString().c_str());
1964
1359
  }
1965
1360
  // Ignore status from a stale call.
1966
1361
  if (IsCurrentCallOnChannel()) {
1967
- GPR_ASSERT(!xds_client()->shutting_down_);
1968
1362
  // Try to restart the call.
1969
1363
  parent_->OnCallFinishedLocked();
1970
1364
  }
1971
- GRPC_ERROR_UNREF(error);
1972
1365
  }
1973
1366
 
1974
1367
  bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1975
- // If the retryable LRS call is null (which only happens when the xds channel
1976
- // is shutting down), all the LRS calls are stale.
1368
+ // If the retryable LRS call is null (which only happens when the xds
1369
+ // channel is shutting down), all the LRS calls are stale.
1977
1370
  if (chand()->lrs_calld_ == nullptr) return false;
1978
1371
  return this == chand()->lrs_calld_->calld();
1979
1372
  }
@@ -1982,95 +1375,51 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1982
1375
  // XdsClient
1983
1376
  //
1984
1377
 
1985
- namespace {
1986
-
1987
- grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1988
- return grpc_channel_args_find_integer(
1989
- args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1990
- {15000, 0, INT_MAX});
1991
- }
1992
-
1993
- grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1994
- absl::InlinedVector<grpc_arg, 1> args_to_add = {
1995
- grpc_channel_arg_integer_create(
1996
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1997
- 5 * 60 * GPR_MS_PER_SEC),
1998
- };
1999
- return grpc_channel_args_copy_and_add(args, args_to_add.data(),
2000
- args_to_add.size());
2001
- }
2002
-
2003
- } // namespace
2004
-
2005
1378
  XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
2006
- const grpc_channel_args* args)
1379
+ OrphanablePtr<XdsTransportFactory> transport_factory,
1380
+ Duration resource_request_timeout)
2007
1381
  : DualRefCounted<XdsClient>(
2008
1382
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
2009
1383
  : nullptr),
2010
1384
  bootstrap_(std::move(bootstrap)),
2011
- args_(ModifyChannelArgs(args)),
2012
- request_timeout_(GetRequestTimeout(args)),
2013
- interested_parties_(grpc_pollset_set_create()),
2014
- certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
2015
- bootstrap_->certificate_providers())),
2016
- api_(this, &grpc_xds_client_trace, bootstrap_->node(),
2017
- &bootstrap_->certificate_providers()) {
1385
+ transport_factory_(std::move(transport_factory)),
1386
+ request_timeout_(resource_request_timeout),
1387
+ xds_federation_enabled_(XdsFederationEnabled()),
1388
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_) {
2018
1389
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2019
1390
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
2020
1391
  }
2021
- // Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
2022
- // destroyed.
2023
- grpc_init();
2024
1392
  }
2025
1393
 
2026
1394
  XdsClient::~XdsClient() {
2027
1395
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2028
1396
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
2029
1397
  }
2030
- grpc_channel_args_destroy(args_);
2031
- grpc_pollset_set_destroy(interested_parties_);
2032
- // Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
2033
- // is destroyed.
2034
- grpc_shutdown();
2035
1398
  }
2036
1399
 
2037
1400
  void XdsClient::Orphan() {
2038
1401
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2039
1402
  gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
2040
1403
  }
2041
- {
2042
- MutexLock lock(g_mu);
2043
- if (g_xds_client == this) g_xds_client = nullptr;
2044
- }
2045
- {
2046
- MutexLock lock(&mu_);
2047
- shutting_down_ = true;
2048
- // We do not clear cluster_map_ and endpoint_map_ if the xds client was
2049
- // created by the XdsResolver because the maps contain refs for watchers
2050
- // which in turn hold refs to the loadbalancing policies. At this point, it
2051
- // is possible for ADS calls to be in progress. Unreffing the loadbalancing
2052
- // policies before those calls are done would lead to issues such as
2053
- // https://github.com/grpc/grpc/issues/20928.
2054
- for (auto& a : authority_state_map_) {
2055
- a.second.channel_state.reset();
2056
- if (!a.second.listener_map.empty()) {
2057
- a.second.cluster_map.clear();
2058
- a.second.endpoint_map.clear();
2059
- }
2060
- }
2061
- // We clear these invalid resource watchers as cancel never came.
2062
- invalid_listener_watchers_.clear();
2063
- invalid_route_config_watchers_.clear();
2064
- invalid_cluster_watchers_.clear();
2065
- invalid_endpoint_watchers_.clear();
1404
+ MutexLock lock(&mu_);
1405
+ shutting_down_ = true;
1406
+ // Clear cache and any remaining watchers that may not have been cancelled.
1407
+ authority_state_map_.clear();
1408
+ invalid_watchers_.clear();
1409
+ // We may still be sending lingering queued load report data, so don't
1410
+ // just clear the load reporting map, but we do want to clear the refs
1411
+ // we're holding to the ChannelState objects, to make sure that
1412
+ // everything shuts down properly.
1413
+ for (auto& p : xds_load_report_server_map_) {
1414
+ p.second.channel_state.reset(DEBUG_LOCATION, "XdsClient::Orphan()");
2066
1415
  }
2067
1416
  }
2068
1417
 
2069
1418
  RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
2070
- const XdsBootstrap::XdsServer& server) {
1419
+ const XdsBootstrap::XdsServer& server, const char* reason) {
2071
1420
  auto it = xds_server_channel_map_.find(server);
2072
1421
  if (it != xds_server_channel_map_.end()) {
2073
- return it->second->Ref(DEBUG_LOCATION, "Authority");
1422
+ return it->second->Ref(DEBUG_LOCATION, reason);
2074
1423
  }
2075
1424
  // Channel not found, so create a new one.
2076
1425
  auto channel_state = MakeRefCounted<ChannelState>(
@@ -2079,297 +1428,247 @@ RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
2079
1428
  return channel_state;
2080
1429
  }
2081
1430
 
2082
- void XdsClient::WatchListenerData(
2083
- absl::string_view listener_name,
2084
- std::unique_ptr<ListenerWatcherInterface> watcher) {
2085
- std::string listener_name_str = std::string(listener_name);
2086
- MutexLock lock(&mu_);
2087
- ListenerWatcherInterface* w = watcher.get();
2088
- auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
2089
- if (!resource.ok()) {
2090
- invalid_listener_watchers_[w] = std::move(watcher);
2091
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2092
- "Unable to parse resource name for listener %s", listener_name));
2093
- w->OnError(GRPC_ERROR_REF(error));
1431
+ void XdsClient::WatchResource(const XdsResourceType* type,
1432
+ absl::string_view name,
1433
+ RefCountedPtr<ResourceWatcherInterface> watcher) {
1434
+ ResourceWatcherInterface* w = watcher.get();
1435
+ // Lambda for handling failure cases.
1436
+ auto fail = [&](absl::Status status) mutable {
1437
+ {
1438
+ MutexLock lock(&mu_);
1439
+ MaybeRegisterResourceTypeLocked(type);
1440
+ invalid_watchers_[w] = watcher;
1441
+ }
1442
+ work_serializer_.Run(
1443
+ // TODO(yashykt): When we move to C++14, capture watcher using
1444
+ // std::move()
1445
+ [watcher, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1446
+ watcher->OnError(status);
1447
+ },
1448
+ DEBUG_LOCATION);
1449
+ };
1450
+ auto resource_name = ParseXdsResourceName(name, type);
1451
+ if (!resource_name.ok()) {
1452
+ fail(absl::UnavailableError(absl::StrFormat(
1453
+ "Unable to parse resource name for listener %s", name)));
2094
1454
  return;
2095
1455
  }
2096
- AuthorityState& authority_state = authority_state_map_[resource->authority];
2097
- ListenerState& listener_state = authority_state.listener_map[resource->id];
2098
- listener_state.watchers[w] = std::move(watcher);
2099
- // If we've already received an LDS update, notify the new watcher
2100
- // immediately.
2101
- if (listener_state.update.has_value()) {
2102
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2103
- gpr_log(GPR_INFO, "[xds_client %p] returning cached listener data for %s",
2104
- this, listener_name_str.c_str());
1456
+ // Find server to use.
1457
+ const XdsBootstrap::XdsServer* xds_server = nullptr;
1458
+ absl::string_view authority_name = resource_name->authority;
1459
+ if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
1460
+ auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
1461
+ if (authority == nullptr) {
1462
+ fail(absl::UnavailableError(
1463
+ absl::StrCat("authority \"", authority_name,
1464
+ "\" not present in bootstrap config")));
1465
+ return;
2105
1466
  }
2106
- w->OnListenerChanged(*listener_state.update);
2107
- }
2108
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2109
- if (authority_state.channel_state == nullptr) {
2110
- authority_state.channel_state =
2111
- GetOrCreateChannelStateLocked(bootstrap_->server());
2112
- }
2113
- authority_state.channel_state->SubscribeLocked(XdsApi::kLdsTypeUrl,
2114
- *resource);
2115
- }
2116
-
2117
- void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
2118
- ListenerWatcherInterface* watcher,
2119
- bool delay_unsubscription) {
2120
- MutexLock lock(&mu_);
2121
- if (shutting_down_) return;
2122
- auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
2123
- if (!resource.ok()) return;
2124
- auto& authority_state = authority_state_map_[resource->authority];
2125
- ListenerState& listener_state = authority_state.listener_map[resource->id];
2126
- auto it = listener_state.watchers.find(watcher);
2127
- if (it == listener_state.watchers.end()) {
2128
- invalid_listener_watchers_.erase(watcher);
2129
- return;
2130
- }
2131
- listener_state.watchers.erase(it);
2132
- if (!listener_state.watchers.empty()) return;
2133
- authority_state.listener_map.erase(resource->id);
2134
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2135
- XdsApi::kLdsTypeUrl, *resource, delay_unsubscription);
2136
- if (!authority_state.HasSubscribedResources()) {
2137
- authority_state.channel_state.reset();
2138
- }
2139
- }
2140
-
2141
- void XdsClient::WatchRouteConfigData(
2142
- absl::string_view route_config_name,
2143
- std::unique_ptr<RouteConfigWatcherInterface> watcher) {
2144
- std::string route_config_name_str = std::string(route_config_name);
2145
- MutexLock lock(&mu_);
2146
- RouteConfigWatcherInterface* w = watcher.get();
2147
- auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
2148
- if (!resource.ok()) {
2149
- invalid_route_config_watchers_[w] = std::move(watcher);
2150
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2151
- absl::StrFormat("Unable to parse resource name for route config %s",
2152
- route_config_name));
2153
- w->OnError(GRPC_ERROR_REF(error));
2154
- return;
2155
- }
2156
- auto& authority_state = authority_state_map_[resource->authority];
2157
- RouteConfigState& route_config_state =
2158
- authority_state.route_config_map[resource->id];
2159
- route_config_state.watchers[w] = std::move(watcher);
2160
- // If we've already received an RDS update, notify the new watcher
2161
- // immediately.
2162
- if (route_config_state.update.has_value()) {
2163
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2164
- gpr_log(GPR_INFO,
2165
- "[xds_client %p] returning cached route config data for %s", this,
2166
- route_config_name_str.c_str());
1467
+ if (!authority->xds_servers.empty()) {
1468
+ xds_server = &authority->xds_servers[0];
2167
1469
  }
2168
- w->OnRouteConfigChanged(*route_config_state.update);
2169
- }
2170
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2171
- if (authority_state.channel_state == nullptr) {
2172
- authority_state.channel_state =
2173
- GetOrCreateChannelStateLocked(bootstrap_->server());
2174
1470
  }
2175
- authority_state.channel_state->SubscribeLocked(XdsApi::kRdsTypeUrl,
2176
- *resource);
2177
- }
2178
-
2179
- void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
2180
- RouteConfigWatcherInterface* watcher,
2181
- bool delay_unsubscription) {
2182
- MutexLock lock(&mu_);
2183
- if (shutting_down_) return;
2184
- auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
2185
- if (!resource.ok()) return;
2186
- auto& authority_state = authority_state_map_[resource->authority];
2187
- RouteConfigState& route_config_state =
2188
- authority_state.route_config_map[resource->id];
2189
- auto it = route_config_state.watchers.find(watcher);
2190
- if (it == route_config_state.watchers.end()) {
2191
- invalid_route_config_watchers_.erase(watcher);
2192
- return;
2193
- }
2194
- route_config_state.watchers.erase(it);
2195
- if (!route_config_state.watchers.empty()) return;
2196
- authority_state.route_config_map.erase(resource->id);
2197
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2198
- XdsApi::kRdsTypeUrl, *resource, delay_unsubscription);
2199
- if (!authority_state.HasSubscribedResources()) {
2200
- authority_state.channel_state.reset();
2201
- }
2202
- }
2203
-
2204
- void XdsClient::WatchClusterData(
2205
- absl::string_view cluster_name,
2206
- std::unique_ptr<ClusterWatcherInterface> watcher) {
2207
- std::string cluster_name_str = std::string(cluster_name);
2208
- MutexLock lock(&mu_);
2209
- ClusterWatcherInterface* w = watcher.get();
2210
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2211
- if (!resource.ok()) {
2212
- invalid_cluster_watchers_[w] = std::move(watcher);
2213
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2214
- "Unable to parse resource name for cluster %s", cluster_name));
2215
- w->OnError(GRPC_ERROR_REF(error));
2216
- return;
2217
- }
2218
- auto& authority_state = authority_state_map_[resource->authority];
2219
- ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2220
- cluster_state.watchers[w] = std::move(watcher);
2221
- // If we've already received a CDS update, notify the new watcher
2222
- // immediately.
2223
- if (cluster_state.update.has_value()) {
2224
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2225
- gpr_log(GPR_INFO, "[xds_client %p] returning cached cluster data for %s",
2226
- this, cluster_name_str.c_str());
2227
- }
2228
- w->OnClusterChanged(cluster_state.update.value());
2229
- }
2230
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2231
- if (authority_state.channel_state == nullptr) {
2232
- authority_state.channel_state =
2233
- GetOrCreateChannelStateLocked(bootstrap_->server());
2234
- }
2235
- authority_state.channel_state->SubscribeLocked(XdsApi::kCdsTypeUrl,
2236
- *resource);
2237
- }
2238
-
2239
- void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
2240
- ClusterWatcherInterface* watcher,
2241
- bool delay_unsubscription) {
2242
- MutexLock lock(&mu_);
2243
- if (shutting_down_) return;
2244
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2245
- if (!resource.ok()) return;
2246
- auto& authority_state = authority_state_map_[resource->authority];
2247
- ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2248
- auto it = cluster_state.watchers.find(watcher);
2249
- if (it == cluster_state.watchers.end()) {
2250
- invalid_cluster_watchers_.erase(watcher);
2251
- return;
2252
- }
2253
- cluster_state.watchers.erase(it);
2254
- if (!cluster_state.watchers.empty()) return;
2255
- authority_state.cluster_map.erase(resource->id);
2256
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2257
- XdsApi::kCdsTypeUrl, *resource, delay_unsubscription);
2258
- if (!authority_state.HasSubscribedResources()) {
2259
- authority_state.channel_state.reset();
2260
- }
2261
- }
2262
-
2263
- void XdsClient::WatchEndpointData(
2264
- absl::string_view eds_service_name,
2265
- std::unique_ptr<EndpointWatcherInterface> watcher) {
2266
- std::string eds_service_name_str = std::string(eds_service_name);
1471
+ if (xds_server == nullptr) xds_server = &bootstrap_->server();
1472
+ {
1473
+ MutexLock lock(&mu_);
1474
+ MaybeRegisterResourceTypeLocked(type);
1475
+ AuthorityState& authority_state =
1476
+ authority_state_map_[resource_name->authority];
1477
+ ResourceState& resource_state =
1478
+ authority_state.resource_map[type][resource_name->key];
1479
+ resource_state.watchers[w] = watcher;
1480
+ // If we already have a cached value for the resource, notify the new
1481
+ // watcher immediately.
1482
+ if (resource_state.resource != nullptr) {
1483
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1484
+ gpr_log(GPR_INFO,
1485
+ "[xds_client %p] returning cached listener data for %s", this,
1486
+ std::string(name).c_str());
1487
+ }
1488
+ auto* value = type->CopyResource(resource_state.resource.get()).release();
1489
+ work_serializer_.Schedule(
1490
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1491
+ watcher->OnGenericResourceChanged(value);
1492
+ delete value;
1493
+ },
1494
+ DEBUG_LOCATION);
1495
+ }
1496
+ // If the authority doesn't yet have a channel, set it, creating it if
1497
+ // needed.
1498
+ if (authority_state.channel_state == nullptr) {
1499
+ authority_state.channel_state =
1500
+ GetOrCreateChannelStateLocked(*xds_server, "start watch");
1501
+ }
1502
+ authority_state.channel_state->SubscribeLocked(type, *resource_name);
1503
+ }
1504
+ work_serializer_.DrainQueue();
1505
+ }
1506
+
1507
+ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
1508
+ absl::string_view name,
1509
+ ResourceWatcherInterface* watcher,
1510
+ bool delay_unsubscription) {
1511
+ auto resource_name = ParseXdsResourceName(name, type);
2267
1512
  MutexLock lock(&mu_);
2268
- EndpointWatcherInterface* w = watcher.get();
2269
- auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
2270
- if (!resource.ok()) {
2271
- invalid_endpoint_watchers_[w] = std::move(watcher);
2272
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2273
- absl::StrFormat("Unable to parse resource name for endpoint service %s",
2274
- eds_service_name));
2275
- w->OnError(GRPC_ERROR_REF(error));
2276
- return;
2277
- }
2278
- auto& authority_state = authority_state_map_[resource->authority];
2279
- EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2280
- endpoint_state.watchers[w] = std::move(watcher);
2281
- // If we've already received an EDS update, notify the new watcher
2282
- // immediately.
2283
- if (endpoint_state.update.has_value()) {
2284
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2285
- gpr_log(GPR_INFO, "[xds_client %p] returning cached endpoint data for %s",
2286
- this, eds_service_name_str.c_str());
1513
+ // We cannot be sure whether the watcher is in invalid_watchers_ or in
1514
+ // authority_state_map_, so we check both, just to be safe.
1515
+ invalid_watchers_.erase(watcher);
1516
+ // Find authority.
1517
+ if (!resource_name.ok()) return;
1518
+ auto authority_it = authority_state_map_.find(resource_name->authority);
1519
+ if (authority_it == authority_state_map_.end()) return;
1520
+ AuthorityState& authority_state = authority_it->second;
1521
+ // Find type map.
1522
+ auto type_it = authority_state.resource_map.find(type);
1523
+ if (type_it == authority_state.resource_map.end()) return;
1524
+ auto& type_map = type_it->second;
1525
+ // Find resource key.
1526
+ auto resource_it = type_map.find(resource_name->key);
1527
+ if (resource_it == type_map.end()) return;
1528
+ ResourceState& resource_state = resource_it->second;
1529
+ // Remove watcher.
1530
+ resource_state.watchers.erase(watcher);
1531
+ // Clean up empty map entries, if any.
1532
+ if (resource_state.watchers.empty()) {
1533
+ if (resource_state.ignored_deletion) {
1534
+ gpr_log(GPR_INFO,
1535
+ "[xds_client %p] unsubscribing from a resource for which we "
1536
+ "previously ignored a deletion: type %s name %s",
1537
+ this, std::string(type->type_url()).c_str(),
1538
+ std::string(name).c_str());
1539
+ }
1540
+ authority_state.channel_state->UnsubscribeLocked(type, *resource_name,
1541
+ delay_unsubscription);
1542
+ type_map.erase(resource_it);
1543
+ if (type_map.empty()) {
1544
+ authority_state.resource_map.erase(type_it);
1545
+ if (authority_state.resource_map.empty()) {
1546
+ authority_state.channel_state.reset();
1547
+ }
2287
1548
  }
2288
- w->OnEndpointChanged(endpoint_state.update.value());
2289
1549
  }
2290
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2291
- if (authority_state.channel_state == nullptr) {
2292
- authority_state.channel_state =
2293
- GetOrCreateChannelStateLocked(bootstrap_->server());
2294
- }
2295
- authority_state.channel_state->SubscribeLocked(XdsApi::kEdsTypeUrl,
2296
- *resource);
2297
1550
  }
2298
1551
 
2299
- void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
2300
- EndpointWatcherInterface* watcher,
2301
- bool delay_unsubscription) {
2302
- MutexLock lock(&mu_);
2303
- if (shutting_down_) return;
2304
- auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
2305
- if (!resource.ok()) return;
2306
- auto& authority_state = authority_state_map_[resource->authority];
2307
- EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2308
- auto it = endpoint_state.watchers.find(watcher);
2309
- if (it == endpoint_state.watchers.end()) {
2310
- invalid_endpoint_watchers_.erase(watcher);
1552
+ void XdsClient::MaybeRegisterResourceTypeLocked(
1553
+ const XdsResourceType* resource_type) {
1554
+ auto it = resource_types_.find(resource_type->type_url());
1555
+ if (it != resource_types_.end()) {
1556
+ GPR_ASSERT(it->second == resource_type);
2311
1557
  return;
2312
1558
  }
2313
- endpoint_state.watchers.erase(it);
2314
- if (!endpoint_state.watchers.empty()) return;
2315
- authority_state.endpoint_map.erase(resource->id);
2316
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2317
- XdsApi::kEdsTypeUrl, *resource, delay_unsubscription);
2318
- if (!authority_state.HasSubscribedResources()) {
2319
- authority_state.channel_state.reset();
2320
- }
1559
+ resource_types_.emplace(resource_type->type_url(), resource_type);
1560
+ v2_resource_types_.emplace(resource_type->v2_type_url(), resource_type);
1561
+ resource_type->InitUpbSymtab(symtab_.ptr());
1562
+ }
1563
+
1564
+ const XdsResourceType* XdsClient::GetResourceTypeLocked(
1565
+ absl::string_view resource_type) {
1566
+ auto it = resource_types_.find(resource_type);
1567
+ if (it != resource_types_.end()) return it->second;
1568
+ auto it2 = v2_resource_types_.find(resource_type);
1569
+ if (it2 != v2_resource_types_.end()) return it2->second;
1570
+ return nullptr;
1571
+ }
1572
+
1573
+ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
1574
+ absl::string_view name, const XdsResourceType* type) {
1575
+ // Old-style names use the empty string for authority.
1576
+ // authority is prefixed with "old:" to indicate that it's an old-style
1577
+ // name.
1578
+ if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
1579
+ return XdsResourceName{"old:", {std::string(name), {}}};
1580
+ }
1581
+ // New style name. Parse URI.
1582
+ auto uri = URI::Parse(name);
1583
+ if (!uri.ok()) return uri.status();
1584
+ // Split the resource type off of the path to get the id.
1585
+ std::pair<absl::string_view, absl::string_view> path_parts = absl::StrSplit(
1586
+ absl::StripPrefix(uri->path(), "/"), absl::MaxSplits('/', 1));
1587
+ if (!type->IsType(path_parts.first, nullptr)) {
1588
+ return absl::InvalidArgumentError(
1589
+ "xdstp URI path must indicate valid xDS resource type");
1590
+ }
1591
+ // Canonicalize order of query params.
1592
+ std::vector<URI::QueryParam> query_params;
1593
+ for (const auto& p : uri->query_parameter_map()) {
1594
+ query_params.emplace_back(
1595
+ URI::QueryParam{std::string(p.first), std::string(p.second)});
1596
+ }
1597
+ return XdsResourceName{
1598
+ absl::StrCat("xdstp:", uri->authority()),
1599
+ {std::string(path_parts.second), std::move(query_params)}};
1600
+ }
1601
+
1602
+ std::string XdsClient::ConstructFullXdsResourceName(
1603
+ absl::string_view authority, absl::string_view resource_type,
1604
+ const XdsResourceKey& key) {
1605
+ if (absl::ConsumePrefix(&authority, "xdstp:")) {
1606
+ auto uri = URI::Create("xdstp", std::string(authority),
1607
+ absl::StrCat("/", resource_type, "/", key.id),
1608
+ key.query_params, /*fragment=*/"");
1609
+ GPR_ASSERT(uri.ok());
1610
+ return uri->ToString();
1611
+ }
1612
+ // Old-style name.
1613
+ return key.id;
2321
1614
  }
2322
1615
 
2323
1616
  RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2324
- absl::string_view lrs_server, absl::string_view cluster_name,
1617
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2325
1618
  absl::string_view eds_service_name) {
2326
- // TODO(roth): When we add support for direct federation, use the
2327
- // server name specified in lrs_server.
1619
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2328
1620
  auto key =
2329
1621
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2330
- MutexLock lock(&mu_);
2331
- // We jump through some hoops here to make sure that the absl::string_views
2332
- // stored in the XdsClusterDropStats object point to the strings
2333
- // in the load_report_map_ key, so that they have the same lifetime.
2334
- auto it = load_report_map_
2335
- .emplace(std::make_pair(std::move(key), LoadReportState()))
2336
- .first;
2337
- LoadReportState& load_report_state = it->second;
2338
1622
  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
2339
- if (load_report_state.drop_stats != nullptr) {
2340
- cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
2341
- }
2342
- if (cluster_drop_stats == nullptr) {
1623
+ {
1624
+ MutexLock lock(&mu_);
1625
+ // We jump through some hoops here to make sure that the const
1626
+ // XdsBootstrap::XdsServer& and absl::string_views
1627
+ // stored in the XdsClusterDropStats object point to the
1628
+ // XdsBootstrap::XdsServer and strings
1629
+ // in the load_report_map_ key, so that they have the same lifetime.
1630
+ auto server_it =
1631
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
1632
+ .first;
1633
+ if (server_it->second.channel_state == nullptr) {
1634
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1635
+ xds_server, "load report map (drop stats)");
1636
+ }
1637
+ auto load_report_it = server_it->second.load_report_map
1638
+ .emplace(std::move(key), LoadReportState())
1639
+ .first;
1640
+ LoadReportState& load_report_state = load_report_it->second;
2343
1641
  if (load_report_state.drop_stats != nullptr) {
2344
- load_report_state.deleted_drop_stats +=
2345
- load_report_state.drop_stats->GetSnapshotAndReset();
1642
+ cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
1643
+ }
1644
+ if (cluster_drop_stats == nullptr) {
1645
+ if (load_report_state.drop_stats != nullptr) {
1646
+ load_report_state.deleted_drop_stats +=
1647
+ load_report_state.drop_stats->GetSnapshotAndReset();
1648
+ }
1649
+ cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1650
+ Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
1651
+ load_report_it->first.first /*cluster_name*/,
1652
+ load_report_it->first.second /*eds_service_name*/);
1653
+ load_report_state.drop_stats = cluster_drop_stats.get();
2346
1654
  }
2347
- cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
2348
- Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
2349
- it->first.first /*cluster_name*/,
2350
- it->first.second /*eds_service_name*/);
2351
- load_report_state.drop_stats = cluster_drop_stats.get();
2352
- }
2353
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2354
- GPR_ASSERT(resource.ok());
2355
- auto a = authority_state_map_.find(resource->authority);
2356
- if (a != authority_state_map_.end()) {
2357
- a->second.channel_state->MaybeStartLrsCall();
1655
+ server_it->second.channel_state->MaybeStartLrsCall();
2358
1656
  }
1657
+ work_serializer_.DrainQueue();
2359
1658
  return cluster_drop_stats;
2360
1659
  }
2361
1660
 
2362
1661
  void XdsClient::RemoveClusterDropStats(
2363
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
1662
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2364
1663
  absl::string_view eds_service_name,
2365
1664
  XdsClusterDropStats* cluster_drop_stats) {
2366
1665
  MutexLock lock(&mu_);
2367
- // TODO(roth): When we add support for direct federation, use the
2368
- // server name specified in lrs_server.
2369
- auto it = load_report_map_.find(
1666
+ auto server_it = xds_load_report_server_map_.find(xds_server);
1667
+ if (server_it == xds_load_report_server_map_.end()) return;
1668
+ auto load_report_it = server_it->second.load_report_map.find(
2370
1669
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2371
- if (it == load_report_map_.end()) return;
2372
- LoadReportState& load_report_state = it->second;
1670
+ if (load_report_it == server_it->second.load_report_map.end()) return;
1671
+ LoadReportState& load_report_state = load_report_it->second;
2373
1672
  if (load_report_state.drop_stats == cluster_drop_stats) {
2374
1673
  // Record final snapshot in deleted_drop_stats, which will be
2375
1674
  // added to the next load report.
@@ -2380,59 +1679,66 @@ void XdsClient::RemoveClusterDropStats(
2380
1679
  }
2381
1680
 
2382
1681
  RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2383
- absl::string_view lrs_server, absl::string_view cluster_name,
1682
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2384
1683
  absl::string_view eds_service_name,
2385
1684
  RefCountedPtr<XdsLocalityName> locality) {
2386
- // TODO(roth): When we add support for direct federation, use the
2387
- // server name specified in lrs_server.
1685
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2388
1686
  auto key =
2389
1687
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2390
- MutexLock lock(&mu_);
2391
- // We jump through some hoops here to make sure that the absl::string_views
2392
- // stored in the XdsClusterLocalityStats object point to the strings
2393
- // in the load_report_map_ key, so that they have the same lifetime.
2394
- auto it = load_report_map_
2395
- .emplace(std::make_pair(std::move(key), LoadReportState()))
2396
- .first;
2397
- LoadReportState& load_report_state = it->second;
2398
- LoadReportState::LocalityState& locality_state =
2399
- load_report_state.locality_stats[locality];
2400
1688
  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
2401
- if (locality_state.locality_stats != nullptr) {
2402
- cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
2403
- }
2404
- if (cluster_locality_stats == nullptr) {
1689
+ {
1690
+ MutexLock lock(&mu_);
1691
+ // We jump through some hoops here to make sure that the const
1692
+ // XdsBootstrap::XdsServer& and absl::string_views
1693
+ // stored in the XdsClusterDropStats object point to the
1694
+ // XdsBootstrap::XdsServer and strings
1695
+ // in the load_report_map_ key, so that they have the same lifetime.
1696
+ auto server_it =
1697
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
1698
+ .first;
1699
+ if (server_it->second.channel_state == nullptr) {
1700
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1701
+ xds_server, "load report map (locality stats)");
1702
+ }
1703
+ auto load_report_it = server_it->second.load_report_map
1704
+ .emplace(std::move(key), LoadReportState())
1705
+ .first;
1706
+ LoadReportState& load_report_state = load_report_it->second;
1707
+ LoadReportState::LocalityState& locality_state =
1708
+ load_report_state.locality_stats[locality];
2405
1709
  if (locality_state.locality_stats != nullptr) {
2406
- locality_state.deleted_locality_stats +=
2407
- locality_state.locality_stats->GetSnapshotAndReset();
1710
+ cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
2408
1711
  }
2409
- cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
2410
- Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
2411
- it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
2412
- std::move(locality));
2413
- locality_state.locality_stats = cluster_locality_stats.get();
2414
- }
2415
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2416
- GPR_ASSERT(resource.ok());
2417
- auto a = authority_state_map_.find(resource->authority);
2418
- if (a != authority_state_map_.end()) {
2419
- a->second.channel_state->MaybeStartLrsCall();
1712
+ if (cluster_locality_stats == nullptr) {
1713
+ if (locality_state.locality_stats != nullptr) {
1714
+ locality_state.deleted_locality_stats +=
1715
+ locality_state.locality_stats->GetSnapshotAndReset();
1716
+ }
1717
+ cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
1718
+ Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
1719
+ load_report_it->first.first /*cluster_name*/,
1720
+ load_report_it->first.second /*eds_service_name*/,
1721
+ std::move(locality));
1722
+ locality_state.locality_stats = cluster_locality_stats.get();
1723
+ }
1724
+ server_it->second.channel_state->MaybeStartLrsCall();
2420
1725
  }
1726
+ work_serializer_.DrainQueue();
2421
1727
  return cluster_locality_stats;
2422
1728
  }
2423
1729
 
2424
1730
  void XdsClient::RemoveClusterLocalityStats(
2425
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
1731
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2426
1732
  absl::string_view eds_service_name,
2427
1733
  const RefCountedPtr<XdsLocalityName>& locality,
2428
1734
  XdsClusterLocalityStats* cluster_locality_stats) {
2429
1735
  MutexLock lock(&mu_);
2430
- // TODO(roth): When we add support for direct federation, use the
2431
- // server name specified in lrs_server.
2432
- auto it = load_report_map_.find(
1736
+ auto server_it = xds_load_report_server_map_.find(xds_server);
1737
+ if (server_it == xds_load_report_server_map_.end()) return;
1738
+ auto load_report_it = server_it->second.load_report_map.find(
2433
1739
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2434
- if (it == load_report_map_.end()) return;
2435
- LoadReportState& load_report_state = it->second;
1740
+ if (load_report_it == server_it->second.load_report_map.end()) return;
1741
+ LoadReportState& load_report_state = load_report_it->second;
2436
1742
  auto locality_it = load_report_state.locality_stats.find(locality);
2437
1743
  if (locality_it == load_report_state.locality_stats.end()) return;
2438
1744
  LoadReportState::LocalityState& locality_state = locality_it->second;
@@ -2448,48 +1754,81 @@ void XdsClient::RemoveClusterLocalityStats(
2448
1754
  void XdsClient::ResetBackoff() {
2449
1755
  MutexLock lock(&mu_);
2450
1756
  for (auto& p : xds_server_channel_map_) {
2451
- grpc_channel_reset_connect_backoff(p.second->channel());
1757
+ p.second->ResetBackoff();
2452
1758
  }
2453
1759
  }
2454
1760
 
2455
- void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2456
- for (const auto& a : authority_state_map_) {
2457
- for (const auto& p : a.second.listener_map) {
2458
- const ListenerState& listener_state = p.second;
2459
- for (const auto& p : listener_state.watchers) {
2460
- p.first->OnError(GRPC_ERROR_REF(error));
2461
- }
2462
- }
2463
- for (const auto& p : a.second.route_config_map) {
2464
- const RouteConfigState& route_config_state = p.second;
2465
- for (const auto& p : route_config_state.watchers) {
2466
- p.first->OnError(GRPC_ERROR_REF(error));
2467
- }
2468
- }
2469
- for (const auto& p : a.second.cluster_map) {
2470
- const ClusterState& cluster_state = p.second;
2471
- for (const auto& p : cluster_state.watchers) {
2472
- p.first->OnError(GRPC_ERROR_REF(error));
2473
- }
2474
- }
2475
- for (const auto& p : a.second.endpoint_map) {
2476
- const EndpointState& endpoint_state = p.second;
2477
- for (const auto& p : endpoint_state.watchers) {
2478
- p.first->OnError(GRPC_ERROR_REF(error));
1761
+ void XdsClient::NotifyOnErrorLocked(absl::Status status) {
1762
+ const auto* node = bootstrap_->node();
1763
+ if (node != nullptr) {
1764
+ status = absl::Status(
1765
+ status.code(), absl::StrCat(status.message(),
1766
+ " (node ID:", bootstrap_->node()->id, ")"));
1767
+ }
1768
+ std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
1769
+ for (const auto& a : authority_state_map_) { // authority
1770
+ for (const auto& t : a.second.resource_map) { // type
1771
+ for (const auto& r : t.second) { // resource id
1772
+ for (const auto& w : r.second.watchers) { // watchers
1773
+ watchers.insert(w.second);
1774
+ }
2479
1775
  }
2480
1776
  }
2481
1777
  }
2482
- GRPC_ERROR_UNREF(error);
1778
+ work_serializer_.Schedule(
1779
+ // TODO(yashykt): When we move to C++14, capture watchers using
1780
+ // std::move()
1781
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
1782
+ for (const auto& watcher : watchers) {
1783
+ watcher->OnError(status);
1784
+ }
1785
+ },
1786
+ DEBUG_LOCATION);
1787
+ }
1788
+
1789
+ void XdsClient::NotifyWatchersOnErrorLocked(
1790
+ const std::map<ResourceWatcherInterface*,
1791
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
1792
+ absl::Status status) {
1793
+ const auto* node = bootstrap_->node();
1794
+ if (node != nullptr) {
1795
+ status = absl::Status(
1796
+ status.code(), absl::StrCat(status.message(),
1797
+ " (node ID:", bootstrap_->node()->id, ")"));
1798
+ }
1799
+ work_serializer_.Schedule(
1800
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1801
+ for (const auto& p : watchers) {
1802
+ p.first->OnError(status);
1803
+ }
1804
+ },
1805
+ DEBUG_LOCATION);
1806
+ }
1807
+
1808
+ void XdsClient::NotifyWatchersOnResourceDoesNotExist(
1809
+ const std::map<ResourceWatcherInterface*,
1810
+ RefCountedPtr<ResourceWatcherInterface>>& watchers) {
1811
+ work_serializer_.Schedule(
1812
+ [watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1813
+ for (const auto& p : watchers) {
1814
+ p.first->OnResourceDoesNotExist();
1815
+ }
1816
+ },
1817
+ DEBUG_LOCATION);
2483
1818
  }
2484
1819
 
2485
1820
  XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2486
- bool send_all_clusters, const std::set<std::string>& clusters) {
1821
+ const XdsBootstrap::XdsServer& xds_server, bool send_all_clusters,
1822
+ const std::set<std::string>& clusters) {
2487
1823
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2488
1824
  gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
2489
1825
  }
2490
1826
  XdsApi::ClusterLoadReportMap snapshot_map;
2491
- for (auto load_report_it = load_report_map_.begin();
2492
- load_report_it != load_report_map_.end();) {
1827
+ auto server_it = xds_load_report_server_map_.find(xds_server);
1828
+ if (server_it == xds_load_report_server_map_.end()) return snapshot_map;
1829
+ auto& load_report_map = server_it->second.load_report_map;
1830
+ for (auto load_report_it = load_report_map.begin();
1831
+ load_report_it != load_report_map.end();) {
2493
1832
  // Cluster key is cluster and EDS service name.
2494
1833
  const auto& cluster_key = load_report_it->first;
2495
1834
  LoadReportState& load_report = load_report_it->second;
@@ -2544,7 +1883,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2544
1883
  }
2545
1884
  }
2546
1885
  // Compute load report interval.
2547
- const grpc_millis now = ExecCtx::Get()->Now();
1886
+ const Timestamp now = ExecCtx::Get()->Now();
2548
1887
  snapshot.load_report_interval = now - load_report.last_report_time;
2549
1888
  load_report.last_report_time = now;
2550
1889
  // Record snapshot.
@@ -2555,7 +1894,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2555
1894
  // deleted stats objects, remove the entry.
2556
1895
  if (load_report.locality_stats.empty() &&
2557
1896
  load_report.drop_stats == nullptr) {
2558
- load_report_it = load_report_map_.erase(load_report_it);
1897
+ load_report_it = load_report_map.erase(load_report_it);
2559
1898
  } else {
2560
1899
  ++load_report_it;
2561
1900
  }
@@ -2566,226 +1905,22 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2566
1905
  std::string XdsClient::DumpClientConfigBinary() {
2567
1906
  MutexLock lock(&mu_);
2568
1907
  XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
2569
- auto& lds_map = resource_type_metadata_map[XdsApi::kLdsTypeUrl];
2570
- auto& rds_map = resource_type_metadata_map[XdsApi::kRdsTypeUrl];
2571
- auto& cds_map = resource_type_metadata_map[XdsApi::kCdsTypeUrl];
2572
- auto& eds_map = resource_type_metadata_map[XdsApi::kEdsTypeUrl];
2573
- for (auto& a : authority_state_map_) {
1908
+ for (const auto& a : authority_state_map_) { // authority
2574
1909
  const std::string& authority = a.first;
2575
- // Collect resource metadata from listeners
2576
- for (auto& p : a.second.listener_map) {
2577
- const std::string& listener_name = p.first;
2578
- lds_map[XdsApi::ConstructFullResourceName(
2579
- authority, XdsApi::kLdsTypeUrl, listener_name)] = &p.second.meta;
2580
- }
2581
- // Collect resource metadata from route configs
2582
- for (auto& p : a.second.route_config_map) {
2583
- const std::string& route_config_name = p.first;
2584
- rds_map[XdsApi::ConstructFullResourceName(
2585
- authority, XdsApi::kRdsTypeUrl, route_config_name)] = &p.second.meta;
2586
- }
2587
- // Collect resource metadata from clusters
2588
- for (auto& p : a.second.cluster_map) {
2589
- const std::string& cluster_name = p.first;
2590
- cds_map[XdsApi::ConstructFullResourceName(authority, XdsApi::kCdsTypeUrl,
2591
- cluster_name)] = &p.second.meta;
2592
- }
2593
- // Collect resource metadata from endpoints
2594
- for (auto& p : a.second.endpoint_map) {
2595
- const std::string& endpoint_name = p.first;
2596
- eds_map[XdsApi::ConstructFullResourceName(
2597
- authority, XdsApi::kEdsTypeUrl, endpoint_name)] = &p.second.meta;
1910
+ for (const auto& t : a.second.resource_map) { // type
1911
+ const XdsResourceType* type = t.first;
1912
+ auto& resource_metadata_map =
1913
+ resource_type_metadata_map[type->type_url()];
1914
+ for (const auto& r : t.second) { // resource id
1915
+ const XdsResourceKey& resource_key = r.first;
1916
+ const ResourceState& resource_state = r.second;
1917
+ resource_metadata_map[ConstructFullXdsResourceName(
1918
+ authority, type->type_url(), resource_key)] = &resource_state.meta;
1919
+ }
2598
1920
  }
2599
1921
  }
2600
1922
  // Assemble config dump messages
2601
1923
  return api_.AssembleClientConfig(resource_type_metadata_map);
2602
1924
  }
2603
1925
 
2604
- //
2605
- // accessors for global state
2606
- //
2607
-
2608
- void XdsClientGlobalInit() {
2609
- g_mu = new Mutex;
2610
- XdsHttpFilterRegistry::Init();
2611
- }
2612
-
2613
- // TODO(roth): Find a better way to clear the fallback config that does
2614
- // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2615
- void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2616
- gpr_free(g_fallback_bootstrap_config);
2617
- g_fallback_bootstrap_config = nullptr;
2618
- delete g_mu;
2619
- g_mu = nullptr;
2620
- XdsHttpFilterRegistry::Shutdown();
2621
- }
2622
-
2623
- namespace {
2624
-
2625
- std::string GetBootstrapContents(const char* fallback_config,
2626
- grpc_error_handle* error) {
2627
- // First, try GRPC_XDS_BOOTSTRAP env var.
2628
- grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2629
- if (path != nullptr) {
2630
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2631
- gpr_log(GPR_INFO,
2632
- "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2633
- "environment variable: %s",
2634
- path.get());
2635
- }
2636
- grpc_slice contents;
2637
- *error =
2638
- grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2639
- if (*error != GRPC_ERROR_NONE) return "";
2640
- std::string contents_str(StringViewFromSlice(contents));
2641
- grpc_slice_unref_internal(contents);
2642
- return contents_str;
2643
- }
2644
- // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2645
- grpc_core::UniquePtr<char> env_config(
2646
- gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2647
- if (env_config != nullptr) {
2648
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2649
- gpr_log(GPR_INFO,
2650
- "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2651
- "environment variable");
2652
- }
2653
- return env_config.get();
2654
- }
2655
- // Finally, try fallback config.
2656
- if (fallback_config != nullptr) {
2657
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2658
- gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2659
- }
2660
- return fallback_config;
2661
- }
2662
- // No bootstrap config found.
2663
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2664
- "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2665
- "not defined");
2666
- return "";
2667
- }
2668
-
2669
- } // namespace
2670
-
2671
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2672
- grpc_error_handle* error) {
2673
- RefCountedPtr<XdsClient> xds_client;
2674
- // If getting bootstrap from channel args, create a local XdsClient
2675
- // instance for the channel or server instead of using the global instance.
2676
- const char* bootstrap_config = grpc_channel_args_find_string(
2677
- args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2678
- if (bootstrap_config != nullptr) {
2679
- std::unique_ptr<XdsBootstrap> bootstrap =
2680
- XdsBootstrap::Create(bootstrap_config, error);
2681
- if (*error == GRPC_ERROR_NONE) {
2682
- grpc_channel_args* xds_channel_args =
2683
- grpc_channel_args_find_pointer<grpc_channel_args>(
2684
- args,
2685
- GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2686
- return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2687
- }
2688
- return nullptr;
2689
- }
2690
- // Otherwise, use the global instance.
2691
- {
2692
- MutexLock lock(g_mu);
2693
- if (g_xds_client != nullptr) {
2694
- auto xds_client = g_xds_client->RefIfNonZero();
2695
- if (xds_client != nullptr) return xds_client;
2696
- }
2697
- // Find bootstrap contents.
2698
- std::string bootstrap_contents =
2699
- GetBootstrapContents(g_fallback_bootstrap_config, error);
2700
- if (*error != GRPC_ERROR_NONE) return nullptr;
2701
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2702
- gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2703
- bootstrap_contents.c_str());
2704
- }
2705
- // Parse bootstrap.
2706
- std::unique_ptr<XdsBootstrap> bootstrap =
2707
- XdsBootstrap::Create(bootstrap_contents, error);
2708
- if (*error != GRPC_ERROR_NONE) return nullptr;
2709
- // Instantiate XdsClient.
2710
- xds_client =
2711
- MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2712
- g_xds_client = xds_client.get();
2713
- }
2714
- return xds_client;
2715
- }
2716
-
2717
- namespace internal {
2718
-
2719
- void SetXdsChannelArgsForTest(grpc_channel_args* args) {
2720
- MutexLock lock(g_mu);
2721
- g_channel_args = args;
2722
- }
2723
-
2724
- void UnsetGlobalXdsClientForTest() {
2725
- MutexLock lock(g_mu);
2726
- g_xds_client = nullptr;
2727
- }
2728
-
2729
- void SetXdsFallbackBootstrapConfig(const char* config) {
2730
- MutexLock lock(g_mu);
2731
- gpr_free(g_fallback_bootstrap_config);
2732
- g_fallback_bootstrap_config = gpr_strdup(config);
2733
- }
2734
-
2735
- } // namespace internal
2736
-
2737
- //
2738
- // embedding XdsClient in channel args
2739
- //
2740
-
2741
- #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2742
-
2743
- namespace {
2744
-
2745
- void* XdsClientArgCopy(void* p) {
2746
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2747
- xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2748
- return p;
2749
- }
2750
-
2751
- void XdsClientArgDestroy(void* p) {
2752
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2753
- xds_client->Unref(DEBUG_LOCATION, "channel arg");
2754
- }
2755
-
2756
- int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
2757
-
2758
- const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2759
- XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2760
-
2761
- } // namespace
2762
-
2763
- grpc_arg XdsClient::MakeChannelArg() const {
2764
- return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2765
- const_cast<XdsClient*>(this),
2766
- &kXdsClientArgVtable);
2767
- }
2768
-
2769
- RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2770
- const grpc_channel_args& args) {
2771
- XdsClient* xds_client =
2772
- grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2773
- if (xds_client == nullptr) return nullptr;
2774
- return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2775
- }
2776
-
2777
1926
  } // namespace grpc_core
2778
-
2779
- // The returned bytes may contain NULL(0), so we can't use c-string.
2780
- grpc_slice grpc_dump_xds_configs() {
2781
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2782
- grpc_core::ExecCtx exec_ctx;
2783
- grpc_error_handle error = GRPC_ERROR_NONE;
2784
- auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2785
- if (error != GRPC_ERROR_NONE) {
2786
- // If we isn't using xDS, just return an empty string.
2787
- GRPC_ERROR_UNREF(error);
2788
- return grpc_empty_slice();
2789
- }
2790
- return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
2791
- }