grpc 1.43.1 → 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 (1240) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +349 -216
  3. data/include/grpc/event_engine/event_engine.h +2 -2
  4. data/include/grpc/grpc.h +40 -14
  5. data/include/grpc/grpc_posix.h +20 -19
  6. data/include/grpc/grpc_security.h +36 -50
  7. data/include/grpc/impl/codegen/compression_types.h +0 -2
  8. data/include/grpc/impl/codegen/grpc_types.h +17 -8
  9. data/include/grpc/impl/codegen/port_platform.h +2 -2
  10. data/include/grpc/impl/codegen/slice.h +4 -1
  11. data/include/grpc/slice.h +0 -11
  12. data/src/core/ext/filters/client_channel/backend_metric.cc +3 -3
  13. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +12 -8
  15. data/src/core/ext/filters/client_channel/channel_connectivity.cc +5 -5
  16. data/src/core/ext/filters/client_channel/client_channel.cc +140 -124
  17. data/src/core/ext/filters/client_channel/client_channel.h +38 -37
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +6 -12
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -2
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +2 -2
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -22
  24. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -15
  25. data/src/core/ext/filters/client_channel/health/health_check_client.cc +32 -31
  26. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  27. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +10 -13
  28. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +4 -7
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +99 -79
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +15 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -4
  36. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +50 -32
  37. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +28 -19
  38. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  39. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +161 -112
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  42. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +28 -19
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +65 -36
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +5 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +69 -117
  48. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  49. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  50. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +10 -16
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +259 -120
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +136 -226
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  58. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +120 -113
  59. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -17
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  61. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +83 -61
  62. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +40 -39
  63. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +185 -96
  64. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -11
  65. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +13 -7
  66. data/src/core/ext/filters/client_channel/retry_filter.cc +236 -169
  67. data/src/core/ext/filters/client_channel/retry_service_config.cc +16 -18
  68. data/src/core/ext/filters/client_channel/retry_service_config.h +18 -12
  69. data/src/core/ext/filters/client_channel/retry_throttle.cc +9 -23
  70. data/src/core/ext/filters/client_channel/retry_throttle.h +11 -5
  71. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +8 -7
  72. data/src/core/ext/filters/client_channel/subchannel.cc +45 -52
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -7
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +96 -159
  75. data/src/core/ext/filters/client_idle/idle_filter_state.h +2 -2
  76. data/src/core/ext/filters/deadline/deadline_filter.cc +15 -14
  77. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  78. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +53 -58
  79. data/src/core/ext/filters/fault_injection/service_config_parser.cc +11 -13
  80. data/src/core/ext/filters/fault_injection/service_config_parser.h +10 -4
  81. data/src/core/ext/filters/http/client/http_client_filter.cc +58 -125
  82. data/src/core/ext/filters/http/client_authority_filter.cc +28 -87
  83. data/src/core/ext/filters/http/client_authority_filter.h +23 -5
  84. data/src/core/ext/filters/http/http_filters_plugin.cc +11 -12
  85. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +43 -140
  86. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +15 -27
  87. data/src/core/ext/filters/http/server/http_server_filter.cc +51 -135
  88. data/src/core/ext/filters/max_age/max_age_filter.cc +46 -40
  89. data/src/core/ext/filters/message_size/message_size_filter.cc +27 -35
  90. data/src/core/ext/filters/message_size/message_size_filter.h +10 -3
  91. data/src/core/ext/filters/rbac/rbac_filter.cc +162 -0
  92. data/src/core/ext/filters/rbac/rbac_filter.h +76 -0
  93. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +606 -0
  94. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +75 -0
  95. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  96. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +12 -6
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +234 -0
  98. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +236 -34
  99. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +155 -233
  100. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -2
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -3
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  104. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -0
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +342 -281
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +70 -160
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  109. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  110. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +29 -78
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  114. data/src/core/ext/transport/chttp2/transport/internal.h +6 -39
  115. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -9
  116. data/src/core/ext/transport/chttp2/transport/writing.cc +62 -128
  117. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  118. data/src/core/ext/transport/inproc/inproc_transport.cc +27 -75
  119. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  120. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +114 -0
  121. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +402 -0
  122. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +119 -0
  123. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +453 -0
  124. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +165 -163
  125. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +798 -575
  126. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  127. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +138 -0
  128. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +62 -0
  129. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +146 -0
  130. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  131. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +106 -0
  132. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  133. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +93 -0
  134. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  135. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +88 -0
  136. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +103 -0
  137. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +466 -0
  138. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  139. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +95 -0
  140. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +22 -20
  141. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +17 -16
  142. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +15 -13
  143. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +31 -23
  144. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +90 -88
  145. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +421 -317
  146. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +156 -152
  147. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +787 -571
  148. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +27 -25
  149. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +115 -79
  150. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +206 -204
  151. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +954 -662
  152. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +10 -8
  153. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +33 -23
  154. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +29 -27
  155. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +127 -79
  156. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +290 -0
  157. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1122 -0
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +49 -47
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +221 -159
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +10 -8
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +33 -23
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +154 -151
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +691 -499
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +39 -37
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +178 -130
  166. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +9 -7
  167. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +25 -19
  168. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +18 -16
  169. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +74 -53
  170. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  171. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +138 -0
  172. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +100 -98
  173. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +449 -329
  174. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +77 -75
  175. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +365 -264
  176. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +11 -9
  177. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +36 -26
  178. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +140 -105
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +675 -345
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +8 -6
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +25 -17
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +15 -13
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +59 -42
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +13 -11
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +39 -25
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +14 -12
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +45 -35
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +10 -8
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +34 -24
  190. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +31 -29
  191. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +113 -85
  192. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +47 -45
  193. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +210 -151
  194. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +48 -46
  195. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +210 -142
  196. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +9 -7
  197. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +28 -20
  198. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +58 -54
  199. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +282 -193
  200. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +64 -62
  201. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +286 -218
  202. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +15 -13
  203. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +62 -42
  204. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +12 -10
  205. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +54 -39
  206. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  207. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +120 -0
  208. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +55 -53
  209. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +244 -185
  210. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +57 -55
  211. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +260 -192
  212. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +70 -68
  213. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +235 -191
  214. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +30 -28
  215. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +142 -112
  216. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +435 -428
  217. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2037 -1507
  218. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +25 -19
  219. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +107 -64
  220. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +216 -0
  221. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +870 -0
  222. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  223. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +82 -0
  224. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  225. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +95 -0
  226. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +15 -13
  227. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +55 -40
  228. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  229. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +119 -0
  230. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +62 -0
  231. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +203 -0
  232. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  233. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +89 -0
  234. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  235. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +184 -0
  236. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +32 -0
  237. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +42 -0
  238. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  239. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +192 -0
  240. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  241. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +126 -0
  242. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +8 -6
  243. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +29 -23
  244. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +26 -24
  245. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +125 -93
  246. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +33 -31
  247. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -105
  248. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +63 -0
  249. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +165 -0
  250. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +15 -13
  251. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +53 -37
  252. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +175 -173
  253. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +803 -559
  254. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +3 -1
  255. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +2 -1
  256. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +75 -52
  257. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +368 -194
  258. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +24 -22
  259. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +95 -71
  260. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +60 -58
  261. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +266 -193
  262. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  263. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +146 -0
  264. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +6 -4
  265. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +22 -16
  266. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +64 -62
  267. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +297 -218
  268. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +18 -16
  269. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +73 -54
  270. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +46 -44
  271. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +197 -145
  272. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  273. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +101 -0
  274. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +19 -17
  275. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +91 -70
  276. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +202 -0
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +16 -14
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +64 -47
  280. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +10 -8
  281. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +34 -26
  282. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +10 -8
  283. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +25 -19
  284. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +9 -7
  285. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +25 -19
  286. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +21 -19
  287. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +85 -61
  288. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +19 -17
  289. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +65 -52
  290. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +14 -12
  291. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +56 -43
  292. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +21 -19
  293. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +74 -58
  294. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +30 -28
  295. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +163 -125
  296. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +34 -32
  297. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +157 -113
  298. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  299. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +183 -0
  300. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +3 -1
  301. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -1
  302. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  303. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +136 -0
  304. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +13 -11
  305. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +51 -34
  306. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +19 -17
  307. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +80 -52
  308. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  309. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  310. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +10 -8
  311. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +31 -19
  312. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  313. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +114 -0
  314. data/src/core/ext/upb-generated/google/api/annotations.upb.c +10 -8
  315. data/src/core/ext/upb-generated/google/api/annotations.upb.h +6 -5
  316. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +100 -98
  317. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +371 -281
  318. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +110 -108
  319. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +409 -298
  320. data/src/core/ext/upb-generated/google/api/http.upb.c +29 -27
  321. data/src/core/ext/upb-generated/google/api/http.upb.h +117 -89
  322. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  323. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +99 -0
  324. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +9 -7
  325. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +32 -22
  326. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +287 -234
  327. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1088 -764
  328. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +9 -7
  329. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +28 -18
  330. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +6 -4
  331. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +22 -16
  332. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +30 -28
  333. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +80 -64
  334. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +9 -7
  335. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +28 -18
  336. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +40 -38
  337. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +213 -149
  338. data/src/core/ext/upb-generated/google/rpc/status.upb.c +11 -9
  339. data/src/core/ext/upb-generated/google/rpc/status.upb.h +36 -26
  340. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  341. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +276 -0
  342. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +20 -18
  343. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +60 -42
  344. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +95 -93
  345. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +396 -285
  346. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +15 -13
  347. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +58 -39
  348. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +12 -10
  349. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +50 -35
  350. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +55 -53
  351. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +255 -183
  352. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +22 -20
  353. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +76 -57
  354. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +46 -44
  355. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +102 -78
  356. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +16 -14
  357. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +32 -22
  358. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +9 -7
  359. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +6 -5
  360. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +16 -14
  361. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +32 -22
  362. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +15 -13
  363. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +31 -23
  364. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -304
  365. data/src/core/ext/upb-generated/validate/validate.upb.h +1114 -741
  366. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  367. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +191 -0
  368. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  369. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +87 -0
  370. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  371. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +38 -0
  372. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +40 -38
  373. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +109 -78
  374. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  375. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +81 -0
  376. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +8 -6
  377. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +27 -19
  378. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +17 -15
  379. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +63 -46
  380. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +14 -12
  381. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +31 -25
  382. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  383. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +95 -0
  384. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +11 -9
  385. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +39 -27
  386. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +20 -18
  387. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +73 -54
  388. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +12 -10
  389. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +43 -29
  390. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +23 -21
  391. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +43 -31
  392. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +203 -0
  393. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +726 -0
  394. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  395. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +132 -0
  396. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  397. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +173 -0
  398. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +10 -8
  399. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +33 -23
  400. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  401. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  402. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  403. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  404. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +14 -12
  405. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +67 -67
  406. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  407. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  408. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +53 -0
  409. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  410. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  411. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  413. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  414. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  415. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  417. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  418. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  419. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +8 -6
  421. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  422. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +8 -6
  423. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  424. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +20 -17
  425. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  426. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +248 -240
  427. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  428. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +16 -13
  429. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  430. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +375 -371
  431. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  432. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +14 -11
  433. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  434. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -13
  435. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  436. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  437. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  438. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +15 -13
  439. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  440. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +15 -12
  441. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  442. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +85 -80
  443. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  444. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +18 -16
  445. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +16 -16
  446. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +14 -12
  447. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  448. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +15 -12
  449. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +7 -7
  450. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  451. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  452. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +21 -18
  453. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  454. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +23 -20
  455. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +25 -25
  456. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +14 -12
  457. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  458. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +250 -221
  459. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  460. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +12 -9
  461. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  462. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +14 -11
  463. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  464. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +14 -11
  465. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  466. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +18 -15
  467. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  468. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +13 -11
  469. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  470. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +18 -15
  471. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  472. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +19 -16
  473. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  474. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +18 -15
  475. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  476. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +14 -11
  477. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  478. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +52 -45
  479. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +19 -19
  480. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +23 -20
  481. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  482. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +19 -16
  483. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  484. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +15 -12
  485. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  486. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  487. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  488. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +17 -14
  489. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  490. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +17 -14
  491. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  492. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +190 -0
  493. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  494. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +19 -16
  495. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +10 -10
  496. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +816 -801
  497. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +160 -160
  498. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +52 -37
  499. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  500. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +188 -0
  501. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +85 -0
  502. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  503. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  504. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  505. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  506. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +15 -12
  507. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  508. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  509. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  510. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  511. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  512. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  513. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  514. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  515. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  516. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +57 -0
  517. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  518. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  519. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  520. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  521. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  522. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +15 -11
  523. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  524. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +17 -14
  525. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  526. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +18 -15
  527. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  528. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +59 -0
  529. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  530. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +17 -13
  531. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  532. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +135 -130
  533. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +58 -58
  534. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +15 -11
  535. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  536. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +169 -140
  537. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  538. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +19 -16
  539. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  540. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +21 -17
  541. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +19 -19
  542. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  543. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  544. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +14 -11
  545. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  546. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +17 -14
  547. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +22 -22
  548. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +16 -13
  549. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  550. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +20 -17
  551. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  552. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  553. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  554. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +13 -10
  555. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  556. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  557. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  558. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +15 -12
  559. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  560. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +15 -12
  561. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  562. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +15 -12
  563. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  564. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +15 -12
  565. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  566. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +15 -12
  567. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  568. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +15 -12
  569. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  570. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +14 -12
  571. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  572. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +16 -13
  573. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  574. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +13 -10
  575. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  576. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +14 -11
  577. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  578. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  579. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  580. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +10 -8
  581. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  582. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  583. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  584. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +12 -10
  585. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  586. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +11 -8
  587. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  588. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  589. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  590. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +11 -9
  591. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  592. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  593. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  594. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +5 -5
  595. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  596. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  597. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  598. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  599. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  600. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +3 -3
  601. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  602. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  603. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  604. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +3 -3
  605. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  606. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +3 -3
  607. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  608. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +3 -3
  609. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  610. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +3 -3
  611. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  612. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +3 -3
  613. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  614. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +3 -3
  615. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  616. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +3 -3
  617. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  618. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +4 -4
  619. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  620. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  621. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  622. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +4 -4
  623. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  624. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +5 -5
  625. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  626. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -4
  627. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  628. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +4 -4
  629. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  630. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +4 -4
  631. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  632. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +6 -6
  633. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  634. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  635. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  636. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  637. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  638. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  639. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  640. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +4 -4
  641. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  642. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  643. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  644. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +5 -5
  645. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  646. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +7 -7
  647. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  648. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +4 -4
  649. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  650. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  651. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  652. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +6 -6
  653. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  654. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +6 -6
  655. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  656. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +6 -6
  657. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  658. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  659. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  660. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  661. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  662. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  663. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  664. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +5 -5
  665. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  666. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -4
  667. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  668. data/src/core/ext/xds/upb_utils.h +67 -0
  669. data/src/core/ext/xds/xds_api.cc +127 -3487
  670. data/src/core/ext/xds/xds_api.h +60 -615
  671. data/src/core/ext/xds/xds_bootstrap.cc +221 -125
  672. data/src/core/ext/xds/xds_bootstrap.h +31 -15
  673. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  674. data/src/core/ext/xds/xds_channel_stack_modifier.cc +14 -17
  675. data/src/core/ext/xds/xds_channel_stack_modifier.h +4 -3
  676. data/src/core/ext/xds/xds_client.cc +702 -1077
  677. data/src/core/ext/xds/xds_client.h +101 -150
  678. data/src/core/ext/xds/xds_client_stats.cc +15 -15
  679. data/src/core/ext/xds/xds_client_stats.h +5 -4
  680. data/src/core/ext/xds/xds_cluster.cc +453 -0
  681. data/src/core/ext/xds/xds_cluster.h +108 -0
  682. data/src/core/ext/xds/xds_common_types.cc +388 -0
  683. data/src/core/ext/xds/xds_common_types.h +95 -0
  684. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  685. data/src/core/ext/xds/xds_endpoint.h +135 -0
  686. data/src/core/ext/xds/xds_http_fault_filter.cc +6 -6
  687. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  688. data/src/core/ext/xds/xds_http_filters.cc +11 -5
  689. data/src/core/ext/xds/xds_http_filters.h +4 -4
  690. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  691. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  692. data/src/core/ext/xds/xds_listener.cc +1039 -0
  693. data/src/core/ext/xds/xds_listener.h +220 -0
  694. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  695. data/src/core/ext/xds/xds_resource_type.h +98 -0
  696. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  697. data/src/core/ext/xds/xds_route_config.cc +985 -0
  698. data/src/core/ext/xds/xds_route_config.h +215 -0
  699. data/src/core/ext/xds/xds_routing.cc +12 -9
  700. data/src/core/ext/xds/xds_routing.h +8 -5
  701. data/src/core/ext/xds/xds_server_config_fetcher.cc +162 -101
  702. data/src/core/lib/address_utils/parse_address.cc +20 -0
  703. data/src/core/lib/address_utils/parse_address.h +5 -0
  704. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  705. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  706. data/src/core/lib/backoff/backoff.cc +8 -37
  707. data/src/core/lib/backoff/backoff.h +11 -11
  708. data/src/core/lib/channel/call_finalization.h +86 -0
  709. data/src/core/lib/channel/channel_args.cc +60 -1
  710. data/src/core/lib/channel/channel_args.h +2 -0
  711. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  712. data/src/core/lib/channel/channel_stack.cc +10 -3
  713. data/src/core/lib/channel/channel_stack.h +42 -6
  714. data/src/core/lib/channel/channel_stack_builder.cc +66 -248
  715. data/src/core/lib/channel/channel_stack_builder.h +95 -147
  716. data/src/core/lib/channel/channel_trace.cc +3 -6
  717. data/src/core/lib/channel/channelz.cc +1 -0
  718. data/src/core/lib/channel/connected_channel.cc +9 -4
  719. data/src/core/lib/channel/connected_channel.h +1 -1
  720. data/src/core/lib/channel/context.h +11 -0
  721. data/src/core/lib/channel/handshaker.cc +1 -1
  722. data/src/core/lib/channel/handshaker.h +1 -1
  723. data/src/core/lib/channel/promise_based_filter.cc +669 -0
  724. data/src/core/lib/channel/promise_based_filter.h +423 -0
  725. data/src/core/lib/compression/compression.cc +20 -112
  726. data/src/core/lib/compression/compression_internal.cc +143 -203
  727. data/src/core/lib/compression/compression_internal.h +64 -69
  728. data/src/core/lib/compression/message_compress.cc +11 -11
  729. data/src/core/lib/compression/message_compress.h +2 -2
  730. data/src/core/lib/config/core_configuration.cc +8 -2
  731. data/src/core/lib/config/core_configuration.h +39 -0
  732. data/src/core/lib/event_engine/default_event_engine_factory.cc +27 -0
  733. data/src/core/lib/event_engine/event_engine.cc +23 -8
  734. data/src/core/lib/event_engine/event_engine_factory.h +3 -0
  735. data/src/core/lib/event_engine/memory_allocator.cc +9 -13
  736. data/src/core/lib/event_engine/{event_engine_factory.cc → resolved_address.cc} +10 -20
  737. data/src/core/lib/gpr/sync_posix.cc +1 -0
  738. data/src/core/lib/gpr/time.cc +2 -1
  739. data/src/core/lib/gpr/useful.h +18 -0
  740. data/src/core/lib/gprpp/bitset.h +7 -0
  741. data/src/core/lib/gprpp/capture.h +76 -0
  742. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  743. data/src/core/lib/gprpp/debug_location.h +2 -0
  744. data/src/core/lib/gprpp/status_helper.cc +30 -38
  745. data/src/core/lib/gprpp/status_helper.h +6 -19
  746. data/src/core/lib/gprpp/table.h +11 -0
  747. data/src/core/lib/gprpp/time.cc +186 -0
  748. data/src/core/lib/gprpp/time.h +292 -0
  749. data/src/core/lib/http/format_request.cc +27 -23
  750. data/src/core/lib/http/format_request.h +7 -6
  751. data/src/core/lib/http/httpcli.cc +307 -239
  752. data/src/core/lib/http/httpcli.h +182 -89
  753. data/src/core/lib/http/httpcli_security_connector.cc +62 -73
  754. data/src/core/lib/http/httpcli_ssl_credentials.h +37 -0
  755. data/src/core/lib/http/parser.h +1 -1
  756. data/src/core/lib/iomgr/buffer_list.h +5 -5
  757. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  758. data/src/core/lib/iomgr/closure.h +29 -9
  759. data/src/core/lib/iomgr/combiner.cc +25 -3
  760. data/src/core/lib/iomgr/error.cc +13 -10
  761. data/src/core/lib/iomgr/error.h +0 -2
  762. data/src/core/lib/iomgr/ev_apple.cc +6 -5
  763. data/src/core/lib/iomgr/ev_epoll1_linux.cc +8 -7
  764. data/src/core/lib/iomgr/ev_epollex_linux.cc +12 -9
  765. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -7
  766. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  767. data/src/core/lib/iomgr/ev_posix.h +1 -1
  768. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  769. data/src/core/lib/iomgr/event_engine/pollset.cc +2 -3
  770. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  771. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  772. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  773. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  774. data/src/core/lib/iomgr/event_engine/tcp.cc +4 -3
  775. data/src/core/lib/iomgr/event_engine/timer.cc +3 -4
  776. data/src/core/lib/iomgr/exec_ctx.cc +25 -97
  777. data/src/core/lib/iomgr/exec_ctx.h +7 -23
  778. data/src/core/lib/iomgr/executor.cc +10 -1
  779. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  780. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  781. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  782. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  783. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  784. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  785. data/src/core/lib/iomgr/polling_entity.h +6 -0
  786. data/src/core/lib/iomgr/pollset.cc +1 -1
  787. data/src/core/lib/iomgr/pollset.h +4 -4
  788. data/src/core/lib/iomgr/pollset_windows.cc +2 -2
  789. data/src/core/lib/iomgr/port.h +6 -9
  790. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  791. data/src/core/lib/iomgr/resolve_address.h +47 -44
  792. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  793. data/src/core/lib/iomgr/resolve_address_posix.cc +83 -67
  794. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  795. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  796. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  797. data/src/core/lib/iomgr/resolved_address.h +39 -0
  798. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +62 -0
  799. data/src/core/lib/iomgr/socket_utils_common_posix.cc +0 -17
  800. data/src/core/lib/iomgr/tcp_client.cc +1 -1
  801. data/src/core/lib/iomgr/tcp_client.h +3 -2
  802. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  803. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
  804. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  805. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -1
  806. data/src/core/lib/iomgr/tcp_posix.cc +2 -1
  807. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  808. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  809. data/src/core/lib/iomgr/tcp_windows.cc +17 -10
  810. data/src/core/lib/iomgr/timer.cc +2 -2
  811. data/src/core/lib/iomgr/timer.h +11 -6
  812. data/src/core/lib/iomgr/timer_generic.cc +96 -77
  813. data/src/core/lib/iomgr/timer_manager.cc +15 -14
  814. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  815. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  816. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  817. data/src/core/lib/iomgr/work_serializer.cc +15 -10
  818. data/src/core/lib/json/json_util.cc +4 -4
  819. data/src/core/lib/json/json_util.h +2 -2
  820. data/src/core/lib/matchers/matchers.cc +1 -1
  821. data/src/core/lib/promise/activity.cc +14 -8
  822. data/src/core/lib/promise/activity.h +183 -142
  823. data/src/core/lib/promise/arena_promise.h +188 -0
  824. data/src/core/lib/promise/detail/basic_seq.h +92 -3
  825. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  826. data/src/core/lib/promise/detail/status.h +5 -0
  827. data/src/core/lib/promise/loop.h +34 -8
  828. data/src/core/lib/promise/poll.h +6 -0
  829. data/src/core/lib/promise/promise.h +95 -0
  830. data/src/core/lib/promise/seq.h +19 -1
  831. data/src/core/lib/promise/sleep.cc +74 -0
  832. data/src/core/lib/promise/sleep.h +66 -0
  833. data/src/core/lib/promise/try_seq.h +157 -0
  834. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  835. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  836. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +32 -31
  837. data/src/core/lib/resolver/resolver_registry.cc +156 -0
  838. data/src/core/lib/resolver/resolver_registry.h +113 -0
  839. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  840. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  841. data/src/core/lib/resource_quota/api.h +0 -1
  842. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  843. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  844. data/src/core/lib/resource_quota/memory_quota.cc +118 -94
  845. data/src/core/lib/resource_quota/memory_quota.h +100 -64
  846. data/src/core/lib/security/authorization/evaluate_args.cc +26 -21
  847. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  848. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  849. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  850. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +109 -0
  851. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +51 -0
  852. data/src/core/lib/security/authorization/matchers.cc +227 -0
  853. data/src/core/lib/security/authorization/matchers.h +211 -0
  854. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  855. data/src/core/lib/security/authorization/rbac_policy.h +171 -0
  856. data/src/core/lib/security/context/security_context.cc +4 -2
  857. data/src/core/lib/security/context/security_context.h +1 -1
  858. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -0
  859. data/src/core/lib/security/credentials/call_creds_util.cc +87 -0
  860. data/src/core/lib/security/credentials/call_creds_util.h +42 -0
  861. data/src/core/lib/security/credentials/channel_creds_registry.h +97 -0
  862. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +70 -0
  863. data/src/core/lib/security/credentials/composite/composite_credentials.cc +17 -81
  864. data/src/core/lib/security/credentials/composite/composite_credentials.h +21 -9
  865. data/src/core/lib/security/credentials/credentials.cc +2 -3
  866. data/src/core/lib/security/credentials/credentials.h +68 -57
  867. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +46 -30
  868. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  869. data/src/core/lib/security/credentials/external/external_account_credentials.cc +51 -33
  870. data/src/core/lib/security/credentials/external/external_account_credentials.h +5 -9
  871. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +0 -1
  872. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +33 -13
  873. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -0
  874. data/src/core/lib/security/credentials/fake/fake_credentials.cc +18 -18
  875. data/src/core/lib/security/credentials/fake/fake_credentials.h +14 -16
  876. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +16 -13
  877. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +6 -0
  878. data/src/core/lib/security/credentials/iam/iam_credentials.cc +19 -27
  879. data/src/core/lib/security/credentials/iam/iam_credentials.h +11 -9
  880. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +13 -7
  881. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  882. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +27 -43
  883. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -12
  884. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +54 -41
  885. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  886. data/src/core/lib/security/credentials/local/local_credentials.h +6 -0
  887. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +137 -158
  888. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +52 -33
  889. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +95 -153
  890. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +54 -27
  891. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  892. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +6 -3
  893. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +25 -0
  894. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +17 -1
  895. data/src/core/lib/security/credentials/tls/tls_credentials.h +6 -0
  896. data/src/core/lib/security/credentials/xds/xds_credentials.h +6 -1
  897. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +8 -14
  898. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +1 -1
  899. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +4 -12
  900. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +0 -2
  901. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +6 -16
  902. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +4 -9
  903. data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -16
  904. data/src/core/lib/security/security_connector/security_connector.cc +3 -15
  905. data/src/core/lib/security/security_connector/security_connector.h +16 -21
  906. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +6 -11
  907. data/src/core/lib/security/security_connector/ssl_utils.cc +29 -31
  908. data/src/core/lib/security/security_connector/ssl_utils.h +13 -17
  909. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  910. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +6 -6
  911. data/src/core/lib/security/transport/auth_filters.h +37 -4
  912. data/src/core/lib/security/transport/client_auth_filter.cc +87 -358
  913. data/src/core/lib/security/transport/security_handshaker.cc +14 -6
  914. data/src/core/lib/security/transport/server_auth_filter.cc +41 -35
  915. data/src/core/lib/service_config/service_config.h +82 -0
  916. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  917. data/src/core/{ext/service_config/service_config.cc → lib/service_config/service_config_impl.cc} +20 -17
  918. data/src/core/{ext/service_config/service_config.h → lib/service_config/service_config_impl.h} +16 -18
  919. data/src/core/{ext → lib}/service_config/service_config_parser.cc +31 -27
  920. data/src/core/{ext → lib}/service_config/service_config_parser.h +39 -30
  921. data/src/core/lib/slice/slice.cc +76 -179
  922. data/src/core/lib/slice/slice.h +67 -24
  923. data/src/core/lib/slice/slice_internal.h +12 -31
  924. data/src/core/lib/slice/slice_refcount.cc +18 -0
  925. data/src/core/lib/slice/slice_refcount.h +6 -85
  926. data/src/core/lib/slice/slice_refcount_base.h +16 -136
  927. data/src/core/lib/surface/builtins.cc +6 -6
  928. data/src/core/lib/surface/call.cc +152 -387
  929. data/src/core/lib/surface/call.h +5 -5
  930. data/src/core/lib/surface/channel.cc +64 -71
  931. data/src/core/lib/surface/channel.h +10 -11
  932. data/src/core/lib/surface/channel_init.cc +1 -1
  933. data/src/core/lib/surface/channel_init.h +4 -4
  934. data/src/core/lib/surface/completion_queue.cc +10 -9
  935. data/src/core/lib/surface/init.cc +78 -9
  936. data/src/core/lib/surface/init.h +0 -2
  937. data/src/core/lib/surface/lame_client.cc +2 -2
  938. data/src/core/lib/surface/server.cc +23 -51
  939. data/src/core/lib/surface/server.h +5 -5
  940. data/src/core/lib/surface/version.cc +2 -2
  941. data/src/core/lib/transport/bdp_estimator.cc +9 -10
  942. data/src/core/lib/transport/bdp_estimator.h +2 -2
  943. data/src/core/lib/transport/error_utils.cc +5 -3
  944. data/src/core/lib/transport/error_utils.h +2 -1
  945. data/src/core/lib/transport/metadata_batch.h +1010 -750
  946. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  947. data/src/core/lib/transport/parsed_metadata.h +115 -96
  948. data/src/core/lib/transport/status_conversion.cc +2 -2
  949. data/src/core/lib/transport/status_conversion.h +1 -1
  950. data/src/core/lib/transport/timeout_encoding.cc +204 -67
  951. data/src/core/lib/transport/timeout_encoding.h +40 -10
  952. data/src/core/lib/transport/transport.cc +3 -1
  953. data/src/core/lib/transport/transport.h +88 -3
  954. data/src/core/lib/transport/transport_impl.h +13 -0
  955. data/src/core/lib/transport/transport_op_string.cc +5 -47
  956. data/src/core/lib/uri/uri_parser.cc +227 -53
  957. data/src/core/lib/uri/uri_parser.h +37 -23
  958. data/src/core/plugin_registry/grpc_plugin_registry.cc +19 -87
  959. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +85 -0
  960. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +27 -22
  961. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  962. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +19 -11
  963. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -2
  964. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  965. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  966. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  967. data/src/core/tsi/local_transport_security.cc +3 -11
  968. data/src/core/tsi/local_transport_security.h +1 -4
  969. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +141 -0
  970. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  971. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  972. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  973. data/src/core/tsi/ssl_transport_security.cc +105 -14
  974. data/src/core/tsi/ssl_transport_security.h +38 -6
  975. data/src/ruby/ext/grpc/extconf.rb +10 -3
  976. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  977. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +20 -24
  978. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +30 -36
  979. data/src/ruby/ext/grpc/rb_server.c +7 -4
  980. data/src/ruby/lib/grpc/version.rb +1 -1
  981. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  982. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  983. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  984. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  985. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  986. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  987. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  988. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  989. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  990. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  991. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  992. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  993. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  994. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  995. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  996. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  997. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  998. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  999. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1000. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1001. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1002. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  1003. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  1004. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1005. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  1006. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1007. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1008. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1009. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1010. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1011. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1012. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  1013. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1014. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1015. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  1016. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1017. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  1018. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  1019. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  1020. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1021. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1022. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1023. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1024. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  1025. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1026. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1027. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  1028. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1029. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1030. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1031. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1032. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1033. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1034. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  1035. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1036. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1037. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1038. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1039. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1040. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1041. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  1042. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1043. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  1044. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1045. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  1046. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1047. data/third_party/cares/cares/{ares.h → include/ares.h} +73 -1
  1048. data/third_party/cares/cares/{ares_dns.h → include/ares_dns.h} +9 -0
  1049. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1050. data/third_party/cares/cares/{ares_version.h → include/ares_version.h} +3 -3
  1051. data/third_party/cares/cares/{ares__close_sockets.c → src/lib/ares__close_sockets.c} +2 -2
  1052. data/third_party/cares/cares/{ares__get_hostent.c → src/lib/ares__get_hostent.c} +1 -2
  1053. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1054. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1055. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1056. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1057. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1058. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1059. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1060. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1061. data/third_party/cares/cares/{ares_create_query.c → src/lib/ares_create_query.c} +8 -17
  1062. data/third_party/cares/cares/{ares_data.c → src/lib/ares_data.c} +18 -0
  1063. data/third_party/cares/cares/{ares_data.h → src/lib/ares_data.h} +2 -0
  1064. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1065. data/third_party/cares/cares/{ares_expand_name.c → src/lib/ares_expand_name.c} +114 -23
  1066. data/third_party/cares/cares/{ares_expand_string.c → src/lib/ares_expand_string.c} +2 -5
  1067. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1068. data/third_party/cares/cares/{ares_free_hostent.c → src/lib/ares_free_hostent.c} +6 -4
  1069. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1070. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1071. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1072. data/third_party/cares/cares/{ares_getenv.c → src/lib/ares_getenv.c} +0 -2
  1073. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1074. data/third_party/cares/cares/{ares_gethostbyaddr.c → src/lib/ares_gethostbyaddr.c} +2 -9
  1075. data/third_party/cares/cares/{ares_gethostbyname.c → src/lib/ares_gethostbyname.c} +25 -20
  1076. data/third_party/cares/cares/{ares_getnameinfo.c → src/lib/ares_getnameinfo.c} +4 -10
  1077. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1078. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1079. data/third_party/cares/cares/{ares_init.c → src/lib/ares_init.c} +79 -40
  1080. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1081. data/third_party/cares/cares/{ares_ipv6.h → src/lib/ares_ipv6.h} +7 -0
  1082. data/third_party/cares/cares/{ares_library_init.c → src/lib/ares_library_init.c} +7 -2
  1083. data/third_party/cares/cares/{ares_library_init.h → src/lib/ares_library_init.h} +1 -1
  1084. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1085. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1086. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1087. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1088. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1089. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1090. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1091. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1092. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1093. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1094. data/third_party/cares/cares/{ares_parse_mx_reply.c → src/lib/ares_parse_mx_reply.c} +2 -8
  1095. data/third_party/cares/cares/{ares_parse_naptr_reply.c → src/lib/ares_parse_naptr_reply.c} +2 -13
  1096. data/third_party/cares/cares/{ares_parse_ns_reply.c → src/lib/ares_parse_ns_reply.c} +5 -11
  1097. data/third_party/cares/cares/{ares_parse_ptr_reply.c → src/lib/ares_parse_ptr_reply.c} +53 -46
  1098. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1099. data/third_party/cares/cares/{ares_parse_srv_reply.c → src/lib/ares_parse_srv_reply.c} +2 -13
  1100. data/third_party/cares/cares/{ares_parse_txt_reply.c → src/lib/ares_parse_txt_reply.c} +3 -9
  1101. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1102. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1103. data/third_party/cares/cares/{ares_private.h → src/lib/ares_private.h} +52 -11
  1104. data/third_party/cares/cares/{ares_process.c → src/lib/ares_process.c} +127 -52
  1105. data/third_party/cares/cares/{ares_query.c → src/lib/ares_query.c} +3 -9
  1106. data/third_party/cares/cares/{ares_search.c → src/lib/ares_search.c} +5 -7
  1107. data/third_party/cares/cares/{ares_send.c → src/lib/ares_send.c} +2 -8
  1108. data/third_party/cares/cares/{ares_setup.h → src/lib/ares_setup.h} +4 -1
  1109. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1110. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1111. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1112. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1113. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1114. data/third_party/cares/cares/{ares_strsplit.c → src/lib/ares_strsplit.c} +4 -0
  1115. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1116. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1117. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1118. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1119. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1120. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1121. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1122. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1123. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1124. data/third_party/cares/cares/{inet_net_pton.c → src/lib/inet_net_pton.c} +2 -8
  1125. data/third_party/cares/cares/{inet_ntop.c → src/lib/inet_ntop.c} +2 -8
  1126. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1127. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1128. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1129. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1130. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1131. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1132. data/third_party/upb/upb/decode.c +526 -319
  1133. data/third_party/upb/upb/decode.h +43 -17
  1134. data/third_party/upb/upb/decode_fast.c +303 -301
  1135. data/third_party/upb/upb/decode_fast.h +18 -18
  1136. data/third_party/upb/upb/decode_internal.h +73 -56
  1137. data/third_party/upb/upb/def.c +1863 -1078
  1138. data/third_party/upb/upb/def.h +318 -286
  1139. data/third_party/upb/upb/def.hpp +129 -172
  1140. data/third_party/upb/upb/encode.c +202 -175
  1141. data/third_party/upb/upb/encode.h +15 -17
  1142. data/third_party/upb/upb/msg.c +144 -124
  1143. data/third_party/upb/upb/msg.h +40 -33
  1144. data/third_party/upb/upb/msg_internal.h +321 -272
  1145. data/third_party/upb/upb/reflection.c +239 -199
  1146. data/third_party/upb/upb/reflection.h +87 -67
  1147. data/third_party/upb/upb/reflection.hpp +6 -6
  1148. data/third_party/upb/upb/table.c +222 -142
  1149. data/third_party/upb/upb/table_internal.h +128 -96
  1150. data/third_party/upb/upb/text_encode.c +113 -90
  1151. data/third_party/upb/upb/text_encode.h +10 -10
  1152. data/third_party/upb/upb/upb.c +111 -72
  1153. data/third_party/upb/upb/upb.h +120 -144
  1154. data/third_party/upb/upb/upb.hpp +31 -28
  1155. data/third_party/upb/upb/upb_internal.h +21 -11
  1156. data/third_party/xxhash/xxhash.h +607 -352
  1157. metadata +406 -203
  1158. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1159. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1160. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -194
  1161. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -88
  1162. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -122
  1163. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -92
  1164. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -192
  1165. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -52
  1166. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -79
  1167. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1168. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1169. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1170. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1171. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1172. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -38
  1173. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -64
  1174. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -38
  1175. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -64
  1176. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -38
  1177. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -64
  1178. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -38
  1179. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -64
  1180. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -38
  1181. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -64
  1182. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +0 -102
  1183. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +0 -306
  1184. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +0 -56
  1185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +0 -135
  1186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +0 -115
  1187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +0 -371
  1188. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -67
  1189. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1190. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -68
  1191. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1192. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -67
  1193. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1194. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -75
  1195. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1196. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -69
  1197. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1198. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1199. data/src/core/lib/compression/compression_args.cc +0 -140
  1200. data/src/core/lib/compression/compression_args.h +0 -58
  1201. data/src/core/lib/compression/stream_compression.cc +0 -81
  1202. data/src/core/lib/compression/stream_compression.h +0 -117
  1203. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1204. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1205. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1206. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1207. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1208. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1209. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1210. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1211. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1212. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1213. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1214. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1215. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -146
  1216. data/src/core/lib/iomgr/tcp_custom.cc +0 -350
  1217. data/src/core/lib/iomgr/tcp_custom.h +0 -85
  1218. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -457
  1219. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  1220. data/src/core/lib/iomgr/timer_custom.h +0 -43
  1221. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -173
  1222. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  1223. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  1224. data/src/core/lib/slice/slice_intern.cc +0 -367
  1225. data/src/core/lib/slice/slice_utils.h +0 -200
  1226. data/src/core/lib/slice/static_slice.cc +0 -377
  1227. data/src/core/lib/slice/static_slice.h +0 -300
  1228. data/src/core/lib/surface/init_secure.cc +0 -103
  1229. data/src/core/lib/transport/metadata.cc +0 -714
  1230. data/src/core/lib/transport/metadata.h +0 -449
  1231. data/src/core/lib/transport/metadata_batch.cc +0 -99
  1232. data/src/core/lib/transport/static_metadata.cc +0 -1032
  1233. data/src/core/lib/transport/static_metadata.h +0 -322
  1234. data/src/core/lib/transport/status_metadata.cc +0 -63
  1235. data/src/core/lib/transport/status_metadata.h +0 -48
  1236. data/third_party/cares/cares/ares_getopt.c +0 -122
  1237. data/third_party/cares/cares/ares_getopt.h +0 -53
  1238. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  1239. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  1240. 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
@@ -172,21 +177,53 @@ class XdsClient::ChannelState::AdsCallState
172
177
  XdsClient* xds_client() const { return chand()->xds_client(); }
173
178
  bool seen_response() const { return seen_response_; }
174
179
 
175
- void SubscribeLocked(const std::string& type_url,
176
- const XdsApi::ResourceName& name)
180
+ void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name)
177
181
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
178
- void UnsubscribeLocked(const std::string& type_url,
179
- const XdsApi::ResourceName& name,
180
- bool delay_unsubscription)
182
+ void UnsubscribeLocked(const XdsResourceType* type,
183
+ const XdsResourceName& name, bool delay_unsubscription)
181
184
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
182
185
 
183
186
  bool HasSubscribedResources() const;
184
187
 
185
188
  private:
186
- class ResourceState : public InternallyRefCounted<ResourceState> {
189
+ class AdsResponseParser : public XdsApi::AdsResponseParserInterface {
187
190
  public:
188
- ResourceState(const std::string& type_url, const XdsApi::ResourceName& name)
189
- : type_url_(type_url), name_(name) {
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) {
190
227
  GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
191
228
  grpc_schedule_on_exec_ctx);
192
229
  }
@@ -217,7 +254,7 @@ class XdsClient::ChannelState::AdsCallState
217
254
 
218
255
  private:
219
256
  static void OnTimer(void* arg, grpc_error_handle error) {
220
- ResourceState* self = static_cast<ResourceState*>(arg);
257
+ ResourceTimer* self = static_cast<ResourceTimer*>(arg);
221
258
  {
222
259
  MutexLock lock(&self->ads_calld_->xds_client()->mu_);
223
260
  self->OnTimerLocked(GRPC_ERROR_REF(error));
@@ -234,51 +271,30 @@ class XdsClient::ChannelState::AdsCallState
234
271
  grpc_error_handle watcher_error =
235
272
  GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
236
273
  "timeout obtaining resource {type=%s name=%s} from xds server",
237
- type_url_,
238
- XdsApi::ConstructFullResourceName(name_.authority, type_url_,
239
- name_.id)));
274
+ type_->type_url(),
275
+ XdsClient::ConstructFullXdsResourceName(
276
+ name_.authority, type_->type_url(), name_.key)));
240
277
  watcher_error = grpc_error_set_int(
241
278
  watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
242
279
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
243
- 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(),
244
283
  grpc_error_std_string(watcher_error).c_str());
245
284
  }
246
285
  auto& authority_state =
247
286
  ads_calld_->xds_client()->authority_state_map_[name_.authority];
248
- if (type_url_ == XdsApi::kLdsTypeUrl) {
249
- ListenerState& state = authority_state.listener_map[name_.id];
250
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
251
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
252
- ads_calld_->xds_client(), state.watchers,
253
- GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
254
- } else if (type_url_ == XdsApi::kRdsTypeUrl) {
255
- RouteConfigState& state = authority_state.route_config_map[name_.id];
256
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
257
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
258
- ads_calld_->xds_client(), state.watchers,
259
- GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
260
- } else if (type_url_ == XdsApi::kCdsTypeUrl) {
261
- ClusterState& state = authority_state.cluster_map[name_.id];
262
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
263
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
264
- ads_calld_->xds_client(), state.watchers,
265
- GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
266
- } else if (type_url_ == XdsApi::kEdsTypeUrl) {
267
- EndpointState& state = authority_state.endpoint_map[name_.id];
268
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
269
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
270
- ads_calld_->xds_client(), state.watchers,
271
- GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
272
- } else {
273
- GPR_UNREACHABLE_CODE(return );
274
- }
275
- GRPC_ERROR_UNREF(watcher_error);
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);
276
292
  }
277
293
  GRPC_ERROR_UNREF(error);
278
294
  }
279
295
 
280
- const std::string type_url_;
281
- const XdsApi::ResourceName name_;
296
+ const XdsResourceType* type_;
297
+ const XdsResourceName name_;
282
298
 
283
299
  RefCountedPtr<AdsCallState> ads_calld_;
284
300
  bool timer_started_ = false;
@@ -296,40 +312,11 @@ class XdsClient::ChannelState::AdsCallState
296
312
 
297
313
  // Subscribed resources of this type.
298
314
  std::map<std::string /*authority*/,
299
- std::map<std::string /*name*/, OrphanablePtr<ResourceState>>>
315
+ std::map<XdsResourceKey, OrphanablePtr<ResourceTimer>>>
300
316
  subscribed_resources;
301
317
  };
302
318
 
303
- void SendMessageLocked(const std::string& type_url)
304
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
305
-
306
- void AcceptLdsUpdateLocked(
307
- std::string version, grpc_millis update_time,
308
- XdsApi::LdsUpdateMap lds_update_map,
309
- const std::set<XdsApi::ResourceName>& resource_names_failed)
310
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
311
- void AcceptRdsUpdateLocked(std::string version, grpc_millis update_time,
312
- XdsApi::RdsUpdateMap rds_update_map)
313
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
314
- void AcceptCdsUpdateLocked(
315
- std::string version, grpc_millis update_time,
316
- XdsApi::CdsUpdateMap cds_update_map,
317
- const std::set<XdsApi::ResourceName>& resource_names_failed)
318
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
319
- void AcceptEdsUpdateLocked(std::string version, grpc_millis update_time,
320
- XdsApi::EdsUpdateMap eds_update_map)
321
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
322
-
323
- template <typename StateMap>
324
- void RejectAdsUpdateHelperLocked(const std::string& resource_name,
325
- grpc_millis update_time,
326
- const XdsApi::AdsParseResult& result,
327
- const std::string& error_details,
328
- StateMap* state_map)
329
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
330
-
331
- void RejectAdsUpdateLocked(grpc_millis update_time,
332
- const XdsApi::AdsParseResult& result)
319
+ void SendMessageLocked(const XdsResourceType* type)
333
320
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
334
321
 
335
322
  static void OnRequestSent(void* arg, grpc_error_handle error);
@@ -344,9 +331,9 @@ class XdsClient::ChannelState::AdsCallState
344
331
 
345
332
  bool IsCurrentCallOnChannel() const;
346
333
 
347
- std::map<absl::string_view /*authority*/,
348
- std::set<absl::string_view /*name*/>>
349
- 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);
350
337
 
351
338
  // The owning RetryableCall<>.
352
339
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
@@ -375,10 +362,10 @@ class XdsClient::ChannelState::AdsCallState
375
362
  grpc_closure on_status_received_;
376
363
 
377
364
  // Resource types for which requests need to be sent.
378
- std::set<std::string /*type_url*/> buffered_requests_;
365
+ std::set<const XdsResourceType*> buffered_requests_;
379
366
 
380
367
  // State for each resource type.
381
- std::map<std::string /*type_url*/, ResourceTypeState> state_map_;
368
+ std::map<const XdsResourceType*, ResourceTypeState> state_map_;
382
369
  };
383
370
 
384
371
  // Contains an LRS call to the xds server.
@@ -402,7 +389,7 @@ class XdsClient::ChannelState::LrsCallState
402
389
  // Reports client-side load stats according to a fixed interval.
403
390
  class Reporter : public InternallyRefCounted<Reporter> {
404
391
  public:
405
- Reporter(RefCountedPtr<LrsCallState> parent, grpc_millis report_interval)
392
+ Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
406
393
  : parent_(std::move(parent)), report_interval_(report_interval) {
407
394
  GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
408
395
  grpc_schedule_on_exec_ctx);
@@ -433,7 +420,7 @@ class XdsClient::ChannelState::LrsCallState
433
420
  RefCountedPtr<LrsCallState> parent_;
434
421
 
435
422
  // The load reporting state.
436
- const grpc_millis report_interval_;
423
+ const Duration report_interval_;
437
424
  bool last_report_counters_were_zero_ = false;
438
425
  bool next_report_timer_callback_pending_ = false;
439
426
  grpc_timer next_report_timer_;
@@ -480,7 +467,7 @@ class XdsClient::ChannelState::LrsCallState
480
467
  // Load reporting state.
481
468
  bool send_all_clusters_ = false;
482
469
  std::set<std::string> cluster_names_; // Asked for by the LRS server.
483
- grpc_millis load_reporting_interval_ = 0;
470
+ Duration load_reporting_interval_;
484
471
  OrphanablePtr<Reporter> reporter_;
485
472
  };
486
473
 
@@ -503,12 +490,14 @@ class XdsClient::ChannelState::StateWatcher
503
490
  new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
504
491
  // In TRANSIENT_FAILURE. Notify all watchers of error.
505
492
  gpr_log(GPR_INFO,
506
- "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
507
- "status_message:(%s)",
508
- parent_->xds_client(), status.ToString().c_str());
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());
509
497
  parent_->xds_client_->NotifyOnErrorLocked(
510
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
511
- "xds channel in TRANSIENT_FAILURE"));
498
+ GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
499
+ "xds channel in TRANSIENT_FAILURE, connectivity error: ",
500
+ status.ToString())));
512
501
  }
513
502
  }
514
503
  parent_->xds_client()->work_serializer_.DrainQueue();
@@ -526,10 +515,10 @@ namespace {
526
515
  grpc_channel* CreateXdsChannel(grpc_channel_args* args,
527
516
  const XdsBootstrap::XdsServer& server) {
528
517
  RefCountedPtr<grpc_channel_credentials> channel_creds =
529
- XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
530
- server.channel_creds_config);
531
- return grpc_secure_channel_create(channel_creds.get(),
532
- 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);
533
522
  }
534
523
 
535
524
  } // namespace
@@ -553,8 +542,8 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
553
542
 
554
543
  XdsClient::ChannelState::~ChannelState() {
555
544
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
556
- gpr_log(GPR_INFO, "[xds_client %p] Destroying xds channel %p", xds_client(),
557
- 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());
558
547
  }
559
548
  grpc_channel_destroy(channel_);
560
549
  xds_client_.reset(DEBUG_LOCATION, "ChannelState");
@@ -595,9 +584,27 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
595
584
  WeakRef(DEBUG_LOCATION, "ChannelState+lrs")));
596
585
  }
597
586
 
598
- 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
599
601
 
600
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
+ }
601
608
  ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
602
609
  GPR_ASSERT(client_channel != nullptr);
603
610
  watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
@@ -607,13 +614,16 @@ void XdsClient::ChannelState::StartConnectivityWatchLocked() {
607
614
  }
608
615
 
609
616
  void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
617
+ if (IsLameChannel(channel_)) {
618
+ return;
619
+ }
610
620
  ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
611
621
  GPR_ASSERT(client_channel != nullptr);
612
622
  client_channel->RemoveConnectivityWatcher(watcher_);
613
623
  }
614
624
 
615
- void XdsClient::ChannelState::SubscribeLocked(
616
- const std::string& type_url, const XdsApi::ResourceName& name) {
625
+ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
626
+ const XdsResourceName& name) {
617
627
  if (ads_calld_ == nullptr) {
618
628
  // Start the ADS call if this is the first request.
619
629
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -627,16 +637,16 @@ void XdsClient::ChannelState::SubscribeLocked(
627
637
  // because when the call is restarted it will resend all necessary requests.
628
638
  if (ads_calld() == nullptr) return;
629
639
  // Subscribe to this resource if the ADS call is active.
630
- ads_calld()->SubscribeLocked(type_url, name);
640
+ ads_calld()->SubscribeLocked(type, name);
631
641
  }
632
642
 
633
- void XdsClient::ChannelState::UnsubscribeLocked(
634
- const std::string& type_url, const XdsApi::ResourceName& name,
635
- bool delay_unsubscription) {
643
+ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
644
+ const XdsResourceName& name,
645
+ bool delay_unsubscription) {
636
646
  if (ads_calld_ != nullptr) {
637
647
  auto* calld = ads_calld_->calld();
638
648
  if (calld != nullptr) {
639
- calld->UnsubscribeLocked(type_url, name, delay_unsubscription);
649
+ calld->UnsubscribeLocked(type, name, delay_unsubscription);
640
650
  if (!calld->HasSubscribedResources()) {
641
651
  ads_calld_.reset();
642
652
  }
@@ -652,13 +662,13 @@ template <typename T>
652
662
  XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
653
663
  WeakRefCountedPtr<ChannelState> chand)
654
664
  : chand_(std::move(chand)),
655
- backoff_(
656
- BackOff::Options()
657
- .set_initial_backoff(GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS *
658
- 1000)
659
- .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER)
660
- .set_jitter(GRPC_XDS_RECONNECT_JITTER)
661
- .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))) {
662
672
  // Closure Initialization
663
673
  GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
664
674
  grpc_schedule_on_exec_ctx);
@@ -694,10 +704,10 @@ void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
694
704
  GPR_ASSERT(chand_->channel_ != nullptr);
695
705
  GPR_ASSERT(calld_ == nullptr);
696
706
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
697
- gpr_log(GPR_INFO,
698
- "[xds_client %p] Start new call from retryable call (chand: %p, "
699
- "retryable call: %p)",
700
- 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);
701
711
  }
702
712
  calld_ = MakeOrphanable<T>(
703
713
  this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
@@ -706,14 +716,15 @@ void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
706
716
  template <typename T>
707
717
  void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
708
718
  if (shutting_down_) return;
709
- const grpc_millis next_attempt_time = backoff_.NextAttemptTime();
719
+ const Timestamp next_attempt_time = backoff_.NextAttemptTime();
710
720
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
711
- grpc_millis timeout =
712
- 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());
713
723
  gpr_log(GPR_INFO,
714
- "[xds_client %p] Failed to connect to xds server (chand: %p) "
724
+ "[xds_client %p] xds server %s: call attempt failed; "
715
725
  "retry timer will fire in %" PRId64 "ms.",
716
- chand()->xds_client(), chand(), timeout);
726
+ chand()->xds_client(), chand()->server_.server_uri.c_str(),
727
+ timeout.millis());
717
728
  }
718
729
  this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
719
730
  grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
@@ -737,16 +748,182 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
737
748
  retry_timer_callback_pending_ = false;
738
749
  if (!shutting_down_ && error == GRPC_ERROR_NONE) {
739
750
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
740
- gpr_log(
741
- GPR_INFO,
742
- "[xds_client %p] Retry timer fires (chand: %p, retryable call: %p)",
743
- 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);
744
755
  }
745
756
  StartNewCallLocked();
746
757
  }
747
758
  GRPC_ERROR_UNREF(error);
748
759
  }
749
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
+
750
927
  //
751
928
  // XdsClient::ChannelState::AdsCallState
752
929
  //
@@ -763,14 +940,17 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
763
940
  // the polling entities from client_channel.
764
941
  GPR_ASSERT(xds_client() != nullptr);
765
942
  // Create a call with the specified method name.
766
- const auto& method =
943
+ const char* method =
767
944
  chand()->server_.ShouldUseV3()
768
- ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES
769
- : 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";
770
949
  call_ = grpc_channel_create_pollset_set_call(
771
950
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
772
- xds_client()->interested_parties_, method, nullptr,
773
- GRPC_MILLIS_INF_FUTURE, nullptr);
951
+ xds_client()->interested_parties_,
952
+ StaticSlice::FromStaticString(method).c_slice(), nullptr,
953
+ Timestamp::InfFuture(), nullptr);
774
954
  GPR_ASSERT(call_ != nullptr);
775
955
  // Init data associated with the call.
776
956
  grpc_metadata_array_init(&initial_metadata_recv_);
@@ -778,9 +958,9 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
778
958
  // Start the call.
779
959
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
780
960
  gpr_log(GPR_INFO,
781
- "[xds_client %p] Starting ADS call (chand: %p, calld: %p, "
782
- "call: %p)",
783
- 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_);
784
964
  }
785
965
  // Create the ops.
786
966
  grpc_call_error call_error;
@@ -804,21 +984,12 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
804
984
  const std::string& authority = a.first;
805
985
  // Skip authorities that are not using this xDS channel.
806
986
  if (a.second.channel_state != chand()) continue;
807
- for (const auto& l : a.second.listener_map) {
808
- const std::string& listener_name = l.first;
809
- SubscribeLocked(XdsApi::kLdsTypeUrl, {authority, listener_name});
810
- }
811
- for (const auto& r : a.second.route_config_map) {
812
- const std::string& route_config_name = r.first;
813
- SubscribeLocked(XdsApi::kRdsTypeUrl, {authority, route_config_name});
814
- }
815
- for (const auto& c : a.second.cluster_map) {
816
- const std::string& cluster_name = c.first;
817
- SubscribeLocked(XdsApi::kCdsTypeUrl, {authority, cluster_name});
818
- }
819
- for (const auto& e : a.second.endpoint_map) {
820
- const std::string& endpoint_name = e.first;
821
- 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
+ }
822
993
  }
823
994
  }
824
995
  // Op: recv initial metadata.
@@ -883,33 +1054,29 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
883
1054
  }
884
1055
 
885
1056
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
886
- const std::string& type_url)
1057
+ const XdsResourceType* type)
887
1058
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
888
1059
  // Buffer message sending if an existing message is in flight.
889
1060
  if (send_message_payload_ != nullptr) {
890
- buffered_requests_.insert(type_url);
1061
+ buffered_requests_.insert(type);
891
1062
  return;
892
1063
  }
893
- auto& state = state_map_[type_url];
1064
+ auto& state = state_map_[type];
894
1065
  grpc_slice request_payload_slice;
895
- std::map<absl::string_view /*authority*/,
896
- std::set<absl::string_view /*name*/>>
897
- resource_map = ResourceNamesForRequest(type_url);
898
1066
  request_payload_slice = xds_client()->api_.CreateAdsRequest(
899
- chand()->server_, type_url, resource_map,
900
- chand()->resource_type_version_map_[type_url], state.nonce,
901
- GRPC_ERROR_REF(state.error), !sent_initial_message_);
902
- if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
903
- type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
904
- state_map_.erase(type_url);
905
- }
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_);
906
1072
  sent_initial_message_ = true;
907
1073
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
908
1074
  gpr_log(GPR_INFO,
909
- "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
910
- "error=%s",
911
- xds_client(), type_url.c_str(),
912
- 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(),
913
1080
  state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
914
1081
  }
915
1082
  GRPC_ERROR_UNREF(state.error);
@@ -930,32 +1097,33 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
930
1097
  grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
931
1098
  if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
932
1099
  gpr_log(GPR_ERROR,
933
- "[xds_client %p] calld=%p call_error=%d sending ADS message",
934
- 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);
935
1104
  GPR_ASSERT(GRPC_CALL_OK == call_error);
936
1105
  }
937
1106
  }
938
1107
 
939
1108
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
940
- const std::string& type_url, const XdsApi::ResourceName& name) {
941
- auto& state =
942
- state_map_[type_url].subscribed_resources[name.authority][name.id];
1109
+ const XdsResourceType* type, const XdsResourceName& name) {
1110
+ auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
943
1111
  if (state == nullptr) {
944
- state = MakeOrphanable<ResourceState>(type_url, name);
945
- SendMessageLocked(type_url);
1112
+ state = MakeOrphanable<ResourceTimer>(type, name);
1113
+ SendMessageLocked(type);
946
1114
  }
947
1115
  }
948
1116
 
949
1117
  void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
950
- const std::string& type_url, const XdsApi::ResourceName& name,
1118
+ const XdsResourceType* type, const XdsResourceName& name,
951
1119
  bool delay_unsubscription) {
952
- auto& type_state_map = state_map_[type_url];
1120
+ auto& type_state_map = state_map_[type];
953
1121
  auto& authority_map = type_state_map.subscribed_resources[name.authority];
954
- authority_map.erase(name.id);
1122
+ authority_map.erase(name.key);
955
1123
  if (authority_map.empty()) {
956
1124
  type_state_map.subscribed_resources.erase(name.authority);
957
1125
  }
958
- if (!delay_unsubscription) SendMessageLocked(type_url);
1126
+ if (!delay_unsubscription) SendMessageLocked(type);
959
1127
  }
960
1128
 
961
1129
  bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
@@ -965,395 +1133,6 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
965
1133
  return false;
966
1134
  }
967
1135
 
968
- namespace {
969
-
970
- // Build a resource metadata struct for ADS result accepting methods and CSDS.
971
- XdsApi::ResourceMetadata CreateResourceMetadataAcked(
972
- std::string serialized_proto, std::string version,
973
- grpc_millis update_time) {
974
- XdsApi::ResourceMetadata resource_metadata;
975
- resource_metadata.serialized_proto = std::move(serialized_proto);
976
- resource_metadata.update_time = update_time;
977
- resource_metadata.version = std::move(version);
978
- resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
979
- return resource_metadata;
980
- }
981
-
982
- } // namespace
983
-
984
- void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
985
- std::string version, grpc_millis update_time,
986
- XdsApi::LdsUpdateMap lds_update_map,
987
- const std::set<XdsApi::ResourceName>& resource_names_failed) {
988
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
989
- gpr_log(GPR_INFO,
990
- "[xds_client %p] LDS update received containing %" PRIuPTR
991
- " resources",
992
- xds_client(), lds_update_map.size());
993
- }
994
- auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
995
- for (auto& p : lds_update_map) {
996
- const XdsApi::ResourceName& name = p.first;
997
- XdsApi::LdsUpdate& lds_update = p.second.resource;
998
- auto it = lds_state.subscribed_resources.find(name.authority);
999
- if (it != lds_state.subscribed_resources.end()) {
1000
- auto res_it = it->second.find(name.id);
1001
- if (res_it != it->second.end()) {
1002
- res_it->second->MaybeCancelTimer();
1003
- }
1004
- }
1005
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1006
- gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
1007
- XdsApi::ConstructFullResourceName(name.authority,
1008
- XdsApi::kLdsTypeUrl, name.id)
1009
- .c_str(),
1010
- lds_update.ToString().c_str());
1011
- }
1012
- ListenerState& listener_state = xds_client()
1013
- ->authority_state_map_[name.authority]
1014
- .listener_map[name.id];
1015
- // Ignore identical update.
1016
- if (listener_state.update.has_value() &&
1017
- *listener_state.update == lds_update) {
1018
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1019
- gpr_log(GPR_INFO,
1020
- "[xds_client %p] LDS update for %s identical to current, "
1021
- "ignoring.",
1022
- xds_client(),
1023
- XdsApi::ConstructFullResourceName(name.authority,
1024
- XdsApi::kLdsTypeUrl, name.id)
1025
- .c_str());
1026
- }
1027
- continue;
1028
- }
1029
- // Update the listener state.
1030
- listener_state.update = std::move(lds_update);
1031
- listener_state.meta = CreateResourceMetadataAcked(
1032
- std::move(p.second.serialized_proto), version, update_time);
1033
- // Notify watchers.
1034
- auto& watchers_list = listener_state.watchers;
1035
- auto& value = listener_state.update.value();
1036
- xds_client()->work_serializer_.Schedule(
1037
- [watchers_list, value]()
1038
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1039
- for (const auto& p : watchers_list) {
1040
- p.first->OnListenerChanged(value);
1041
- }
1042
- },
1043
- DEBUG_LOCATION);
1044
- }
1045
- // For invalid resources in the update, if they are already in the
1046
- // cache, pretend that they are present in the update, so that we
1047
- // don't incorrectly consider them deleted below.
1048
- for (const auto& name : resource_names_failed) {
1049
- auto& listener_map =
1050
- xds_client()->authority_state_map_[name.authority].listener_map;
1051
- auto it = listener_map.find(name.id);
1052
- if (it != listener_map.end()) {
1053
- auto& update = it->second.update;
1054
- if (!update.has_value()) continue;
1055
- lds_update_map[name];
1056
- }
1057
- }
1058
- // For any subscribed resource that is not present in the update,
1059
- // remove it from the cache and notify watchers that it does not exist.
1060
- for (const auto& a : lds_state.subscribed_resources) {
1061
- const std::string& authority_name = a.first;
1062
- for (const auto& p : a.second) {
1063
- const std::string& listener_name = p.first;
1064
- if (lds_update_map.find({authority_name, listener_name}) ==
1065
- lds_update_map.end()) {
1066
- ListenerState& listener_state =
1067
- xds_client()
1068
- ->authority_state_map_[authority_name]
1069
- .listener_map[listener_name];
1070
- // If the resource was newly requested but has not yet been received,
1071
- // we don't want to generate an error for the watchers, because this LDS
1072
- // response may be in reaction to an earlier request that did not yet
1073
- // request the new resource, so its absence from the response does not
1074
- // necessarily indicate that the resource does not exist.
1075
- // For that case, we rely on the request timeout instead.
1076
- if (!listener_state.update.has_value()) continue;
1077
- listener_state.update.reset();
1078
- Notifier::ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1079
- xds_client(), listener_state.watchers, DEBUG_LOCATION);
1080
- }
1081
- }
1082
- }
1083
- }
1084
-
1085
- void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
1086
- std::string version, grpc_millis update_time,
1087
- XdsApi::RdsUpdateMap rds_update_map) {
1088
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1089
- gpr_log(GPR_INFO,
1090
- "[xds_client %p] RDS update received containing %" PRIuPTR
1091
- " resources",
1092
- xds_client(), rds_update_map.size());
1093
- }
1094
- auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
1095
- for (auto& p : rds_update_map) {
1096
- const XdsApi::ResourceName& name = p.first;
1097
- XdsApi::RdsUpdate& rds_update = p.second.resource;
1098
- auto it = rds_state.subscribed_resources.find(name.authority);
1099
- if (it != rds_state.subscribed_resources.end()) {
1100
- auto res_it = it->second.find(name.id);
1101
- if (res_it != it->second.end()) {
1102
- res_it->second->MaybeCancelTimer();
1103
- }
1104
- }
1105
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1106
- gpr_log(GPR_INFO, "[xds_client %p] RDS resource:\n%s", xds_client(),
1107
- rds_update.ToString().c_str());
1108
- }
1109
- RouteConfigState& route_config_state =
1110
- xds_client()
1111
- ->authority_state_map_[name.authority]
1112
- .route_config_map[name.id];
1113
- // Ignore identical update.
1114
- if (route_config_state.update.has_value() &&
1115
- *route_config_state.update == rds_update) {
1116
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1117
- gpr_log(GPR_INFO,
1118
- "[xds_client %p] RDS resource identical to current, ignoring",
1119
- xds_client());
1120
- }
1121
- continue;
1122
- }
1123
- // Update the cache.
1124
- route_config_state.update = std::move(rds_update);
1125
- route_config_state.meta = CreateResourceMetadataAcked(
1126
- std::move(p.second.serialized_proto), version, update_time);
1127
- // Notify all watchers.
1128
- auto& watchers_list = route_config_state.watchers;
1129
- auto& value = route_config_state.update.value();
1130
- xds_client()->work_serializer_.Schedule(
1131
- [watchers_list, value]()
1132
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1133
- for (const auto& p : watchers_list) {
1134
- p.first->OnRouteConfigChanged(value);
1135
- }
1136
- },
1137
- DEBUG_LOCATION);
1138
- }
1139
- }
1140
-
1141
- void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1142
- std::string version, grpc_millis update_time,
1143
- XdsApi::CdsUpdateMap cds_update_map,
1144
- const std::set<XdsApi::ResourceName>& resource_names_failed) {
1145
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1146
- gpr_log(GPR_INFO,
1147
- "[xds_client %p] CDS update received containing %" PRIuPTR
1148
- " resources",
1149
- xds_client(), cds_update_map.size());
1150
- }
1151
- auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
1152
- for (auto& p : cds_update_map) {
1153
- const XdsApi::ResourceName& name = p.first;
1154
- XdsApi::CdsUpdate& cds_update = p.second.resource;
1155
- auto it = cds_state.subscribed_resources.find(name.authority);
1156
- if (it != cds_state.subscribed_resources.end()) {
1157
- auto res_it = it->second.find(name.id);
1158
- if (res_it != it->second.end()) {
1159
- res_it->second->MaybeCancelTimer();
1160
- }
1161
- }
1162
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1163
- gpr_log(GPR_INFO, "[xds_client %p] cluster=%s: %s", xds_client(),
1164
- XdsApi::ConstructFullResourceName(name.authority,
1165
- XdsApi::kCdsTypeUrl, name.id)
1166
- .c_str(),
1167
- cds_update.ToString().c_str());
1168
- }
1169
- ClusterState& cluster_state =
1170
- xds_client()->authority_state_map_[name.authority].cluster_map[name.id];
1171
- // Ignore identical update.
1172
- if (cluster_state.update.has_value() &&
1173
- *cluster_state.update == cds_update) {
1174
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1175
- gpr_log(GPR_INFO,
1176
- "[xds_client %p] CDS update identical to current, ignoring.",
1177
- xds_client());
1178
- }
1179
- continue;
1180
- }
1181
- // Update the cluster state.
1182
- cluster_state.update = std::move(cds_update);
1183
- cluster_state.meta = CreateResourceMetadataAcked(
1184
- std::move(p.second.serialized_proto), version, update_time);
1185
- // Notify all watchers.
1186
- auto& watchers_list = cluster_state.watchers;
1187
- auto& value = cluster_state.update.value();
1188
- xds_client()->work_serializer_.Schedule(
1189
- [watchers_list, value]()
1190
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1191
- for (const auto& p : watchers_list) {
1192
- p.first->OnClusterChanged(value);
1193
- }
1194
- },
1195
- DEBUG_LOCATION);
1196
- }
1197
- // For invalid resources in the update, if they are already in the
1198
- // cache, pretend that they are present in the update, so that we
1199
- // don't incorrectly consider them deleted below.
1200
- for (const auto& name : resource_names_failed) {
1201
- auto& cluster_map =
1202
- xds_client()->authority_state_map_[name.authority].cluster_map;
1203
- auto it = cluster_map.find(name.id);
1204
- if (it != cluster_map.end()) {
1205
- auto& update = it->second.update;
1206
- if (!update.has_value()) continue;
1207
- cds_update_map[name];
1208
- }
1209
- }
1210
- // For any subscribed resource that is not present in the update,
1211
- // remove it from the cache and notify watchers that it does not exist.
1212
- for (const auto& a : cds_state.subscribed_resources) {
1213
- const std::string& authority = a.first;
1214
- for (const auto& p : a.second) {
1215
- const std::string& cluster_name = p.first;
1216
- if (cds_update_map.find({authority, cluster_name}) ==
1217
- cds_update_map.end()) {
1218
- ClusterState& cluster_state = xds_client()
1219
- ->authority_state_map_[authority]
1220
- .cluster_map[cluster_name];
1221
- // If the resource was newly requested but has not yet been received,
1222
- // we don't want to generate an error for the watchers, because this CDS
1223
- // response may be in reaction to an earlier request that did not yet
1224
- // request the new resource, so its absence from the response does not
1225
- // necessarily indicate that the resource does not exist.
1226
- // For that case, we rely on the request timeout instead.
1227
- if (!cluster_state.update.has_value()) continue;
1228
- cluster_state.update.reset();
1229
- Notifier::ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1230
- xds_client(), cluster_state.watchers, DEBUG_LOCATION);
1231
- }
1232
- }
1233
- }
1234
- }
1235
-
1236
- void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1237
- std::string version, grpc_millis update_time,
1238
- XdsApi::EdsUpdateMap eds_update_map) {
1239
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1240
- gpr_log(GPR_INFO,
1241
- "[xds_client %p] EDS update received containing %" PRIuPTR
1242
- " resources",
1243
- xds_client(), eds_update_map.size());
1244
- }
1245
- auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1246
- for (auto& p : eds_update_map) {
1247
- const XdsApi::ResourceName& name = p.first;
1248
- XdsApi::EdsUpdate& eds_update = p.second.resource;
1249
- auto it = eds_state.subscribed_resources.find(name.authority);
1250
- if (it != eds_state.subscribed_resources.end()) {
1251
- auto res_it = it->second.find(name.id);
1252
- if (res_it != it->second.end()) {
1253
- res_it->second->MaybeCancelTimer();
1254
- }
1255
- }
1256
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1257
- gpr_log(GPR_INFO, "[xds_client %p] EDS resource %s: %s", xds_client(),
1258
- XdsApi::ConstructFullResourceName(name.authority,
1259
- XdsApi::kCdsTypeUrl, name.id)
1260
- .c_str(),
1261
- eds_update.ToString().c_str());
1262
- }
1263
- EndpointState& endpoint_state = xds_client()
1264
- ->authority_state_map_[name.authority]
1265
- .endpoint_map[name.id];
1266
- // Ignore identical update.
1267
- if (endpoint_state.update.has_value() &&
1268
- *endpoint_state.update == eds_update) {
1269
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1270
- gpr_log(GPR_INFO,
1271
- "[xds_client %p] EDS update identical to current, ignoring.",
1272
- xds_client());
1273
- }
1274
- continue;
1275
- }
1276
- // Update the cluster state.
1277
- endpoint_state.update = std::move(eds_update);
1278
- endpoint_state.meta = CreateResourceMetadataAcked(
1279
- std::move(p.second.serialized_proto), version, update_time);
1280
- // Notify all watchers.
1281
- auto& watchers_list = endpoint_state.watchers;
1282
- auto& value = endpoint_state.update.value();
1283
- xds_client()->work_serializer_.Schedule(
1284
- [watchers_list, value]()
1285
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1286
- for (const auto& p : watchers_list) {
1287
- p.first->OnEndpointChanged(value);
1288
- }
1289
- },
1290
- DEBUG_LOCATION);
1291
- }
1292
- }
1293
-
1294
- namespace {
1295
-
1296
- // Update resource_metadata for NACK.
1297
- void UpdateResourceMetadataNacked(const std::string& version,
1298
- const std::string& details,
1299
- grpc_millis update_time,
1300
- XdsApi::ResourceMetadata* resource_metadata) {
1301
- resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
1302
- resource_metadata->failed_version = version;
1303
- resource_metadata->failed_details = details;
1304
- resource_metadata->failed_update_time = update_time;
1305
- }
1306
-
1307
- } // namespace
1308
-
1309
- template <typename StateMap>
1310
- void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateHelperLocked(
1311
- const std::string& resource_name, grpc_millis update_time,
1312
- const XdsApi::AdsParseResult& result, const std::string& error_details,
1313
- StateMap* state_map) {
1314
- auto it = state_map->find(resource_name);
1315
- if (it == state_map->end()) return;
1316
- auto& state = it->second;
1317
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
1318
- xds_client(), state.watchers, GRPC_ERROR_REF(result.parse_error),
1319
- DEBUG_LOCATION);
1320
- UpdateResourceMetadataNacked(result.version, error_details, update_time,
1321
- &state.meta);
1322
- }
1323
-
1324
- void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
1325
- grpc_millis update_time, const XdsApi::AdsParseResult& result) {
1326
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1327
- gpr_log(GPR_INFO,
1328
- "[xds_client %p] %s update NACKed containing %" PRIuPTR
1329
- " invalid resources",
1330
- xds_client(), result.type_url.c_str(),
1331
- result.resource_names_failed.size());
1332
- }
1333
- std::string details = grpc_error_std_string(result.parse_error);
1334
- for (auto& resource : result.resource_names_failed) {
1335
- auto authority_it =
1336
- xds_client()->authority_state_map_.find(resource.authority);
1337
- if (authority_it == xds_client()->authority_state_map_.end()) continue;
1338
- AuthorityState& authority_state = authority_it->second;
1339
- if (result.type_url == XdsApi::kLdsTypeUrl) {
1340
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1341
- &authority_state.listener_map);
1342
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1343
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1344
- &authority_state.route_config_map);
1345
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1346
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1347
- &authority_state.cluster_map);
1348
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1349
- RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
1350
- &authority_state.endpoint_map);
1351
- } else {
1352
- GPR_ASSERT(0);
1353
- }
1354
- }
1355
- }
1356
-
1357
1136
  void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1358
1137
  void* arg, grpc_error_handle error) {
1359
1138
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
@@ -1413,63 +1192,76 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1413
1192
  grpc_byte_buffer_destroy(recv_message_payload_);
1414
1193
  recv_message_payload_ = nullptr;
1415
1194
  // Parse and validate the response.
1416
- XdsApi::AdsParseResult result = xds_client()->api_.ParseAdsResponse(
1417
- chand()->server_, response_slice,
1418
- ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1419
- ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1420
- ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1421
- ResourceNamesForRequest(XdsApi::kEdsTypeUrl));
1195
+ AdsResponseParser parser(this);
1196
+ absl::Status status = xds_client()->api_.ParseAdsResponse(
1197
+ chand()->server_, response_slice, &parser);
1422
1198
  grpc_slice_unref_internal(response_slice);
1423
- if (result.type_url.empty()) {
1199
+ if (!status.ok()) {
1424
1200
  // Ignore unparsable response.
1425
1201
  gpr_log(GPR_ERROR,
1426
- "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1427
- xds_client(), grpc_error_std_string(result.parse_error).c_str());
1428
- 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());
1429
1206
  } else {
1430
- grpc_millis update_time = ExecCtx::Get()->Now();
1207
+ AdsResponseParser::Result result = parser.TakeResult();
1431
1208
  // Update nonce.
1432
- auto& state = state_map_[result.type_url];
1433
- state.nonce = std::move(result.nonce);
1434
- // If we got an error, we'll NACK the update.
1435
- if (result.parse_error != GRPC_ERROR_NONE) {
1436
- gpr_log(GPR_ERROR,
1437
- "[xds_client %p] ADS response invalid for resource type %s "
1438
- "version %s, will NACK: nonce=%s error=%s",
1439
- xds_client(), result.type_url.c_str(), result.version.c_str(),
1440
- state.nonce.c_str(),
1441
- grpc_error_std_string(result.parse_error).c_str());
1442
- result.parse_error =
1443
- grpc_error_set_int(result.parse_error, GRPC_ERROR_INT_GRPC_STATUS,
1444
- 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());
1445
1221
  GRPC_ERROR_UNREF(state.error);
1446
- state.error = result.parse_error;
1447
- RejectAdsUpdateLocked(update_time, result);
1448
- }
1449
- // Process any valid resources.
1450
- bool have_valid_resources = false;
1451
- if (result.type_url == XdsApi::kLdsTypeUrl) {
1452
- have_valid_resources = !result.lds_update_map.empty();
1453
- AcceptLdsUpdateLocked(result.version, update_time,
1454
- std::move(result.lds_update_map),
1455
- result.resource_names_failed);
1456
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1457
- have_valid_resources = !result.rds_update_map.empty();
1458
- AcceptRdsUpdateLocked(result.version, update_time,
1459
- std::move(result.rds_update_map));
1460
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1461
- have_valid_resources = !result.cds_update_map.empty();
1462
- AcceptCdsUpdateLocked(result.version, update_time,
1463
- std::move(result.cds_update_map),
1464
- result.resource_names_failed);
1465
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1466
- have_valid_resources = !result.eds_update_map.empty();
1467
- AcceptEdsUpdateLocked(result.version, update_time,
1468
- 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
+ }
1469
1259
  }
1470
- if (have_valid_resources) {
1260
+ // If we had valid resources, update the version.
1261
+ if (result.have_valid_resources) {
1471
1262
  seen_response_ = true;
1472
- chand()->resource_type_version_map_[result.type_url] = result.version;
1263
+ chand()->resource_type_version_map_[result.type] =
1264
+ std::move(result.version);
1473
1265
  // Start load reporting if needed.
1474
1266
  auto& lrs_call = chand()->lrs_calld_;
1475
1267
  if (lrs_call != nullptr) {
@@ -1478,7 +1270,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1478
1270
  }
1479
1271
  }
1480
1272
  // Send ACK or NACK.
1481
- SendMessageLocked(result.type_url);
1273
+ SendMessageLocked(result.type);
1482
1274
  }
1483
1275
  if (xds_client()->shutting_down_) return true;
1484
1276
  // Keep listening for updates.
@@ -1512,9 +1304,11 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1512
1304
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1513
1305
  char* status_details = grpc_slice_to_c_string(status_details_);
1514
1306
  gpr_log(GPR_INFO,
1515
- "[xds_client %p] ADS call status received. Status = %d, details "
1516
- "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
1517
- 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,
1518
1312
  grpc_error_std_string(error).c_str());
1519
1313
  gpr_free(status_details);
1520
1314
  }
@@ -1524,7 +1318,12 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1524
1318
  parent_->OnCallFinishedLocked();
1525
1319
  // Send error to all watchers.
1526
1320
  xds_client()->NotifyOnErrorLocked(
1527
- 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))));
1528
1327
  }
1529
1328
  GRPC_ERROR_UNREF(error);
1530
1329
  }
@@ -1536,23 +1335,24 @@ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1536
1335
  return this == chand()->ads_calld_->calld();
1537
1336
  }
1538
1337
 
1539
- std::map<absl::string_view /*authority*/, std::set<absl::string_view /*name*/>>
1338
+ std::vector<std::string>
1540
1339
  XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1541
- const std::string& type_url) {
1542
- std::map<absl::string_view /*authority*/,
1543
- std::set<absl::string_view /*name*/>>
1544
- resource_map;
1545
- 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);
1546
1343
  if (it != state_map_.end()) {
1547
1344
  for (auto& a : it->second.subscribed_resources) {
1345
+ const std::string& authority = a.first;
1548
1346
  for (auto& p : a.second) {
1549
- resource_map[a.first].insert(p.first);
1550
- OrphanablePtr<ResourceState>& state = p.second;
1551
- state->MaybeStartTimer(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"));
1552
1352
  }
1553
1353
  }
1554
1354
  }
1555
- return resource_map;
1355
+ return resource_names;
1556
1356
  }
1557
1357
 
1558
1358
  //
@@ -1567,7 +1367,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1567
1367
 
1568
1368
  void XdsClient::ChannelState::LrsCallState::Reporter::
1569
1369
  ScheduleNextReportLocked() {
1570
- const grpc_millis next_report_time = ExecCtx::Get()->Now() + report_interval_;
1370
+ const Timestamp next_report_time = ExecCtx::Get()->Now() + report_interval_;
1571
1371
  grpc_timer_init(&next_report_timer_, next_report_time,
1572
1372
  &on_next_report_timer_);
1573
1373
  next_report_timer_callback_pending_ = true;
@@ -1613,15 +1413,19 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1613
1413
  bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1614
1414
  // Construct snapshot from all reported stats.
1615
1415
  XdsApi::ClusterLoadReportMap snapshot =
1616
- xds_client()->BuildLoadReportSnapshotLocked(parent_->send_all_clusters_,
1416
+ xds_client()->BuildLoadReportSnapshotLocked(parent_->chand()->server_,
1417
+ parent_->send_all_clusters_,
1617
1418
  parent_->cluster_names_);
1618
1419
  // Skip client load report if the counters were all zero in the last
1619
1420
  // report and they are still zero in this one.
1620
1421
  const bool old_val = last_report_counters_were_zero_;
1621
1422
  last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
1622
1423
  if (old_val && last_report_counters_were_zero_) {
1623
- if (xds_client()->load_report_map_.empty()) {
1624
- 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();
1625
1429
  return true;
1626
1430
  }
1627
1431
  ScheduleNextReportLocked();
@@ -1642,8 +1446,10 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1642
1446
  parent_->call_, &op, 1, &on_report_done_);
1643
1447
  if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1644
1448
  gpr_log(GPR_ERROR,
1645
- "[xds_client %p] calld=%p call_error=%d sending client load report",
1646
- 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);
1647
1453
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1648
1454
  }
1649
1455
  return false;
@@ -1665,8 +1471,11 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1665
1471
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1666
1472
  parent_->send_message_payload_ = nullptr;
1667
1473
  // If there are no more registered stats to report, cancel the call.
1668
- if (xds_client()->load_report_map_.empty()) {
1669
- 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();
1670
1479
  GRPC_ERROR_UNREF(error);
1671
1480
  return true;
1672
1481
  }
@@ -1698,14 +1507,15 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1698
1507
  // activity in xds_client()->interested_parties_, which is comprised of
1699
1508
  // the polling entities from client_channel.
1700
1509
  GPR_ASSERT(xds_client() != nullptr);
1701
- const auto& method =
1510
+ const char* method =
1702
1511
  chand()->server_.ShouldUseV3()
1703
- ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS
1704
- : 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";
1705
1514
  call_ = grpc_channel_create_pollset_set_call(
1706
1515
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
1707
- xds_client()->interested_parties_, method, nullptr,
1708
- GRPC_MILLIS_INF_FUTURE, nullptr);
1516
+ xds_client()->interested_parties_,
1517
+ Slice::FromStaticString(method).c_slice(), nullptr,
1518
+ Timestamp::InfFuture(), nullptr);
1709
1519
  GPR_ASSERT(call_ != nullptr);
1710
1520
  // Init the request payload.
1711
1521
  grpc_slice request_payload_slice =
@@ -1718,10 +1528,10 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1718
1528
  grpc_metadata_array_init(&trailing_metadata_recv_);
1719
1529
  // Start the call.
1720
1530
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1721
- gpr_log(GPR_INFO,
1722
- "[xds_client %p] Starting LRS call (chand: %p, calld: %p, "
1723
- "call: %p)",
1724
- 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_);
1725
1535
  }
1726
1536
  // Create the ops.
1727
1537
  grpc_call_error call_error;
@@ -1875,14 +1685,15 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1875
1685
  // Parse the response.
1876
1686
  bool send_all_clusters = false;
1877
1687
  std::set<std::string> new_cluster_names;
1878
- grpc_millis new_load_reporting_interval;
1688
+ Duration new_load_reporting_interval;
1879
1689
  grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1880
1690
  response_slice, &send_all_clusters, &new_cluster_names,
1881
1691
  &new_load_reporting_interval);
1882
1692
  if (parse_error != GRPC_ERROR_NONE) {
1883
1693
  gpr_log(GPR_ERROR,
1884
- "[xds_client %p] LRS response parsing failed. error=%s",
1885
- 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());
1886
1697
  GRPC_ERROR_UNREF(parse_error);
1887
1698
  return;
1888
1699
  }
@@ -1890,11 +1701,12 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1890
1701
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1891
1702
  gpr_log(
1892
1703
  GPR_INFO,
1893
- "[xds_client %p] LRS response received, %" PRIuPTR
1704
+ "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1894
1705
  " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1895
1706
  "ms",
1896
- xds_client(), new_cluster_names.size(), send_all_clusters,
1897
- 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());
1898
1710
  size_t i = 0;
1899
1711
  for (const auto& name : new_cluster_names) {
1900
1712
  gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
@@ -1902,14 +1714,16 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1902
1714
  }
1903
1715
  }
1904
1716
  if (new_load_reporting_interval <
1905
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS) {
1906
- new_load_reporting_interval =
1907
- 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);
1908
1721
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1909
1722
  gpr_log(GPR_INFO,
1910
- "[xds_client %p] Increased load_report_interval to minimum "
1911
- "value %dms",
1912
- 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);
1913
1727
  }
1914
1728
  }
1915
1729
  // Ignore identical update.
@@ -1917,10 +1731,11 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1917
1731
  cluster_names_ == new_cluster_names &&
1918
1732
  load_reporting_interval_ == new_load_reporting_interval) {
1919
1733
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1920
- gpr_log(GPR_INFO,
1921
- "[xds_client %p] Incoming LRS response identical to current, "
1922
- "ignoring.",
1923
- 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());
1924
1739
  }
1925
1740
  return;
1926
1741
  }
@@ -1966,15 +1781,16 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1966
1781
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1967
1782
  char* status_details = grpc_slice_to_c_string(status_details_);
1968
1783
  gpr_log(GPR_INFO,
1969
- "[xds_client %p] LRS call status received. Status = %d, details "
1970
- "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1971
- 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,
1972
1789
  grpc_error_std_string(error).c_str());
1973
1790
  gpr_free(status_details);
1974
1791
  }
1975
1792
  // Ignore status from a stale call.
1976
1793
  if (IsCurrentCallOnChannel()) {
1977
- GPR_ASSERT(!xds_client()->shutting_down_);
1978
1794
  // Try to restart the call.
1979
1795
  parent_->OnCallFinishedLocked();
1980
1796
  }
@@ -1994,10 +1810,10 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1994
1810
 
1995
1811
  namespace {
1996
1812
 
1997
- grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1998
- return grpc_channel_args_find_integer(
1813
+ Duration GetRequestTimeout(const grpc_channel_args* args) {
1814
+ return Duration::Milliseconds(grpc_channel_args_find_integer(
1999
1815
  args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
2000
- {15000, 0, INT_MAX});
1816
+ {15000, 0, INT_MAX}));
2001
1817
  }
2002
1818
 
2003
1819
  grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
@@ -2024,7 +1840,7 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
2024
1840
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
2025
1841
  bootstrap_->certificate_providers())),
2026
1842
  api_(this, &grpc_xds_client_trace, bootstrap_->node(),
2027
- &bootstrap_->certificate_providers()) {
1843
+ &bootstrap_->certificate_providers(), &symtab_) {
2028
1844
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2029
1845
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
2030
1846
  }
@@ -2055,24 +1871,9 @@ void XdsClient::Orphan() {
2055
1871
  {
2056
1872
  MutexLock lock(&mu_);
2057
1873
  shutting_down_ = true;
2058
- // We do not clear cluster_map_ and endpoint_map_ if the xds client was
2059
- // created by the XdsResolver because the maps contain refs for watchers
2060
- // which in turn hold refs to the loadbalancing policies. At this point, it
2061
- // is possible for ADS calls to be in progress. Unreffing the loadbalancing
2062
- // policies before those calls are done would lead to issues such as
2063
- // https://github.com/grpc/grpc/issues/20928.
2064
- for (auto& a : authority_state_map_) {
2065
- a.second.channel_state.reset();
2066
- if (!a.second.listener_map.empty()) {
2067
- a.second.cluster_map.clear();
2068
- a.second.endpoint_map.clear();
2069
- }
2070
- }
2071
- // We clear these invalid resource watchers as cancel never came.
2072
- invalid_listener_watchers_.clear();
2073
- invalid_route_config_watchers_.clear();
2074
- invalid_cluster_watchers_.clear();
2075
- 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();
2076
1877
  }
2077
1878
  }
2078
1879
 
@@ -2089,19 +1890,17 @@ RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
2089
1890
  return channel_state;
2090
1891
  }
2091
1892
 
2092
- void XdsClient::WatchListenerData(
2093
- absl::string_view listener_name,
2094
- RefCountedPtr<ListenerWatcherInterface> watcher) {
2095
- std::string listener_name_str = std::string(listener_name);
2096
- ListenerWatcherInterface* w = watcher.get();
2097
- auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
2098
- if (!resource.ok()) {
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 {
2099
1899
  {
2100
1900
  MutexLock lock(&mu_);
2101
- invalid_listener_watchers_[w] = watcher;
1901
+ MaybeRegisterResourceTypeLocked(type);
1902
+ invalid_watchers_[w] = watcher;
2102
1903
  }
2103
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2104
- "Unable to parse resource name for listener %s", listener_name));
2105
1904
  work_serializer_.Run(
2106
1905
  // TODO(yashykt): When we move to C++14, capture watcher using
2107
1906
  // std::move()
@@ -2109,107 +1908,50 @@ void XdsClient::WatchListenerData(
2109
1908
  watcher->OnError(error);
2110
1909
  },
2111
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)));
2112
1916
  return;
2113
1917
  }
2114
- {
2115
- MutexLock lock(&mu_);
2116
- AuthorityState& authority_state = authority_state_map_[resource->authority];
2117
- ListenerState& listener_state = authority_state.listener_map[resource->id];
2118
- listener_state.watchers[w] = watcher;
2119
- // If we've already received an LDS update, notify the new watcher
2120
- // immediately.
2121
- if (listener_state.update.has_value()) {
2122
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2123
- gpr_log(GPR_INFO,
2124
- "[xds_client %p] returning cached listener data for %s", this,
2125
- listener_name_str.c_str());
2126
- }
2127
- auto& value = listener_state.update.value();
2128
- work_serializer_.Schedule(
2129
- // TODO(yashykt): When we move to C++14, capture watcher using
2130
- // std::move()
2131
- [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2132
- watcher->OnListenerChanged(value);
2133
- },
2134
- DEBUG_LOCATION);
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;
2135
1928
  }
2136
- // If the authority doesn't yet have a channel, set it, creating it if
2137
- // needed.
2138
- if (authority_state.channel_state == nullptr) {
2139
- authority_state.channel_state =
2140
- GetOrCreateChannelStateLocked(bootstrap_->server());
1929
+ if (!authority->xds_servers.empty()) {
1930
+ xds_server = &authority->xds_servers[0];
2141
1931
  }
2142
- authority_state.channel_state->SubscribeLocked(XdsApi::kLdsTypeUrl,
2143
- *resource);
2144
- }
2145
- work_serializer_.DrainQueue();
2146
- }
2147
-
2148
- void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
2149
- ListenerWatcherInterface* watcher,
2150
- bool delay_unsubscription) {
2151
- MutexLock lock(&mu_);
2152
- if (shutting_down_) return;
2153
- auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
2154
- if (!resource.ok()) return;
2155
- auto& authority_state = authority_state_map_[resource->authority];
2156
- ListenerState& listener_state = authority_state.listener_map[resource->id];
2157
- auto it = listener_state.watchers.find(watcher);
2158
- if (it == listener_state.watchers.end()) {
2159
- invalid_listener_watchers_.erase(watcher);
2160
- return;
2161
- }
2162
- listener_state.watchers.erase(it);
2163
- if (!listener_state.watchers.empty()) return;
2164
- authority_state.listener_map.erase(resource->id);
2165
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2166
- XdsApi::kLdsTypeUrl, *resource, delay_unsubscription);
2167
- if (!authority_state.HasSubscribedResources()) {
2168
- authority_state.channel_state.reset();
2169
- }
2170
- }
2171
-
2172
- void XdsClient::WatchRouteConfigData(
2173
- absl::string_view route_config_name,
2174
- RefCountedPtr<RouteConfigWatcherInterface> watcher) {
2175
- std::string route_config_name_str = std::string(route_config_name);
2176
- RouteConfigWatcherInterface* w = watcher.get();
2177
- auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
2178
- if (!resource.ok()) {
2179
- {
2180
- MutexLock lock(&mu_);
2181
- invalid_route_config_watchers_[w] = watcher;
2182
- }
2183
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2184
- absl::StrFormat("Unable to parse resource name for route config %s",
2185
- route_config_name));
2186
- work_serializer_.Run(
2187
- // TODO(yashykt): When we move to C++14, capture watcher using
2188
- // std::move()
2189
- [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2190
- watcher->OnError(error);
2191
- },
2192
- DEBUG_LOCATION);
2193
- return;
2194
1932
  }
1933
+ if (xds_server == nullptr) xds_server = &bootstrap_->server();
2195
1934
  {
2196
1935
  MutexLock lock(&mu_);
2197
- auto& authority_state = authority_state_map_[resource->authority];
2198
- RouteConfigState& route_config_state =
2199
- authority_state.route_config_map[resource->id];
2200
- route_config_state.watchers[w] = watcher;
2201
- // If we've already received an RDS update, notify the new watcher
2202
- // immediately.
2203
- if (route_config_state.update.has_value()) {
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) {
2204
1945
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2205
1946
  gpr_log(GPR_INFO,
2206
- "[xds_client %p] returning cached route config data for %s",
2207
- this, route_config_name_str.c_str());
1947
+ "[xds_client %p] returning cached listener data for %s", this,
1948
+ std::string(name).c_str());
2208
1949
  }
2209
- auto& value = route_config_state.update.value();
1950
+ auto* value = type->CopyResource(resource_state.resource.get()).release();
2210
1951
  work_serializer_.Schedule(
2211
- [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2212
- watcher->OnRouteConfigChanged(value);
1952
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1953
+ watcher->OnGenericResourceChanged(value);
1954
+ delete value;
2213
1955
  },
2214
1956
  DEBUG_LOCATION);
2215
1957
  }
@@ -2217,205 +1959,136 @@ void XdsClient::WatchRouteConfigData(
2217
1959
  // needed.
2218
1960
  if (authority_state.channel_state == nullptr) {
2219
1961
  authority_state.channel_state =
2220
- GetOrCreateChannelStateLocked(bootstrap_->server());
1962
+ GetOrCreateChannelStateLocked(*xds_server);
2221
1963
  }
2222
- authority_state.channel_state->SubscribeLocked(XdsApi::kRdsTypeUrl,
2223
- *resource);
1964
+ authority_state.channel_state->SubscribeLocked(type, *resource_name);
2224
1965
  }
2225
1966
  work_serializer_.DrainQueue();
2226
1967
  }
2227
1968
 
2228
- void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
2229
- RouteConfigWatcherInterface* watcher,
2230
- bool delay_unsubscription) {
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);
2231
1974
  MutexLock lock(&mu_);
2232
- if (shutting_down_) return;
2233
- auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
2234
- if (!resource.ok()) return;
2235
- auto& authority_state = authority_state_map_[resource->authority];
2236
- RouteConfigState& route_config_state =
2237
- authority_state.route_config_map[resource->id];
2238
- auto it = route_config_state.watchers.find(watcher);
2239
- if (it == route_config_state.watchers.end()) {
2240
- invalid_route_config_watchers_.erase(watcher);
1975
+ if (!resource_name.ok()) {
1976
+ invalid_watchers_.erase(watcher);
2241
1977
  return;
2242
1978
  }
2243
- route_config_state.watchers.erase(it);
2244
- if (!route_config_state.watchers.empty()) return;
2245
- authority_state.route_config_map.erase(resource->id);
2246
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2247
- XdsApi::kRdsTypeUrl, *resource, delay_unsubscription);
2248
- if (!authority_state.HasSubscribedResources()) {
2249
- authority_state.channel_state.reset();
2250
- }
2251
- }
2252
-
2253
- void XdsClient::WatchClusterData(
2254
- absl::string_view cluster_name,
2255
- RefCountedPtr<ClusterWatcherInterface> watcher) {
2256
- std::string cluster_name_str = std::string(cluster_name);
2257
- ClusterWatcherInterface* w = watcher.get();
2258
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2259
- if (!resource.ok()) {
2260
- {
2261
- MutexLock lock(&mu_);
2262
- invalid_cluster_watchers_[w] = watcher;
2263
- }
2264
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2265
- "Unable to parse resource name for cluster %s", cluster_name));
2266
- work_serializer_.Run([watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
2267
- work_serializer_) { watcher->OnError(error); },
2268
- DEBUG_LOCATION);
2269
- return;
2270
- }
2271
- {
2272
- MutexLock lock(&mu_);
2273
- auto& authority_state = authority_state_map_[resource->authority];
2274
- ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2275
- cluster_state.watchers[w] = watcher;
2276
- // If we've already received a CDS update, notify the new watcher
2277
- // immediately.
2278
- if (cluster_state.update.has_value()) {
2279
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2280
- gpr_log(GPR_INFO,
2281
- "[xds_client %p] returning cached cluster data for %s", this,
2282
- cluster_name_str.c_str());
2283
- }
2284
- auto& value = cluster_state.update.value();
2285
- work_serializer_.Schedule(
2286
- // TODO(yashykt): When we move to C++14, capture watcher using
2287
- // std::move()
2288
- [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2289
- watcher->OnClusterChanged(value);
2290
- },
2291
- DEBUG_LOCATION);
2292
- }
2293
- // If the authority doesn't yet have a channel, set it, creating it if
2294
- // needed.
2295
- if (authority_state.channel_state == nullptr) {
2296
- authority_state.channel_state =
2297
- GetOrCreateChannelStateLocked(bootstrap_->server());
2298
- }
2299
- authority_state.channel_state->SubscribeLocked(XdsApi::kCdsTypeUrl,
2300
- *resource);
2301
- }
2302
- work_serializer_.DrainQueue();
2303
- }
2304
-
2305
- void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
2306
- ClusterWatcherInterface* watcher,
2307
- bool delay_unsubscription) {
2308
- MutexLock lock(&mu_);
2309
1979
  if (shutting_down_) return;
2310
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2311
- if (!resource.ok()) return;
2312
- auto& authority_state = authority_state_map_[resource->authority];
2313
- ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2314
- auto it = cluster_state.watchers.find(watcher);
2315
- if (it == cluster_state.watchers.end()) {
2316
- invalid_cluster_watchers_.erase(watcher);
2317
- return;
2318
- }
2319
- cluster_state.watchers.erase(it);
2320
- if (!cluster_state.watchers.empty()) return;
2321
- authority_state.cluster_map.erase(resource->id);
2322
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2323
- XdsApi::kCdsTypeUrl, *resource, delay_unsubscription);
2324
- if (!authority_state.HasSubscribedResources()) {
2325
- authority_state.channel_state.reset();
2326
- }
2327
- }
2328
-
2329
- void XdsClient::WatchEndpointData(
2330
- absl::string_view eds_service_name,
2331
- RefCountedPtr<EndpointWatcherInterface> watcher) {
2332
- std::string eds_service_name_str = std::string(eds_service_name);
2333
- EndpointWatcherInterface* w = watcher.get();
2334
- auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
2335
- if (!resource.ok()) {
2336
- {
2337
- MutexLock lock(&mu_);
2338
- invalid_endpoint_watchers_[w] = watcher;
2339
- }
2340
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2341
- absl::StrFormat("Unable to parse resource name for endpoint service %s",
2342
- eds_service_name));
2343
- work_serializer_.Run([watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
2344
- work_serializer_) { watcher->OnError(error); },
2345
- DEBUG_LOCATION);
2346
- return;
2347
- }
2348
- {
2349
- MutexLock lock(&mu_);
2350
- auto& authority_state = authority_state_map_[resource->authority];
2351
- EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2352
- endpoint_state.watchers[w] = watcher;
2353
- // If we've already received an EDS update, notify the new watcher
2354
- // immediately.
2355
- if (endpoint_state.update.has_value()) {
2356
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2357
- gpr_log(GPR_INFO,
2358
- "[xds_client %p] returning cached endpoint data for %s", this,
2359
- 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();
2360
2003
  }
2361
- auto& value = endpoint_state.update.value();
2362
- work_serializer_.Schedule(
2363
- [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2364
- watcher->OnEndpointChanged(value);
2365
- },
2366
- DEBUG_LOCATION);
2367
2004
  }
2368
- // If the authority doesn't yet have a channel, set it, creating it if
2369
- // needed.
2370
- if (authority_state.channel_state == nullptr) {
2371
- authority_state.channel_state =
2372
- GetOrCreateChannelStateLocked(bootstrap_->server());
2373
- }
2374
- authority_state.channel_state->SubscribeLocked(XdsApi::kEdsTypeUrl,
2375
- *resource);
2376
2005
  }
2377
- work_serializer_.DrainQueue();
2378
2006
  }
2379
2007
 
2380
- void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
2381
- EndpointWatcherInterface* watcher,
2382
- bool delay_unsubscription) {
2383
- MutexLock lock(&mu_);
2384
- if (shutting_down_) return;
2385
- auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
2386
- if (!resource.ok()) return;
2387
- auto& authority_state = authority_state_map_[resource->authority];
2388
- EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2389
- auto it = endpoint_state.watchers.find(watcher);
2390
- if (it == endpoint_state.watchers.end()) {
2391
- 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);
2392
2013
  return;
2393
2014
  }
2394
- endpoint_state.watchers.erase(it);
2395
- if (!endpoint_state.watchers.empty()) return;
2396
- authority_state.endpoint_map.erase(resource->id);
2397
- xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
2398
- XdsApi::kEdsTypeUrl, *resource, delay_unsubscription);
2399
- if (!authority_state.HasSubscribedResources()) {
2400
- authority_state.channel_state.reset();
2401
- }
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;
2402
2069
  }
2403
2070
 
2404
2071
  RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2405
- absl::string_view lrs_server, absl::string_view cluster_name,
2072
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2406
2073
  absl::string_view eds_service_name) {
2407
- // TODO(roth): When we add support for direct federation, use the
2408
- // server name specified in lrs_server.
2074
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2409
2075
  auto key =
2410
2076
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2411
2077
  MutexLock lock(&mu_);
2412
- // We jump through some hoops here to make sure that the absl::string_views
2413
- // 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
2414
2082
  // in the load_report_map_ key, so that they have the same lifetime.
2415
- auto it = load_report_map_
2416
- .emplace(std::make_pair(std::move(key), LoadReportState()))
2417
- .first;
2418
- 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;
2419
2092
  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
2420
2093
  if (load_report_state.drop_stats != nullptr) {
2421
2094
  cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
@@ -2426,31 +2099,26 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2426
2099
  load_report_state.drop_stats->GetSnapshotAndReset();
2427
2100
  }
2428
2101
  cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
2429
- Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
2430
- it->first.first /*cluster_name*/,
2431
- 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*/);
2432
2105
  load_report_state.drop_stats = cluster_drop_stats.get();
2433
2106
  }
2434
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2435
- GPR_ASSERT(resource.ok());
2436
- auto a = authority_state_map_.find(resource->authority);
2437
- if (a != authority_state_map_.end()) {
2438
- a->second.channel_state->MaybeStartLrsCall();
2439
- }
2107
+ server_it->second.channel_state->MaybeStartLrsCall();
2440
2108
  return cluster_drop_stats;
2441
2109
  }
2442
2110
 
2443
2111
  void XdsClient::RemoveClusterDropStats(
2444
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
2112
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2445
2113
  absl::string_view eds_service_name,
2446
2114
  XdsClusterDropStats* cluster_drop_stats) {
2447
2115
  MutexLock lock(&mu_);
2448
- // TODO(roth): When we add support for direct federation, use the
2449
- // server name specified in lrs_server.
2450
- 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(
2451
2119
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2452
- if (it == load_report_map_.end()) return;
2453
- 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;
2454
2122
  if (load_report_state.drop_stats == cluster_drop_stats) {
2455
2123
  // Record final snapshot in deleted_drop_stats, which will be
2456
2124
  // added to the next load report.
@@ -2461,21 +2129,27 @@ void XdsClient::RemoveClusterDropStats(
2461
2129
  }
2462
2130
 
2463
2131
  RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2464
- absl::string_view lrs_server, absl::string_view cluster_name,
2132
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2465
2133
  absl::string_view eds_service_name,
2466
2134
  RefCountedPtr<XdsLocalityName> locality) {
2467
- // TODO(roth): When we add support for direct federation, use the
2468
- // server name specified in lrs_server.
2135
+ if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2469
2136
  auto key =
2470
2137
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2471
2138
  MutexLock lock(&mu_);
2472
- // We jump through some hoops here to make sure that the absl::string_views
2473
- // 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
2474
2143
  // in the load_report_map_ key, so that they have the same lifetime.
2475
- auto it = load_report_map_
2476
- .emplace(std::make_pair(std::move(key), LoadReportState()))
2477
- .first;
2478
- 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;
2479
2153
  LoadReportState::LocalityState& locality_state =
2480
2154
  load_report_state.locality_stats[locality];
2481
2155
  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
@@ -2488,32 +2162,27 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2488
2162
  locality_state.locality_stats->GetSnapshotAndReset();
2489
2163
  }
2490
2164
  cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
2491
- Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
2492
- it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
2493
- 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));
2494
2168
  locality_state.locality_stats = cluster_locality_stats.get();
2495
2169
  }
2496
- auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2497
- GPR_ASSERT(resource.ok());
2498
- auto a = authority_state_map_.find(resource->authority);
2499
- if (a != authority_state_map_.end()) {
2500
- a->second.channel_state->MaybeStartLrsCall();
2501
- }
2170
+ server_it->second.channel_state->MaybeStartLrsCall();
2502
2171
  return cluster_locality_stats;
2503
2172
  }
2504
2173
 
2505
2174
  void XdsClient::RemoveClusterLocalityStats(
2506
- absl::string_view /*lrs_server*/, absl::string_view cluster_name,
2175
+ const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
2507
2176
  absl::string_view eds_service_name,
2508
2177
  const RefCountedPtr<XdsLocalityName>& locality,
2509
2178
  XdsClusterLocalityStats* cluster_locality_stats) {
2510
2179
  MutexLock lock(&mu_);
2511
- // TODO(roth): When we add support for direct federation, use the
2512
- // server name specified in lrs_server.
2513
- 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(
2514
2183
  std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2515
- if (it == load_report_map_.end()) return;
2516
- 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;
2517
2186
  auto locality_it = load_report_state.locality_stats.find(locality);
2518
2187
  if (locality_it == load_report_state.locality_stats.end()) return;
2519
2188
  LoadReportState::LocalityState& locality_state = locality_it->second;
@@ -2534,67 +2203,40 @@ void XdsClient::ResetBackoff() {
2534
2203
  }
2535
2204
 
2536
2205
  void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2537
- std::set<RefCountedPtr<ListenerWatcherInterface>> listener_watchers;
2538
- std::set<RefCountedPtr<RouteConfigWatcherInterface>> route_config_watchers;
2539
- std::set<RefCountedPtr<ClusterWatcherInterface>> cluster_watchers;
2540
- std::set<RefCountedPtr<EndpointWatcherInterface>> endpoint_watchers;
2541
- for (const auto& a : authority_state_map_) {
2542
- for (const auto& p : a.second.listener_map) {
2543
- const ListenerState& listener_state = p.second;
2544
- for (const auto& q : listener_state.watchers) {
2545
- listener_watchers.insert(q.second);
2546
- }
2547
- }
2548
- for (const auto& p : a.second.route_config_map) {
2549
- const RouteConfigState& route_config_state = p.second;
2550
- for (const auto& q : route_config_state.watchers) {
2551
- route_config_watchers.insert(q.second);
2552
- }
2553
- }
2554
- for (const auto& p : a.second.cluster_map) {
2555
- const ClusterState& cluster_state = p.second;
2556
- for (const auto& q : cluster_state.watchers) {
2557
- cluster_watchers.insert(q.second);
2558
- }
2559
- }
2560
- for (const auto& p : a.second.endpoint_map) {
2561
- const EndpointState& endpoint_state = p.second;
2562
- for (const auto& q : endpoint_state.watchers) {
2563
- endpoint_watchers.insert(q.second);
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
+ }
2564
2213
  }
2565
2214
  }
2566
2215
  }
2567
2216
  work_serializer_.Schedule(
2568
- // TODO(yashykt): When we move to C++14, capture *_watchers using
2217
+ // TODO(yashykt): When we move to C++14, capture watchers using
2569
2218
  // std::move()
2570
- [listener_watchers, route_config_watchers, cluster_watchers,
2571
- endpoint_watchers, error]()
2572
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2573
- for (const auto& watcher : listener_watchers) {
2574
- watcher->OnError(GRPC_ERROR_REF(error));
2575
- }
2576
- for (const auto& watcher : route_config_watchers) {
2577
- watcher->OnError(GRPC_ERROR_REF(error));
2578
- }
2579
- for (const auto& watcher : cluster_watchers) {
2580
- watcher->OnError(GRPC_ERROR_REF(error));
2581
- }
2582
- for (const auto& watcher : endpoint_watchers) {
2583
- watcher->OnError(GRPC_ERROR_REF(error));
2584
- }
2585
- GRPC_ERROR_UNREF(error);
2586
- },
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
+ },
2587
2225
  DEBUG_LOCATION);
2588
2226
  }
2589
2227
 
2590
2228
  XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2591
- 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) {
2592
2231
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2593
2232
  gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
2594
2233
  }
2595
2234
  XdsApi::ClusterLoadReportMap snapshot_map;
2596
- for (auto load_report_it = load_report_map_.begin();
2597
- 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();) {
2598
2240
  // Cluster key is cluster and EDS service name.
2599
2241
  const auto& cluster_key = load_report_it->first;
2600
2242
  LoadReportState& load_report = load_report_it->second;
@@ -2649,7 +2291,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2649
2291
  }
2650
2292
  }
2651
2293
  // Compute load report interval.
2652
- const grpc_millis now = ExecCtx::Get()->Now();
2294
+ const Timestamp now = ExecCtx::Get()->Now();
2653
2295
  snapshot.load_report_interval = now - load_report.last_report_time;
2654
2296
  load_report.last_report_time = now;
2655
2297
  // Record snapshot.
@@ -2660,7 +2302,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2660
2302
  // deleted stats objects, remove the entry.
2661
2303
  if (load_report.locality_stats.empty() &&
2662
2304
  load_report.drop_stats == nullptr) {
2663
- load_report_it = load_report_map_.erase(load_report_it);
2305
+ load_report_it = load_report_map.erase(load_report_it);
2664
2306
  } else {
2665
2307
  ++load_report_it;
2666
2308
  }
@@ -2671,35 +2313,18 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2671
2313
  std::string XdsClient::DumpClientConfigBinary() {
2672
2314
  MutexLock lock(&mu_);
2673
2315
  XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
2674
- auto& lds_map = resource_type_metadata_map[XdsApi::kLdsTypeUrl];
2675
- auto& rds_map = resource_type_metadata_map[XdsApi::kRdsTypeUrl];
2676
- auto& cds_map = resource_type_metadata_map[XdsApi::kCdsTypeUrl];
2677
- auto& eds_map = resource_type_metadata_map[XdsApi::kEdsTypeUrl];
2678
- for (auto& a : authority_state_map_) {
2316
+ for (const auto& a : authority_state_map_) { // authority
2679
2317
  const std::string& authority = a.first;
2680
- // Collect resource metadata from listeners
2681
- for (auto& p : a.second.listener_map) {
2682
- const std::string& listener_name = p.first;
2683
- lds_map[XdsApi::ConstructFullResourceName(
2684
- authority, XdsApi::kLdsTypeUrl, listener_name)] = &p.second.meta;
2685
- }
2686
- // Collect resource metadata from route configs
2687
- for (auto& p : a.second.route_config_map) {
2688
- const std::string& route_config_name = p.first;
2689
- rds_map[XdsApi::ConstructFullResourceName(
2690
- authority, XdsApi::kRdsTypeUrl, route_config_name)] = &p.second.meta;
2691
- }
2692
- // Collect resource metadata from clusters
2693
- for (auto& p : a.second.cluster_map) {
2694
- const std::string& cluster_name = p.first;
2695
- cds_map[XdsApi::ConstructFullResourceName(authority, XdsApi::kCdsTypeUrl,
2696
- cluster_name)] = &p.second.meta;
2697
- }
2698
- // Collect resource metadata from endpoints
2699
- for (auto& p : a.second.endpoint_map) {
2700
- const std::string& endpoint_name = p.first;
2701
- eds_map[XdsApi::ConstructFullResourceName(
2702
- 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
+ }
2703
2328
  }
2704
2329
  }
2705
2330
  // Assemble config dump messages