grpc 1.32.0 → 1.36.0

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

Potentially problematic release.


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

Files changed (1031) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1086 -3054
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +227 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2788 -1535
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -6
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +7 -8
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +204 -195
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +58 -26
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  44. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +478 -145
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +810 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  51. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  52. data/src/core/ext/filters/client_channel/resolver.cc +4 -5
  53. data/src/core/ext/filters/client_channel/resolver.h +5 -13
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +43 -59
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +443 -17
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +22 -23
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -18
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +362 -0
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +37 -30
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +566 -366
  65. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  66. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  67. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  68. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  70. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  71. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  72. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  73. data/src/core/ext/filters/client_channel/server_address.cc +86 -0
  74. data/src/core/ext/filters/client_channel/server_address.h +52 -36
  75. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  76. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  77. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  78. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  79. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  80. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  81. data/src/core/ext/filters/client_channel/subchannel.cc +53 -66
  82. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  83. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  84. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  86. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  87. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  88. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  89. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +36 -33
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  93. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  94. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  95. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  100. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +226 -95
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  105. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  106. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  107. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  108. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  109. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  110. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  114. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  115. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  116. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  117. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  118. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  119. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  120. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -33
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  124. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +171 -98
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +625 -202
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +70 -45
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +42 -0
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +126 -0
  157. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
  158. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  159. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  160. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  161. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  162. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  164. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  165. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +49 -27
  166. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +204 -48
  167. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +47 -26
  168. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +181 -48
  169. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
  170. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  171. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  172. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  173. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
  174. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
  175. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +352 -199
  176. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1334 -443
  177. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  178. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  179. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
  180. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  181. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  183. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +129 -80
  184. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +525 -166
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +26 -24
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +121 -64
  189. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -6
  190. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -8
  191. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +70 -29
  192. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  193. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  194. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  195. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -34
  198. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +188 -75
  199. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
  200. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  201. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
  202. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
  204. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  205. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
  206. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  207. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  208. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -4
  218. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  219. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  220. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  221. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  222. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  223. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  224. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  225. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  232. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  233. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  234. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  235. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
  237. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  238. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  239. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  242. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  243. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  245. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  246. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  247. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  248. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  249. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  250. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  251. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  252. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  253. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  254. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  255. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  256. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  257. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  258. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  259. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  260. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  261. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  262. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  263. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  264. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  265. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  266. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  267. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  268. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  269. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  270. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  271. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  272. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  273. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  274. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  275. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  276. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  277. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  278. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +28 -0
  279. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  280. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  281. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  282. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  283. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  284. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  285. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  286. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  287. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  288. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  289. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  290. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  291. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  292. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  293. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  342. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
  343. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  344. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
  345. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  346. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +938 -0
  347. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +285 -0
  348. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  349. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
  351. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  352. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  353. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +504 -0
  355. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  356. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
  357. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  358. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
  359. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  360. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
  361. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  362. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
  363. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
  369. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  370. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
  371. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
  373. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
  375. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  376. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
  377. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  378. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  379. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  385. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  386. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  392. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  393. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  394. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  395. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  396. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  397. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  398. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  399. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  400. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  401. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  402. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  405. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  406. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  407. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  410. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  411. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  412. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  413. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  414. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  415. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  417. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  418. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  419. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  421. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  422. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  425. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  426. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  427. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  428. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  429. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  430. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  431. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  432. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  433. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  437. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  438. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  439. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  440. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  441. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  442. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  443. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  444. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  445. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  446. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  447. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  448. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  449. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  450. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  451. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  452. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  453. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  454. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  455. data/src/core/ext/xds/xds_api.cc +1149 -1058
  456. data/src/core/ext/xds/xds_api.h +215 -144
  457. data/src/core/ext/xds/xds_bootstrap.cc +228 -62
  458. data/src/core/ext/xds/xds_bootstrap.h +35 -12
  459. data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
  460. data/src/core/ext/xds/xds_certificate_provider.h +151 -0
  461. data/src/core/ext/xds/xds_channel_args.h +6 -3
  462. data/src/core/ext/xds/xds_client.cc +620 -495
  463. data/src/core/ext/xds/xds_client.h +121 -58
  464. data/src/core/ext/xds/xds_client_stats.cc +61 -17
  465. data/src/core/ext/xds/xds_client_stats.h +35 -7
  466. data/src/core/ext/xds/xds_server_config_fetcher.cc +267 -0
  467. data/src/core/lib/channel/channel_args.cc +9 -8
  468. data/src/core/lib/channel/channel_args.h +0 -1
  469. data/src/core/lib/channel/channel_trace.cc +4 -2
  470. data/src/core/lib/channel/channel_trace.h +1 -1
  471. data/src/core/lib/channel/channelz.cc +23 -59
  472. data/src/core/lib/channel/channelz.h +13 -22
  473. data/src/core/lib/channel/channelz_registry.cc +12 -11
  474. data/src/core/lib/channel/channelz_registry.h +3 -1
  475. data/src/core/lib/channel/handshaker.cc +4 -7
  476. data/src/core/lib/channel/handshaker.h +3 -3
  477. data/src/core/lib/compression/compression.cc +8 -4
  478. data/src/core/lib/compression/compression_args.cc +3 -2
  479. data/src/core/lib/compression/compression_internal.cc +10 -5
  480. data/src/core/lib/compression/compression_internal.h +2 -1
  481. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  482. data/src/core/lib/debug/stats.h +2 -2
  483. data/src/core/lib/debug/stats_data.cc +1 -0
  484. data/src/core/lib/debug/stats_data.h +13 -13
  485. data/src/core/lib/gpr/alloc.cc +3 -2
  486. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  487. data/src/core/lib/gpr/log.cc +59 -17
  488. data/src/core/lib/gpr/log_linux.cc +19 -3
  489. data/src/core/lib/gpr/log_posix.cc +15 -1
  490. data/src/core/lib/gpr/log_windows.cc +18 -4
  491. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  492. data/src/core/lib/gpr/spinlock.h +10 -2
  493. data/src/core/lib/gpr/string.cc +23 -22
  494. data/src/core/lib/gpr/string.h +5 -6
  495. data/src/core/lib/gpr/sync.cc +4 -4
  496. data/src/core/lib/gpr/time.cc +12 -12
  497. data/src/core/lib/gpr/time_precise.cc +5 -2
  498. data/src/core/lib/gpr/time_precise.h +6 -2
  499. data/src/core/lib/gpr/tls.h +4 -0
  500. data/src/core/lib/gpr/tls_msvc.h +2 -0
  501. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  502. data/src/core/lib/gpr/useful.h +5 -4
  503. data/src/core/lib/gprpp/arena.h +3 -2
  504. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  505. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  506. data/src/core/lib/gprpp/examine_stack.h +46 -0
  507. data/src/core/lib/gprpp/fork.cc +2 -2
  508. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  509. data/src/core/lib/gprpp/mpscq.cc +2 -2
  510. data/src/core/lib/gprpp/orphanable.h +4 -8
  511. data/src/core/lib/gprpp/ref_counted.h +91 -68
  512. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  513. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  514. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  515. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  516. data/src/core/lib/gprpp/sync.h +129 -40
  517. data/src/core/lib/gprpp/thd.h +2 -2
  518. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  519. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  520. data/src/core/lib/gprpp/time_util.cc +77 -0
  521. data/src/core/lib/gprpp/time_util.h +42 -0
  522. data/src/core/lib/http/httpcli.cc +1 -1
  523. data/src/core/lib/http/httpcli.h +2 -3
  524. data/src/core/lib/http/httpcli_security_connector.cc +3 -3
  525. data/src/core/lib/http/parser.cc +47 -27
  526. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  527. data/src/core/lib/iomgr/combiner.cc +2 -1
  528. data/src/core/lib/iomgr/endpoint.h +1 -1
  529. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  530. data/src/core/lib/iomgr/error.cc +17 -12
  531. data/src/core/lib/iomgr/error_internal.h +1 -1
  532. data/src/core/lib/iomgr/ev_apple.cc +10 -7
  533. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  534. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -21
  535. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  536. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  537. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  538. data/src/core/lib/iomgr/executor.cc +2 -1
  539. data/src/core/lib/iomgr/executor.h +1 -1
  540. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  541. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  542. data/src/core/lib/iomgr/iomgr.cc +1 -1
  543. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  544. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  545. data/src/core/lib/iomgr/load_file.h +1 -1
  546. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  547. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  548. data/src/core/lib/iomgr/parse_address.cc +127 -43
  549. data/src/core/lib/iomgr/parse_address.h +32 -8
  550. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  551. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  552. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  553. data/src/core/lib/iomgr/python_util.h +4 -4
  554. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  555. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  556. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  557. data/src/core/lib/iomgr/sockaddr_utils.cc +11 -11
  558. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  559. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  560. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  561. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  562. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  563. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  564. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  565. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  566. data/src/core/lib/iomgr/tcp_posix.cc +16 -12
  567. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  568. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  569. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  570. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  571. data/src/core/lib/iomgr/udp_server.cc +1 -2
  572. data/src/core/lib/iomgr/udp_server.h +1 -2
  573. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  574. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  575. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  576. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  577. data/src/core/lib/json/json.h +12 -2
  578. data/src/core/lib/json/json_reader.cc +8 -4
  579. data/src/core/lib/json/json_util.cc +58 -0
  580. data/src/core/lib/json/json_util.h +204 -0
  581. data/src/core/lib/json/json_writer.cc +2 -1
  582. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  583. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  584. data/src/core/lib/security/authorization/matchers.cc +339 -0
  585. data/src/core/lib/security/authorization/matchers.h +158 -0
  586. data/src/core/lib/security/authorization/mock_cel/activation.h +1 -1
  587. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  588. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  589. data/src/core/lib/security/authorization/mock_cel/cel_value.h +13 -7
  590. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  591. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  592. data/src/core/lib/security/context/security_context.cc +4 -3
  593. data/src/core/lib/security/context/security_context.h +3 -1
  594. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  595. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  596. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  597. data/src/core/lib/security/credentials/credentials.cc +7 -7
  598. data/src/core/lib/security/credentials/credentials.h +5 -4
  599. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  600. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  601. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  602. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  603. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  604. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  605. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  606. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  607. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  608. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  609. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  610. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
  611. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  612. data/src/core/lib/security/credentials/jwt/json_token.cc +3 -3
  613. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  614. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -4
  615. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  616. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  617. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  618. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  619. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  620. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
  621. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  622. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  623. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  624. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  625. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  626. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  627. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  628. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
  629. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  630. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  631. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  632. data/src/core/lib/security/credentials/xds/xds_credentials.cc +244 -0
  633. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  634. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  635. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  636. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  637. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  638. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  639. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  640. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  641. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  642. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  643. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  644. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -2
  645. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  646. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +354 -279
  647. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  648. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  649. data/src/core/lib/security/transport/security_handshaker.cc +4 -6
  650. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  651. data/src/core/lib/security/util/json_util.h +1 -0
  652. data/src/core/lib/slice/slice.cc +7 -4
  653. data/src/core/lib/slice/slice_buffer.cc +2 -1
  654. data/src/core/lib/slice/slice_intern.cc +7 -8
  655. data/src/core/lib/slice/slice_internal.h +2 -2
  656. data/src/core/lib/surface/call.cc +41 -32
  657. data/src/core/lib/surface/call_details.cc +8 -8
  658. data/src/core/lib/surface/channel.cc +25 -41
  659. data/src/core/lib/surface/channel.h +9 -3
  660. data/src/core/lib/surface/channel_init.cc +1 -1
  661. data/src/core/lib/surface/completion_queue.cc +30 -24
  662. data/src/core/lib/surface/completion_queue.h +16 -16
  663. data/src/core/lib/surface/init.cc +45 -29
  664. data/src/core/lib/surface/lame_client.cc +20 -46
  665. data/src/core/lib/surface/lame_client.h +4 -0
  666. data/src/core/lib/surface/server.cc +66 -20
  667. data/src/core/lib/surface/server.h +42 -7
  668. data/src/core/lib/surface/validate_metadata.h +3 -0
  669. data/src/core/lib/surface/version.cc +2 -2
  670. data/src/core/lib/transport/authority_override.cc +6 -4
  671. data/src/core/lib/transport/authority_override.h +7 -2
  672. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  673. data/src/core/lib/transport/bdp_estimator.h +2 -1
  674. data/src/core/lib/transport/byte_stream.h +3 -3
  675. data/src/core/lib/transport/connectivity_state.h +11 -9
  676. data/src/core/lib/transport/error_utils.h +1 -1
  677. data/src/core/lib/transport/metadata.cc +16 -2
  678. data/src/core/lib/transport/metadata.h +2 -2
  679. data/src/core/lib/transport/metadata_batch.h +4 -4
  680. data/src/core/lib/transport/static_metadata.cc +1 -1
  681. data/src/core/lib/transport/status_metadata.cc +4 -3
  682. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  683. data/src/core/lib/transport/transport.cc +5 -3
  684. data/src/core/lib/transport/transport.h +8 -8
  685. data/src/core/lib/uri/uri_parser.cc +131 -249
  686. data/src/core/lib/uri/uri_parser.h +57 -21
  687. data/src/core/plugin_registry/grpc_plugin_registry.cc +47 -20
  688. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  689. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  690. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -21
  691. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -47
  692. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  693. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  694. data/src/core/tsi/fake_transport_security.cc +7 -4
  695. data/src/core/tsi/local_transport_security.cc +5 -1
  696. data/src/core/tsi/local_transport_security.h +6 -7
  697. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  698. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  699. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -2
  700. data/src/core/tsi/ssl_transport_security.cc +75 -58
  701. data/src/core/tsi/ssl_transport_security.h +6 -6
  702. data/src/core/tsi/transport_security.cc +10 -8
  703. data/src/core/tsi/transport_security_interface.h +1 -1
  704. data/src/ruby/ext/grpc/extconf.rb +1 -1
  705. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  706. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  707. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  708. data/src/ruby/lib/grpc/version.rb +1 -1
  709. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
  710. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  711. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  712. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  713. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  714. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  715. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  716. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  717. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  718. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  719. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  720. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  721. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  722. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  723. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  724. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  725. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  726. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  727. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  728. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  729. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  730. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  731. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  732. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  733. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  734. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  735. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  736. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  737. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  738. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  739. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  740. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  741. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  742. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  743. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  744. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  745. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  746. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  747. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  748. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  749. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  750. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  751. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  752. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  753. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  754. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  755. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  756. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  757. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  758. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  759. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  760. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  761. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  762. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  763. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  764. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  765. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  766. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  767. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  768. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  769. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  770. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  771. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  772. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  773. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  774. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  775. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  776. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  777. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  778. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  779. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  780. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  781. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  782. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  783. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  784. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  785. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  786. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  787. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  788. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  789. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  790. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  791. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  792. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  793. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  794. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  795. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  796. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  797. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  798. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  799. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  800. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  801. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  802. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  803. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  804. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  805. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  806. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  807. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  808. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  809. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  810. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  811. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  812. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  813. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  814. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +4 -3
  815. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  816. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  817. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  818. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  819. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  820. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  821. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  822. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  823. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  824. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  825. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  826. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  827. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  828. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  829. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  830. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  831. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  832. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  833. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  834. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  835. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  836. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  837. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  838. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  839. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  840. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  841. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  842. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  843. data/third_party/boringssl-with-bazel/err_data.c +728 -720
  844. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  845. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  846. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  847. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  848. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  849. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  850. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -20
  852. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  853. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  854. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  855. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  856. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  857. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  859. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  860. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  861. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  862. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  863. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  864. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  865. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  866. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  867. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  868. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  869. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  870. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  871. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  872. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  873. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  874. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  875. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  876. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  877. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  878. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  879. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  880. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  881. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  882. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  883. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  884. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  885. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  886. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  887. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +128 -38
  889. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  890. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  891. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  892. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +107 -54
  893. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +155 -2
  894. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +112 -36
  895. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +63 -9
  896. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  897. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  898. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  899. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  900. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  901. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  902. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  903. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  904. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  905. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  906. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  907. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  908. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  909. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  910. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  911. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +8 -3
  912. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +27 -21
  913. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  914. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  915. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +32 -11
  916. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  917. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  918. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +4 -4
  919. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  920. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +42 -25
  921. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  922. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  923. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +3 -4
  924. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  925. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  926. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +38 -3
  927. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  928. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  929. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  930. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  931. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
  932. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  933. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +32 -28
  934. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  935. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  938. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  939. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
  941. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  942. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -7
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  944. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  945. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +10 -8
  946. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -546
  947. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  948. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +15 -7
  949. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  950. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  951. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  952. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +21 -0
  953. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  954. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  955. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +62 -20
  956. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +10 -0
  957. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  958. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +16 -3
  959. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  960. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  961. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  962. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  963. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +106 -27
  964. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -8
  965. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  966. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +462 -163
  967. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +593 -440
  968. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  969. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  970. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +22 -21
  971. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +13 -23
  972. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +11 -6
  973. data/third_party/boringssl-with-bazel/src/ssl/internal.h +82 -26
  974. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  975. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +49 -9
  976. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  977. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +87 -14
  978. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +18 -22
  979. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  980. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  981. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +537 -34
  982. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  983. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +59 -21
  984. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  985. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +194 -58
  986. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  987. data/third_party/upb/upb/decode.c +248 -167
  988. data/third_party/upb/upb/decode.h +20 -1
  989. data/third_party/upb/upb/decode.int.h +163 -0
  990. data/third_party/upb/upb/decode_fast.c +1040 -0
  991. data/third_party/upb/upb/decode_fast.h +126 -0
  992. data/third_party/upb/upb/def.c +2178 -0
  993. data/third_party/upb/upb/def.h +315 -0
  994. data/third_party/upb/upb/def.hpp +439 -0
  995. data/third_party/upb/upb/encode.c +227 -169
  996. data/third_party/upb/upb/encode.h +27 -2
  997. data/third_party/upb/upb/json_decode.c +1443 -0
  998. data/third_party/upb/upb/json_decode.h +23 -0
  999. data/third_party/upb/upb/json_encode.c +713 -0
  1000. data/third_party/upb/upb/json_encode.h +36 -0
  1001. data/third_party/upb/upb/msg.c +167 -88
  1002. data/third_party/upb/upb/msg.h +174 -34
  1003. data/third_party/upb/upb/port_def.inc +74 -61
  1004. data/third_party/upb/upb/port_undef.inc +3 -7
  1005. data/third_party/upb/upb/reflection.c +408 -0
  1006. data/third_party/upb/upb/reflection.h +168 -0
  1007. data/third_party/upb/upb/table.c +34 -197
  1008. data/third_party/upb/upb/table.int.h +14 -5
  1009. data/third_party/upb/upb/text_encode.c +421 -0
  1010. data/third_party/upb/upb/text_encode.h +38 -0
  1011. data/third_party/upb/upb/upb.c +18 -41
  1012. data/third_party/upb/upb/upb.h +36 -7
  1013. data/third_party/upb/upb/upb.hpp +4 -4
  1014. data/third_party/upb/upb/upb.int.h +29 -0
  1015. metadata +309 -63
  1016. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  1017. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  1018. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  1019. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  1020. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  1021. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  1022. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  1023. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  1024. data/src/core/ext/xds/xds_channel.h +0 -46
  1025. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  1026. data/src/core/lib/gprpp/map.h +0 -53
  1027. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  1028. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  1029. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  1030. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  1031. data/third_party/upb/upb/port.c +0 -26
@@ -17,10 +17,13 @@
17
17
  #ifndef GRPC_CORE_EXT_XDS_XDS_CHANNEL_ARGS_H
18
18
  #define GRPC_CORE_EXT_XDS_XDS_CHANNEL_ARGS_H
19
19
 
20
- // Boolean channel arg indicating whether the target is an xds server.
21
- #define GRPC_ARG_ADDRESS_IS_XDS_SERVER "grpc.address_is_xds_server"
22
-
23
20
  // Pointer channel arg containing a ref to the XdsClient object.
24
21
  #define GRPC_ARG_XDS_CLIENT "grpc.xds_client"
25
22
 
23
+ // Timeout in milliseconds to wait for a resource to be returned from
24
+ // the xds server before assuming that it does not exist.
25
+ // The default is 15 seconds.
26
+ #define GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS \
27
+ "grpc.xds_resource_does_not_exist_timeout_ms"
28
+
26
29
  #endif /* GRPC_CORE_EXT_XDS_XDS_CHANNEL_ARGS_H */
@@ -35,7 +35,6 @@
35
35
  #include "src/core/ext/filters/client_channel/client_channel.h"
36
36
  #include "src/core/ext/filters/client_channel/service_config.h"
37
37
  #include "src/core/ext/xds/xds_api.h"
38
- #include "src/core/ext/xds/xds_channel.h"
39
38
  #include "src/core/ext/xds/xds_channel_args.h"
40
39
  #include "src/core/ext/xds/xds_client.h"
41
40
  #include "src/core/ext/xds/xds_client_stats.h"
@@ -43,7 +42,6 @@
43
42
  #include "src/core/lib/channel/channel_args.h"
44
43
  #include "src/core/lib/channel/channel_stack.h"
45
44
  #include "src/core/lib/gpr/string.h"
46
- #include "src/core/lib/gprpp/map.h"
47
45
  #include "src/core/lib/gprpp/memory.h"
48
46
  #include "src/core/lib/gprpp/orphanable.h"
49
47
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -51,7 +49,6 @@
51
49
  #include "src/core/lib/iomgr/sockaddr.h"
52
50
  #include "src/core/lib/iomgr/sockaddr_utils.h"
53
51
  #include "src/core/lib/iomgr/timer.h"
54
- #include "src/core/lib/iomgr/work_serializer.h"
55
52
  #include "src/core/lib/slice/slice_internal.h"
56
53
  #include "src/core/lib/slice/slice_string_helpers.h"
57
54
  #include "src/core/lib/surface/call.h"
@@ -68,6 +65,16 @@
68
65
  namespace grpc_core {
69
66
 
70
67
  TraceFlag grpc_xds_client_trace(false, "xds_client");
68
+ TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
69
+
70
+ namespace {
71
+
72
+ Mutex* g_mu = nullptr;
73
+ const grpc_channel_args* g_channel_args = nullptr;
74
+ XdsClient* g_xds_client = nullptr;
75
+ char* g_fallback_bootstrap_config = nullptr;
76
+
77
+ } // namespace
71
78
 
72
79
  //
73
80
  // Internal class declarations
@@ -135,22 +142,25 @@ class XdsClient::ChannelState::AdsCallState
135
142
  private:
136
143
  class ResourceState : public InternallyRefCounted<ResourceState> {
137
144
  public:
138
- ResourceState(const std::string& type_url, const std::string& name)
139
- : type_url_(type_url), name_(name) {
145
+ ResourceState(const std::string& type_url, const std::string& name,
146
+ bool sent_initial_request)
147
+ : type_url_(type_url),
148
+ name_(name),
149
+ sent_initial_request_(sent_initial_request) {
140
150
  GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
141
151
  grpc_schedule_on_exec_ctx);
142
152
  }
143
153
 
144
154
  void Orphan() override {
145
155
  Finish();
146
- Unref();
156
+ Unref(DEBUG_LOCATION, "Orphan");
147
157
  }
148
158
 
149
159
  void Start(RefCountedPtr<AdsCallState> ads_calld) {
150
- if (sent_) return;
151
- sent_ = true;
160
+ if (sent_initial_request_) return;
161
+ sent_initial_request_ = true;
152
162
  ads_calld_ = std::move(ads_calld);
153
- Ref().release();
163
+ Ref(DEBUG_LOCATION, "timer").release();
154
164
  timer_pending_ = true;
155
165
  grpc_timer_init(
156
166
  &timer_,
@@ -168,9 +178,12 @@ class XdsClient::ChannelState::AdsCallState
168
178
  private:
169
179
  static void OnTimer(void* arg, grpc_error* error) {
170
180
  ResourceState* self = static_cast<ResourceState*>(arg);
171
- GRPC_ERROR_REF(error); // ref owned by lambda
172
- self->ads_calld_->xds_client()->work_serializer_->Run(
173
- [self, error]() { self->OnTimerLocked(error); }, DEBUG_LOCATION);
181
+ {
182
+ MutexLock lock(&self->ads_calld_->xds_client()->mu_);
183
+ self->OnTimerLocked(GRPC_ERROR_REF(error));
184
+ }
185
+ self->ads_calld_.reset();
186
+ self->Unref(DEBUG_LOCATION, "timer");
174
187
  }
175
188
 
176
189
  void OnTimerLocked(grpc_error* error) {
@@ -185,27 +198,32 @@ class XdsClient::ChannelState::AdsCallState
185
198
  gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
186
199
  grpc_error_string(watcher_error));
187
200
  }
188
- if (type_url_ == XdsApi::kLdsTypeUrl ||
189
- type_url_ == XdsApi::kRdsTypeUrl) {
190
- ads_calld_->xds_client()->listener_watcher_->OnError(watcher_error);
201
+ if (type_url_ == XdsApi::kLdsTypeUrl) {
202
+ ListenerState& state = ads_calld_->xds_client()->listener_map_[name_];
203
+ for (const auto& p : state.watchers) {
204
+ p.first->OnError(GRPC_ERROR_REF(watcher_error));
205
+ }
206
+ } else if (type_url_ == XdsApi::kRdsTypeUrl) {
207
+ RouteConfigState& state =
208
+ ads_calld_->xds_client()->route_config_map_[name_];
209
+ for (const auto& p : state.watchers) {
210
+ p.first->OnError(GRPC_ERROR_REF(watcher_error));
211
+ }
191
212
  } else if (type_url_ == XdsApi::kCdsTypeUrl) {
192
213
  ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_];
193
214
  for (const auto& p : state.watchers) {
194
215
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
195
216
  }
196
- GRPC_ERROR_UNREF(watcher_error);
197
217
  } else if (type_url_ == XdsApi::kEdsTypeUrl) {
198
218
  EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_];
199
219
  for (const auto& p : state.watchers) {
200
220
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
201
221
  }
202
- GRPC_ERROR_UNREF(watcher_error);
203
222
  } else {
204
223
  GPR_UNREACHABLE_CODE(return );
205
224
  }
225
+ GRPC_ERROR_UNREF(watcher_error);
206
226
  }
207
- ads_calld_.reset();
208
- Unref();
209
227
  GRPC_ERROR_UNREF(error);
210
228
  }
211
229
 
@@ -213,7 +231,7 @@ class XdsClient::ChannelState::AdsCallState
213
231
  const std::string name_;
214
232
 
215
233
  RefCountedPtr<AdsCallState> ads_calld_;
216
- bool sent_ = false;
234
+ bool sent_initial_request_;
217
235
  bool timer_pending_ = false;
218
236
  grpc_timer timer_;
219
237
  grpc_closure timer_callback_;
@@ -222,8 +240,7 @@ class XdsClient::ChannelState::AdsCallState
222
240
  struct ResourceTypeState {
223
241
  ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
224
242
 
225
- // Version, nonce, and error for this resource type.
226
- std::string version;
243
+ // Nonce and error for this resource type.
227
244
  std::string nonce;
228
245
  grpc_error* error = GRPC_ERROR_NONE;
229
246
 
@@ -234,15 +251,15 @@ class XdsClient::ChannelState::AdsCallState
234
251
 
235
252
  void SendMessageLocked(const std::string& type_url);
236
253
 
237
- void AcceptLdsUpdate(absl::optional<XdsApi::LdsUpdate> lds_update);
238
- void AcceptRdsUpdate(absl::optional<XdsApi::RdsUpdate> rds_update);
254
+ void AcceptLdsUpdate(XdsApi::LdsUpdateMap lds_update_map);
255
+ void AcceptRdsUpdate(XdsApi::RdsUpdateMap rds_update_map);
239
256
  void AcceptCdsUpdate(XdsApi::CdsUpdateMap cds_update_map);
240
257
  void AcceptEdsUpdate(XdsApi::EdsUpdateMap eds_update_map);
241
258
 
242
259
  static void OnRequestSent(void* arg, grpc_error* error);
243
260
  void OnRequestSentLocked(grpc_error* error);
244
261
  static void OnResponseReceived(void* arg, grpc_error* error);
245
- void OnResponseReceivedLocked();
262
+ bool OnResponseReceivedLocked();
246
263
  static void OnStatusReceived(void* arg, grpc_error* error);
247
264
  void OnStatusReceivedLocked(grpc_error* error);
248
265
 
@@ -319,10 +336,10 @@ class XdsClient::ChannelState::LrsCallState
319
336
  private:
320
337
  void ScheduleNextReportLocked();
321
338
  static void OnNextReportTimer(void* arg, grpc_error* error);
322
- void OnNextReportTimerLocked(grpc_error* error);
323
- void SendReportLocked();
339
+ bool OnNextReportTimerLocked(grpc_error* error);
340
+ bool SendReportLocked();
324
341
  static void OnReportDone(void* arg, grpc_error* error);
325
- void OnReportDoneLocked(grpc_error* error);
342
+ bool OnReportDoneLocked(grpc_error* error);
326
343
 
327
344
  bool IsCurrentReporterOnCall() const {
328
345
  return this == parent_->reporter_.get();
@@ -344,7 +361,7 @@ class XdsClient::ChannelState::LrsCallState
344
361
  static void OnInitialRequestSent(void* arg, grpc_error* error);
345
362
  void OnInitialRequestSentLocked();
346
363
  static void OnResponseReceived(void* arg, grpc_error* error);
347
- void OnResponseReceivedLocked();
364
+ bool OnResponseReceivedLocked();
348
365
  static void OnStatusReceived(void* arg, grpc_error* error);
349
366
  void OnStatusReceivedLocked(grpc_error* error);
350
367
 
@@ -389,13 +406,12 @@ class XdsClient::ChannelState::StateWatcher
389
406
  : public AsyncConnectivityStateWatcherInterface {
390
407
  public:
391
408
  explicit StateWatcher(RefCountedPtr<ChannelState> parent)
392
- : AsyncConnectivityStateWatcherInterface(
393
- parent->xds_client()->work_serializer_),
394
- parent_(std::move(parent)) {}
409
+ : parent_(std::move(parent)) {}
395
410
 
396
411
  private:
397
412
  void OnConnectivityStateChange(grpc_connectivity_state new_state,
398
413
  const absl::Status& status) override {
414
+ MutexLock lock(&parent_->xds_client_->mu_);
399
415
  if (!parent_->shutting_down_ &&
400
416
  new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
401
417
  // In TRANSIENT_FAILURE. Notify all watchers of error.
@@ -403,8 +419,9 @@ class XdsClient::ChannelState::StateWatcher
403
419
  "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
404
420
  "status_message:(%s)",
405
421
  parent_->xds_client(), status.ToString().c_str());
406
- parent_->xds_client()->NotifyOnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
407
- "xds channel in TRANSIENT_FAILURE"));
422
+ parent_->xds_client()->NotifyOnErrorLocked(
423
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
424
+ "xds channel in TRANSIENT_FAILURE"));
408
425
  }
409
426
  }
410
427
 
@@ -417,69 +434,43 @@ class XdsClient::ChannelState::StateWatcher
417
434
 
418
435
  namespace {
419
436
 
420
- // Returns the channel args for the xds channel.
421
- grpc_channel_args* BuildXdsChannelArgs(const grpc_channel_args& args) {
422
- static const char* args_to_remove[] = {
423
- // LB policy name, since we want to use the default (pick_first) in
424
- // the LB channel.
425
- GRPC_ARG_LB_POLICY_NAME,
426
- // The service config that contains the LB config. We don't want to
427
- // recursively use xds in the LB channel.
428
- GRPC_ARG_SERVICE_CONFIG,
429
- // The channel arg for the server URI, since that will be different for
430
- // the xds channel than for the parent channel. The client channel
431
- // factory will re-add this arg with the right value.
432
- GRPC_ARG_SERVER_URI,
433
- // The xds channel should use the authority indicated by the target
434
- // authority table (see \a ModifyXdsChannelArgs),
435
- // as opposed to the authority from the parent channel.
436
- GRPC_ARG_DEFAULT_AUTHORITY,
437
- // Just as for \a GRPC_ARG_DEFAULT_AUTHORITY, the xds channel should be
438
- // treated as a stand-alone channel and not inherit this argument from the
439
- // args of the parent channel.
440
- GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
441
- // Don't want to pass down channelz node from parent; the balancer
442
- // channel will get its own.
443
- GRPC_ARG_CHANNELZ_CHANNEL_NODE,
444
- // Keepalive interval. We are explicitly setting our own value below.
445
- GRPC_ARG_KEEPALIVE_TIME_MS,
437
+ grpc_channel* CreateXdsChannel(const XdsBootstrap::XdsServer& server) {
438
+ // Build channel args.
439
+ absl::InlinedVector<grpc_arg, 2> args_to_add = {
440
+ grpc_channel_arg_integer_create(
441
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
442
+ 5 * 60 * GPR_MS_PER_SEC),
443
+ grpc_channel_arg_integer_create(
444
+ const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
446
445
  };
447
- // Channel args to add.
448
- absl::InlinedVector<grpc_arg, 3> args_to_add;
449
- // Keepalive interval.
450
- args_to_add.emplace_back(grpc_channel_arg_integer_create(
451
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 5000));
452
- // A channel arg indicating that the target is an xds server.
453
- // TODO(roth): Once we figure out our fallback and credentials story, decide
454
- // whether this is actually needed. Note that it's currently used by the
455
- // fake security connector as well.
456
- args_to_add.emplace_back(grpc_channel_arg_integer_create(
457
- const_cast<char*>(GRPC_ARG_ADDRESS_IS_XDS_SERVER), 1));
458
- // The parent channel's channelz uuid.
459
- channelz::ChannelNode* channelz_node = nullptr;
460
- const grpc_arg* arg =
461
- grpc_channel_args_find(&args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
462
- if (arg != nullptr && arg->type == GRPC_ARG_POINTER &&
463
- arg->value.pointer.p != nullptr) {
464
- channelz_node = static_cast<channelz::ChannelNode*>(arg->value.pointer.p);
465
- args_to_add.emplace_back(
466
- channelz::MakeParentUuidArg(channelz_node->uuid()));
467
- }
468
- // Construct channel args.
469
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
470
- &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add.data(),
471
- args_to_add.size());
472
- // Make any necessary modifications for security.
473
- return ModifyXdsChannelArgs(new_args);
446
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
447
+ g_channel_args, args_to_add.data(), args_to_add.size());
448
+ // Create channel creds.
449
+ RefCountedPtr<grpc_channel_credentials> channel_creds =
450
+ XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
451
+ server.channel_creds_config);
452
+ // Create channel.
453
+ grpc_channel* channel = grpc_secure_channel_create(
454
+ channel_creds.get(), server.server_uri.c_str(), new_args, nullptr);
455
+ grpc_channel_args_destroy(new_args);
456
+ return channel;
474
457
  }
475
458
 
476
459
  } // namespace
477
460
 
478
- XdsClient::ChannelState::ChannelState(RefCountedPtr<XdsClient> xds_client,
479
- grpc_channel* channel)
480
- : InternallyRefCounted<ChannelState>(&grpc_xds_client_trace),
461
+ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
462
+ const XdsBootstrap::XdsServer& server)
463
+ : InternallyRefCounted<ChannelState>(
464
+ GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace)
465
+ ? "ChannelState"
466
+ : nullptr),
481
467
  xds_client_(std::move(xds_client)),
482
- channel_(channel) {
468
+ server_(server) {
469
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
470
+ gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
471
+ xds_client_.get(), server.server_uri.c_str());
472
+ }
473
+ channel_ = CreateXdsChannel(server);
483
474
  GPR_ASSERT(channel_ != nullptr);
484
475
  StartConnectivityWatchLocked();
485
476
  }
@@ -490,6 +481,7 @@ XdsClient::ChannelState::~ChannelState() {
490
481
  this);
491
482
  }
492
483
  grpc_channel_destroy(channel_);
484
+ xds_client_.reset(DEBUG_LOCATION, "ChannelState");
493
485
  }
494
486
 
495
487
  void XdsClient::ChannelState::Orphan() {
@@ -526,7 +518,7 @@ void XdsClient::ChannelState::StartConnectivityWatchLocked() {
526
518
  grpc_channel_element* client_channel_elem =
527
519
  grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel_));
528
520
  GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
529
- watcher_ = new StateWatcher(Ref());
521
+ watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "ChannelState+watch"));
530
522
  grpc_client_channel_start_connectivity_watch(
531
523
  client_channel_elem, GRPC_CHANNEL_IDLE,
532
524
  OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
@@ -561,8 +553,11 @@ void XdsClient::ChannelState::Unsubscribe(const std::string& type_url,
561
553
  const std::string& name,
562
554
  bool delay_unsubscription) {
563
555
  if (ads_calld_ != nullptr) {
564
- ads_calld_->calld()->Unsubscribe(type_url, name, delay_unsubscription);
565
- if (!ads_calld_->calld()->HasSubscribedResources()) ads_calld_.reset();
556
+ auto* calld = ads_calld_->calld();
557
+ if (calld != nullptr) {
558
+ calld->Unsubscribe(type_url, name, delay_unsubscription);
559
+ if (!calld->HasSubscribedResources()) ads_calld_.reset();
560
+ }
566
561
  }
567
562
  }
568
563
 
@@ -645,9 +640,11 @@ template <typename T>
645
640
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
646
641
  void* arg, grpc_error* error) {
647
642
  RetryableCall* calld = static_cast<RetryableCall*>(arg);
648
- GRPC_ERROR_REF(error); // ref owned by lambda
649
- calld->chand_->xds_client()->work_serializer_->Run(
650
- [calld, error]() { calld->OnRetryTimerLocked(error); }, DEBUG_LOCATION);
643
+ {
644
+ MutexLock lock(&calld->chand_->xds_client()->mu_);
645
+ calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
646
+ }
647
+ calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
651
648
  }
652
649
 
653
650
  template <typename T>
@@ -663,7 +660,6 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
663
660
  }
664
661
  StartNewCallLocked();
665
662
  }
666
- this->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
667
663
  GRPC_ERROR_UNREF(error);
668
664
  }
669
665
 
@@ -673,16 +669,18 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
673
669
 
674
670
  XdsClient::ChannelState::AdsCallState::AdsCallState(
675
671
  RefCountedPtr<RetryableCall<AdsCallState>> parent)
676
- : InternallyRefCounted<AdsCallState>(&grpc_xds_client_trace),
672
+ : InternallyRefCounted<AdsCallState>(
673
+ GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace)
674
+ ? "AdsCallState"
675
+ : nullptr),
677
676
  parent_(std::move(parent)) {
678
677
  // Init the ADS call. Note that the call will progress every time there's
679
678
  // activity in xds_client()->interested_parties_, which is comprised of
680
679
  // the polling entities from client_channel.
681
680
  GPR_ASSERT(xds_client() != nullptr);
682
- GPR_ASSERT(!xds_client()->server_name_.empty());
683
681
  // Create a call with the specified method name.
684
682
  const auto& method =
685
- xds_client()->bootstrap_->server().ShouldUseV3()
683
+ chand()->server_.ShouldUseV3()
686
684
  ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES
687
685
  : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES;
688
686
  call_ = grpc_channel_create_pollset_set_call(
@@ -712,19 +710,17 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
712
710
  GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
713
711
  op->reserved = nullptr;
714
712
  op++;
715
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
716
- nullptr);
713
+ call_error = grpc_call_start_batch_and_execute(
714
+ call_, ops, static_cast<size_t>(op - ops), nullptr);
717
715
  GPR_ASSERT(GRPC_CALL_OK == call_error);
718
716
  // Op: send request message.
719
717
  GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
720
718
  grpc_schedule_on_exec_ctx);
721
- if (xds_client()->listener_watcher_ != nullptr) {
722
- Subscribe(XdsApi::kLdsTypeUrl, xds_client()->server_name_);
723
- if (xds_client()->lds_result_.has_value() &&
724
- !xds_client()->lds_result_->route_config_name.empty()) {
725
- Subscribe(XdsApi::kRdsTypeUrl,
726
- xds_client()->lds_result_->route_config_name);
727
- }
719
+ for (const auto& p : xds_client()->listener_map_) {
720
+ Subscribe(XdsApi::kLdsTypeUrl, std::string(p.first));
721
+ }
722
+ for (const auto& p : xds_client()->route_config_map_) {
723
+ Subscribe(XdsApi::kRdsTypeUrl, std::string(p.first));
728
724
  }
729
725
  for (const auto& p : xds_client()->cluster_map_) {
730
726
  Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first));
@@ -749,8 +745,8 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
749
745
  Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
750
746
  GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
751
747
  grpc_schedule_on_exec_ctx);
752
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
753
- &on_response_received_);
748
+ call_error = grpc_call_start_batch_and_execute(
749
+ call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
754
750
  GPR_ASSERT(GRPC_CALL_OK == call_error);
755
751
  // Op: recv server status.
756
752
  op = ops;
@@ -766,8 +762,8 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
766
762
  // unreffed.
767
763
  GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
768
764
  grpc_schedule_on_exec_ctx);
769
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
770
- &on_status_received_);
765
+ call_error = grpc_call_start_batch_and_execute(
766
+ call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
771
767
  GPR_ASSERT(GRPC_CALL_OK == call_error);
772
768
  }
773
769
 
@@ -805,7 +801,8 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
805
801
  std::set<absl::string_view> resource_names =
806
802
  ResourceNamesForRequest(type_url);
807
803
  request_payload_slice = xds_client()->api_.CreateAdsRequest(
808
- type_url, resource_names, state.version, state.nonce,
804
+ chand()->server_, type_url, resource_names,
805
+ xds_client()->resource_version_map_[type_url], state.nonce,
809
806
  GRPC_ERROR_REF(state.error), !sent_initial_message_);
810
807
  if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
811
808
  type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
@@ -816,7 +813,8 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
816
813
  gpr_log(GPR_INFO,
817
814
  "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
818
815
  "error=%s resources=%s",
819
- xds_client(), type_url.c_str(), state.version.c_str(),
816
+ xds_client(), type_url.c_str(),
817
+ xds_client()->resource_version_map_[type_url].c_str(),
820
818
  state.nonce.c_str(), grpc_error_string(state.error),
821
819
  absl::StrJoin(resource_names, " ").c_str());
822
820
  }
@@ -848,7 +846,8 @@ void XdsClient::ChannelState::AdsCallState::Subscribe(
848
846
  const std::string& type_url, const std::string& name) {
849
847
  auto& state = state_map_[type_url].subscribed_resources[name];
850
848
  if (state == nullptr) {
851
- state = MakeOrphanable<ResourceState>(type_url, name);
849
+ state = MakeOrphanable<ResourceState>(
850
+ type_url, name, !xds_client()->resource_version_map_[type_url].empty());
852
851
  SendMessageLocked(type_url);
853
852
  }
854
853
  }
@@ -868,118 +867,132 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
868
867
  }
869
868
 
870
869
  void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
871
- absl::optional<XdsApi::LdsUpdate> lds_update) {
872
- if (!lds_update.has_value()) {
873
- gpr_log(GPR_INFO,
874
- "[xds_client %p] LDS update does not include requested resource",
875
- xds_client());
876
- if (xds_client()->lds_result_.has_value() &&
877
- !xds_client()->lds_result_->route_config_name.empty()) {
878
- Unsubscribe(XdsApi::kRdsTypeUrl,
879
- xds_client()->lds_result_->route_config_name,
880
- /*delay_unsubscription=*/false);
881
- xds_client()->rds_result_.reset();
882
- }
883
- xds_client()->lds_result_.reset();
884
- xds_client()->listener_watcher_->OnResourceDoesNotExist();
885
- return;
886
- }
870
+ XdsApi::LdsUpdateMap lds_update_map) {
887
871
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
888
872
  gpr_log(GPR_INFO,
889
- "[xds_client %p] LDS update received: route_config_name=%s",
890
- xds_client(),
891
- (!lds_update->route_config_name.empty()
892
- ? lds_update->route_config_name.c_str()
893
- : "<inlined>"));
894
- if (lds_update->rds_update.has_value()) {
895
- gpr_log(GPR_INFO, "RouteConfiguration: %s",
896
- lds_update->rds_update->ToString().c_str());
897
- }
873
+ "[xds_client %p] LDS update received containing %" PRIuPTR
874
+ " resources",
875
+ xds_client(), lds_update_map.size());
898
876
  }
899
877
  auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
900
- auto& state = lds_state.subscribed_resources[xds_client()->server_name_];
901
- if (state != nullptr) state->Finish();
902
- // Ignore identical update.
903
- if (xds_client()->lds_result_ == lds_update) {
878
+ std::set<std::string> rds_resource_names_seen;
879
+ for (auto& p : lds_update_map) {
880
+ const std::string& listener_name = p.first;
881
+ XdsApi::LdsUpdate& lds_update = p.second;
882
+ auto& state = lds_state.subscribed_resources[listener_name];
883
+ if (state != nullptr) state->Finish();
904
884
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
905
- gpr_log(GPR_INFO,
906
- "[xds_client %p] LDS update identical to current, ignoring.",
907
- xds_client());
885
+ gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
886
+ listener_name.c_str(), lds_update.ToString().c_str());
887
+ }
888
+ // Record the RDS resource names seen.
889
+ if (!lds_update.route_config_name.empty()) {
890
+ rds_resource_names_seen.insert(lds_update.route_config_name);
891
+ }
892
+ // Ignore identical update.
893
+ ListenerState& listener_state = xds_client()->listener_map_[listener_name];
894
+ if (listener_state.update.has_value() &&
895
+ *listener_state.update == lds_update) {
896
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
897
+ gpr_log(GPR_INFO,
898
+ "[xds_client %p] LDS update for %s identical to current, "
899
+ "ignoring.",
900
+ xds_client(), listener_name.c_str());
901
+ }
902
+ continue;
903
+ }
904
+ // Update the listener state.
905
+ listener_state.update = std::move(lds_update);
906
+ // Notify watchers.
907
+ for (const auto& p : listener_state.watchers) {
908
+ p.first->OnListenerChanged(*listener_state.update);
908
909
  }
909
- return;
910
910
  }
911
- if (xds_client()->lds_result_.has_value() &&
912
- !xds_client()->lds_result_->route_config_name.empty()) {
913
- Unsubscribe(
914
- XdsApi::kRdsTypeUrl, xds_client()->lds_result_->route_config_name,
915
- /*delay_unsubscription=*/!lds_update->route_config_name.empty());
916
- xds_client()->rds_result_.reset();
917
- }
918
- xds_client()->lds_result_ = std::move(lds_update);
919
- if (xds_client()->lds_result_->rds_update.has_value()) {
920
- // If the RouteConfiguration was found inlined in LDS response, notify
921
- // the watcher immediately.
922
- const XdsApi::RdsUpdate::VirtualHost* vhost =
923
- xds_client()->lds_result_->rds_update->FindVirtualHostForDomain(
924
- xds_client()->server_name_);
925
- if (vhost == nullptr) {
926
- xds_client()->listener_watcher_->OnError(
927
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
928
- "no VirtualHost found for domain"));
929
- } else {
930
- xds_client()->listener_watcher_->OnListenerChanged(vhost->routes);
911
+ // For any subscribed resource that is not present in the update,
912
+ // remove it from the cache and notify watchers that it does not exist.
913
+ for (const auto& p : lds_state.subscribed_resources) {
914
+ const std::string& listener_name = p.first;
915
+ if (lds_update_map.find(listener_name) == lds_update_map.end()) {
916
+ ListenerState& listener_state =
917
+ xds_client()->listener_map_[listener_name];
918
+ // If the resource was newly requested but has not yet been received,
919
+ // we don't want to generate an error for the watchers, because this LDS
920
+ // response may be in reaction to an earlier request that did not yet
921
+ // request the new resource, so its absence from the response does not
922
+ // necessarily indicate that the resource does not exist.
923
+ // For that case, we rely on the request timeout instead.
924
+ if (!listener_state.update.has_value()) continue;
925
+ listener_state.update.reset();
926
+ for (const auto& p : listener_state.watchers) {
927
+ p.first->OnResourceDoesNotExist();
928
+ }
929
+ }
930
+ }
931
+ // For any RDS resource that is no longer referred to by any LDS
932
+ // resources, remove it from the cache and notify watchers that it
933
+ // does not exist.
934
+ auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
935
+ for (const auto& p : rds_state.subscribed_resources) {
936
+ const std::string& rds_resource_name = p.first;
937
+ if (rds_resource_names_seen.find(rds_resource_name) ==
938
+ rds_resource_names_seen.end()) {
939
+ RouteConfigState& route_config_state =
940
+ xds_client()->route_config_map_[rds_resource_name];
941
+ route_config_state.update.reset();
942
+ for (const auto& p : route_config_state.watchers) {
943
+ p.first->OnResourceDoesNotExist();
944
+ }
931
945
  }
932
- } else {
933
- // Send RDS request for dynamic resolution.
934
- Subscribe(XdsApi::kRdsTypeUrl,
935
- xds_client()->lds_result_->route_config_name);
936
946
  }
937
947
  }
938
948
 
939
949
  void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
940
- absl::optional<XdsApi::RdsUpdate> rds_update) {
941
- if (!rds_update.has_value()) {
942
- gpr_log(GPR_INFO,
943
- "[xds_client %p] RDS update does not include requested resource",
944
- xds_client());
945
- xds_client()->rds_result_.reset();
946
- xds_client()->listener_watcher_->OnResourceDoesNotExist();
947
- return;
948
- }
950
+ XdsApi::RdsUpdateMap rds_update_map) {
949
951
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
950
- gpr_log(GPR_INFO, "[xds_client %p] RDS update received:\n%s", xds_client(),
951
- rds_update->ToString().c_str());
952
+ gpr_log(GPR_INFO,
953
+ "[xds_client %p] RDS update received containing %" PRIuPTR
954
+ " resources",
955
+ xds_client(), rds_update_map.size());
952
956
  }
953
957
  auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
954
- auto& state =
955
- rds_state
956
- .subscribed_resources[xds_client()->lds_result_->route_config_name];
957
- if (state != nullptr) state->Finish();
958
- // Ignore identical update.
959
- if (xds_client()->rds_result_ == rds_update) {
958
+ for (auto& p : rds_update_map) {
959
+ const std::string& route_config_name = p.first;
960
+ XdsApi::RdsUpdate& rds_update = p.second;
961
+ auto& state = rds_state.subscribed_resources[route_config_name];
962
+ if (state != nullptr) state->Finish();
960
963
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
961
- gpr_log(GPR_INFO,
962
- "[xds_client %p] RDS update identical to current, ignoring.",
963
- xds_client());
964
+ gpr_log(GPR_INFO, "[xds_client %p] RDS resource:\n%s", xds_client(),
965
+ rds_update.ToString().c_str());
966
+ }
967
+ RouteConfigState& route_config_state =
968
+ xds_client()->route_config_map_[route_config_name];
969
+ // Ignore identical update.
970
+ if (route_config_state.update.has_value() &&
971
+ *route_config_state.update == rds_update) {
972
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
973
+ gpr_log(GPR_INFO,
974
+ "[xds_client %p] RDS resource identical to current, ignoring",
975
+ xds_client());
976
+ }
977
+ continue;
978
+ }
979
+ // Update the cache.
980
+ route_config_state.update = std::move(rds_update);
981
+ // Notify all watchers.
982
+ for (const auto& p : route_config_state.watchers) {
983
+ p.first->OnRouteConfigChanged(*route_config_state.update);
964
984
  }
965
- return;
966
- }
967
- xds_client()->rds_result_ = std::move(rds_update);
968
- // Notify the watcher.
969
- const XdsApi::RdsUpdate::VirtualHost* vhost =
970
- xds_client()->rds_result_->FindVirtualHostForDomain(
971
- xds_client()->server_name_);
972
- if (vhost == nullptr) {
973
- xds_client()->listener_watcher_->OnError(
974
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
975
- "no VirtualHost found for domain"));
976
- } else {
977
- xds_client()->listener_watcher_->OnListenerChanged(vhost->routes);
978
985
  }
979
986
  }
980
987
 
981
988
  void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
982
989
  XdsApi::CdsUpdateMap cds_update_map) {
990
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
991
+ gpr_log(GPR_INFO,
992
+ "[xds_client %p] CDS update received containing %" PRIuPTR
993
+ " resources",
994
+ xds_client(), cds_update_map.size());
995
+ }
983
996
  auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
984
997
  std::set<std::string> eds_resource_names_seen;
985
998
  for (auto& p : cds_update_map) {
@@ -988,13 +1001,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
988
1001
  auto& state = cds_state.subscribed_resources[cluster_name];
989
1002
  if (state != nullptr) state->Finish();
990
1003
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
991
- gpr_log(GPR_INFO,
992
- "[xds_client %p] CDS update (cluster=%s) received: "
993
- "eds_service_name=%s, lrs_load_reporting_server_name=%s",
994
- xds_client(), cluster_name, cds_update.eds_service_name.c_str(),
995
- cds_update.lrs_load_reporting_server_name.has_value()
996
- ? cds_update.lrs_load_reporting_server_name.value().c_str()
997
- : "(N/A)");
1004
+ gpr_log(GPR_INFO, "[xds_client %p] cluster=%s: %s", xds_client(),
1005
+ cluster_name, cds_update.ToString().c_str());
998
1006
  }
999
1007
  // Record the EDS resource names seen.
1000
1008
  eds_resource_names_seen.insert(cds_update.eds_service_name.empty()
@@ -1003,9 +1011,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1003
1011
  // Ignore identical update.
1004
1012
  ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name];
1005
1013
  if (cluster_state.update.has_value() &&
1006
- cds_update.eds_service_name == cluster_state.update->eds_service_name &&
1007
- cds_update.lrs_load_reporting_server_name ==
1008
- cluster_state.update->lrs_load_reporting_server_name) {
1014
+ *cluster_state.update == cds_update) {
1009
1015
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1010
1016
  gpr_log(GPR_INFO,
1011
1017
  "[xds_client %p] CDS update identical to current, ignoring.",
@@ -1059,6 +1065,12 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1059
1065
 
1060
1066
  void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1061
1067
  XdsApi::EdsUpdateMap eds_update_map) {
1068
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1069
+ gpr_log(GPR_INFO,
1070
+ "[xds_client %p] EDS update received containing %" PRIuPTR
1071
+ " resources",
1072
+ xds_client(), eds_update_map.size());
1073
+ }
1062
1074
  auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1063
1075
  for (auto& p : eds_update_map) {
1064
1076
  const char* eds_service_name = p.first.c_str();
@@ -1066,71 +1078,20 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1066
1078
  auto& state = eds_state.subscribed_resources[eds_service_name];
1067
1079
  if (state != nullptr) state->Finish();
1068
1080
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1069
- gpr_log(GPR_INFO,
1070
- "[xds_client %p] EDS response with %" PRIuPTR
1071
- " priorities and %" PRIuPTR
1072
- " drop categories received (drop_all=%d)",
1073
- xds_client(), eds_update.priority_list_update.size(),
1074
- eds_update.drop_config->drop_category_list().size(),
1075
- eds_update.drop_config->drop_all());
1076
- for (size_t priority = 0;
1077
- priority < eds_update.priority_list_update.size(); ++priority) {
1078
- const auto* locality_map_update = eds_update.priority_list_update.Find(
1079
- static_cast<uint32_t>(priority));
1080
- gpr_log(GPR_INFO,
1081
- "[xds_client %p] Priority %" PRIuPTR " contains %" PRIuPTR
1082
- " localities",
1083
- xds_client(), priority, locality_map_update->size());
1084
- size_t locality_count = 0;
1085
- for (const auto& p : locality_map_update->localities) {
1086
- const auto& locality = p.second;
1087
- gpr_log(GPR_INFO,
1088
- "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR
1089
- " %s has weight %d, contains %" PRIuPTR " server addresses",
1090
- xds_client(), priority, locality_count,
1091
- locality.name->AsHumanReadableString().c_str(),
1092
- locality.lb_weight, locality.serverlist.size());
1093
- for (size_t i = 0; i < locality.serverlist.size(); ++i) {
1094
- std::string ipport = grpc_sockaddr_to_string(
1095
- &locality.serverlist[i].address(), false);
1096
- gpr_log(GPR_INFO,
1097
- "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR
1098
- " %s, server address %" PRIuPTR ": %s",
1099
- xds_client(), priority, locality_count,
1100
- locality.name->AsHumanReadableString().c_str(), i,
1101
- ipport.c_str());
1102
- }
1103
- ++locality_count;
1104
- }
1105
- }
1106
- for (size_t i = 0;
1107
- i < eds_update.drop_config->drop_category_list().size(); ++i) {
1108
- const XdsApi::DropConfig::DropCategory& drop_category =
1109
- eds_update.drop_config->drop_category_list()[i];
1110
- gpr_log(GPR_INFO,
1111
- "[xds_client %p] Drop category %s has drop rate %d per million",
1112
- xds_client(), drop_category.name.c_str(),
1113
- drop_category.parts_per_million);
1114
- }
1081
+ gpr_log(GPR_INFO, "[xds_client %p] EDS resource %s: %s", xds_client(),
1082
+ eds_service_name, eds_update.ToString().c_str());
1115
1083
  }
1116
1084
  EndpointState& endpoint_state =
1117
1085
  xds_client()->endpoint_map_[eds_service_name];
1118
1086
  // Ignore identical update.
1119
- if (endpoint_state.update.has_value()) {
1120
- const XdsApi::EdsUpdate& prev_update = endpoint_state.update.value();
1121
- const bool priority_list_changed =
1122
- prev_update.priority_list_update != eds_update.priority_list_update;
1123
- const bool drop_config_changed =
1124
- prev_update.drop_config == nullptr ||
1125
- *prev_update.drop_config != *eds_update.drop_config;
1126
- if (!priority_list_changed && !drop_config_changed) {
1127
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1128
- gpr_log(GPR_INFO,
1129
- "[xds_client %p] EDS update identical to current, ignoring.",
1130
- xds_client());
1131
- }
1132
- continue;
1087
+ if (endpoint_state.update.has_value() &&
1088
+ *endpoint_state.update == eds_update) {
1089
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1090
+ gpr_log(GPR_INFO,
1091
+ "[xds_client %p] EDS update identical to current, ignoring.",
1092
+ xds_client());
1133
1093
  }
1094
+ continue;
1134
1095
  }
1135
1096
  // Update the cluster state.
1136
1097
  endpoint_state.update = std::move(eds_update);
@@ -1144,10 +1105,11 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1144
1105
  void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1145
1106
  grpc_error* error) {
1146
1107
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1147
- GRPC_ERROR_REF(error); // ref owned by lambda
1148
- ads_calld->xds_client()->work_serializer_->Run(
1149
- [ads_calld, error]() { ads_calld->OnRequestSentLocked(error); },
1150
- DEBUG_LOCATION);
1108
+ {
1109
+ MutexLock lock(&ads_calld->xds_client()->mu_);
1110
+ ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
1111
+ }
1112
+ ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1151
1113
  }
1152
1114
 
1153
1115
  void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
@@ -1171,22 +1133,24 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1171
1133
  buffered_requests_.erase(it);
1172
1134
  }
1173
1135
  }
1174
- Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1175
1136
  GRPC_ERROR_UNREF(error);
1176
1137
  }
1177
1138
 
1178
1139
  void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1179
1140
  void* arg, grpc_error* /* error */) {
1180
1141
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1181
- ads_calld->xds_client()->work_serializer_->Run(
1182
- [ads_calld]() { ads_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION);
1142
+ bool done;
1143
+ {
1144
+ MutexLock lock(&ads_calld->xds_client()->mu_);
1145
+ done = ads_calld->OnResponseReceivedLocked();
1146
+ }
1147
+ if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1183
1148
  }
1184
1149
 
1185
- void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1150
+ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1186
1151
  // Empty payload means the call was cancelled.
1187
1152
  if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1188
- Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1189
- return;
1153
+ return true;
1190
1154
  }
1191
1155
  // Read the response.
1192
1156
  grpc_byte_buffer_reader bbr;
@@ -1197,7 +1161,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1197
1161
  recv_message_payload_ = nullptr;
1198
1162
  // Parse and validate the response.
1199
1163
  XdsApi::AdsParseResult result = xds_client()->api_.ParseAdsResponse(
1200
- response_slice, xds_client()->server_name_,
1164
+ response_slice, ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1201
1165
  ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1202
1166
  ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1203
1167
  ResourceNamesForRequest(XdsApi::kEdsTypeUrl));
@@ -1227,15 +1191,16 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1227
1191
  seen_response_ = true;
1228
1192
  // Accept the ADS response according to the type_url.
1229
1193
  if (result.type_url == XdsApi::kLdsTypeUrl) {
1230
- AcceptLdsUpdate(std::move(result.lds_update));
1194
+ AcceptLdsUpdate(std::move(result.lds_update_map));
1231
1195
  } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1232
- AcceptRdsUpdate(std::move(result.rds_update));
1196
+ AcceptRdsUpdate(std::move(result.rds_update_map));
1233
1197
  } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1234
1198
  AcceptCdsUpdate(std::move(result.cds_update_map));
1235
1199
  } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1236
1200
  AcceptEdsUpdate(std::move(result.eds_update_map));
1237
1201
  }
1238
- state.version = std::move(result.version);
1202
+ xds_client()->resource_version_map_[result.type_url] =
1203
+ std::move(result.version);
1239
1204
  // ACK the update.
1240
1205
  SendMessageLocked(result.type_url);
1241
1206
  // Start load reporting if needed.
@@ -1246,10 +1211,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1246
1211
  }
1247
1212
  }
1248
1213
  }
1249
- if (xds_client()->shutting_down_) {
1250
- Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked+xds_shutdown");
1251
- return;
1252
- }
1214
+ if (xds_client()->shutting_down_) return true;
1253
1215
  // Keep listening for updates.
1254
1216
  grpc_op op;
1255
1217
  memset(&op, 0, sizeof(op));
@@ -1262,15 +1224,17 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1262
1224
  const grpc_call_error call_error =
1263
1225
  grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1264
1226
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1227
+ return false;
1265
1228
  }
1266
1229
 
1267
1230
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1268
1231
  void* arg, grpc_error* error) {
1269
1232
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1270
- GRPC_ERROR_REF(error); // ref owned by lambda
1271
- ads_calld->xds_client()->work_serializer_->Run(
1272
- [ads_calld, error]() { ads_calld->OnStatusReceivedLocked(error); },
1273
- DEBUG_LOCATION);
1233
+ {
1234
+ MutexLock lock(&ads_calld->xds_client()->mu_);
1235
+ ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1236
+ }
1237
+ ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1274
1238
  }
1275
1239
 
1276
1240
  void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
@@ -1289,10 +1253,9 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1289
1253
  // Try to restart the call.
1290
1254
  parent_->OnCallFinishedLocked();
1291
1255
  // Send error to all watchers.
1292
- xds_client()->NotifyOnError(
1256
+ xds_client()->NotifyOnErrorLocked(
1293
1257
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds call failed"));
1294
1258
  }
1295
- Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1296
1259
  GRPC_ERROR_UNREF(error);
1297
1260
  }
1298
1261
 
@@ -1312,7 +1275,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1312
1275
  for (auto& p : it->second.subscribed_resources) {
1313
1276
  resource_names.insert(p.first);
1314
1277
  OrphanablePtr<ResourceState>& state = p.second;
1315
- state->Start(Ref());
1278
+ state->Start(Ref(DEBUG_LOCATION, "ResourceState"));
1316
1279
  }
1317
1280
  }
1318
1281
  return resource_names;
@@ -1339,21 +1302,22 @@ void XdsClient::ChannelState::LrsCallState::Reporter::
1339
1302
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1340
1303
  void* arg, grpc_error* error) {
1341
1304
  Reporter* self = static_cast<Reporter*>(arg);
1342
- GRPC_ERROR_REF(error); // ref owned by lambda
1343
- self->xds_client()->work_serializer_->Run(
1344
- [self, error]() { self->OnNextReportTimerLocked(error); },
1345
- DEBUG_LOCATION);
1305
+ bool done;
1306
+ {
1307
+ MutexLock lock(&self->xds_client()->mu_);
1308
+ done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
1309
+ }
1310
+ if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
1346
1311
  }
1347
1312
 
1348
- void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1313
+ bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1349
1314
  grpc_error* error) {
1350
1315
  next_report_timer_callback_pending_ = false;
1351
1316
  if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1352
- Unref(DEBUG_LOCATION, "Reporter+timer");
1353
- } else {
1354
- SendReportLocked();
1317
+ GRPC_ERROR_UNREF(error);
1318
+ return true;
1355
1319
  }
1356
- GRPC_ERROR_UNREF(error);
1320
+ return SendReportLocked();
1357
1321
  }
1358
1322
 
1359
1323
  namespace {
@@ -1361,9 +1325,7 @@ namespace {
1361
1325
  bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1362
1326
  for (const auto& p : snapshot) {
1363
1327
  const XdsApi::ClusterLoadReport& cluster_snapshot = p.second;
1364
- for (const auto& q : cluster_snapshot.dropped_requests) {
1365
- if (q.second > 0) return false;
1366
- }
1328
+ if (!cluster_snapshot.dropped_requests.IsZero()) return false;
1367
1329
  for (const auto& q : cluster_snapshot.locality_stats) {
1368
1330
  const XdsClusterLocalityStats::Snapshot& locality_snapshot = q.second;
1369
1331
  if (!locality_snapshot.IsZero()) return false;
@@ -1374,17 +1336,22 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1374
1336
 
1375
1337
  } // namespace
1376
1338
 
1377
- void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1339
+ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1378
1340
  // Construct snapshot from all reported stats.
1379
- XdsApi::ClusterLoadReportMap snapshot = xds_client()->BuildLoadReportSnapshot(
1380
- parent_->send_all_clusters_, parent_->cluster_names_);
1341
+ XdsApi::ClusterLoadReportMap snapshot =
1342
+ xds_client()->BuildLoadReportSnapshotLocked(parent_->send_all_clusters_,
1343
+ parent_->cluster_names_);
1381
1344
  // Skip client load report if the counters were all zero in the last
1382
1345
  // report and they are still zero in this one.
1383
1346
  const bool old_val = last_report_counters_were_zero_;
1384
1347
  last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
1385
1348
  if (old_val && last_report_counters_were_zero_) {
1349
+ if (xds_client()->load_report_map_.empty()) {
1350
+ parent_->chand()->StopLrsCall();
1351
+ return true;
1352
+ }
1386
1353
  ScheduleNextReportLocked();
1387
- return;
1354
+ return false;
1388
1355
  }
1389
1356
  // Create a request that contains the snapshot.
1390
1357
  grpc_slice request_payload_slice =
@@ -1405,37 +1372,41 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1405
1372
  xds_client(), this, call_error);
1406
1373
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1407
1374
  }
1375
+ return false;
1408
1376
  }
1409
1377
 
1410
1378
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1411
1379
  void* arg, grpc_error* error) {
1412
1380
  Reporter* self = static_cast<Reporter*>(arg);
1413
- GRPC_ERROR_REF(error); // ref owned by lambda
1414
- self->xds_client()->work_serializer_->Run(
1415
- [self, error]() { self->OnReportDoneLocked(error); }, DEBUG_LOCATION);
1381
+ bool done;
1382
+ {
1383
+ MutexLock lock(&self->xds_client()->mu_);
1384
+ done = self->OnReportDoneLocked(GRPC_ERROR_REF(error));
1385
+ }
1386
+ if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
1416
1387
  }
1417
1388
 
1418
- void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1389
+ bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1419
1390
  grpc_error* error) {
1420
1391
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1421
1392
  parent_->send_message_payload_ = nullptr;
1422
1393
  // If there are no more registered stats to report, cancel the call.
1423
1394
  if (xds_client()->load_report_map_.empty()) {
1424
1395
  parent_->chand()->StopLrsCall();
1425
- Unref(DEBUG_LOCATION, "Reporter+report_done+no_more_reporters");
1426
- return;
1396
+ GRPC_ERROR_UNREF(error);
1397
+ return true;
1427
1398
  }
1428
1399
  if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1400
+ GRPC_ERROR_UNREF(error);
1429
1401
  // If this reporter is no longer the current one on the call, the reason
1430
1402
  // might be that it was orphaned for a new one due to config update.
1431
1403
  if (!IsCurrentReporterOnCall()) {
1432
1404
  parent_->MaybeStartReportingLocked();
1433
1405
  }
1434
- Unref(DEBUG_LOCATION, "Reporter+report_done");
1435
- } else {
1436
- ScheduleNextReportLocked();
1406
+ return true;
1437
1407
  }
1438
- GRPC_ERROR_UNREF(error);
1408
+ ScheduleNextReportLocked();
1409
+ return false;
1439
1410
  }
1440
1411
 
1441
1412
  //
@@ -1444,15 +1415,17 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1444
1415
 
1445
1416
  XdsClient::ChannelState::LrsCallState::LrsCallState(
1446
1417
  RefCountedPtr<RetryableCall<LrsCallState>> parent)
1447
- : InternallyRefCounted<LrsCallState>(&grpc_xds_client_trace),
1418
+ : InternallyRefCounted<LrsCallState>(
1419
+ GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace)
1420
+ ? "LrsCallState"
1421
+ : nullptr),
1448
1422
  parent_(std::move(parent)) {
1449
1423
  // Init the LRS call. Note that the call will progress every time there's
1450
1424
  // activity in xds_client()->interested_parties_, which is comprised of
1451
1425
  // the polling entities from client_channel.
1452
1426
  GPR_ASSERT(xds_client() != nullptr);
1453
- GPR_ASSERT(!xds_client()->server_name_.empty());
1454
1427
  const auto& method =
1455
- xds_client()->bootstrap_->server().ShouldUseV3()
1428
+ chand()->server_.ShouldUseV3()
1456
1429
  ? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS
1457
1430
  : GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS;
1458
1431
  call_ = grpc_channel_create_pollset_set_call(
@@ -1462,7 +1435,7 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1462
1435
  GPR_ASSERT(call_ != nullptr);
1463
1436
  // Init the request payload.
1464
1437
  grpc_slice request_payload_slice =
1465
- xds_client()->api_.CreateLrsInitialRequest(xds_client()->server_name_);
1438
+ xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1466
1439
  send_message_payload_ =
1467
1440
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1468
1441
  grpc_slice_unref_internal(request_payload_slice);
@@ -1498,8 +1471,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1498
1471
  Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
1499
1472
  GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
1500
1473
  grpc_schedule_on_exec_ctx);
1501
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
1502
- &on_initial_request_sent_);
1474
+ call_error = grpc_call_start_batch_and_execute(
1475
+ call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
1503
1476
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1504
1477
  // Op: recv initial metadata.
1505
1478
  op = ops;
@@ -1518,8 +1491,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1518
1491
  Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
1519
1492
  GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1520
1493
  grpc_schedule_on_exec_ctx);
1521
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
1522
- &on_response_received_);
1494
+ call_error = grpc_call_start_batch_and_execute(
1495
+ call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1523
1496
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1524
1497
  // Op: recv server status.
1525
1498
  op = ops;
@@ -1535,8 +1508,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1535
1508
  // unreffed.
1536
1509
  GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1537
1510
  grpc_schedule_on_exec_ctx);
1538
- call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
1539
- &on_status_received_);
1511
+ call_error = grpc_call_start_batch_and_execute(
1512
+ call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1540
1513
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1541
1514
  }
1542
1515
 
@@ -1586,9 +1559,11 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1586
1559
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1587
1560
  void* arg, grpc_error* /*error*/) {
1588
1561
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1589
- lrs_calld->xds_client()->work_serializer_->Run(
1590
- [lrs_calld]() { lrs_calld->OnInitialRequestSentLocked(); },
1591
- DEBUG_LOCATION);
1562
+ {
1563
+ MutexLock lock(&lrs_calld->xds_client()->mu_);
1564
+ lrs_calld->OnInitialRequestSentLocked();
1565
+ }
1566
+ lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1592
1567
  }
1593
1568
 
1594
1569
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
@@ -1596,21 +1571,23 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1596
1571
  grpc_byte_buffer_destroy(send_message_payload_);
1597
1572
  send_message_payload_ = nullptr;
1598
1573
  MaybeStartReportingLocked();
1599
- Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1600
1574
  }
1601
1575
 
1602
1576
  void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1603
1577
  void* arg, grpc_error* /*error*/) {
1604
1578
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1605
- lrs_calld->xds_client()->work_serializer_->Run(
1606
- [lrs_calld]() { lrs_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION);
1579
+ bool done;
1580
+ {
1581
+ MutexLock lock(&lrs_calld->xds_client()->mu_);
1582
+ done = lrs_calld->OnResponseReceivedLocked();
1583
+ }
1584
+ if (done) lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1607
1585
  }
1608
1586
 
1609
- void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1587
+ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1610
1588
  // Empty payload means the call was cancelled.
1611
1589
  if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1612
- Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1613
- return;
1590
+ return true;
1614
1591
  }
1615
1592
  // Read the response.
1616
1593
  grpc_byte_buffer_reader bbr;
@@ -1683,10 +1660,7 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1683
1660
  MaybeStartReportingLocked();
1684
1661
  }();
1685
1662
  grpc_slice_unref_internal(response_slice);
1686
- if (xds_client()->shutting_down_) {
1687
- Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked+xds_shutdown");
1688
- return;
1689
- }
1663
+ if (xds_client()->shutting_down_) return true;
1690
1664
  // Keep listening for LRS config updates.
1691
1665
  grpc_op op;
1692
1666
  memset(&op, 0, sizeof(op));
@@ -1699,15 +1673,17 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1699
1673
  const grpc_call_error call_error =
1700
1674
  grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1701
1675
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1676
+ return false;
1702
1677
  }
1703
1678
 
1704
1679
  void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1705
1680
  void* arg, grpc_error* error) {
1706
1681
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1707
- GRPC_ERROR_REF(error); // ref owned by lambda
1708
- lrs_calld->xds_client()->work_serializer_->Run(
1709
- [lrs_calld, error]() { lrs_calld->OnStatusReceivedLocked(error); },
1710
- DEBUG_LOCATION);
1682
+ {
1683
+ MutexLock lock(&lrs_calld->xds_client()->mu_);
1684
+ lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1685
+ }
1686
+ lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1711
1687
  }
1712
1688
 
1713
1689
  void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
@@ -1728,7 +1704,6 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1728
1704
  // Try to restart the call.
1729
1705
  parent_->OnCallFinishedLocked();
1730
1706
  }
1731
- Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1732
1707
  GRPC_ERROR_UNREF(error);
1733
1708
  }
1734
1709
 
@@ -1745,28 +1720,28 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1745
1720
 
1746
1721
  namespace {
1747
1722
 
1748
- grpc_millis GetRequestTimeout(const grpc_channel_args& args) {
1723
+ grpc_millis GetRequestTimeout() {
1749
1724
  return grpc_channel_args_find_integer(
1750
- &args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1725
+ g_channel_args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1751
1726
  {15000, 0, INT_MAX});
1752
1727
  }
1753
1728
 
1754
1729
  } // namespace
1755
1730
 
1756
- XdsClient::XdsClient(std::shared_ptr<WorkSerializer> work_serializer,
1757
- grpc_pollset_set* interested_parties,
1758
- absl::string_view server_name,
1759
- std::unique_ptr<ListenerWatcherInterface> watcher,
1760
- const grpc_channel_args& channel_args, grpc_error** error)
1761
- : InternallyRefCounted<XdsClient>(&grpc_xds_client_trace),
1762
- request_timeout_(GetRequestTimeout(channel_args)),
1763
- work_serializer_(std::move(work_serializer)),
1764
- interested_parties_(interested_parties),
1765
- bootstrap_(
1766
- XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
1767
- api_(this, &grpc_xds_client_trace, bootstrap_.get()),
1768
- server_name_(server_name),
1769
- listener_watcher_(std::move(watcher)) {
1731
+ XdsClient::XdsClient(grpc_error** error)
1732
+ : DualRefCounted<XdsClient>(
1733
+ GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1734
+ : nullptr),
1735
+ request_timeout_(GetRequestTimeout()),
1736
+ interested_parties_(grpc_pollset_set_create()),
1737
+ bootstrap_(XdsBootstrap::Create(this, &grpc_xds_client_trace,
1738
+ g_fallback_bootstrap_config, error)),
1739
+ certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1740
+ bootstrap_ == nullptr
1741
+ ? CertificateProviderStore::PluginDefinitionMap()
1742
+ : bootstrap_->certificate_providers())),
1743
+ api_(this, &grpc_xds_client_trace,
1744
+ bootstrap_ == nullptr ? nullptr : bootstrap_->node()) {
1770
1745
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1771
1746
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1772
1747
  }
@@ -1775,58 +1750,150 @@ XdsClient::XdsClient(std::shared_ptr<WorkSerializer> work_serializer,
1775
1750
  this, grpc_error_string(*error));
1776
1751
  return;
1777
1752
  }
1778
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1779
- gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s", this,
1780
- bootstrap_->server().server_uri.c_str());
1781
- }
1782
- grpc_channel_args* new_args = BuildXdsChannelArgs(channel_args);
1783
- grpc_channel* channel = CreateXdsChannel(*bootstrap_, *new_args, error);
1784
- grpc_channel_args_destroy(new_args);
1785
- if (*error != GRPC_ERROR_NONE) {
1786
- gpr_log(GPR_ERROR, "[xds_client %p] failed to create xds channel: %s", this,
1787
- grpc_error_string(*error));
1788
- return;
1789
- }
1753
+ // Create ChannelState object.
1790
1754
  chand_ = MakeOrphanable<ChannelState>(
1791
- Ref(DEBUG_LOCATION, "XdsClient+ChannelState"), channel);
1792
- if (listener_watcher_ != nullptr) {
1793
- chand_->Subscribe(XdsApi::kLdsTypeUrl, std::string(server_name));
1794
- }
1755
+ WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), bootstrap_->server());
1795
1756
  }
1796
1757
 
1797
1758
  XdsClient::~XdsClient() {
1798
1759
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1799
1760
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1800
1761
  }
1762
+ grpc_pollset_set_destroy(interested_parties_);
1763
+ }
1764
+
1765
+ void XdsClient::AddChannelzLinkage(
1766
+ channelz::ChannelNode* parent_channelz_node) {
1767
+ channelz::ChannelNode* xds_channelz_node =
1768
+ grpc_channel_get_channelz_node(chand_->channel());
1769
+ if (xds_channelz_node != nullptr) {
1770
+ parent_channelz_node->AddChildChannel(xds_channelz_node->uuid());
1771
+ }
1772
+ }
1773
+
1774
+ void XdsClient::RemoveChannelzLinkage(
1775
+ channelz::ChannelNode* parent_channelz_node) {
1776
+ channelz::ChannelNode* xds_channelz_node =
1777
+ grpc_channel_get_channelz_node(chand_->channel());
1778
+ if (xds_channelz_node != nullptr) {
1779
+ parent_channelz_node->RemoveChildChannel(xds_channelz_node->uuid());
1780
+ }
1801
1781
  }
1802
1782
 
1803
1783
  void XdsClient::Orphan() {
1804
1784
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1805
1785
  gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
1806
1786
  }
1807
- shutting_down_ = true;
1808
- chand_.reset();
1809
- // We do not clear cluster_map_ and endpoint_map_ if the xds client was
1810
- // created by the XdsResolver because the maps contain refs for watchers which
1811
- // in turn hold refs to the loadbalancing policies. At this point, it is
1812
- // possible for ADS calls to be in progress. Unreffing the loadbalancing
1813
- // policies before those calls are done would lead to issues such as
1814
- // https://github.com/grpc/grpc/issues/20928.
1815
- if (listener_watcher_ != nullptr) {
1816
- cluster_map_.clear();
1817
- endpoint_map_.clear();
1787
+ {
1788
+ MutexLock lock(g_mu);
1789
+ if (g_xds_client == this) g_xds_client = nullptr;
1790
+ }
1791
+ {
1792
+ MutexLock lock(&mu_);
1793
+ shutting_down_ = true;
1794
+ // Orphan ChannelState object.
1795
+ chand_.reset();
1796
+ // We do not clear cluster_map_ and endpoint_map_ if the xds client was
1797
+ // created by the XdsResolver because the maps contain refs for watchers
1798
+ // which in turn hold refs to the loadbalancing policies. At this point, it
1799
+ // is possible for ADS calls to be in progress. Unreffing the loadbalancing
1800
+ // policies before those calls are done would lead to issues such as
1801
+ // https://github.com/grpc/grpc/issues/20928.
1802
+ if (!listener_map_.empty()) {
1803
+ cluster_map_.clear();
1804
+ endpoint_map_.clear();
1805
+ }
1806
+ }
1807
+ }
1808
+
1809
+ void XdsClient::WatchListenerData(
1810
+ absl::string_view listener_name,
1811
+ std::unique_ptr<ListenerWatcherInterface> watcher) {
1812
+ std::string listener_name_str = std::string(listener_name);
1813
+ MutexLock lock(&mu_);
1814
+ ListenerState& listener_state = listener_map_[listener_name_str];
1815
+ ListenerWatcherInterface* w = watcher.get();
1816
+ listener_state.watchers[w] = std::move(watcher);
1817
+ // If we've already received an LDS update, notify the new watcher
1818
+ // immediately.
1819
+ if (listener_state.update.has_value()) {
1820
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1821
+ gpr_log(GPR_INFO, "[xds_client %p] returning cached listener data for %s",
1822
+ this, listener_name_str.c_str());
1823
+ }
1824
+ w->OnListenerChanged(*listener_state.update);
1825
+ }
1826
+ chand_->Subscribe(XdsApi::kLdsTypeUrl, listener_name_str);
1827
+ }
1828
+
1829
+ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
1830
+ ListenerWatcherInterface* watcher,
1831
+ bool delay_unsubscription) {
1832
+ MutexLock lock(&mu_);
1833
+ if (shutting_down_) return;
1834
+ std::string listener_name_str = std::string(listener_name);
1835
+ ListenerState& listener_state = listener_map_[listener_name_str];
1836
+ auto it = listener_state.watchers.find(watcher);
1837
+ if (it != listener_state.watchers.end()) {
1838
+ listener_state.watchers.erase(it);
1839
+ if (listener_state.watchers.empty()) {
1840
+ listener_map_.erase(listener_name_str);
1841
+ chand_->Unsubscribe(XdsApi::kLdsTypeUrl, listener_name_str,
1842
+ delay_unsubscription);
1843
+ }
1844
+ }
1845
+ }
1846
+
1847
+ void XdsClient::WatchRouteConfigData(
1848
+ absl::string_view route_config_name,
1849
+ std::unique_ptr<RouteConfigWatcherInterface> watcher) {
1850
+ std::string route_config_name_str = std::string(route_config_name);
1851
+ MutexLock lock(&mu_);
1852
+ RouteConfigState& route_config_state =
1853
+ route_config_map_[route_config_name_str];
1854
+ RouteConfigWatcherInterface* w = watcher.get();
1855
+ route_config_state.watchers[w] = std::move(watcher);
1856
+ // If we've already received an RDS update, notify the new watcher
1857
+ // immediately.
1858
+ if (route_config_state.update.has_value()) {
1859
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1860
+ gpr_log(GPR_INFO,
1861
+ "[xds_client %p] returning cached route config data for %s", this,
1862
+ route_config_name_str.c_str());
1863
+ }
1864
+ w->OnRouteConfigChanged(*route_config_state.update);
1865
+ }
1866
+ chand_->Subscribe(XdsApi::kRdsTypeUrl, route_config_name_str);
1867
+ }
1868
+
1869
+ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
1870
+ RouteConfigWatcherInterface* watcher,
1871
+ bool delay_unsubscription) {
1872
+ MutexLock lock(&mu_);
1873
+ if (shutting_down_) return;
1874
+ std::string route_config_name_str = std::string(route_config_name);
1875
+ RouteConfigState& route_config_state =
1876
+ route_config_map_[route_config_name_str];
1877
+ auto it = route_config_state.watchers.find(watcher);
1878
+ if (it != route_config_state.watchers.end()) {
1879
+ route_config_state.watchers.erase(it);
1880
+ if (route_config_state.watchers.empty()) {
1881
+ route_config_map_.erase(route_config_name_str);
1882
+ chand_->Unsubscribe(XdsApi::kRdsTypeUrl, route_config_name_str,
1883
+ delay_unsubscription);
1884
+ }
1818
1885
  }
1819
- Unref(DEBUG_LOCATION, "XdsClient::Orphan()");
1820
1886
  }
1821
1887
 
1822
1888
  void XdsClient::WatchClusterData(
1823
1889
  absl::string_view cluster_name,
1824
1890
  std::unique_ptr<ClusterWatcherInterface> watcher) {
1825
1891
  std::string cluster_name_str = std::string(cluster_name);
1892
+ MutexLock lock(&mu_);
1826
1893
  ClusterState& cluster_state = cluster_map_[cluster_name_str];
1827
1894
  ClusterWatcherInterface* w = watcher.get();
1828
1895
  cluster_state.watchers[w] = std::move(watcher);
1829
- // If we've already received an CDS update, notify the new watcher
1896
+ // If we've already received a CDS update, notify the new watcher
1830
1897
  // immediately.
1831
1898
  if (cluster_state.update.has_value()) {
1832
1899
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1841,6 +1908,7 @@ void XdsClient::WatchClusterData(
1841
1908
  void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
1842
1909
  ClusterWatcherInterface* watcher,
1843
1910
  bool delay_unsubscription) {
1911
+ MutexLock lock(&mu_);
1844
1912
  if (shutting_down_) return;
1845
1913
  std::string cluster_name_str = std::string(cluster_name);
1846
1914
  ClusterState& cluster_state = cluster_map_[cluster_name_str];
@@ -1859,6 +1927,7 @@ void XdsClient::WatchEndpointData(
1859
1927
  absl::string_view eds_service_name,
1860
1928
  std::unique_ptr<EndpointWatcherInterface> watcher) {
1861
1929
  std::string eds_service_name_str = std::string(eds_service_name);
1930
+ MutexLock lock(&mu_);
1862
1931
  EndpointState& endpoint_state = endpoint_map_[eds_service_name_str];
1863
1932
  EndpointWatcherInterface* w = watcher.get();
1864
1933
  endpoint_state.watchers[w] = std::move(watcher);
@@ -1877,6 +1946,7 @@ void XdsClient::WatchEndpointData(
1877
1946
  void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
1878
1947
  EndpointWatcherInterface* watcher,
1879
1948
  bool delay_unsubscription) {
1949
+ MutexLock lock(&mu_);
1880
1950
  if (shutting_down_) return;
1881
1951
  std::string eds_service_name_str = std::string(eds_service_name);
1882
1952
  EndpointState& endpoint_state = endpoint_map_[eds_service_name_str];
@@ -1898,16 +1968,29 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
1898
1968
  // server name specified in lrs_server.
1899
1969
  auto key =
1900
1970
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
1971
+ MutexLock lock(&mu_);
1901
1972
  // We jump through some hoops here to make sure that the absl::string_views
1902
1973
  // stored in the XdsClusterDropStats object point to the strings
1903
1974
  // in the load_report_map_ key, so that they have the same lifetime.
1904
1975
  auto it = load_report_map_
1905
1976
  .emplace(std::make_pair(std::move(key), LoadReportState()))
1906
1977
  .first;
1907
- auto cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1908
- Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
1909
- it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/);
1910
- it->second.drop_stats.insert(cluster_drop_stats.get());
1978
+ LoadReportState& load_report_state = it->second;
1979
+ RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
1980
+ if (load_report_state.drop_stats != nullptr) {
1981
+ cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
1982
+ }
1983
+ if (cluster_drop_stats == nullptr) {
1984
+ if (load_report_state.drop_stats != nullptr) {
1985
+ load_report_state.deleted_drop_stats +=
1986
+ load_report_state.drop_stats->GetSnapshotAndReset();
1987
+ }
1988
+ cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1989
+ Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
1990
+ it->first.first /*cluster_name*/,
1991
+ it->first.second /*eds_service_name*/);
1992
+ load_report_state.drop_stats = cluster_drop_stats.get();
1993
+ }
1911
1994
  chand_->MaybeStartLrsCall();
1912
1995
  return cluster_drop_stats;
1913
1996
  }
@@ -1916,20 +1999,19 @@ void XdsClient::RemoveClusterDropStats(
1916
1999
  absl::string_view /*lrs_server*/, absl::string_view cluster_name,
1917
2000
  absl::string_view eds_service_name,
1918
2001
  XdsClusterDropStats* cluster_drop_stats) {
1919
- auto load_report_it = load_report_map_.find(
1920
- std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
1921
- if (load_report_it == load_report_map_.end()) return;
1922
- LoadReportState& load_report_state = load_report_it->second;
2002
+ MutexLock lock(&mu_);
1923
2003
  // TODO(roth): When we add support for direct federation, use the
1924
2004
  // server name specified in lrs_server.
1925
- auto it = load_report_state.drop_stats.find(cluster_drop_stats);
1926
- if (it != load_report_state.drop_stats.end()) {
1927
- // Record final drop stats in deleted_drop_stats, which will be
2005
+ auto it = load_report_map_.find(
2006
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2007
+ if (it == load_report_map_.end()) return;
2008
+ LoadReportState& load_report_state = it->second;
2009
+ if (load_report_state.drop_stats == cluster_drop_stats) {
2010
+ // Record final snapshot in deleted_drop_stats, which will be
1928
2011
  // added to the next load report.
1929
- for (const auto& p : cluster_drop_stats->GetSnapshotAndReset()) {
1930
- load_report_state.deleted_drop_stats[p.first] += p.second;
1931
- }
1932
- load_report_state.drop_stats.erase(it);
2012
+ load_report_state.deleted_drop_stats +=
2013
+ load_report_state.drop_stats->GetSnapshotAndReset();
2014
+ load_report_state.drop_stats = nullptr;
1933
2015
  }
1934
2016
  }
1935
2017
 
@@ -1941,18 +2023,31 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
1941
2023
  // server name specified in lrs_server.
1942
2024
  auto key =
1943
2025
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2026
+ MutexLock lock(&mu_);
1944
2027
  // We jump through some hoops here to make sure that the absl::string_views
1945
2028
  // stored in the XdsClusterLocalityStats object point to the strings
1946
2029
  // in the load_report_map_ key, so that they have the same lifetime.
1947
2030
  auto it = load_report_map_
1948
2031
  .emplace(std::make_pair(std::move(key), LoadReportState()))
1949
2032
  .first;
1950
- auto cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
1951
- Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
1952
- it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
1953
- locality);
1954
- it->second.locality_stats[std::move(locality)].locality_stats.insert(
1955
- cluster_locality_stats.get());
2033
+ LoadReportState& load_report_state = it->second;
2034
+ LoadReportState::LocalityState& locality_state =
2035
+ load_report_state.locality_stats[locality];
2036
+ RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
2037
+ if (locality_state.locality_stats != nullptr) {
2038
+ cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
2039
+ }
2040
+ if (cluster_locality_stats == nullptr) {
2041
+ if (locality_state.locality_stats != nullptr) {
2042
+ locality_state.deleted_locality_stats +=
2043
+ locality_state.locality_stats->GetSnapshotAndReset();
2044
+ }
2045
+ cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
2046
+ Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
2047
+ it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
2048
+ std::move(locality));
2049
+ locality_state.locality_stats = cluster_locality_stats.get();
2050
+ }
1956
2051
  chand_->MaybeStartLrsCall();
1957
2052
  return cluster_locality_stats;
1958
2053
  }
@@ -1962,33 +2057,65 @@ void XdsClient::RemoveClusterLocalityStats(
1962
2057
  absl::string_view eds_service_name,
1963
2058
  const RefCountedPtr<XdsLocalityName>& locality,
1964
2059
  XdsClusterLocalityStats* cluster_locality_stats) {
1965
- auto load_report_it = load_report_map_.find(
1966
- std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
1967
- if (load_report_it == load_report_map_.end()) return;
1968
- LoadReportState& load_report_state = load_report_it->second;
2060
+ MutexLock lock(&mu_);
1969
2061
  // TODO(roth): When we add support for direct federation, use the
1970
2062
  // server name specified in lrs_server.
2063
+ auto it = load_report_map_.find(
2064
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
2065
+ if (it == load_report_map_.end()) return;
2066
+ LoadReportState& load_report_state = it->second;
1971
2067
  auto locality_it = load_report_state.locality_stats.find(locality);
1972
2068
  if (locality_it == load_report_state.locality_stats.end()) return;
1973
- auto& locality_set = locality_it->second.locality_stats;
1974
- auto it = locality_set.find(cluster_locality_stats);
1975
- if (it != locality_set.end()) {
2069
+ LoadReportState::LocalityState& locality_state = locality_it->second;
2070
+ if (locality_state.locality_stats == cluster_locality_stats) {
1976
2071
  // Record final snapshot in deleted_locality_stats, which will be
1977
2072
  // added to the next load report.
1978
- locality_it->second.deleted_locality_stats.emplace_back(
1979
- cluster_locality_stats->GetSnapshotAndReset());
1980
- locality_set.erase(it);
2073
+ locality_state.deleted_locality_stats +=
2074
+ locality_state.locality_stats->GetSnapshotAndReset();
2075
+ locality_state.locality_stats = nullptr;
1981
2076
  }
1982
2077
  }
1983
2078
 
1984
2079
  void XdsClient::ResetBackoff() {
2080
+ MutexLock lock(&mu_);
1985
2081
  if (chand_ != nullptr) {
1986
2082
  grpc_channel_reset_connect_backoff(chand_->channel());
1987
2083
  }
1988
2084
  }
1989
2085
 
1990
- XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot(
2086
+ void XdsClient::NotifyOnErrorLocked(grpc_error* error) {
2087
+ for (const auto& p : listener_map_) {
2088
+ const ListenerState& listener_state = p.second;
2089
+ for (const auto& p : listener_state.watchers) {
2090
+ p.first->OnError(GRPC_ERROR_REF(error));
2091
+ }
2092
+ }
2093
+ for (const auto& p : route_config_map_) {
2094
+ const RouteConfigState& route_config_state = p.second;
2095
+ for (const auto& p : route_config_state.watchers) {
2096
+ p.first->OnError(GRPC_ERROR_REF(error));
2097
+ }
2098
+ }
2099
+ for (const auto& p : cluster_map_) {
2100
+ const ClusterState& cluster_state = p.second;
2101
+ for (const auto& p : cluster_state.watchers) {
2102
+ p.first->OnError(GRPC_ERROR_REF(error));
2103
+ }
2104
+ }
2105
+ for (const auto& p : endpoint_map_) {
2106
+ const EndpointState& endpoint_state = p.second;
2107
+ for (const auto& p : endpoint_state.watchers) {
2108
+ p.first->OnError(GRPC_ERROR_REF(error));
2109
+ }
2110
+ }
2111
+ GRPC_ERROR_UNREF(error);
2112
+ }
2113
+
2114
+ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
1991
2115
  bool send_all_clusters, const std::set<std::string>& clusters) {
2116
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2117
+ gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
2118
+ }
1992
2119
  XdsApi::ClusterLoadReportMap snapshot_map;
1993
2120
  for (auto load_report_it = load_report_map_.begin();
1994
2121
  load_report_it != load_report_map_.end();) {
@@ -2007,9 +2134,14 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot(
2007
2134
  XdsApi::ClusterLoadReport snapshot;
2008
2135
  // Aggregate drop stats.
2009
2136
  snapshot.dropped_requests = std::move(load_report.deleted_drop_stats);
2010
- for (auto& drop_stats : load_report.drop_stats) {
2011
- for (const auto& p : drop_stats->GetSnapshotAndReset()) {
2012
- snapshot.dropped_requests[p.first] += p.second;
2137
+ if (load_report.drop_stats != nullptr) {
2138
+ snapshot.dropped_requests +=
2139
+ load_report.drop_stats->GetSnapshotAndReset();
2140
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2141
+ gpr_log(GPR_INFO,
2142
+ "[xds_client %p] cluster=%s eds_service_name=%s drop_stats=%p",
2143
+ this, cluster_key.first.c_str(), cluster_key.second.c_str(),
2144
+ load_report.drop_stats);
2013
2145
  }
2014
2146
  }
2015
2147
  // Aggregate locality stats.
@@ -2019,34 +2151,39 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot(
2019
2151
  auto& locality_state = it->second;
2020
2152
  XdsClusterLocalityStats::Snapshot& locality_snapshot =
2021
2153
  snapshot.locality_stats[locality_name];
2022
- for (auto& locality_stats : locality_state.locality_stats) {
2023
- locality_snapshot += locality_stats->GetSnapshotAndReset();
2024
- }
2025
- // Add final snapshots from recently deleted locality stats objects.
2026
- for (auto& deleted_locality_stats :
2027
- locality_state.deleted_locality_stats) {
2028
- locality_snapshot += deleted_locality_stats;
2154
+ locality_snapshot = std::move(locality_state.deleted_locality_stats);
2155
+ if (locality_state.locality_stats != nullptr) {
2156
+ locality_snapshot +=
2157
+ locality_state.locality_stats->GetSnapshotAndReset();
2158
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2159
+ gpr_log(GPR_INFO,
2160
+ "[xds_client %p] cluster=%s eds_service_name=%s "
2161
+ "locality=%s locality_stats=%p",
2162
+ this, cluster_key.first.c_str(), cluster_key.second.c_str(),
2163
+ locality_name->AsHumanReadableString().c_str(),
2164
+ locality_state.locality_stats);
2165
+ }
2029
2166
  }
2030
- locality_state.deleted_locality_stats.clear();
2031
2167
  // If the only thing left in this entry was final snapshots from
2032
2168
  // deleted locality stats objects, remove the entry.
2033
- if (locality_state.locality_stats.empty()) {
2169
+ if (locality_state.locality_stats == nullptr) {
2034
2170
  it = load_report.locality_stats.erase(it);
2035
2171
  } else {
2036
2172
  ++it;
2037
2173
  }
2038
2174
  }
2175
+ // Compute load report interval.
2176
+ const grpc_millis now = ExecCtx::Get()->Now();
2177
+ snapshot.load_report_interval = now - load_report.last_report_time;
2178
+ load_report.last_report_time = now;
2179
+ // Record snapshot.
2039
2180
  if (record_stats) {
2040
- // Compute load report interval.
2041
- const grpc_millis now = ExecCtx::Get()->Now();
2042
- snapshot.load_report_interval = now - load_report.last_report_time;
2043
- load_report.last_report_time = now;
2044
- // Record snapshot.
2045
2181
  snapshot_map[cluster_key] = std::move(snapshot);
2046
2182
  }
2047
2183
  // If the only thing left in this entry was final snapshots from
2048
2184
  // deleted stats objects, remove the entry.
2049
- if (load_report.locality_stats.empty() && load_report.drop_stats.empty()) {
2185
+ if (load_report.locality_stats.empty() &&
2186
+ load_report.drop_stats == nullptr) {
2050
2187
  load_report_it = load_report_map_.erase(load_report_it);
2051
2188
  } else {
2052
2189
  ++load_report_it;
@@ -2055,60 +2192,48 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot(
2055
2192
  return snapshot_map;
2056
2193
  }
2057
2194
 
2058
- void XdsClient::NotifyOnError(grpc_error* error) {
2059
- if (listener_watcher_ != nullptr) {
2060
- listener_watcher_->OnError(GRPC_ERROR_REF(error));
2061
- }
2062
- for (const auto& p : cluster_map_) {
2063
- const ClusterState& cluster_state = p.second;
2064
- for (const auto& p : cluster_state.watchers) {
2065
- p.first->OnError(GRPC_ERROR_REF(error));
2066
- }
2067
- }
2068
- for (const auto& p : endpoint_map_) {
2069
- const EndpointState& endpoint_state = p.second;
2070
- for (const auto& p : endpoint_state.watchers) {
2071
- p.first->OnError(GRPC_ERROR_REF(error));
2072
- }
2073
- }
2074
- GRPC_ERROR_UNREF(error);
2075
- }
2195
+ //
2196
+ // accessors for global state
2197
+ //
2076
2198
 
2077
- void* XdsClient::ChannelArgCopy(void* p) {
2078
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2079
- xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2080
- return p;
2081
- }
2199
+ void XdsClientGlobalInit() { g_mu = new Mutex; }
2082
2200
 
2083
- void XdsClient::ChannelArgDestroy(void* p) {
2084
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2085
- xds_client->Unref(DEBUG_LOCATION, "channel arg");
2201
+ void XdsClientGlobalShutdown() {
2202
+ delete g_mu;
2203
+ g_mu = nullptr;
2204
+ gpr_free(g_fallback_bootstrap_config);
2205
+ g_fallback_bootstrap_config = nullptr;
2086
2206
  }
2087
2207
 
2088
- int XdsClient::ChannelArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
2208
+ RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
2209
+ MutexLock lock(g_mu);
2210
+ if (g_xds_client != nullptr) {
2211
+ auto xds_client = g_xds_client->RefIfNonZero();
2212
+ if (xds_client != nullptr) return xds_client;
2213
+ }
2214
+ auto xds_client = MakeRefCounted<XdsClient>(error);
2215
+ g_xds_client = xds_client.get();
2216
+ return xds_client;
2217
+ }
2089
2218
 
2090
- const grpc_arg_pointer_vtable XdsClient::kXdsClientVtable = {
2091
- XdsClient::ChannelArgCopy, XdsClient::ChannelArgDestroy,
2092
- XdsClient::ChannelArgCmp};
2219
+ namespace internal {
2093
2220
 
2094
- grpc_arg XdsClient::MakeChannelArg() const {
2095
- return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2096
- const_cast<XdsClient*>(this),
2097
- &XdsClient::kXdsClientVtable);
2221
+ void SetXdsChannelArgsForTest(grpc_channel_args* args) {
2222
+ MutexLock lock(g_mu);
2223
+ g_channel_args = args;
2098
2224
  }
2099
2225
 
2100
- RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2101
- const grpc_channel_args& args) {
2102
- XdsClient* xds_client =
2103
- grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2104
- if (xds_client != nullptr) return xds_client->Ref();
2105
- return nullptr;
2226
+ void UnsetGlobalXdsClientForTest() {
2227
+ MutexLock lock(g_mu);
2228
+ g_xds_client = nullptr;
2106
2229
  }
2107
2230
 
2108
- grpc_channel_args* XdsClient::RemoveFromChannelArgs(
2109
- const grpc_channel_args& args) {
2110
- const char* arg_name = GRPC_ARG_XDS_CLIENT;
2111
- return grpc_channel_args_copy_and_remove(&args, &arg_name, 1);
2231
+ void SetXdsFallbackBootstrapConfig(const char* config) {
2232
+ MutexLock lock(g_mu);
2233
+ gpr_free(g_fallback_bootstrap_config);
2234
+ g_fallback_bootstrap_config = gpr_strdup(config);
2112
2235
  }
2113
2236
 
2237
+ } // namespace internal
2238
+
2114
2239
  } // namespace grpc_core