grpc 1.42.0 → 1.46.3

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 (1531) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +425 -234
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc.h +40 -14
  8. data/include/grpc/grpc_posix.h +20 -19
  9. data/include/grpc/grpc_security.h +312 -195
  10. data/include/grpc/grpc_security_constants.h +1 -14
  11. data/include/grpc/impl/codegen/compression_types.h +0 -2
  12. data/include/grpc/impl/codegen/grpc_types.h +24 -21
  13. data/include/grpc/impl/codegen/port_platform.h +7 -3
  14. data/include/grpc/impl/codegen/slice.h +4 -1
  15. data/include/grpc/slice.h +0 -11
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  17. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  18. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  19. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +5 -5
  20. data/src/core/ext/filters/client_channel/backend_metric.cc +9 -10
  21. data/src/core/ext/filters/client_channel/backend_metric.h +4 -3
  22. data/src/core/ext/filters/client_channel/backup_poller.cc +12 -8
  23. data/src/core/ext/filters/client_channel/channel_connectivity.cc +5 -5
  24. data/src/core/ext/filters/client_channel/client_channel.cc +367 -243
  25. data/src/core/ext/filters/client_channel/client_channel.h +45 -41
  26. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +6 -13
  27. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  28. data/src/core/ext/filters/client_channel/connector.h +1 -1
  29. data/src/core/ext/filters/client_channel/dynamic_filters.cc +5 -6
  30. data/src/core/ext/filters/client_channel/dynamic_filters.h +2 -2
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -22
  32. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -15
  33. data/src/core/ext/filters/client_channel/health/health_check_client.cc +126 -582
  34. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
  35. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +22 -27
  36. data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
  37. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  40. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +4 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +100 -81
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +15 -15
  47. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -4
  48. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +50 -32
  49. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +199 -150
  50. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +123 -76
  51. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +162 -122
  52. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  53. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  54. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +98 -63
  55. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +104 -145
  56. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +147 -70
  58. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +19 -10
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +323 -470
  60. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  61. data/src/core/ext/filters/client_channel/lb_policy.h +94 -62
  62. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +10 -16
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +287 -313
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  65. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  66. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +31 -50
  67. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +136 -226
  68. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  69. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  70. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +92 -255
  71. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -17
  72. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  73. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +84 -68
  74. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  75. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  76. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +40 -39
  77. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +476 -412
  78. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -11
  79. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +13 -7
  80. data/src/core/ext/filters/client_channel/retry_filter.cc +253 -171
  81. data/src/core/ext/filters/client_channel/retry_service_config.cc +16 -18
  82. data/src/core/ext/filters/client_channel/retry_service_config.h +18 -12
  83. data/src/core/ext/filters/client_channel/retry_throttle.cc +9 -23
  84. data/src/core/ext/filters/client_channel/retry_throttle.h +11 -5
  85. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +8 -7
  86. data/src/core/ext/filters/client_channel/subchannel.cc +52 -59
  87. data/src/core/ext/filters/client_channel/subchannel.h +7 -7
  88. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  89. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  90. data/src/core/ext/filters/deadline/deadline_filter.cc +15 -14
  91. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  92. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +155 -400
  93. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  94. data/src/core/ext/filters/fault_injection/service_config_parser.cc +11 -13
  95. data/src/core/ext/filters/fault_injection/service_config_parser.h +10 -4
  96. data/src/core/ext/filters/http/client/http_client_filter.cc +81 -544
  97. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  98. data/src/core/ext/filters/http/client_authority_filter.cc +31 -95
  99. data/src/core/ext/filters/http/client_authority_filter.h +24 -5
  100. data/src/core/ext/filters/http/http_filters_plugin.cc +22 -22
  101. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +43 -140
  102. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +15 -27
  103. data/src/core/ext/filters/http/server/http_server_filter.cc +36 -251
  104. data/src/core/ext/filters/message_size/message_size_filter.cc +27 -35
  105. data/src/core/ext/filters/message_size/message_size_filter.h +10 -3
  106. data/src/core/ext/filters/rbac/rbac_filter.cc +162 -0
  107. data/src/core/ext/filters/rbac/rbac_filter.h +76 -0
  108. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +606 -0
  109. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +75 -0
  110. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +61 -0
  111. data/src/core/ext/filters/server_config_selector/server_config_selector.h +71 -0
  112. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +143 -0
  113. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → filters/server_config_selector/server_config_selector_filter.h} +9 -7
  114. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +239 -20
  115. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  116. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +286 -108
  117. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +327 -303
  118. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +9 -4
  119. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  120. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  121. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -10
  122. data/src/core/ext/transport/chttp2/transport/flow_control.h +5 -5
  123. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  124. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  125. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -0
  126. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +361 -240
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +87 -145
  129. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  130. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  131. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +74 -149
  132. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  133. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  134. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  135. data/src/core/ext/transport/chttp2/transport/internal.h +16 -43
  136. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -9
  137. data/src/core/ext/transport/chttp2/transport/writing.cc +81 -136
  138. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  139. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -81
  140. data/src/core/ext/transport/inproc/inproc_transport.h +1 -4
  141. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  142. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +482 -0
  143. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  144. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +553 -0
  145. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +247 -209
  146. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1249 -684
  147. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  148. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +151 -0
  149. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +62 -0
  150. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +160 -0
  151. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  152. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +124 -0
  153. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  154. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +102 -0
  155. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  156. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +97 -0
  157. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  158. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +605 -0
  159. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  160. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +103 -0
  161. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +43 -0
  162. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +51 -0
  163. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +30 -4
  164. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +50 -17
  165. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +143 -116
  166. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +670 -385
  167. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +239 -199
  168. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1270 -663
  169. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +49 -28
  170. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +201 -90
  171. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +320 -271
  172. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1671 -826
  173. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +20 -7
  174. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +43 -23
  175. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +60 -27
  176. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +273 -98
  177. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  178. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1381 -0
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +74 -53
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +355 -189
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +21 -7
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +46 -24
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +213 -176
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1069 -581
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +105 -45
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +526 -166
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +19 -6
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +39 -23
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +16 -22
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +42 -100
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +151 -0
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +145 -117
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +769 -409
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +141 -92
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +737 -348
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +21 -8
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +58 -30
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +203 -125
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +993 -396
  201. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +17 -4
  202. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +29 -16
  203. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +27 -13
  204. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +84 -48
  205. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +22 -9
  206. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +76 -33
  207. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +26 -13
  208. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +94 -48
  209. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +21 -8
  210. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +47 -25
  211. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +51 -35
  212. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +195 -108
  213. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +74 -55
  214. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +350 -189
  215. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +70 -53
  216. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +358 -187
  217. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +19 -6
  218. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +35 -20
  219. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +98 -71
  220. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +504 -258
  221. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +104 -79
  222. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +561 -300
  223. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +31 -16
  224. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +105 -48
  225. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +24 -10
  226. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +66 -39
  227. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  228. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +136 -0
  229. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +82 -61
  230. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +414 -234
  231. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +86 -65
  232. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +407 -236
  233. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +127 -103
  234. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +563 -293
  235. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +53 -34
  236. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +272 -141
  237. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +663 -572
  238. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +3643 -1900
  239. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +38 -19
  240. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +149 -71
  241. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +222 -0
  242. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1052 -0
  243. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  244. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +88 -0
  245. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  246. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +103 -0
  247. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +27 -13
  248. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +78 -45
  249. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  250. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +134 -0
  251. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  252. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +250 -0
  253. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  254. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +94 -0
  255. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  256. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +213 -0
  257. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +32 -0
  258. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +42 -0
  259. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  260. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +218 -0
  261. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  262. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +146 -0
  263. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +17 -4
  264. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +35 -23
  265. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +45 -28
  266. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +188 -111
  267. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +51 -36
  268. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +261 -131
  269. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +64 -0
  270. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +183 -0
  271. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +26 -13
  272. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +87 -42
  273. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +283 -223
  274. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1554 -733
  275. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +9 -0
  276. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -3
  277. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +105 -60
  278. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +555 -234
  279. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +41 -26
  280. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +157 -86
  281. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +126 -83
  282. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +623 -262
  283. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  284. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +160 -0
  285. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +15 -2
  286. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +22 -14
  287. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +91 -72
  288. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +475 -255
  289. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +31 -17
  290. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +108 -61
  291. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +73 -56
  292. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +348 -185
  293. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  294. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +112 -0
  295. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +34 -18
  296. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +124 -80
  297. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  298. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +214 -0
  299. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +28 -14
  300. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +100 -56
  301. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +21 -8
  302. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +51 -30
  303. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +20 -7
  304. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +49 -26
  305. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +19 -6
  306. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +39 -23
  307. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +35 -20
  308. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +118 -68
  309. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +31 -17
  310. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +124 -64
  311. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +26 -12
  312. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +86 -52
  313. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +37 -22
  314. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +151 -82
  315. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +50 -31
  316. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +230 -144
  317. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +53 -36
  318. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +236 -130
  319. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  320. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +201 -0
  321. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +9 -0
  322. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -0
  323. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  324. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +139 -0
  325. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +23 -9
  326. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +63 -35
  327. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +30 -15
  328. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +99 -51
  329. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  330. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  331. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +19 -6
  332. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +41 -18
  333. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  334. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +127 -0
  335. data/src/core/ext/upb-generated/google/api/annotations.upb.c +22 -0
  336. data/src/core/ext/upb-generated/google/api/annotations.upb.h +23 -0
  337. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +154 -125
  338. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +721 -381
  339. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +158 -126
  340. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +796 -401
  341. data/src/core/ext/upb-generated/google/api/http.upb.c +43 -28
  342. data/src/core/ext/upb-generated/google/api/http.upb.h +217 -114
  343. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  344. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +111 -0
  345. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +18 -5
  346. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +39 -21
  347. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +373 -282
  348. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2077 -1029
  349. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +18 -5
  350. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +37 -19
  351. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +15 -2
  352. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +22 -14
  353. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +47 -31
  354. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +178 -92
  355. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +18 -5
  356. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +37 -19
  357. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +57 -36
  358. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +241 -148
  359. data/src/core/ext/upb-generated/google/rpc/status.upb.c +21 -8
  360. data/src/core/ext/upb-generated/google/rpc/status.upb.h +53 -29
  361. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  362. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +319 -0
  363. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +32 -18
  364. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +104 -47
  365. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +135 -107
  366. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +686 -358
  367. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +27 -12
  368. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +77 -40
  369. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +22 -8
  370. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +57 -34
  371. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +81 -61
  372. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +399 -237
  373. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +34 -19
  374. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +116 -62
  375. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  376. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  377. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +75 -13
  378. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +194 -56
  379. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -5
  380. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +55 -17
  381. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +21 -0
  382. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +16 -0
  383. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +31 -5
  384. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +57 -19
  385. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +30 -4
  386. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +50 -17
  387. data/src/core/ext/upb-generated/validate/validate.upb.c +406 -310
  388. data/src/core/ext/upb-generated/validate/validate.upb.h +2730 -1164
  389. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  390. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +278 -0
  391. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  392. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +108 -0
  393. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  394. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  395. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +64 -17
  396. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +175 -67
  397. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  398. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +99 -0
  399. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +17 -4
  400. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +31 -18
  401. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +30 -16
  402. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +99 -54
  403. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +25 -11
  404. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +54 -29
  405. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  406. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +103 -0
  407. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +22 -9
  408. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +56 -29
  409. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +33 -19
  410. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +131 -69
  411. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +22 -9
  412. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +59 -29
  413. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +36 -21
  414. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +102 -45
  415. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  416. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +878 -0
  417. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  418. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +143 -0
  419. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  420. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +218 -0
  421. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +20 -7
  422. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +43 -23
  423. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  424. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  425. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  426. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  427. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +16 -61
  428. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +67 -67
  429. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  430. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  431. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +53 -0
  432. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  433. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  434. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  435. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  436. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  437. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  438. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  439. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  440. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  441. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  442. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  443. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +10 -8
  444. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  445. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +10 -13
  446. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  447. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +22 -52
  448. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  449. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +250 -281
  450. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  451. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +60 -62
  452. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  453. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +387 -426
  454. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  455. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +16 -18
  456. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  457. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +25 -23
  458. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  459. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  460. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  461. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +17 -32
  462. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  463. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +17 -19
  464. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  465. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +87 -133
  466. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  467. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +140 -116
  468. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +26 -16
  469. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +16 -19
  470. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  471. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +24 -43
  472. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +4 -9
  473. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  474. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  475. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +23 -51
  476. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  477. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +179 -187
  478. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +30 -25
  479. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +16 -19
  480. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  481. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +252 -254
  482. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  483. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +14 -16
  484. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  485. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +16 -20
  486. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  487. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +16 -18
  488. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  489. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +20 -22
  490. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  491. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +15 -18
  492. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  493. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +20 -28
  494. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  495. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +21 -33
  496. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  497. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +20 -30
  498. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  499. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +16 -18
  500. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  501. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +54 -62
  502. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +19 -19
  503. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +155 -166
  504. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  505. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +21 -23
  506. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  507. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +17 -21
  508. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  509. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  510. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  511. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +19 -35
  512. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  513. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +19 -37
  514. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  515. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +190 -0
  516. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  517. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +38 -38
  518. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +10 -10
  519. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -914
  520. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +160 -160
  521. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +54 -48
  522. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  523. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +188 -0
  524. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +85 -0
  525. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  526. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  527. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  528. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  529. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +17 -21
  530. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  531. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  532. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  533. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  534. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  535. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  536. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  537. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  538. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  539. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +57 -0
  540. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  541. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  542. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  543. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  544. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  545. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +17 -18
  546. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  547. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +19 -29
  548. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  549. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +20 -26
  550. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  551. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +59 -0
  552. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  553. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +19 -20
  554. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  555. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +199 -215
  556. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +63 -58
  557. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +17 -13
  558. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  559. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +171 -157
  560. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  561. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +21 -27
  562. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  563. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +219 -216
  564. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +24 -19
  565. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  566. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  567. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +16 -18
  568. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  569. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +19 -33
  570. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +22 -22
  571. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +18 -22
  572. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  573. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +22 -32
  574. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  575. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  576. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  577. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +15 -23
  578. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  579. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  580. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  581. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +17 -21
  582. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  583. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +17 -19
  584. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  585. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +17 -19
  586. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  587. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +17 -19
  588. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  589. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +17 -23
  590. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  591. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +17 -21
  592. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  593. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +16 -21
  594. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  595. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +18 -24
  596. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  597. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +15 -29
  598. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  599. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +16 -26
  600. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  601. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  602. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  603. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +12 -10
  604. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  605. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  606. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  607. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +14 -19
  608. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  609. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +13 -19
  610. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  611. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  612. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  613. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +13 -16
  614. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  615. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  616. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  617. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +7 -7
  618. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  619. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  620. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  621. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  622. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  623. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +5 -14
  624. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  625. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  626. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  627. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +5 -10
  628. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  629. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +5 -62
  630. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  631. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +5 -10
  632. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  633. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +5 -10
  634. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  635. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +5 -16
  636. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  637. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +5 -10
  638. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  639. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +5 -26
  640. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  641. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +6 -11
  642. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  643. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  644. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  645. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  646. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  647. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +6 -15
  648. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  649. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +7 -12
  650. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  651. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -6
  652. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  653. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +6 -11
  654. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  655. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +6 -11
  656. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  657. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +8 -57
  658. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  659. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  660. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  661. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  662. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  663. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  664. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  665. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +6 -17
  666. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  667. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  668. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  669. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +7 -12
  670. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  671. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +9 -16
  672. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  673. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +6 -13
  674. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  675. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  676. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  677. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +8 -13
  678. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  679. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +8 -15
  680. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  681. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +8 -13
  682. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  683. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  684. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  685. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  686. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  687. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  688. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  689. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +7 -12
  690. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  691. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  692. data/src/core/ext/xds/certificate_provider_store.cc +8 -0
  693. data/src/core/ext/xds/certificate_provider_store.h +10 -1
  694. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -4
  695. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  696. data/src/core/ext/xds/upb_utils.h +67 -0
  697. data/src/core/ext/xds/xds_api.cc +182 -3417
  698. data/src/core/ext/xds/xds_api.h +60 -613
  699. data/src/core/ext/xds/xds_bootstrap.cc +222 -123
  700. data/src/core/ext/xds/xds_bootstrap.h +33 -15
  701. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  702. data/src/core/ext/xds/xds_certificate_provider.h +10 -2
  703. data/src/core/ext/xds/xds_channel_stack_modifier.cc +16 -20
  704. data/src/core/ext/xds/xds_channel_stack_modifier.h +4 -3
  705. data/src/core/ext/xds/xds_client.cc +805 -1084
  706. data/src/core/ext/xds/xds_client.h +118 -150
  707. data/src/core/ext/xds/xds_client_stats.cc +15 -15
  708. data/src/core/ext/xds/xds_client_stats.h +5 -4
  709. data/src/core/ext/xds/xds_cluster.cc +453 -0
  710. data/src/core/ext/xds/xds_cluster.h +108 -0
  711. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  712. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  713. data/src/core/ext/xds/xds_common_types.cc +388 -0
  714. data/src/core/ext/xds/xds_common_types.h +95 -0
  715. data/src/core/ext/xds/xds_endpoint.cc +371 -0
  716. data/src/core/ext/xds/xds_endpoint.h +135 -0
  717. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -7
  718. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  719. data/src/core/ext/xds/xds_http_filters.cc +11 -5
  720. data/src/core/ext/xds/xds_http_filters.h +4 -4
  721. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  722. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  723. data/src/core/ext/xds/xds_listener.cc +1039 -0
  724. data/src/core/ext/xds/xds_listener.h +220 -0
  725. data/src/core/ext/xds/xds_resource_type.cc +33 -0
  726. data/src/core/ext/xds/xds_resource_type.h +98 -0
  727. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  728. data/src/core/ext/xds/xds_route_config.cc +1122 -0
  729. data/src/core/ext/xds/xds_route_config.h +218 -0
  730. data/src/core/ext/xds/xds_routing.cc +250 -0
  731. data/src/core/ext/xds/xds_routing.h +101 -0
  732. data/src/core/ext/xds/xds_server_config_fetcher.cc +1056 -286
  733. data/src/core/lib/address_utils/parse_address.cc +20 -0
  734. data/src/core/lib/address_utils/parse_address.h +5 -0
  735. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  736. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  737. data/src/core/lib/avl/avl.h +452 -88
  738. data/src/core/lib/backoff/backoff.cc +9 -38
  739. data/src/core/lib/backoff/backoff.h +11 -11
  740. data/src/core/lib/channel/call_finalization.h +86 -0
  741. data/src/core/lib/channel/call_tracer.h +4 -1
  742. data/src/core/lib/channel/channel_args.cc +166 -28
  743. data/src/core/lib/channel/channel_args.h +214 -10
  744. data/src/core/lib/channel/channel_args_preconditioning.cc +42 -0
  745. data/src/core/lib/channel/channel_args_preconditioning.h +61 -0
  746. data/src/core/lib/channel/channel_stack.cc +10 -3
  747. data/src/core/lib/channel/channel_stack.h +39 -6
  748. data/src/core/lib/channel/channel_stack_builder.cc +23 -272
  749. data/src/core/lib/channel/channel_stack_builder.h +118 -149
  750. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  751. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  752. data/src/core/lib/channel/channel_trace.cc +3 -6
  753. data/src/core/lib/channel/channelz.cc +2 -1
  754. data/src/core/lib/channel/connected_channel.cc +9 -4
  755. data/src/core/lib/channel/connected_channel.h +2 -1
  756. data/src/core/lib/channel/context.h +11 -0
  757. data/src/core/lib/channel/handshaker.cc +1 -1
  758. data/src/core/lib/channel/handshaker.h +1 -1
  759. data/src/core/lib/channel/promise_based_filter.cc +1002 -0
  760. data/src/core/lib/channel/promise_based_filter.h +437 -0
  761. data/src/core/lib/compression/compression.cc +20 -112
  762. data/src/core/lib/compression/compression_internal.cc +137 -203
  763. data/src/core/lib/compression/compression_internal.h +64 -69
  764. data/src/core/lib/compression/message_compress.cc +11 -11
  765. data/src/core/lib/compression/message_compress.h +2 -2
  766. data/src/core/lib/config/core_configuration.cc +11 -3
  767. data/src/core/lib/config/core_configuration.h +50 -0
  768. data/src/core/lib/debug/stats_data.cc +2 -6
  769. data/src/core/lib/debug/stats_data.h +18 -21
  770. data/src/core/lib/debug/trace.h +2 -2
  771. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  772. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  773. data/src/core/lib/event_engine/default_event_engine_factory.cc +27 -0
  774. data/src/core/lib/event_engine/event_engine.cc +21 -19
  775. data/src/core/lib/event_engine/event_engine_factory.h +36 -0
  776. data/src/core/lib/event_engine/memory_allocator.cc +66 -0
  777. data/src/core/lib/event_engine/resolved_address.cc +39 -0
  778. data/src/core/lib/gpr/sync_posix.cc +1 -0
  779. data/src/core/lib/gpr/time.cc +2 -1
  780. data/src/core/lib/gpr/tls.h +7 -0
  781. data/src/core/lib/gpr/useful.h +18 -0
  782. data/src/core/lib/gprpp/bitset.h +19 -0
  783. data/src/core/lib/gprpp/capture.h +76 -0
  784. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  785. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  786. data/src/core/lib/gprpp/debug_location.h +2 -0
  787. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  788. data/src/core/lib/gprpp/global_config_env.h +2 -2
  789. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  790. data/src/core/lib/gprpp/orphanable.h +1 -1
  791. data/src/core/lib/gprpp/ref_counted.h +3 -1
  792. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  793. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  794. data/src/core/lib/gprpp/status_helper.cc +48 -40
  795. data/src/core/lib/gprpp/status_helper.h +6 -19
  796. data/src/core/lib/gprpp/table.h +24 -1
  797. data/src/core/lib/gprpp/time.cc +198 -0
  798. data/src/core/lib/gprpp/time.h +292 -0
  799. data/src/core/lib/http/format_request.cc +28 -25
  800. data/src/core/lib/http/format_request.h +7 -6
  801. data/src/core/lib/http/httpcli.cc +310 -238
  802. data/src/core/lib/http/httpcli.h +183 -88
  803. data/src/core/lib/http/httpcli_security_connector.cc +64 -75
  804. data/src/core/lib/http/httpcli_ssl_credentials.h +37 -0
  805. data/src/core/lib/http/parser.cc +80 -9
  806. data/src/core/lib/http/parser.h +15 -2
  807. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  808. data/src/core/lib/iomgr/buffer_list.h +18 -18
  809. data/src/core/lib/iomgr/call_combiner.cc +17 -7
  810. data/src/core/lib/iomgr/closure.h +29 -9
  811. data/src/core/lib/iomgr/combiner.cc +25 -3
  812. data/src/core/lib/iomgr/endpoint.h +0 -1
  813. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  814. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  815. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  816. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  817. data/src/core/lib/iomgr/error.cc +13 -10
  818. data/src/core/lib/iomgr/error.h +0 -2
  819. data/src/core/lib/iomgr/ev_apple.cc +6 -5
  820. data/src/core/lib/iomgr/ev_epoll1_linux.cc +8 -7
  821. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -7
  822. data/src/core/lib/iomgr/ev_posix.cc +9 -10
  823. data/src/core/lib/iomgr/ev_posix.h +1 -1
  824. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  825. data/src/core/lib/iomgr/event_engine/iomgr.cc +8 -27
  826. data/src/core/lib/iomgr/event_engine/pollset.cc +2 -3
  827. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  828. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  829. data/src/core/lib/iomgr/event_engine/resolver.cc +68 -49
  830. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  831. data/src/core/lib/iomgr/event_engine/tcp.cc +11 -8
  832. data/src/core/lib/iomgr/event_engine/timer.cc +7 -7
  833. data/src/core/lib/iomgr/exec_ctx.cc +25 -97
  834. data/src/core/lib/iomgr/exec_ctx.h +18 -34
  835. data/src/core/lib/iomgr/executor.cc +22 -16
  836. data/src/core/lib/iomgr/executor.h +1 -1
  837. data/src/core/lib/iomgr/fork_posix.cc +2 -1
  838. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  839. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  840. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  841. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  842. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  843. data/src/core/lib/iomgr/polling_entity.h +6 -0
  844. data/src/core/lib/iomgr/pollset.cc +1 -1
  845. data/src/core/lib/iomgr/pollset.h +4 -4
  846. data/src/core/lib/iomgr/pollset_windows.cc +2 -2
  847. data/src/core/lib/iomgr/port.h +6 -11
  848. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  849. data/src/core/lib/iomgr/resolve_address.h +47 -44
  850. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  851. data/src/core/lib/iomgr/resolve_address_posix.cc +83 -67
  852. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  853. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  854. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  855. data/src/core/lib/iomgr/resolved_address.h +39 -0
  856. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +62 -0
  857. data/src/core/lib/iomgr/socket_utils_common_posix.cc +0 -17
  858. data/src/core/lib/iomgr/tcp_client.cc +3 -5
  859. data/src/core/lib/iomgr/tcp_client.h +4 -5
  860. data/src/core/lib/iomgr/tcp_client_cfstream.cc +2 -10
  861. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -26
  862. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  863. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -11
  864. data/src/core/lib/iomgr/tcp_posix.cc +120 -66
  865. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  866. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  867. data/src/core/lib/iomgr/tcp_server.h +6 -8
  868. data/src/core/lib/iomgr/tcp_server_posix.cc +43 -38
  869. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  870. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  871. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  872. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  873. data/src/core/lib/iomgr/tcp_windows.cc +19 -17
  874. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  875. data/src/core/lib/iomgr/timer.cc +2 -2
  876. data/src/core/lib/iomgr/timer.h +11 -6
  877. data/src/core/lib/iomgr/timer_generic.cc +96 -77
  878. data/src/core/lib/iomgr/timer_manager.cc +15 -14
  879. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  880. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  881. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  882. data/src/core/lib/iomgr/work_serializer.cc +120 -44
  883. data/src/core/lib/iomgr/work_serializer.h +16 -4
  884. data/src/core/lib/json/json_reader.cc +83 -35
  885. data/src/core/lib/json/json_util.cc +5 -5
  886. data/src/core/lib/json/json_util.h +5 -5
  887. data/src/core/lib/matchers/matchers.cc +1 -1
  888. data/src/core/lib/promise/activity.cc +121 -0
  889. data/src/core/lib/promise/activity.h +540 -0
  890. data/src/core/lib/promise/arena_promise.h +188 -0
  891. data/src/core/lib/promise/call_push_pull.h +144 -0
  892. data/src/core/lib/promise/context.h +86 -0
  893. data/src/core/lib/promise/detail/basic_seq.h +496 -0
  894. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  895. data/src/core/lib/promise/detail/promise_like.h +85 -0
  896. data/src/core/lib/promise/detail/status.h +50 -0
  897. data/src/core/lib/promise/detail/switch.h +1455 -0
  898. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  899. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  900. data/src/core/lib/promise/latch.h +104 -0
  901. data/src/core/lib/promise/loop.h +134 -0
  902. data/src/core/lib/promise/map.h +88 -0
  903. data/src/core/lib/promise/poll.h +66 -0
  904. data/src/core/lib/promise/promise.h +95 -0
  905. data/src/core/lib/promise/race.h +84 -0
  906. data/src/core/lib/promise/seq.h +89 -0
  907. data/src/core/lib/promise/sleep.cc +74 -0
  908. data/src/core/lib/promise/sleep.h +66 -0
  909. data/src/core/lib/promise/try_seq.h +157 -0
  910. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  911. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  912. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +32 -31
  913. data/src/core/lib/resolver/resolver_registry.cc +156 -0
  914. data/src/core/lib/resolver/resolver_registry.h +113 -0
  915. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  916. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  917. data/src/core/lib/resource_quota/api.cc +83 -0
  918. data/src/core/lib/resource_quota/api.h +40 -0
  919. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  920. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  921. data/src/core/lib/resource_quota/memory_quota.cc +478 -0
  922. data/src/core/lib/resource_quota/memory_quota.h +457 -0
  923. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  924. data/src/core/lib/resource_quota/resource_quota.h +66 -0
  925. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  926. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  927. data/src/core/lib/resource_quota/trace.cc +19 -0
  928. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/resource_quota/trace.h} +6 -8
  929. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  930. data/src/core/lib/security/authorization/evaluate_args.cc +37 -38
  931. data/src/core/lib/security/authorization/evaluate_args.h +3 -2
  932. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  933. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  934. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +106 -0
  935. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +50 -0
  936. data/src/core/lib/security/authorization/matchers.cc +227 -0
  937. data/src/core/lib/security/authorization/matchers.h +211 -0
  938. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  939. data/src/core/lib/security/authorization/rbac_policy.h +171 -0
  940. data/src/core/lib/security/context/security_context.cc +4 -2
  941. data/src/core/lib/security/context/security_context.h +9 -2
  942. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  943. data/src/core/lib/security/credentials/alts/alts_credentials.h +10 -0
  944. data/src/core/lib/security/credentials/call_creds_util.cc +87 -0
  945. data/src/core/lib/security/credentials/call_creds_util.h +42 -0
  946. data/src/core/lib/security/credentials/channel_creds_registry.h +97 -0
  947. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +70 -0
  948. data/src/core/lib/security/credentials/composite/composite_credentials.cc +24 -83
  949. data/src/core/lib/security/credentials/composite/composite_credentials.h +23 -10
  950. data/src/core/lib/security/credentials/credentials.cc +2 -3
  951. data/src/core/lib/security/credentials/credentials.h +74 -80
  952. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +48 -33
  953. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  954. data/src/core/lib/security/credentials/external/external_account_credentials.cc +52 -35
  955. data/src/core/lib/security/credentials/external/external_account_credentials.h +5 -9
  956. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +0 -1
  957. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +33 -14
  958. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -0
  959. data/src/core/lib/security/credentials/fake/fake_credentials.cc +23 -27
  960. data/src/core/lib/security/credentials/fake/fake_credentials.h +22 -21
  961. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +21 -16
  962. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -3
  963. data/src/core/lib/security/credentials/iam/iam_credentials.cc +21 -28
  964. data/src/core/lib/security/credentials/iam/iam_credentials.h +15 -9
  965. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +25 -26
  966. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  967. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  968. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +33 -45
  969. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +16 -12
  970. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +54 -43
  971. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  972. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  973. data/src/core/lib/security/credentials/local/local_credentials.h +10 -0
  974. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +157 -174
  975. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +60 -33
  976. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +96 -152
  977. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +56 -27
  978. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -14
  979. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +14 -3
  980. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  981. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +56 -8
  982. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +209 -0
  983. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +145 -0
  984. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +33 -87
  985. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +73 -149
  986. data/src/core/lib/security/credentials/tls/tls_credentials.cc +30 -16
  987. data/src/core/lib/security/credentials/tls/tls_credentials.h +6 -0
  988. data/src/core/lib/security/credentials/xds/xds_credentials.cc +51 -58
  989. data/src/core/lib/security/credentials/xds/xds_credentials.h +37 -6
  990. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +11 -17
  991. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +3 -3
  992. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -16
  993. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +0 -2
  994. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +8 -18
  995. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +11 -16
  996. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  997. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -19
  998. data/src/core/lib/security/security_connector/security_connector.cc +3 -15
  999. data/src/core/lib/security/security_connector/security_connector.h +25 -21
  1000. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +10 -13
  1001. data/src/core/lib/security/security_connector/ssl_utils.cc +38 -32
  1002. data/src/core/lib/security/security_connector/ssl_utils.h +14 -18
  1003. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +365 -206
  1004. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +70 -47
  1005. data/src/core/lib/security/transport/auth_filters.h +38 -5
  1006. data/src/core/lib/security/transport/client_auth_filter.cc +97 -360
  1007. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  1008. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  1009. data/src/core/lib/security/transport/security_handshaker.cc +22 -12
  1010. data/src/core/lib/security/transport/server_auth_filter.cc +41 -35
  1011. data/src/core/lib/service_config/service_config.h +82 -0
  1012. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  1013. data/src/core/{ext/service_config/service_config.cc → lib/service_config/service_config_impl.cc} +20 -17
  1014. data/src/core/{ext/service_config/service_config.h → lib/service_config/service_config_impl.h} +16 -18
  1015. data/src/core/{ext → lib}/service_config/service_config_parser.cc +31 -27
  1016. data/src/core/{ext → lib}/service_config/service_config_parser.h +39 -30
  1017. data/src/core/lib/slice/percent_encoding.cc +30 -86
  1018. data/src/core/lib/slice/percent_encoding.h +5 -11
  1019. data/src/core/lib/slice/slice.cc +78 -181
  1020. data/src/core/lib/slice/slice.h +384 -0
  1021. data/src/core/lib/slice/slice_buffer.cc +4 -0
  1022. data/src/core/lib/slice/slice_internal.h +12 -31
  1023. data/src/core/lib/slice/slice_refcount.cc +18 -0
  1024. data/src/core/lib/slice/slice_refcount.h +8 -83
  1025. data/src/core/lib/slice/slice_refcount_base.h +21 -133
  1026. data/src/core/lib/surface/builtins.cc +6 -6
  1027. data/src/core/lib/surface/call.cc +1132 -1221
  1028. data/src/core/lib/surface/call.h +5 -19
  1029. data/src/core/lib/surface/channel.cc +68 -99
  1030. data/src/core/lib/surface/channel.h +12 -23
  1031. data/src/core/lib/surface/channel_init.cc +2 -3
  1032. data/src/core/lib/surface/channel_init.h +3 -7
  1033. data/src/core/lib/surface/completion_queue.cc +12 -11
  1034. data/src/core/lib/surface/init.cc +78 -10
  1035. data/src/core/lib/surface/init.h +0 -2
  1036. data/src/core/lib/surface/lame_client.cc +26 -19
  1037. data/src/core/lib/surface/server.cc +46 -85
  1038. data/src/core/lib/surface/server.h +14 -16
  1039. data/src/core/lib/surface/validate_metadata.cc +2 -2
  1040. data/src/core/lib/surface/version.cc +2 -2
  1041. data/src/core/lib/transport/bdp_estimator.cc +10 -11
  1042. data/src/core/lib/transport/bdp_estimator.h +2 -2
  1043. data/src/core/lib/transport/byte_stream.cc +6 -0
  1044. data/src/core/lib/transport/error_utils.cc +5 -3
  1045. data/src/core/lib/transport/error_utils.h +2 -1
  1046. data/src/core/lib/transport/metadata_batch.h +1131 -792
  1047. data/src/core/lib/transport/parsed_metadata.cc +37 -0
  1048. data/src/core/lib/transport/parsed_metadata.h +228 -90
  1049. data/src/core/lib/transport/pid_controller.cc +4 -4
  1050. data/src/core/lib/transport/status_conversion.cc +2 -2
  1051. data/src/core/lib/transport/status_conversion.h +1 -1
  1052. data/src/core/lib/transport/timeout_encoding.cc +204 -67
  1053. data/src/core/lib/transport/timeout_encoding.h +40 -10
  1054. data/src/core/lib/transport/transport.cc +7 -27
  1055. data/src/core/lib/transport/transport.h +103 -4
  1056. data/src/core/lib/transport/transport_impl.h +14 -0
  1057. data/src/core/lib/transport/transport_op_string.cc +5 -47
  1058. data/src/core/lib/uri/uri_parser.cc +237 -63
  1059. data/src/core/lib/uri/uri_parser.h +39 -23
  1060. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -92
  1061. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +85 -0
  1062. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +28 -23
  1063. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1064. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +21 -13
  1065. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -2
  1066. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1067. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  1068. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1069. data/src/core/tsi/local_transport_security.cc +16 -24
  1070. data/src/core/tsi/local_transport_security.h +1 -4
  1071. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +141 -0
  1072. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1073. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  1074. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  1075. data/src/core/tsi/ssl_transport_security.cc +210 -53
  1076. data/src/core/tsi/ssl_transport_security.h +47 -8
  1077. data/src/core/tsi/transport_security_interface.h +2 -0
  1078. data/src/ruby/ext/grpc/extconf.rb +10 -3
  1079. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  1080. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -34
  1081. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +39 -51
  1082. data/src/ruby/ext/grpc/rb_server.c +7 -4
  1083. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1084. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1085. data/src/ruby/lib/grpc/version.rb +1 -1
  1086. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1087. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  1088. data/src/ruby/pb/test/client.rb +769 -0
  1089. data/src/ruby/pb/test/server.rb +252 -0
  1090. data/src/ruby/pb/test/xds_client.rb +415 -0
  1091. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  1092. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  1093. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  1094. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  1095. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  1096. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  1097. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  1098. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  1099. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  1100. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  1101. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  1102. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  1103. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  1104. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  1105. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  1106. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  1107. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  1108. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  1109. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  1110. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  1111. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  1112. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  1113. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  1114. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  1115. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  1116. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1117. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  1118. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  1119. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1120. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  1121. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1122. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  1123. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  1124. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1125. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  1126. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  1127. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1128. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  1129. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  1130. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  1131. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1132. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1133. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  1134. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  1135. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1136. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1137. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  1138. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  1139. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  1140. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1141. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1142. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1143. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1144. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1145. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1146. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1147. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1148. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  1149. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  1150. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1151. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1152. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1153. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  1154. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1155. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1156. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1157. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1158. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1159. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  1160. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  1161. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1162. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  1163. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1164. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1165. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1166. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1167. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1168. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1169. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  1170. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1171. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1172. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  1173. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1174. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  1175. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  1176. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  1177. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1178. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1179. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1180. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1181. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  1182. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1183. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1184. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  1185. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  1186. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  1187. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  1188. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1189. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  1190. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1191. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1192. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  1193. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  1194. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1195. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  1196. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  1197. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  1198. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  1199. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  1200. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  1201. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  1202. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  1203. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  1204. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1205. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  1206. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  1207. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1208. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1209. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1210. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1211. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1212. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1213. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  1214. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1215. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  1216. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1217. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  1218. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1219. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  1220. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1221. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  1222. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1223. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  1224. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1225. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  1226. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1227. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  1228. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  1229. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1230. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1231. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  1232. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  1233. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1234. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  1235. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1236. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1237. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  1238. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  1239. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1240. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1241. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1242. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1243. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1244. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1245. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1246. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1247. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  1248. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1249. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1250. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  1251. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  1252. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1253. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1254. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1255. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1256. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1257. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1258. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  1259. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1260. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1261. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1262. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1263. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1264. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1265. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1269. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1270. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1271. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1272. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1273. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1274. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1275. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1276. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1277. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1278. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1279. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1280. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1281. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1282. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1283. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1284. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1285. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1286. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1287. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1288. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1289. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  1290. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1291. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  1292. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1293. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1294. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1295. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1296. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1297. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1298. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1299. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1300. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1301. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1302. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1303. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1304. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +29 -11
  1305. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  1306. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1307. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1308. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1309. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1310. data/third_party/cares/cares/{ares.h → include/ares.h} +73 -1
  1311. data/third_party/cares/cares/{ares_dns.h → include/ares_dns.h} +9 -0
  1312. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1313. data/third_party/cares/cares/{ares_version.h → include/ares_version.h} +3 -3
  1314. data/third_party/cares/cares/{ares__close_sockets.c → src/lib/ares__close_sockets.c} +2 -2
  1315. data/third_party/cares/cares/{ares__get_hostent.c → src/lib/ares__get_hostent.c} +1 -2
  1316. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1317. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1318. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1319. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1320. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1321. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1322. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1323. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1324. data/third_party/cares/cares/{ares_create_query.c → src/lib/ares_create_query.c} +8 -17
  1325. data/third_party/cares/cares/{ares_data.c → src/lib/ares_data.c} +18 -0
  1326. data/third_party/cares/cares/{ares_data.h → src/lib/ares_data.h} +2 -0
  1327. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1328. data/third_party/cares/cares/{ares_expand_name.c → src/lib/ares_expand_name.c} +114 -23
  1329. data/third_party/cares/cares/{ares_expand_string.c → src/lib/ares_expand_string.c} +2 -5
  1330. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1331. data/third_party/cares/cares/{ares_free_hostent.c → src/lib/ares_free_hostent.c} +6 -4
  1332. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1333. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1334. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1335. data/third_party/cares/cares/{ares_getenv.c → src/lib/ares_getenv.c} +0 -2
  1336. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1337. data/third_party/cares/cares/{ares_gethostbyaddr.c → src/lib/ares_gethostbyaddr.c} +2 -9
  1338. data/third_party/cares/cares/{ares_gethostbyname.c → src/lib/ares_gethostbyname.c} +25 -20
  1339. data/third_party/cares/cares/{ares_getnameinfo.c → src/lib/ares_getnameinfo.c} +4 -10
  1340. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1341. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1342. data/third_party/cares/cares/{ares_init.c → src/lib/ares_init.c} +79 -40
  1343. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1344. data/third_party/cares/cares/{ares_ipv6.h → src/lib/ares_ipv6.h} +7 -0
  1345. data/third_party/cares/cares/{ares_library_init.c → src/lib/ares_library_init.c} +7 -2
  1346. data/third_party/cares/cares/{ares_library_init.h → src/lib/ares_library_init.h} +1 -1
  1347. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1348. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1349. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1350. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1351. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1352. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1353. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1354. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1355. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1356. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1357. data/third_party/cares/cares/{ares_parse_mx_reply.c → src/lib/ares_parse_mx_reply.c} +2 -8
  1358. data/third_party/cares/cares/{ares_parse_naptr_reply.c → src/lib/ares_parse_naptr_reply.c} +2 -13
  1359. data/third_party/cares/cares/{ares_parse_ns_reply.c → src/lib/ares_parse_ns_reply.c} +5 -11
  1360. data/third_party/cares/cares/{ares_parse_ptr_reply.c → src/lib/ares_parse_ptr_reply.c} +53 -46
  1361. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1362. data/third_party/cares/cares/{ares_parse_srv_reply.c → src/lib/ares_parse_srv_reply.c} +2 -13
  1363. data/third_party/cares/cares/{ares_parse_txt_reply.c → src/lib/ares_parse_txt_reply.c} +3 -9
  1364. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1365. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1366. data/third_party/cares/cares/{ares_private.h → src/lib/ares_private.h} +52 -11
  1367. data/third_party/cares/cares/{ares_process.c → src/lib/ares_process.c} +127 -52
  1368. data/third_party/cares/cares/{ares_query.c → src/lib/ares_query.c} +3 -9
  1369. data/third_party/cares/cares/{ares_search.c → src/lib/ares_search.c} +5 -7
  1370. data/third_party/cares/cares/{ares_send.c → src/lib/ares_send.c} +2 -8
  1371. data/third_party/cares/cares/{ares_setup.h → src/lib/ares_setup.h} +4 -1
  1372. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1373. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1374. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1375. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1376. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1377. data/third_party/cares/cares/{ares_strsplit.c → src/lib/ares_strsplit.c} +4 -0
  1378. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1379. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1380. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1381. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1382. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1383. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1384. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1385. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1386. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1387. data/third_party/cares/cares/{inet_net_pton.c → src/lib/inet_net_pton.c} +2 -8
  1388. data/third_party/cares/cares/{inet_ntop.c → src/lib/inet_ntop.c} +2 -8
  1389. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1390. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1391. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1392. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1393. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1394. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1395. data/third_party/upb/upb/decode.c +732 -378
  1396. data/third_party/upb/upb/decode.h +43 -17
  1397. data/third_party/upb/upb/decode_fast.c +303 -301
  1398. data/third_party/upb/upb/decode_fast.h +18 -18
  1399. data/third_party/upb/upb/decode_internal.h +73 -55
  1400. data/third_party/upb/upb/def.c +2074 -981
  1401. data/third_party/upb/upb/def.h +332 -260
  1402. data/third_party/upb/upb/def.hpp +139 -169
  1403. data/third_party/upb/upb/encode.c +267 -174
  1404. data/third_party/upb/upb/encode.h +15 -17
  1405. data/third_party/upb/upb/json_encode.c +776 -0
  1406. data/third_party/upb/upb/json_encode.h +62 -0
  1407. data/third_party/upb/upb/msg.c +152 -121
  1408. data/third_party/upb/upb/msg.h +39 -33
  1409. data/third_party/upb/upb/msg_internal.h +395 -251
  1410. data/third_party/upb/upb/port_def.inc +8 -0
  1411. data/third_party/upb/upb/port_undef.inc +1 -0
  1412. data/third_party/upb/upb/reflection.c +292 -212
  1413. data/third_party/upb/upb/reflection.h +91 -67
  1414. data/third_party/upb/upb/reflection.hpp +6 -6
  1415. data/third_party/upb/upb/table.c +231 -147
  1416. data/third_party/upb/upb/table_internal.h +129 -95
  1417. data/third_party/upb/upb/text_encode.c +114 -91
  1418. data/third_party/upb/upb/text_encode.h +10 -10
  1419. data/third_party/upb/upb/upb.c +118 -71
  1420. data/third_party/upb/upb/upb.h +157 -151
  1421. data/third_party/upb/upb/upb.hpp +31 -28
  1422. data/third_party/upb/upb/upb_internal.h +21 -11
  1423. data/third_party/xxhash/xxhash.h +607 -352
  1424. data/third_party/zlib/crc32.c +966 -292
  1425. data/third_party/zlib/crc32.h +9441 -436
  1426. data/third_party/zlib/deflate.c +78 -30
  1427. data/third_party/zlib/deflate.h +12 -15
  1428. data/third_party/zlib/gzguts.h +3 -2
  1429. data/third_party/zlib/gzlib.c +5 -3
  1430. data/third_party/zlib/gzread.c +5 -7
  1431. data/third_party/zlib/gzwrite.c +25 -13
  1432. data/third_party/zlib/infback.c +2 -1
  1433. data/third_party/zlib/inffast.c +14 -14
  1434. data/third_party/zlib/inflate.c +39 -8
  1435. data/third_party/zlib/inflate.h +3 -2
  1436. data/third_party/zlib/inftrees.c +3 -3
  1437. data/third_party/zlib/trees.c +27 -48
  1438. data/third_party/zlib/zlib.h +123 -100
  1439. data/third_party/zlib/zutil.c +2 -2
  1440. data/third_party/zlib/zutil.h +12 -9
  1441. metadata +505 -221
  1442. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1443. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1444. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -195
  1445. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  1446. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -264
  1447. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -560
  1448. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -119
  1449. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -95
  1450. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -189
  1451. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -53
  1452. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -83
  1453. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1454. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1455. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1456. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1457. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1458. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -27
  1459. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -62
  1460. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -27
  1461. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -62
  1462. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -27
  1463. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -62
  1464. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -27
  1465. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -62
  1466. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -27
  1467. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -62
  1468. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -72
  1469. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1470. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -73
  1471. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1472. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -72
  1473. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1474. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -80
  1475. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1476. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -74
  1477. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1478. data/src/core/lib/avl/avl.cc +0 -306
  1479. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1480. data/src/core/lib/compression/compression_args.cc +0 -138
  1481. data/src/core/lib/compression/compression_args.h +0 -56
  1482. data/src/core/lib/compression/stream_compression.cc +0 -81
  1483. data/src/core/lib/compression/stream_compression.h +0 -117
  1484. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1485. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1486. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1487. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1488. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1654
  1489. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1490. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1491. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1492. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1493. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1494. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1495. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1496. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1497. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1498. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1499. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1500. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1501. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  1502. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1503. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1504. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -152
  1505. data/src/core/lib/iomgr/tcp_custom.cc +0 -377
  1506. data/src/core/lib/iomgr/tcp_custom.h +0 -86
  1507. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -467
  1508. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  1509. data/src/core/lib/iomgr/timer_custom.h +0 -43
  1510. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -171
  1511. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  1512. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  1513. data/src/core/lib/slice/slice_intern.cc +0 -367
  1514. data/src/core/lib/slice/slice_utils.h +0 -200
  1515. data/src/core/lib/slice/static_slice.cc +0 -529
  1516. data/src/core/lib/slice/static_slice.h +0 -331
  1517. data/src/core/lib/surface/init_secure.cc +0 -103
  1518. data/src/core/lib/transport/metadata.cc +0 -714
  1519. data/src/core/lib/transport/metadata.h +0 -449
  1520. data/src/core/lib/transport/metadata_batch.cc +0 -94
  1521. data/src/core/lib/transport/static_metadata.cc +0 -1117
  1522. data/src/core/lib/transport/static_metadata.h +0 -340
  1523. data/src/core/lib/transport/status_metadata.cc +0 -63
  1524. data/src/core/lib/transport/status_metadata.h +0 -48
  1525. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1526. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  1527. data/third_party/cares/cares/ares_getopt.c +0 -122
  1528. data/third_party/cares/cares/ares_getopt.h +0 -53
  1529. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  1530. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  1531. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
@@ -37,11 +37,16 @@
37
37
  #include "src/core/ext/xds/xds_bootstrap.h"
38
38
  #include "src/core/ext/xds/xds_channel_args.h"
39
39
  #include "src/core/ext/xds/xds_client_stats.h"
40
+ #include "src/core/ext/xds/xds_cluster.h"
41
+ #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
42
+ #include "src/core/ext/xds/xds_endpoint.h"
40
43
  #include "src/core/ext/xds/xds_http_filters.h"
44
+ #include "src/core/ext/xds/xds_listener.h"
41
45
  #include "src/core/lib/address_utils/sockaddr_utils.h"
42
46
  #include "src/core/lib/backoff/backoff.h"
43
47
  #include "src/core/lib/channel/channel_args.h"
44
48
  #include "src/core/lib/channel/channel_stack.h"
49
+ #include "src/core/lib/config/core_configuration.h"
45
50
  #include "src/core/lib/gpr/env.h"
46
51
  #include "src/core/lib/gpr/string.h"
47
52
  #include "src/core/lib/gprpp/memory.h"
@@ -50,11 +55,12 @@
50
55
  #include "src/core/lib/gprpp/sync.h"
51
56
  #include "src/core/lib/iomgr/sockaddr.h"
52
57
  #include "src/core/lib/iomgr/timer.h"
58
+ #include "src/core/lib/security/credentials/channel_creds_registry.h"
53
59
  #include "src/core/lib/slice/slice_internal.h"
54
60
  #include "src/core/lib/slice/slice_string_helpers.h"
55
61
  #include "src/core/lib/surface/call.h"
56
62
  #include "src/core/lib/surface/channel.h"
57
- #include "src/core/lib/transport/static_metadata.h"
63
+ #include "src/core/lib/surface/lame_client.h"
58
64
  #include "src/core/lib/uri/uri_parser.h"
59
65
 
60
66
  #define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
@@ -135,37 +141,66 @@ class XdsClient::ChannelState::AdsCallState
135
141
  XdsClient* xds_client() const { return chand()->xds_client(); }
136
142
  bool seen_response() const { return seen_response_; }
137
143
 
138
- void SubscribeLocked(const std::string& type_url,
139
- const XdsApi::ResourceName& resource)
144
+ void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name,
145
+ bool delay_send)
140
146
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
141
- void UnsubscribeLocked(const std::string& type_url,
142
- const XdsApi::ResourceName& resource,
143
- bool delay_unsubscription)
147
+ void UnsubscribeLocked(const XdsResourceType* type,
148
+ const XdsResourceName& name, bool delay_unsubscription)
144
149
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
145
150
 
146
151
  bool HasSubscribedResources() const;
147
152
 
148
153
  private:
149
- class ResourceState : public InternallyRefCounted<ResourceState> {
154
+ class AdsResponseParser : public XdsApi::AdsResponseParserInterface {
150
155
  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) {
156
+ struct Result {
157
+ const XdsResourceType* type;
158
+ std::string type_url;
159
+ std::string version;
160
+ std::string nonce;
161
+ std::vector<std::string> errors;
162
+ std::map<std::string /*authority*/, std::set<XdsResourceKey>>
163
+ resources_seen;
164
+ bool have_valid_resources = false;
165
+ };
166
+
167
+ explicit AdsResponseParser(AdsCallState* ads_call_state)
168
+ : ads_call_state_(ads_call_state) {}
169
+
170
+ absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
171
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
172
+
173
+ void ParseResource(const XdsEncodingContext& context, size_t idx,
174
+ absl::string_view type_url,
175
+ absl::string_view serialized_resource) override
176
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
177
+
178
+ Result TakeResult() { return std::move(result_); }
179
+
180
+ private:
181
+ XdsClient* xds_client() const { return ads_call_state_->xds_client(); }
182
+
183
+ AdsCallState* ads_call_state_;
184
+ const Timestamp update_time_ = ExecCtx::Get()->Now();
185
+ Result result_;
186
+ };
187
+
188
+ class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
189
+ public:
190
+ ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
191
+ : type_(type), name_(name) {
157
192
  GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
158
193
  grpc_schedule_on_exec_ctx);
159
194
  }
160
195
 
161
196
  void Orphan() override {
162
- Finish();
197
+ MaybeCancelTimer();
163
198
  Unref(DEBUG_LOCATION, "Orphan");
164
199
  }
165
200
 
166
- void Start(RefCountedPtr<AdsCallState> ads_calld) {
167
- if (sent_initial_request_) return;
168
- sent_initial_request_ = true;
201
+ void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld) {
202
+ if (timer_started_) return;
203
+ timer_started_ = true;
169
204
  ads_calld_ = std::move(ads_calld);
170
205
  Ref(DEBUG_LOCATION, "timer").release();
171
206
  timer_pending_ = true;
@@ -175,7 +210,7 @@ class XdsClient::ChannelState::AdsCallState
175
210
  &timer_callback_);
176
211
  }
177
212
 
178
- void Finish() {
213
+ void MaybeCancelTimer() {
179
214
  if (timer_pending_) {
180
215
  grpc_timer_cancel(&timer_);
181
216
  timer_pending_ = false;
@@ -184,11 +219,12 @@ class XdsClient::ChannelState::AdsCallState
184
219
 
185
220
  private:
186
221
  static void OnTimer(void* arg, grpc_error_handle error) {
187
- ResourceState* self = static_cast<ResourceState*>(arg);
222
+ ResourceTimer* self = static_cast<ResourceTimer*>(arg);
188
223
  {
189
224
  MutexLock lock(&self->ads_calld_->xds_client()->mu_);
190
225
  self->OnTimerLocked(GRPC_ERROR_REF(error));
191
226
  }
227
+ self->ads_calld_->xds_client()->work_serializer_.DrainQueue();
192
228
  self->ads_calld_.reset();
193
229
  self->Unref(DEBUG_LOCATION, "timer");
194
230
  }
@@ -197,58 +233,32 @@ class XdsClient::ChannelState::AdsCallState
197
233
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
198
234
  if (error == GRPC_ERROR_NONE && timer_pending_) {
199
235
  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);
236
+ absl::Status watcher_error = absl::UnavailableError(absl::StrFormat(
237
+ "timeout obtaining resource {type=%s name=%s} from xds server",
238
+ type_->type_url(),
239
+ XdsClient::ConstructFullXdsResourceName(
240
+ name_.authority, type_->type_url(), name_.key)));
208
241
  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());
242
+ gpr_log(GPR_INFO, "[xds_client %p] xds server %s: %s",
243
+ ads_calld_->xds_client(),
244
+ ads_calld_->chand()->server_.server_uri.c_str(),
245
+ watcher_error.ToString().c_str());
211
246
  }
212
247
  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));
226
- }
227
- } else if (type_url_ == XdsApi::kCdsTypeUrl) {
228
- ClusterState& state = authority_state.cluster_map[resource_.id];
229
- 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 );
241
- }
242
- GRPC_ERROR_UNREF(watcher_error);
248
+ ads_calld_->xds_client()->authority_state_map_[name_.authority];
249
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
250
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
251
+ ads_calld_->xds_client()->NotifyWatchersOnErrorLocked(state.watchers,
252
+ watcher_error);
243
253
  }
244
254
  GRPC_ERROR_UNREF(error);
245
255
  }
246
256
 
247
- const std::string type_url_;
248
- const XdsApi::ResourceName resource_;
257
+ const XdsResourceType* type_;
258
+ const XdsResourceName name_;
249
259
 
250
260
  RefCountedPtr<AdsCallState> ads_calld_;
251
- bool sent_initial_request_;
261
+ bool timer_started_ = false;
252
262
  bool timer_pending_ = false;
253
263
  grpc_timer timer_;
254
264
  grpc_closure timer_callback_;
@@ -263,40 +273,11 @@ class XdsClient::ChannelState::AdsCallState
263
273
 
264
274
  // Subscribed resources of this type.
265
275
  std::map<std::string /*authority*/,
266
- std::map<std::string /*name*/, OrphanablePtr<ResourceState>>>
276
+ std::map<XdsResourceKey, OrphanablePtr<ResourceTimer>>>
267
277
  subscribed_resources;
268
278
  };
269
279
 
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)
296
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
297
-
298
- void RejectAdsUpdateLocked(grpc_millis update_time,
299
- const XdsApi::AdsParseResult& result)
280
+ void SendMessageLocked(const XdsResourceType* type)
300
281
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
301
282
 
302
283
  static void OnRequestSent(void* arg, grpc_error_handle error);
@@ -311,9 +292,9 @@ class XdsClient::ChannelState::AdsCallState
311
292
 
312
293
  bool IsCurrentCallOnChannel() const;
313
294
 
314
- std::map<absl::string_view /*authority*/,
315
- std::set<absl::string_view /*name*/>>
316
- ResourceNamesForRequest(const std::string& type_url);
295
+ // Constructs a list of resource names of a given type for an ADS
296
+ // request. Also starts the timer for each resource if needed.
297
+ std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type);
317
298
 
318
299
  // The owning RetryableCall<>.
319
300
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
@@ -342,10 +323,10 @@ class XdsClient::ChannelState::AdsCallState
342
323
  grpc_closure on_status_received_;
343
324
 
344
325
  // Resource types for which requests need to be sent.
345
- std::set<std::string /*type_url*/> buffered_requests_;
326
+ std::set<const XdsResourceType*> buffered_requests_;
346
327
 
347
328
  // State for each resource type.
348
- std::map<std::string /*type_url*/, ResourceTypeState> state_map_;
329
+ std::map<const XdsResourceType*, ResourceTypeState> state_map_;
349
330
  };
350
331
 
351
332
  // Contains an LRS call to the xds server.
@@ -369,7 +350,7 @@ class XdsClient::ChannelState::LrsCallState
369
350
  // Reports client-side load stats according to a fixed interval.
370
351
  class Reporter : public InternallyRefCounted<Reporter> {
371
352
  public:
372
- Reporter(RefCountedPtr<LrsCallState> parent, grpc_millis report_interval)
353
+ Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
373
354
  : parent_(std::move(parent)), report_interval_(report_interval) {
374
355
  GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
375
356
  grpc_schedule_on_exec_ctx);
@@ -400,7 +381,7 @@ class XdsClient::ChannelState::LrsCallState
400
381
  RefCountedPtr<LrsCallState> parent_;
401
382
 
402
383
  // The load reporting state.
403
- const grpc_millis report_interval_;
384
+ const Duration report_interval_;
404
385
  bool last_report_counters_were_zero_ = false;
405
386
  bool next_report_timer_callback_pending_ = false;
406
387
  grpc_timer next_report_timer_;
@@ -447,7 +428,7 @@ class XdsClient::ChannelState::LrsCallState
447
428
  // Load reporting state.
448
429
  bool send_all_clusters_ = false;
449
430
  std::set<std::string> cluster_names_; // Asked for by the LRS server.
450
- grpc_millis load_reporting_interval_ = 0;
431
+ Duration load_reporting_interval_;
451
432
  OrphanablePtr<Reporter> reporter_;
452
433
  };
453
434
 
@@ -464,18 +445,23 @@ class XdsClient::ChannelState::StateWatcher
464
445
  private:
465
446
  void OnConnectivityStateChange(grpc_connectivity_state new_state,
466
447
  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"));
448
+ {
449
+ MutexLock lock(&parent_->xds_client_->mu_);
450
+ if (!parent_->shutting_down_ &&
451
+ new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
452
+ // In TRANSIENT_FAILURE. Notify all watchers of error.
453
+ gpr_log(GPR_INFO,
454
+ "[xds_client %p] xds channel for server %s in "
455
+ "state TRANSIENT_FAILURE: %s",
456
+ parent_->xds_client(), parent_->server_.server_uri.c_str(),
457
+ status.ToString().c_str());
458
+ parent_->xds_client_->NotifyOnErrorLocked(
459
+ absl::UnavailableError(absl::StrCat(
460
+ "xds channel in TRANSIENT_FAILURE, connectivity error: ",
461
+ status.ToString())));
462
+ }
478
463
  }
464
+ parent_->xds_client()->work_serializer_.DrainQueue();
479
465
  }
480
466
 
481
467
  WeakRefCountedPtr<ChannelState> parent_;
@@ -490,10 +476,10 @@ namespace {
490
476
  grpc_channel* CreateXdsChannel(grpc_channel_args* args,
491
477
  const XdsBootstrap::XdsServer& server) {
492
478
  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);
479
+ CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
480
+ server.channel_creds_type, server.channel_creds_config);
481
+ return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
482
+ args);
497
483
  }
498
484
 
499
485
  } // namespace
@@ -517,8 +503,8 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
517
503
 
518
504
  XdsClient::ChannelState::~ChannelState() {
519
505
  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);
506
+ gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
507
+ xds_client(), this, server_.server_uri.c_str());
522
508
  }
523
509
  grpc_channel_destroy(channel_);
524
510
  xds_client_.reset(DEBUG_LOCATION, "ChannelState");
@@ -559,9 +545,27 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
559
545
  WeakRef(DEBUG_LOCATION, "ChannelState+lrs")));
560
546
  }
561
547
 
562
- void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
548
+ void XdsClient::ChannelState::StopLrsCallLocked() {
549
+ xds_client_->xds_load_report_server_map_.erase(server_);
550
+ lrs_calld_.reset();
551
+ }
552
+
553
+ namespace {
554
+
555
+ bool IsLameChannel(grpc_channel* channel) {
556
+ grpc_channel_element* elem =
557
+ grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
558
+ return elem->filter == &grpc_lame_filter;
559
+ }
560
+
561
+ } // namespace
563
562
 
564
563
  void XdsClient::ChannelState::StartConnectivityWatchLocked() {
564
+ if (IsLameChannel(channel_)) {
565
+ xds_client()->NotifyOnErrorLocked(
566
+ absl::UnavailableError("xds client has a lame channel"));
567
+ return;
568
+ }
565
569
  ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
566
570
  GPR_ASSERT(client_channel != nullptr);
567
571
  watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
@@ -571,13 +575,16 @@ void XdsClient::ChannelState::StartConnectivityWatchLocked() {
571
575
  }
572
576
 
573
577
  void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
578
+ if (IsLameChannel(channel_)) {
579
+ return;
580
+ }
574
581
  ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
575
582
  GPR_ASSERT(client_channel != nullptr);
576
583
  client_channel->RemoveConnectivityWatcher(watcher_);
577
584
  }
578
585
 
579
- void XdsClient::ChannelState::SubscribeLocked(
580
- const std::string& type_url, const XdsApi::ResourceName& resource) {
586
+ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
587
+ const XdsResourceName& name) {
581
588
  if (ads_calld_ == nullptr) {
582
589
  // Start the ADS call if this is the first request.
583
590
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -591,16 +598,16 @@ void XdsClient::ChannelState::SubscribeLocked(
591
598
  // because when the call is restarted it will resend all necessary requests.
592
599
  if (ads_calld() == nullptr) return;
593
600
  // Subscribe to this resource if the ADS call is active.
594
- ads_calld()->SubscribeLocked(type_url, resource);
601
+ ads_calld()->SubscribeLocked(type, name, /*delay_send=*/false);
595
602
  }
596
603
 
597
- void XdsClient::ChannelState::UnsubscribeLocked(
598
- const std::string& type_url, const XdsApi::ResourceName& resource,
599
- bool delay_unsubscription) {
604
+ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
605
+ const XdsResourceName& name,
606
+ bool delay_unsubscription) {
600
607
  if (ads_calld_ != nullptr) {
601
608
  auto* calld = ads_calld_->calld();
602
609
  if (calld != nullptr) {
603
- calld->UnsubscribeLocked(type_url, resource, delay_unsubscription);
610
+ calld->UnsubscribeLocked(type, name, delay_unsubscription);
604
611
  if (!calld->HasSubscribedResources()) {
605
612
  ads_calld_.reset();
606
613
  }
@@ -616,13 +623,13 @@ template <typename T>
616
623
  XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
617
624
  WeakRefCountedPtr<ChannelState> chand)
618
625
  : 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
+ backoff_(BackOff::Options()
627
+ .set_initial_backoff(Duration::Seconds(
628
+ GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS))
629
+ .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER)
630
+ .set_jitter(GRPC_XDS_RECONNECT_JITTER)
631
+ .set_max_backoff(Duration::Seconds(
632
+ GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
626
633
  // Closure Initialization
627
634
  GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
628
635
  grpc_schedule_on_exec_ctx);
@@ -639,17 +646,11 @@ void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
639
646
 
640
647
  template <typename T>
641
648
  void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
642
- const bool seen_response = calld_->seen_response();
649
+ // If we saw a response on the current stream, reset backoff.
650
+ if (calld_->seen_response()) backoff_.Reset();
643
651
  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
- }
652
+ // Start retry timer.
653
+ StartRetryTimerLocked();
653
654
  }
654
655
 
655
656
  template <typename T>
@@ -658,10 +659,10 @@ void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
658
659
  GPR_ASSERT(chand_->channel_ != nullptr);
659
660
  GPR_ASSERT(calld_ == nullptr);
660
661
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
661
- 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);
662
+ gpr_log(
663
+ GPR_INFO,
664
+ "[xds_client %p] xds server %s: start new call from retryable call %p",
665
+ chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
665
666
  }
666
667
  calld_ = MakeOrphanable<T>(
667
668
  this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
@@ -670,14 +671,15 @@ void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
670
671
  template <typename T>
671
672
  void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
672
673
  if (shutting_down_) return;
673
- const grpc_millis next_attempt_time = backoff_.NextAttemptTime();
674
+ const Timestamp next_attempt_time = backoff_.NextAttemptTime();
674
675
  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));
676
+ Duration timeout =
677
+ std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
677
678
  gpr_log(GPR_INFO,
678
- "[xds_client %p] Failed to connect to xds server (chand: %p) "
679
+ "[xds_client %p] xds server %s: call attempt failed; "
679
680
  "retry timer will fire in %" PRId64 "ms.",
680
- chand()->xds_client(), chand(), timeout);
681
+ chand()->xds_client(), chand()->server_.server_uri.c_str(),
682
+ timeout.millis());
681
683
  }
682
684
  this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
683
685
  grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
@@ -701,16 +703,179 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
701
703
  retry_timer_callback_pending_ = false;
702
704
  if (!shutting_down_ && error == GRPC_ERROR_NONE) {
703
705
  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);
706
+ gpr_log(GPR_INFO,
707
+ "[xds_client %p] xds server %s: retry timer fired (retryable "
708
+ "call: %p)",
709
+ chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
708
710
  }
709
711
  StartNewCallLocked();
710
712
  }
711
713
  GRPC_ERROR_UNREF(error);
712
714
  }
713
715
 
716
+ //
717
+ // XdsClient::ChannelState::AdsCallState::AdsResponseParser
718
+ //
719
+
720
+ absl::Status XdsClient::ChannelState::AdsCallState::AdsResponseParser::
721
+ ProcessAdsResponseFields(AdsResponseFields fields) {
722
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
723
+ gpr_log(
724
+ GPR_INFO,
725
+ "[xds_client %p] xds server %s: received ADS response: type_url=%s, "
726
+ "version=%s, nonce=%s, num_resources=%" PRIuPTR,
727
+ ads_call_state_->xds_client(),
728
+ ads_call_state_->chand()->server_.server_uri.c_str(),
729
+ fields.type_url.c_str(), fields.version.c_str(), fields.nonce.c_str(),
730
+ fields.num_resources);
731
+ }
732
+ result_.type =
733
+ ads_call_state_->xds_client()->GetResourceTypeLocked(fields.type_url);
734
+ if (result_.type == nullptr) {
735
+ return absl::InvalidArgumentError(
736
+ absl::StrCat("unknown resource type ", fields.type_url));
737
+ }
738
+ result_.type_url = std::move(fields.type_url);
739
+ result_.version = std::move(fields.version);
740
+ result_.nonce = std::move(fields.nonce);
741
+ return absl::OkStatus();
742
+ }
743
+
744
+ namespace {
745
+
746
+ // Build a resource metadata struct for ADS result accepting methods and CSDS.
747
+ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
748
+ std::string serialized_proto, std::string version, Timestamp update_time) {
749
+ XdsApi::ResourceMetadata resource_metadata;
750
+ resource_metadata.serialized_proto = std::move(serialized_proto);
751
+ resource_metadata.update_time = update_time;
752
+ resource_metadata.version = std::move(version);
753
+ resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
754
+ return resource_metadata;
755
+ }
756
+
757
+ // Update resource_metadata for NACK.
758
+ void UpdateResourceMetadataNacked(const std::string& version,
759
+ const std::string& details,
760
+ Timestamp update_time,
761
+ XdsApi::ResourceMetadata* resource_metadata) {
762
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
763
+ resource_metadata->failed_version = version;
764
+ resource_metadata->failed_details = details;
765
+ resource_metadata->failed_update_time = update_time;
766
+ }
767
+
768
+ } // namespace
769
+
770
+ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
771
+ const XdsEncodingContext& context, size_t idx, absl::string_view type_url,
772
+ absl::string_view serialized_resource) {
773
+ // Check the type_url of the resource.
774
+ bool is_v2 = false;
775
+ if (!result_.type->IsType(type_url, &is_v2)) {
776
+ result_.errors.emplace_back(
777
+ absl::StrCat("resource index ", idx, ": incorrect resource type ",
778
+ type_url, " (should be ", result_.type_url, ")"));
779
+ return;
780
+ }
781
+ // Parse the resource.
782
+ absl::StatusOr<XdsResourceType::DecodeResult> result =
783
+ result_.type->Decode(context, serialized_resource, is_v2);
784
+ if (!result.ok()) {
785
+ result_.errors.emplace_back(
786
+ absl::StrCat("resource index ", idx, ": ", result.status().ToString()));
787
+ return;
788
+ }
789
+ // Check the resource name.
790
+ auto resource_name =
791
+ xds_client()->ParseXdsResourceName(result->name, result_.type);
792
+ if (!resource_name.ok()) {
793
+ result_.errors.emplace_back(absl::StrCat(
794
+ "resource index ", idx, ": Cannot parse xDS resource name \"",
795
+ result->name, "\""));
796
+ return;
797
+ }
798
+ // Cancel resource-does-not-exist timer, if needed.
799
+ auto timer_it = ads_call_state_->state_map_.find(result_.type);
800
+ if (timer_it != ads_call_state_->state_map_.end()) {
801
+ auto it =
802
+ timer_it->second.subscribed_resources.find(resource_name->authority);
803
+ if (it != timer_it->second.subscribed_resources.end()) {
804
+ auto res_it = it->second.find(resource_name->key);
805
+ if (res_it != it->second.end()) {
806
+ res_it->second->MaybeCancelTimer();
807
+ }
808
+ }
809
+ }
810
+ // Lookup the authority in the cache.
811
+ auto authority_it =
812
+ xds_client()->authority_state_map_.find(resource_name->authority);
813
+ if (authority_it == xds_client()->authority_state_map_.end()) {
814
+ return; // Skip resource -- we don't have a subscription for it.
815
+ }
816
+ // Found authority, so look up type.
817
+ AuthorityState& authority_state = authority_it->second;
818
+ auto type_it = authority_state.resource_map.find(result_.type);
819
+ if (type_it == authority_state.resource_map.end()) {
820
+ return; // Skip resource -- we don't have a subscription for it.
821
+ }
822
+ auto& type_map = type_it->second;
823
+ // Found type, so look up resource key.
824
+ auto it = type_map.find(resource_name->key);
825
+ if (it == type_map.end()) {
826
+ return; // Skip resource -- we don't have a subscription for it.
827
+ }
828
+ ResourceState& resource_state = it->second;
829
+ // If needed, record that we've seen this resource.
830
+ if (result_.type->AllResourcesRequiredInSotW()) {
831
+ result_.resources_seen[resource_name->authority].insert(resource_name->key);
832
+ }
833
+ // Update resource state based on whether the resource is valid.
834
+ if (!result->resource.ok()) {
835
+ result_.errors.emplace_back(absl::StrCat(
836
+ "resource index ", idx, ": ", result->name,
837
+ ": validation error: ", result->resource.status().ToString()));
838
+ xds_client()->NotifyWatchersOnErrorLocked(
839
+ resource_state.watchers,
840
+ absl::UnavailableError(absl::StrCat(
841
+ "invalid resource: ", result->resource.status().ToString())));
842
+ UpdateResourceMetadataNacked(result_.version,
843
+ result->resource.status().ToString(),
844
+ update_time_, &resource_state.meta);
845
+ return;
846
+ }
847
+ // Resource is valid.
848
+ result_.have_valid_resources = true;
849
+ // If it didn't change, ignore it.
850
+ if (resource_state.resource != nullptr &&
851
+ result_.type->ResourcesEqual(resource_state.resource.get(),
852
+ result->resource->get())) {
853
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
854
+ gpr_log(GPR_INFO,
855
+ "[xds_client %p] %s resource %s identical to current, ignoring.",
856
+ xds_client(), result_.type_url.c_str(), result->name.c_str());
857
+ }
858
+ return;
859
+ }
860
+ // Update the resource state.
861
+ resource_state.resource = std::move(*result->resource);
862
+ resource_state.meta = CreateResourceMetadataAcked(
863
+ std::string(serialized_resource), result_.version, update_time_);
864
+ // Notify watchers.
865
+ auto& watchers_list = resource_state.watchers;
866
+ auto* value =
867
+ result_.type->CopyResource(resource_state.resource.get()).release();
868
+ xds_client()->work_serializer_.Schedule(
869
+ [watchers_list, value]()
870
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
871
+ for (const auto& p : watchers_list) {
872
+ p.first->OnGenericResourceChanged(value);
873
+ }
874
+ delete value;
875
+ },
876
+ DEBUG_LOCATION);
877
+ }
878
+
714
879
  //
715
880
  // XdsClient::ChannelState::AdsCallState
716
881
  //
@@ -727,14 +892,17 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
727
892
  // the polling entities from client_channel.
728
893
  GPR_ASSERT(xds_client() != nullptr);
729
894
  // Create a call with the specified method name.
730
- const auto& method =
895
+ const char* method =
731
896
  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;
897
+ ? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
898
+ "StreamAggregatedResources"
899
+ : "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
900
+ "StreamAggregatedResources";
734
901
  call_ = grpc_channel_create_pollset_set_call(
735
902
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
736
- xds_client()->interested_parties_, method, nullptr,
737
- GRPC_MILLIS_INF_FUTURE, nullptr);
903
+ xds_client()->interested_parties_,
904
+ StaticSlice::FromStaticString(method).c_slice(), nullptr,
905
+ Timestamp::InfFuture(), nullptr);
738
906
  GPR_ASSERT(call_ != nullptr);
739
907
  // Init data associated with the call.
740
908
  grpc_metadata_array_init(&initial_metadata_recv_);
@@ -742,9 +910,9 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
742
910
  // Start the call.
743
911
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
744
912
  gpr_log(GPR_INFO,
745
- "[xds_client %p] Starting ADS call (chand: %p, calld: %p, "
746
- "call: %p)",
747
- xds_client(), chand(), this, call_);
913
+ "[xds_client %p] xds server %s: starting ADS call "
914
+ "(calld: %p, call: %p)",
915
+ xds_client(), chand()->server_.server_uri.c_str(), this, call_);
748
916
  }
749
917
  // Create the ops.
750
918
  grpc_call_error call_error;
@@ -768,23 +936,17 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
768
936
  const std::string& authority = a.first;
769
937
  // Skip authorities that are not using this xDS channel.
770
938
  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});
939
+ for (const auto& t : a.second.resource_map) {
940
+ const XdsResourceType* type = t.first;
941
+ for (const auto& r : t.second) {
942
+ const XdsResourceKey& resource_key = r.first;
943
+ SubscribeLocked(type, {authority, resource_key}, /*delay_send=*/true);
944
+ }
786
945
  }
787
946
  }
947
+ for (const auto& p : state_map_) {
948
+ SendMessageLocked(p.first);
949
+ }
788
950
  // Op: recv initial metadata.
789
951
  op = ops;
790
952
  op->op = GRPC_OP_RECV_INITIAL_METADATA;
@@ -847,33 +1009,29 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
847
1009
  }
848
1010
 
849
1011
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
850
- const std::string& type_url)
1012
+ const XdsResourceType* type)
851
1013
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
852
1014
  // Buffer message sending if an existing message is in flight.
853
1015
  if (send_message_payload_ != nullptr) {
854
- buffered_requests_.insert(type_url);
1016
+ buffered_requests_.insert(type);
855
1017
  return;
856
1018
  }
857
- auto& state = state_map_[type_url];
1019
+ auto& state = state_map_[type];
858
1020
  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
1021
  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
- }
1022
+ chand()->server_,
1023
+ chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
1024
+ chand()->resource_type_version_map_[type], state.nonce,
1025
+ ResourceNamesForRequest(type), GRPC_ERROR_REF(state.error),
1026
+ !sent_initial_message_);
870
1027
  sent_initial_message_ = true;
871
1028
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
872
1029
  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(),
1030
+ "[xds_client %p] xds server %s: sending ADS request: type=%s "
1031
+ "version=%s nonce=%s error=%s",
1032
+ xds_client(), chand()->server_.server_uri.c_str(),
1033
+ std::string(type->type_url()).c_str(),
1034
+ chand()->resource_type_version_map_[type].c_str(),
877
1035
  state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
878
1036
  }
879
1037
  GRPC_ERROR_UNREF(state.error);
@@ -894,34 +1052,33 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
894
1052
  grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
895
1053
  if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
896
1054
  gpr_log(GPR_ERROR,
897
- "[xds_client %p] calld=%p call_error=%d sending ADS message",
898
- xds_client(), this, call_error);
1055
+ "[xds_client %p] xds server %s: error starting ADS send_message "
1056
+ "batch on calld=%p: call_error=%d",
1057
+ xds_client(), chand()->server_.server_uri.c_str(), this,
1058
+ call_error);
899
1059
  GPR_ASSERT(GRPC_CALL_OK == call_error);
900
1060
  }
901
1061
  }
902
1062
 
903
1063
  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];
1064
+ const XdsResourceType* type, const XdsResourceName& name, bool delay_send) {
1065
+ auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
907
1066
  if (state == nullptr) {
908
- state = MakeOrphanable<ResourceState>(
909
- type_url, resource,
910
- !chand()->resource_type_version_map_[type_url].empty());
911
- SendMessageLocked(type_url);
1067
+ state = MakeOrphanable<ResourceTimer>(type, name);
1068
+ if (!delay_send) SendMessageLocked(type);
912
1069
  }
913
1070
  }
914
1071
 
915
1072
  void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
916
- const std::string& type_url, const XdsApi::ResourceName& resource,
1073
+ const XdsResourceType* type, const XdsResourceName& name,
917
1074
  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);
1075
+ auto& type_state_map = state_map_[type];
1076
+ auto& authority_map = type_state_map.subscribed_resources[name.authority];
1077
+ authority_map.erase(name.key);
921
1078
  if (authority_map.empty()) {
922
- type_state_map.subscribed_resources.erase(resource.authority);
1079
+ type_state_map.subscribed_resources.erase(name.authority);
923
1080
  }
924
- if (!delay_unsubscription) SendMessageLocked(type_url);
1081
+ if (!delay_unsubscription) SendMessageLocked(type);
925
1082
  }
926
1083
 
927
1084
  bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
@@ -931,421 +1088,6 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
931
1088
  return false;
932
1089
  }
933
1090
 
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);
1005
- }
1006
- }
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);
1021
- }
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();
1046
- }
1047
- }
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();
1068
- }
1069
- }
1070
- }
1071
- }
1072
- }
1073
-
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();
1090
- 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;
1107
- }
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);
1115
- }
1116
- }
1117
- }
1118
-
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
1091
  void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1350
1092
  void* arg, grpc_error_handle error) {
1351
1093
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
@@ -1388,6 +1130,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1388
1130
  MutexLock lock(&ads_calld->xds_client()->mu_);
1389
1131
  done = ads_calld->OnResponseReceivedLocked();
1390
1132
  }
1133
+ ads_calld->xds_client()->work_serializer_.DrainQueue();
1391
1134
  if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1392
1135
  }
1393
1136
 
@@ -1404,63 +1147,75 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1404
1147
  grpc_byte_buffer_destroy(recv_message_payload_);
1405
1148
  recv_message_payload_ = nullptr;
1406
1149
  // 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));
1150
+ AdsResponseParser parser(this);
1151
+ absl::Status status = xds_client()->api_.ParseAdsResponse(
1152
+ chand()->server_, response_slice, &parser);
1413
1153
  grpc_slice_unref_internal(response_slice);
1414
- if (result.type_url.empty()) {
1154
+ if (!status.ok()) {
1415
1155
  // Ignore unparsable response.
1416
1156
  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);
1157
+ "[xds_client %p] xds server %s: error parsing ADS response (%s) "
1158
+ "-- ignoring",
1159
+ xds_client(), chand()->server_.server_uri.c_str(),
1160
+ status.ToString().c_str());
1420
1161
  } else {
1421
- grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
1162
+ seen_response_ = true;
1163
+ AdsResponseParser::Result result = parser.TakeResult();
1422
1164
  // 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);
1165
+ auto& state = state_map_[result.type];
1166
+ state.nonce = result.nonce;
1167
+ // If we got an error, set state.error so that we'll NACK the update.
1168
+ if (!result.errors.empty()) {
1169
+ std::string error = absl::StrJoin(result.errors, "; ");
1170
+ gpr_log(
1171
+ GPR_ERROR,
1172
+ "[xds_client %p] xds server %s: ADS response invalid for resource "
1173
+ "type %s version %s, will NACK: nonce=%s error=%s",
1174
+ xds_client(), chand()->server_.server_uri.c_str(),
1175
+ result.type_url.c_str(), result.version.c_str(), state.nonce.c_str(),
1176
+ error.c_str());
1436
1177
  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));
1178
+ state.error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(error),
1179
+ GRPC_ERROR_INT_GRPC_STATUS,
1180
+ GRPC_STATUS_UNAVAILABLE);
1181
+ }
1182
+ // Delete resources not seen in update if needed.
1183
+ if (result.type->AllResourcesRequiredInSotW()) {
1184
+ for (auto& a : xds_client()->authority_state_map_) {
1185
+ const std::string& authority = a.first;
1186
+ AuthorityState& authority_state = a.second;
1187
+ // Skip authorities that are not using this xDS channel.
1188
+ if (authority_state.channel_state != chand()) continue;
1189
+ auto seen_authority_it = result.resources_seen.find(authority);
1190
+ // Find this resource type.
1191
+ auto type_it = authority_state.resource_map.find(result.type);
1192
+ if (type_it == authority_state.resource_map.end()) continue;
1193
+ // Iterate over resource ids.
1194
+ for (auto& r : type_it->second) {
1195
+ const XdsResourceKey& resource_key = r.first;
1196
+ ResourceState& resource_state = r.second;
1197
+ if (seen_authority_it == result.resources_seen.end() ||
1198
+ seen_authority_it->second.find(resource_key) ==
1199
+ seen_authority_it->second.end()) {
1200
+ // If the resource was newly requested but has not yet been
1201
+ // received, we don't want to generate an error for the watchers,
1202
+ // because this ADS response may be in reaction to an earlier
1203
+ // request that did not yet request the new resource, so its absence
1204
+ // from the response does not necessarily indicate that the resource
1205
+ // does not exist. For that case, we rely on the request timeout
1206
+ // instead.
1207
+ if (resource_state.resource == nullptr) continue;
1208
+ resource_state.resource.reset();
1209
+ xds_client()->NotifyWatchersOnResourceDoesNotExist(
1210
+ resource_state.watchers);
1211
+ }
1212
+ }
1213
+ }
1460
1214
  }
1461
- if (have_valid_resources) {
1462
- seen_response_ = true;
1463
- chand()->resource_type_version_map_[result.type_url] = result.version;
1215
+ // If we had valid resources, update the version.
1216
+ if (result.have_valid_resources) {
1217
+ chand()->resource_type_version_map_[result.type] =
1218
+ std::move(result.version);
1464
1219
  // Start load reporting if needed.
1465
1220
  auto& lrs_call = chand()->lrs_calld_;
1466
1221
  if (lrs_call != nullptr) {
@@ -1469,7 +1224,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1469
1224
  }
1470
1225
  }
1471
1226
  // Send ACK or NACK.
1472
- SendMessageLocked(result.type_url);
1227
+ SendMessageLocked(result.type);
1473
1228
  }
1474
1229
  if (xds_client()->shutting_down_) return true;
1475
1230
  // Keep listening for updates.
@@ -1494,6 +1249,7 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1494
1249
  MutexLock lock(&ads_calld->xds_client()->mu_);
1495
1250
  ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1496
1251
  }
1252
+ ads_calld->xds_client()->work_serializer_.DrainQueue();
1497
1253
  ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1498
1254
  }
1499
1255
 
@@ -1502,9 +1258,11 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1502
1258
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1503
1259
  char* status_details = grpc_slice_to_c_string(status_details_);
1504
1260
  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_,
1261
+ "[xds_client %p] xds server %s: ADS call status received "
1262
+ "(chand=%p, ads_calld=%p, call=%p): "
1263
+ "status=%d, details='%s', error='%s'",
1264
+ xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1265
+ call_, status_code_, status_details,
1508
1266
  grpc_error_std_string(error).c_str());
1509
1267
  gpr_free(status_details);
1510
1268
  }
@@ -1513,8 +1271,11 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1513
1271
  // Try to restart the call.
1514
1272
  parent_->OnCallFinishedLocked();
1515
1273
  // Send error to all watchers.
1516
- xds_client()->NotifyOnErrorLocked(
1517
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds call failed"));
1274
+ xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
1275
+ "xDS call failed: xDS server: %s, ADS call status code=%d, "
1276
+ "details='%s', error='%s'",
1277
+ chand()->server_.server_uri, status_code_,
1278
+ StringViewFromSlice(status_details_), grpc_error_std_string(error))));
1518
1279
  }
1519
1280
  GRPC_ERROR_UNREF(error);
1520
1281
  }
@@ -1526,23 +1287,24 @@ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1526
1287
  return this == chand()->ads_calld_->calld();
1527
1288
  }
1528
1289
 
1529
- std::map<absl::string_view /*authority*/, std::set<absl::string_view /*name*/>>
1290
+ std::vector<std::string>
1530
1291
  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);
1292
+ const XdsResourceType* type) {
1293
+ std::vector<std::string> resource_names;
1294
+ auto it = state_map_.find(type);
1536
1295
  if (it != state_map_.end()) {
1537
1296
  for (auto& a : it->second.subscribed_resources) {
1297
+ const std::string& authority = a.first;
1538
1298
  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"));
1299
+ const XdsResourceKey& resource_key = p.first;
1300
+ resource_names.emplace_back(XdsClient::ConstructFullXdsResourceName(
1301
+ authority, type->type_url(), resource_key));
1302
+ OrphanablePtr<ResourceTimer>& resource_timer = p.second;
1303
+ resource_timer->MaybeStartTimer(Ref(DEBUG_LOCATION, "ResourceTimer"));
1542
1304
  }
1543
1305
  }
1544
1306
  }
1545
- return resource_map;
1307
+ return resource_names;
1546
1308
  }
1547
1309
 
1548
1310
  //
@@ -1557,7 +1319,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1557
1319
 
1558
1320
  void XdsClient::ChannelState::LrsCallState::Reporter::
1559
1321
  ScheduleNextReportLocked() {
1560
- const grpc_millis next_report_time = ExecCtx::Get()->Now() + report_interval_;
1322
+ const Timestamp next_report_time = ExecCtx::Get()->Now() + report_interval_;
1561
1323
  grpc_timer_init(&next_report_timer_, next_report_time,
1562
1324
  &on_next_report_timer_);
1563
1325
  next_report_timer_callback_pending_ = true;
@@ -1603,15 +1365,19 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1603
1365
  bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1604
1366
  // Construct snapshot from all reported stats.
1605
1367
  XdsApi::ClusterLoadReportMap snapshot =
1606
- xds_client()->BuildLoadReportSnapshotLocked(parent_->send_all_clusters_,
1368
+ xds_client()->BuildLoadReportSnapshotLocked(parent_->chand()->server_,
1369
+ parent_->send_all_clusters_,
1607
1370
  parent_->cluster_names_);
1608
1371
  // Skip client load report if the counters were all zero in the last
1609
1372
  // report and they are still zero in this one.
1610
1373
  const bool old_val = last_report_counters_were_zero_;
1611
1374
  last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
1612
1375
  if (old_val && last_report_counters_were_zero_) {
1613
- if (xds_client()->load_report_map_.empty()) {
1614
- parent_->chand()->StopLrsCall();
1376
+ auto it = xds_client()->xds_load_report_server_map_.find(
1377
+ parent_->chand()->server_);
1378
+ if (it == xds_client()->xds_load_report_server_map_.end() ||
1379
+ it->second.load_report_map.empty()) {
1380
+ it->second.channel_state->StopLrsCallLocked();
1615
1381
  return true;
1616
1382
  }
1617
1383
  ScheduleNextReportLocked();
@@ -1632,8 +1398,10 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1632
1398
  parent_->call_, &op, 1, &on_report_done_);
1633
1399
  if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1634
1400
  gpr_log(GPR_ERROR,
1635
- "[xds_client %p] calld=%p call_error=%d sending client load report",
1636
- xds_client(), this, call_error);
1401
+ "[xds_client %p] xds server %s: error starting LRS send_message "
1402
+ "batch on calld=%p: call_error=%d",
1403
+ xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
1404
+ call_error);
1637
1405
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1638
1406
  }
1639
1407
  return false;
@@ -1655,8 +1423,11 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1655
1423
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1656
1424
  parent_->send_message_payload_ = nullptr;
1657
1425
  // If there are no more registered stats to report, cancel the call.
1658
- if (xds_client()->load_report_map_.empty()) {
1659
- parent_->chand()->StopLrsCall();
1426
+ auto it =
1427
+ xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
1428
+ if (it == xds_client()->xds_load_report_server_map_.end() ||
1429
+ it->second.load_report_map.empty()) {
1430
+ it->second.channel_state->StopLrsCallLocked();
1660
1431
  GRPC_ERROR_UNREF(error);
1661
1432
  return true;
1662
1433
  }
@@ -1688,14 +1459,15 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1688
1459
  // activity in xds_client()->interested_parties_, which is comprised of
1689
1460
  // the polling entities from client_channel.
1690
1461
  GPR_ASSERT(xds_client() != nullptr);
1691
- const auto& method =
1462
+ const char* method =
1692
1463
  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;
1464
+ ? "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats"
1465
+ : "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats";
1695
1466
  call_ = grpc_channel_create_pollset_set_call(
1696
1467
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
1697
- xds_client()->interested_parties_, method, nullptr,
1698
- GRPC_MILLIS_INF_FUTURE, nullptr);
1468
+ xds_client()->interested_parties_,
1469
+ Slice::FromStaticString(method).c_slice(), nullptr,
1470
+ Timestamp::InfFuture(), nullptr);
1699
1471
  GPR_ASSERT(call_ != nullptr);
1700
1472
  // Init the request payload.
1701
1473
  grpc_slice request_payload_slice =
@@ -1708,10 +1480,10 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1708
1480
  grpc_metadata_array_init(&trailing_metadata_recv_);
1709
1481
  // Start the call.
1710
1482
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1711
- gpr_log(GPR_INFO,
1712
- "[xds_client %p] Starting LRS call (chand: %p, calld: %p, "
1713
- "call: %p)",
1714
- xds_client(), chand(), this, call_);
1483
+ gpr_log(
1484
+ GPR_INFO,
1485
+ "[xds_client %p] xds server %s: starting LRS call (calld=%p, call=%p)",
1486
+ xds_client(), chand()->server_.server_uri.c_str(), this, call_);
1715
1487
  }
1716
1488
  // Create the ops.
1717
1489
  grpc_call_error call_error;
@@ -1865,14 +1637,15 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1865
1637
  // Parse the response.
1866
1638
  bool send_all_clusters = false;
1867
1639
  std::set<std::string> new_cluster_names;
1868
- grpc_millis new_load_reporting_interval;
1640
+ Duration new_load_reporting_interval;
1869
1641
  grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1870
1642
  response_slice, &send_all_clusters, &new_cluster_names,
1871
1643
  &new_load_reporting_interval);
1872
1644
  if (parse_error != GRPC_ERROR_NONE) {
1873
1645
  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());
1646
+ "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1647
+ xds_client(), chand()->server_.server_uri.c_str(),
1648
+ grpc_error_std_string(parse_error).c_str());
1876
1649
  GRPC_ERROR_UNREF(parse_error);
1877
1650
  return;
1878
1651
  }
@@ -1880,11 +1653,12 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1880
1653
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1881
1654
  gpr_log(
1882
1655
  GPR_INFO,
1883
- "[xds_client %p] LRS response received, %" PRIuPTR
1656
+ "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1884
1657
  " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1885
1658
  "ms",
1886
- xds_client(), new_cluster_names.size(), send_all_clusters,
1887
- new_load_reporting_interval);
1659
+ xds_client(), chand()->server_.server_uri.c_str(),
1660
+ new_cluster_names.size(), send_all_clusters,
1661
+ new_load_reporting_interval.millis());
1888
1662
  size_t i = 0;
1889
1663
  for (const auto& name : new_cluster_names) {
1890
1664
  gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
@@ -1892,14 +1666,16 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1892
1666
  }
1893
1667
  }
1894
1668
  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;
1669
+ Duration::Milliseconds(
1670
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1671
+ new_load_reporting_interval = Duration::Milliseconds(
1672
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1898
1673
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1899
1674
  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);
1675
+ "[xds_client %p] xds server %s: increased load_report_interval "
1676
+ "to minimum value %dms",
1677
+ xds_client(), chand()->server_.server_uri.c_str(),
1678
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1903
1679
  }
1904
1680
  }
1905
1681
  // Ignore identical update.
@@ -1907,10 +1683,11 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1907
1683
  cluster_names_ == new_cluster_names &&
1908
1684
  load_reporting_interval_ == new_load_reporting_interval) {
1909
1685
  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());
1686
+ gpr_log(
1687
+ GPR_INFO,
1688
+ "[xds_client %p] xds server %s: incoming LRS response identical "
1689
+ "to current, ignoring.",
1690
+ xds_client(), chand()->server_.server_uri.c_str());
1914
1691
  }
1915
1692
  return;
1916
1693
  }
@@ -1956,15 +1733,16 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1956
1733
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1957
1734
  char* status_details = grpc_slice_to_c_string(status_details_);
1958
1735
  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_,
1736
+ "[xds_client %p] xds server %s: LRS call status received "
1737
+ "(chand=%p, calld=%p, call=%p): "
1738
+ "status=%d, details='%s', error='%s'",
1739
+ xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1740
+ call_, status_code_, status_details,
1962
1741
  grpc_error_std_string(error).c_str());
1963
1742
  gpr_free(status_details);
1964
1743
  }
1965
1744
  // Ignore status from a stale call.
1966
1745
  if (IsCurrentCallOnChannel()) {
1967
- GPR_ASSERT(!xds_client()->shutting_down_);
1968
1746
  // Try to restart the call.
1969
1747
  parent_->OnCallFinishedLocked();
1970
1748
  }
@@ -1984,10 +1762,10 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1984
1762
 
1985
1763
  namespace {
1986
1764
 
1987
- grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1988
- return grpc_channel_args_find_integer(
1765
+ Duration GetRequestTimeout(const grpc_channel_args* args) {
1766
+ return Duration::Milliseconds(grpc_channel_args_find_integer(
1989
1767
  args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1990
- {15000, 0, INT_MAX});
1768
+ {15000, 0, INT_MAX}));
1991
1769
  }
1992
1770
 
1993
1771
  grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
@@ -2010,11 +1788,12 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
2010
1788
  bootstrap_(std::move(bootstrap)),
2011
1789
  args_(ModifyChannelArgs(args)),
2012
1790
  request_timeout_(GetRequestTimeout(args)),
1791
+ xds_federation_enabled_(XdsFederationEnabled()),
2013
1792
  interested_parties_(grpc_pollset_set_create()),
2014
1793
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
2015
1794
  bootstrap_->certificate_providers())),
2016
1795
  api_(this, &grpc_xds_client_trace, bootstrap_->node(),
2017
- &bootstrap_->certificate_providers()) {
1796
+ &bootstrap_->certificate_providers(), &symtab_) {
2018
1797
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2019
1798
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
2020
1799
  }
@@ -2045,24 +1824,9 @@ void XdsClient::Orphan() {
2045
1824
  {
2046
1825
  MutexLock lock(&mu_);
2047
1826
  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();
1827
+ // Clear cache and any remaining watchers that may not have been cancelled.
1828
+ authority_state_map_.clear();
1829
+ invalid_watchers_.clear();
2066
1830
  }
2067
1831
  }
2068
1832
 
@@ -2079,262 +1843,206 @@ RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
2079
1843
  return channel_state;
2080
1844
  }
2081
1845
 
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));
1846
+ void XdsClient::WatchResource(const XdsResourceType* type,
1847
+ absl::string_view name,
1848
+ RefCountedPtr<ResourceWatcherInterface> watcher) {
1849
+ ResourceWatcherInterface* w = watcher.get();
1850
+ // Lambda for handling failure cases.
1851
+ auto fail = [&](absl::Status status) mutable {
1852
+ {
1853
+ MutexLock lock(&mu_);
1854
+ MaybeRegisterResourceTypeLocked(type);
1855
+ invalid_watchers_[w] = watcher;
1856
+ }
1857
+ work_serializer_.Run(
1858
+ // TODO(yashykt): When we move to C++14, capture watcher using
1859
+ // std::move()
1860
+ [watcher, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1861
+ watcher->OnError(status);
1862
+ },
1863
+ DEBUG_LOCATION);
1864
+ };
1865
+ auto resource_name = ParseXdsResourceName(name, type);
1866
+ if (!resource_name.ok()) {
1867
+ fail(absl::UnavailableError(absl::StrFormat(
1868
+ "Unable to parse resource name for listener %s", name)));
2094
1869
  return;
2095
1870
  }
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());
1871
+ // Find server to use.
1872
+ const XdsBootstrap::XdsServer* xds_server = nullptr;
1873
+ absl::string_view authority_name = resource_name->authority;
1874
+ if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
1875
+ auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
1876
+ if (authority == nullptr) {
1877
+ fail(absl::UnavailableError(
1878
+ absl::StrCat("authority \"", authority_name,
1879
+ "\" not present in bootstrap config")));
1880
+ return;
2105
1881
  }
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());
1882
+ if (!authority->xds_servers.empty()) {
1883
+ xds_server = &authority->xds_servers[0];
2167
1884
  }
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
1885
  }
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);
1886
+ if (xds_server == nullptr) xds_server = &bootstrap_->server();
1887
+ {
1888
+ MutexLock lock(&mu_);
1889
+ MaybeRegisterResourceTypeLocked(type);
1890
+ AuthorityState& authority_state =
1891
+ authority_state_map_[resource_name->authority];
1892
+ ResourceState& resource_state =
1893
+ authority_state.resource_map[type][resource_name->key];
1894
+ resource_state.watchers[w] = watcher;
1895
+ // If we already have a cached value for the resource, notify the new
1896
+ // watcher immediately.
1897
+ if (resource_state.resource != nullptr) {
1898
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1899
+ gpr_log(GPR_INFO,
1900
+ "[xds_client %p] returning cached listener data for %s", this,
1901
+ std::string(name).c_str());
1902
+ }
1903
+ auto* value = type->CopyResource(resource_state.resource.get()).release();
1904
+ work_serializer_.Schedule(
1905
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1906
+ watcher->OnGenericResourceChanged(value);
1907
+ delete value;
1908
+ },
1909
+ DEBUG_LOCATION);
1910
+ }
1911
+ // If the authority doesn't yet have a channel, set it, creating it if
1912
+ // needed.
1913
+ if (authority_state.channel_state == nullptr) {
1914
+ authority_state.channel_state =
1915
+ GetOrCreateChannelStateLocked(*xds_server);
1916
+ }
1917
+ authority_state.channel_state->SubscribeLocked(type, *resource_name);
1918
+ }
1919
+ work_serializer_.DrainQueue();
1920
+ }
1921
+
1922
+ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
1923
+ absl::string_view name,
1924
+ ResourceWatcherInterface* watcher,
1925
+ bool delay_unsubscription) {
1926
+ auto resource_name = ParseXdsResourceName(name, type);
2208
1927
  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));
1928
+ if (!resource_name.ok()) {
1929
+ invalid_watchers_.erase(watcher);
2216
1930
  return;
2217
1931
  }
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
1932
  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);
2267
- 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());
1933
+ // Find authority.
1934
+ if (!resource_name.ok()) return;
1935
+ auto authority_it = authority_state_map_.find(resource_name->authority);
1936
+ if (authority_it == authority_state_map_.end()) return;
1937
+ AuthorityState& authority_state = authority_it->second;
1938
+ // Find type map.
1939
+ auto type_it = authority_state.resource_map.find(type);
1940
+ if (type_it == authority_state.resource_map.end()) return;
1941
+ auto& type_map = type_it->second;
1942
+ // Find resource key.
1943
+ auto resource_it = type_map.find(resource_name->key);
1944
+ if (resource_it == type_map.end()) return;
1945
+ ResourceState& resource_state = resource_it->second;
1946
+ // Remove watcher.
1947
+ resource_state.watchers.erase(watcher);
1948
+ // Clean up empty map entries, if any.
1949
+ if (resource_state.watchers.empty()) {
1950
+ authority_state.channel_state->UnsubscribeLocked(type, *resource_name,
1951
+ delay_unsubscription);
1952
+ type_map.erase(resource_it);
1953
+ if (type_map.empty()) {
1954
+ authority_state.resource_map.erase(type_it);
1955
+ if (authority_state.resource_map.empty()) {
1956
+ authority_state.channel_state.reset();
1957
+ }
2287
1958
  }
2288
- w->OnEndpointChanged(endpoint_state.update.value());
2289
1959
  }
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
1960
  }
2298
1961
 
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);
1962
+ void XdsClient::MaybeRegisterResourceTypeLocked(
1963
+ const XdsResourceType* resource_type) {
1964
+ auto it = resource_types_.find(resource_type->type_url());
1965
+ if (it != resource_types_.end()) {
1966
+ GPR_ASSERT(it->second == resource_type);
2311
1967
  return;
2312
1968
  }
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
- }
1969
+ resource_types_.emplace(resource_type->type_url(), resource_type);
1970
+ v2_resource_types_.emplace(resource_type->v2_type_url(), resource_type);
1971
+ resource_type->InitUpbSymtab(symtab_.ptr());
1972
+ }
1973
+
1974
+ const XdsResourceType* XdsClient::GetResourceTypeLocked(
1975
+ absl::string_view resource_type) {
1976
+ auto it = resource_types_.find(resource_type);
1977
+ if (it != resource_types_.end()) return it->second;
1978
+ auto it2 = v2_resource_types_.find(resource_type);
1979
+ if (it2 != v2_resource_types_.end()) return it2->second;
1980
+ return nullptr;
1981
+ }
1982
+
1983
+ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
1984
+ absl::string_view name, const XdsResourceType* type) {
1985
+ // Old-style names use the empty string for authority.
1986
+ // authority is prefixed with "old:" to indicate that it's an old-style name.
1987
+ if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
1988
+ return XdsResourceName{"old:", {std::string(name), {}}};
1989
+ }
1990
+ // New style name. Parse URI.
1991
+ auto uri = URI::Parse(name);
1992
+ if (!uri.ok()) return uri.status();
1993
+ // Split the resource type off of the path to get the id.
1994
+ std::pair<absl::string_view, absl::string_view> path_parts = absl::StrSplit(
1995
+ absl::StripPrefix(uri->path(), "/"), absl::MaxSplits('/', 1));
1996
+ if (!type->IsType(path_parts.first, nullptr)) {
1997
+ return absl::InvalidArgumentError(
1998
+ "xdstp URI path must indicate valid xDS resource type");
1999
+ }
2000
+ // Canonicalize order of query params.
2001
+ std::vector<URI::QueryParam> query_params;
2002
+ for (const auto& p : uri->query_parameter_map()) {
2003
+ query_params.emplace_back(
2004
+ URI::QueryParam{std::string(p.first), std::string(p.second)});
2005
+ }
2006
+ return XdsResourceName{
2007
+ absl::StrCat("xdstp:", uri->authority()),
2008
+ {std::string(path_parts.second), std::move(query_params)}};
2009
+ }
2010
+
2011
+ std::string XdsClient::ConstructFullXdsResourceName(
2012
+ absl::string_view authority, absl::string_view resource_type,
2013
+ const XdsResourceKey& key) {
2014
+ if (absl::ConsumePrefix(&authority, "xdstp:")) {
2015
+ auto uri = URI::Create("xdstp", std::string(authority),
2016
+ absl::StrCat("/", resource_type, "/", key.id),
2017
+ key.query_params, /*fragment=*/"");
2018
+ GPR_ASSERT(uri.ok());
2019
+ return uri->ToString();
2020
+ }
2021
+ // Old-style name.
2022
+ return key.id;
2321
2023
  }
2322
2024
 
2323
2025
  RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2324
- absl::string_view lrs_server, absl::string_view cluster_name,
2026
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2325
2027
  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.
2028
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2328
2029
  auto key =
2329
2030
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2330
2031
  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
2032
+ // We jump through some hoops here to make sure that the const
2033
+ // XdsBootstrap::XdsServer& and absl::string_views
2034
+ // stored in the XdsClusterDropStats object point to the
2035
+ // XdsBootstrap::XdsServer and strings
2333
2036
  // 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;
2037
+ auto server_it =
2038
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2039
+ if (server_it->second.channel_state == nullptr) {
2040
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2041
+ }
2042
+ auto load_report_it = server_it->second.load_report_map
2043
+ .emplace(std::move(key), LoadReportState())
2044
+ .first;
2045
+ LoadReportState& load_report_state = load_report_it->second;
2338
2046
  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
2339
2047
  if (load_report_state.drop_stats != nullptr) {
2340
2048
  cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
@@ -2345,31 +2053,26 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2345
2053
  load_report_state.drop_stats->GetSnapshotAndReset();
2346
2054
  }
2347
2055
  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*/);
2056
+ Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
2057
+ load_report_it->first.first /*cluster_name*/,
2058
+ load_report_it->first.second /*eds_service_name*/);
2351
2059
  load_report_state.drop_stats = cluster_drop_stats.get();
2352
2060
  }
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();
2358
- }
2061
+ server_it->second.channel_state->MaybeStartLrsCall();
2359
2062
  return cluster_drop_stats;
2360
2063
  }
2361
2064
 
2362
2065
  void XdsClient::RemoveClusterDropStats(
2363
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
2066
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2364
2067
  absl::string_view eds_service_name,
2365
2068
  XdsClusterDropStats* cluster_drop_stats) {
2366
2069
  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(
2070
+ auto server_it = xds_load_report_server_map_.find(xds_server);
2071
+ if (server_it == xds_load_report_server_map_.end()) return;
2072
+ auto load_report_it = server_it->second.load_report_map.find(
2370
2073
  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;
2074
+ if (load_report_it == server_it->second.load_report_map.end()) return;
2075
+ LoadReportState& load_report_state = load_report_it->second;
2373
2076
  if (load_report_state.drop_stats == cluster_drop_stats) {
2374
2077
  // Record final snapshot in deleted_drop_stats, which will be
2375
2078
  // added to the next load report.
@@ -2380,21 +2083,27 @@ void XdsClient::RemoveClusterDropStats(
2380
2083
  }
2381
2084
 
2382
2085
  RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2383
- absl::string_view lrs_server, absl::string_view cluster_name,
2086
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2384
2087
  absl::string_view eds_service_name,
2385
2088
  RefCountedPtr<XdsLocalityName> locality) {
2386
- // TODO(roth): When we add support for direct federation, use the
2387
- // server name specified in lrs_server.
2089
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2388
2090
  auto key =
2389
2091
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2390
2092
  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
2093
+ // We jump through some hoops here to make sure that the const
2094
+ // XdsBootstrap::XdsServer& and absl::string_views
2095
+ // stored in the XdsClusterDropStats object point to the
2096
+ // XdsBootstrap::XdsServer and strings
2393
2097
  // 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;
2098
+ auto server_it =
2099
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2100
+ if (server_it->second.channel_state == nullptr) {
2101
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2102
+ }
2103
+ auto load_report_it = server_it->second.load_report_map
2104
+ .emplace(std::move(key), LoadReportState())
2105
+ .first;
2106
+ LoadReportState& load_report_state = load_report_it->second;
2398
2107
  LoadReportState::LocalityState& locality_state =
2399
2108
  load_report_state.locality_stats[locality];
2400
2109
  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
@@ -2407,32 +2116,27 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2407
2116
  locality_state.locality_stats->GetSnapshotAndReset();
2408
2117
  }
2409
2118
  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));
2119
+ Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
2120
+ load_report_it->first.first /*cluster_name*/,
2121
+ load_report_it->first.second /*eds_service_name*/, std::move(locality));
2413
2122
  locality_state.locality_stats = cluster_locality_stats.get();
2414
2123
  }
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();
2420
- }
2124
+ server_it->second.channel_state->MaybeStartLrsCall();
2421
2125
  return cluster_locality_stats;
2422
2126
  }
2423
2127
 
2424
2128
  void XdsClient::RemoveClusterLocalityStats(
2425
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
2129
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2426
2130
  absl::string_view eds_service_name,
2427
2131
  const RefCountedPtr<XdsLocalityName>& locality,
2428
2132
  XdsClusterLocalityStats* cluster_locality_stats) {
2429
2133
  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(
2134
+ auto server_it = xds_load_report_server_map_.find(xds_server);
2135
+ if (server_it == xds_load_report_server_map_.end()) return;
2136
+ auto load_report_it = server_it->second.load_report_map.find(
2433
2137
  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;
2138
+ if (load_report_it == server_it->second.load_report_map.end()) return;
2139
+ LoadReportState& load_report_state = load_report_it->second;
2436
2140
  auto locality_it = load_report_state.locality_stats.find(locality);
2437
2141
  if (locality_it == load_report_state.locality_stats.end()) return;
2438
2142
  LoadReportState::LocalityState& locality_state = locality_it->second;
@@ -2452,44 +2156,77 @@ void XdsClient::ResetBackoff() {
2452
2156
  }
2453
2157
  }
2454
2158
 
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));
2159
+ void XdsClient::NotifyOnErrorLocked(absl::Status status) {
2160
+ const auto* node = bootstrap_->node();
2161
+ if (node != nullptr) {
2162
+ status = absl::Status(
2163
+ status.code(), absl::StrCat(status.message(),
2164
+ " (node ID:", bootstrap_->node()->id, ")"));
2165
+ }
2166
+ std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
2167
+ for (const auto& a : authority_state_map_) { // authority
2168
+ for (const auto& t : a.second.resource_map) { // type
2169
+ for (const auto& r : t.second) { // resource id
2170
+ for (const auto& w : r.second.watchers) { // watchers
2171
+ watchers.insert(w.second);
2172
+ }
2479
2173
  }
2480
2174
  }
2481
2175
  }
2482
- GRPC_ERROR_UNREF(error);
2176
+ work_serializer_.Schedule(
2177
+ // TODO(yashykt): When we move to C++14, capture watchers using
2178
+ // std::move()
2179
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2180
+ for (const auto& watcher : watchers) {
2181
+ watcher->OnError(status);
2182
+ }
2183
+ },
2184
+ DEBUG_LOCATION);
2185
+ }
2186
+
2187
+ void XdsClient::NotifyWatchersOnErrorLocked(
2188
+ const std::map<ResourceWatcherInterface*,
2189
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
2190
+ absl::Status status) {
2191
+ const auto* node = bootstrap_->node();
2192
+ if (node != nullptr) {
2193
+ status = absl::Status(
2194
+ status.code(), absl::StrCat(status.message(),
2195
+ " (node ID:", bootstrap_->node()->id, ")"));
2196
+ }
2197
+ work_serializer_.Schedule(
2198
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2199
+ for (const auto& p : watchers) {
2200
+ p.first->OnError(status);
2201
+ }
2202
+ },
2203
+ DEBUG_LOCATION);
2204
+ }
2205
+
2206
+ void XdsClient::NotifyWatchersOnResourceDoesNotExist(
2207
+ const std::map<ResourceWatcherInterface*,
2208
+ RefCountedPtr<ResourceWatcherInterface>>& watchers) {
2209
+ work_serializer_.Schedule(
2210
+ [watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2211
+ for (const auto& p : watchers) {
2212
+ p.first->OnResourceDoesNotExist();
2213
+ }
2214
+ },
2215
+ DEBUG_LOCATION);
2483
2216
  }
2484
2217
 
2485
2218
  XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2486
- bool send_all_clusters, const std::set<std::string>& clusters) {
2219
+ const XdsBootstrap::XdsServer& xds_server, bool send_all_clusters,
2220
+ const std::set<std::string>& clusters) {
2487
2221
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2488
2222
  gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
2489
2223
  }
2490
2224
  XdsApi::ClusterLoadReportMap snapshot_map;
2491
- for (auto load_report_it = load_report_map_.begin();
2492
- load_report_it != load_report_map_.end();) {
2225
+ auto server_it = xds_load_report_server_map_.find(xds_server);
2226
+ if (server_it == xds_load_report_server_map_.end()) return snapshot_map;
2227
+ auto& load_report_map = server_it->second.load_report_map;
2228
+ for (auto load_report_it = load_report_map.begin();
2229
+ load_report_it != load_report_map.end();) {
2493
2230
  // Cluster key is cluster and EDS service name.
2494
2231
  const auto& cluster_key = load_report_it->first;
2495
2232
  LoadReportState& load_report = load_report_it->second;
@@ -2544,7 +2281,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2544
2281
  }
2545
2282
  }
2546
2283
  // Compute load report interval.
2547
- const grpc_millis now = ExecCtx::Get()->Now();
2284
+ const Timestamp now = ExecCtx::Get()->Now();
2548
2285
  snapshot.load_report_interval = now - load_report.last_report_time;
2549
2286
  load_report.last_report_time = now;
2550
2287
  // Record snapshot.
@@ -2555,7 +2292,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2555
2292
  // deleted stats objects, remove the entry.
2556
2293
  if (load_report.locality_stats.empty() &&
2557
2294
  load_report.drop_stats == nullptr) {
2558
- load_report_it = load_report_map_.erase(load_report_it);
2295
+ load_report_it = load_report_map.erase(load_report_it);
2559
2296
  } else {
2560
2297
  ++load_report_it;
2561
2298
  }
@@ -2566,35 +2303,18 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2566
2303
  std::string XdsClient::DumpClientConfigBinary() {
2567
2304
  MutexLock lock(&mu_);
2568
2305
  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_) {
2306
+ for (const auto& a : authority_state_map_) { // authority
2574
2307
  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;
2308
+ for (const auto& t : a.second.resource_map) { // type
2309
+ const XdsResourceType* type = t.first;
2310
+ auto& resource_metadata_map =
2311
+ resource_type_metadata_map[type->type_url()];
2312
+ for (const auto& r : t.second) { // resource id
2313
+ const XdsResourceKey& resource_key = r.first;
2314
+ const ResourceState& resource_state = r.second;
2315
+ resource_metadata_map[ConstructFullXdsResourceName(
2316
+ authority, type->type_url(), resource_key)] = &resource_state.meta;
2317
+ }
2598
2318
  }
2599
2319
  }
2600
2320
  // Assemble config dump messages
@@ -2608,6 +2328,7 @@ std::string XdsClient::DumpClientConfigBinary() {
2608
2328
  void XdsClientGlobalInit() {
2609
2329
  g_mu = new Mutex;
2610
2330
  XdsHttpFilterRegistry::Init();
2331
+ XdsClusterSpecifierPluginRegistry::Init();
2611
2332
  }
2612
2333
 
2613
2334
  // TODO(roth): Find a better way to clear the fallback config that does
@@ -2618,6 +2339,7 @@ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2618
2339
  delete g_mu;
2619
2340
  g_mu = nullptr;
2620
2341
  XdsHttpFilterRegistry::Shutdown();
2342
+ XdsClusterSpecifierPluginRegistry::Shutdown();
2621
2343
  }
2622
2344
 
2623
2345
  namespace {
@@ -2625,7 +2347,7 @@ namespace {
2625
2347
  std::string GetBootstrapContents(const char* fallback_config,
2626
2348
  grpc_error_handle* error) {
2627
2349
  // First, try GRPC_XDS_BOOTSTRAP env var.
2628
- grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2350
+ UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2629
2351
  if (path != nullptr) {
2630
2352
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2631
2353
  gpr_log(GPR_INFO,
@@ -2642,8 +2364,7 @@ std::string GetBootstrapContents(const char* fallback_config,
2642
2364
  return contents_str;
2643
2365
  }
2644
2366
  // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2645
- grpc_core::UniquePtr<char> env_config(
2646
- gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2367
+ UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2647
2368
  if (env_config != nullptr) {
2648
2369
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2649
2370
  gpr_log(GPR_INFO,