grpc 1.42.0 → 1.45.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

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