grpc 1.43.1 → 1.46.2

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