grpc 1.48.0-x86_64-linux → 1.49.1-x86_64-linux

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 (721) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +104 -41
  3. data/include/grpc/event_engine/event_engine.h +19 -16
  4. data/include/grpc/impl/codegen/grpc_types.h +3 -8
  5. data/include/grpc/impl/codegen/port_platform.h +0 -8
  6. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
  7. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -2
  8. data/src/core/ext/filters/client_channel/client_channel.cc +125 -200
  9. data/src/core/ext/filters/client_channel/client_channel.h +15 -8
  10. data/src/core/ext/filters/client_channel/client_channel_factory.cc +0 -29
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -10
  12. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  13. data/src/core/ext/filters/client_channel/config_selector.h +12 -4
  14. data/src/core/ext/filters/client_channel/connector.h +4 -5
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +53 -65
  16. data/src/core/ext/filters/client_channel/http_proxy.h +12 -9
  17. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +14 -12
  18. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +6 -6
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +102 -131
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +12 -3
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +5 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +1 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -2
  24. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +169 -63
  26. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +25 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +15 -19
  28. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +66 -78
  29. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +44 -44
  30. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -5
  31. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +65 -77
  32. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +15 -14
  33. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -14
  34. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +63 -67
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +40 -49
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +81 -97
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +53 -61
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +171 -102
  39. data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
  40. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +19 -16
  41. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +4 -8
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +431 -145
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +170 -99
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +20 -7
  46. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -15
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +7 -17
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +11 -0
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +38 -17
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  51. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +5 -6
  52. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -13
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +162 -165
  54. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +37 -30
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
  56. data/src/core/ext/filters/client_channel/retry_filter.cc +0 -7
  57. data/src/core/ext/filters/client_channel/retry_service_config.cc +30 -19
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +6 -9
  59. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +6 -7
  60. data/src/core/ext/filters/client_channel/subchannel.cc +49 -89
  61. data/src/core/ext/filters/client_channel/subchannel.h +8 -8
  62. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +1 -1
  63. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +6 -76
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -25
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +3 -4
  66. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -6
  67. data/src/core/ext/filters/deadline/deadline_filter.h +2 -3
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -3
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -1
  70. data/src/core/ext/filters/fault_injection/service_config_parser.cc +17 -12
  71. data/src/core/ext/filters/fault_injection/service_config_parser.h +4 -5
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +2 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  74. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  75. data/src/core/ext/filters/http/client_authority_filter.h +1 -1
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -3
  77. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  78. data/src/core/ext/filters/message_size/message_size_filter.cc +13 -7
  79. data/src/core/ext/filters/message_size/message_size_filter.h +3 -6
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +16 -12
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -6
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +5 -0
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +3 -5
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +35 -62
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +62 -89
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
  87. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +130 -165
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +67 -2
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  91. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  92. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +25 -8
  93. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -0
  94. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -1
  95. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +8 -2
  96. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -10
  97. data/src/core/ext/transport/chttp2/transport/internal.h +2 -1
  98. data/src/core/ext/transport/inproc/inproc_transport.cc +40 -74
  99. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
  101. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +4 -4
  102. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +24 -8
  103. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
  104. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
  105. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  106. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  107. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
  108. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
  109. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
  110. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
  111. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
  112. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
  113. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
  114. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
  115. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
  116. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
  117. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
  118. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
  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 -3
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
  123. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +21 -19
  124. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +124 -34
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +23 -22
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +153 -48
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
  131. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
  132. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
  133. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
  134. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +7 -7
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +42 -14
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +9 -9
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +54 -18
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +21 -20
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +117 -44
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +6 -2
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
  166. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
  167. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
  168. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +5 -5
  169. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +36 -12
  170. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
  171. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
  172. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
  173. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
  174. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -13
  175. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +170 -15
  176. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
  177. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
  178. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +1 -1
  179. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +6 -2
  180. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
  181. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
  182. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
  184. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
  185. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
  186. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
  187. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
  188. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -9
  189. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +100 -14
  190. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -22
  191. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +36 -77
  192. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +121 -76
  193. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +647 -163
  194. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
  195. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
  196. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
  197. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
  198. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +1 -1
  199. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -2
  200. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
  201. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
  202. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
  203. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
  204. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
  205. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
  206. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
  207. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
  208. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  209. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  210. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
  211. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
  212. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
  213. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
  214. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  215. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
  217. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
  218. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +1 -1
  219. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +6 -2
  220. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
  222. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
  223. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
  224. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
  226. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
  227. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
  228. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +1 -1
  229. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +6 -2
  230. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +35 -27
  231. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +177 -52
  232. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +6 -2
  233. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +1 -1
  234. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +6 -2
  235. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
  236. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
  237. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
  238. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
  239. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +5 -5
  240. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +42 -14
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
  243. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  244. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  245. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +131 -16
  246. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +632 -12
  247. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
  248. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
  249. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
  250. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
  251. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
  252. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
  253. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
  254. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
  255. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
  256. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
  257. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
  259. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
  260. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
  261. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  262. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
  263. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
  265. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
  266. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
  267. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
  268. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
  273. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  274. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
  275. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
  276. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
  277. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
  278. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
  279. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
  280. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
  281. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
  282. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
  283. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
  284. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  285. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  286. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  287. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
  288. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
  289. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  290. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
  291. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
  292. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
  293. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
  294. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  295. data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
  296. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
  297. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
  298. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  299. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
  300. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
  301. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
  302. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  303. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
  304. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  305. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  306. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
  307. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
  308. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  309. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
  310. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
  311. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
  312. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  313. data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
  314. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
  315. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
  316. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
  317. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
  318. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
  319. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
  320. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
  321. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  322. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
  323. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
  324. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
  325. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
  326. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
  327. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
  328. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
  329. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  330. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
  331. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  332. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
  333. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
  334. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  335. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
  336. data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
  337. data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
  338. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
  339. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
  340. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
  341. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
  342. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
  343. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
  344. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
  345. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
  346. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  347. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
  348. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
  349. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
  350. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  351. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
  352. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
  353. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  355. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  359. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
  360. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +6 -2
  361. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +1 -1
  362. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +6 -2
  363. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
  364. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
  365. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
  366. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
  367. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
  368. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
  369. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -1
  370. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
  371. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  372. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  373. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  374. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  375. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  376. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  377. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  378. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +156 -154
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +186 -183
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +136 -134
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  382. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +162 -139
  383. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  385. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +12 -8
  386. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  387. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +72 -75
  388. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +0 -5
  389. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +713 -670
  390. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  391. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  392. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  393. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  394. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  395. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +477 -466
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  399. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +153 -84
  400. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  401. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  402. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  404. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  406. data/src/core/ext/xds/upb_utils.h +0 -21
  407. data/src/core/ext/xds/xds_api.cc +53 -86
  408. data/src/core/ext/xds/xds_api.h +19 -28
  409. data/src/core/ext/xds/xds_bootstrap.cc +39 -52
  410. data/src/core/ext/xds/xds_bootstrap.h +28 -8
  411. data/src/core/ext/xds/xds_certificate_provider.h +9 -0
  412. data/src/core/ext/xds/xds_channel_stack_modifier.cc +6 -4
  413. data/src/core/ext/xds/xds_channel_stack_modifier.h +8 -0
  414. data/src/core/ext/xds/xds_client.cc +555 -1214
  415. data/src/core/ext/xds/xds_client.h +16 -44
  416. data/src/core/ext/xds/xds_client_grpc.cc +291 -0
  417. data/src/core/ext/xds/xds_client_grpc.h +102 -0
  418. data/src/core/ext/xds/xds_cluster.cc +92 -103
  419. data/src/core/ext/xds/xds_cluster.h +6 -5
  420. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +10 -14
  421. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -0
  422. data/src/core/ext/xds/xds_common_types.cc +134 -110
  423. data/src/core/ext/xds/xds_common_types.h +6 -7
  424. data/src/core/ext/xds/xds_endpoint.cc +80 -80
  425. data/src/core/ext/xds/xds_endpoint.h +4 -4
  426. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -11
  427. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  428. data/src/core/ext/xds/xds_http_filters.h +3 -3
  429. data/src/core/ext/xds/xds_http_rbac_filter.cc +39 -58
  430. data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
  431. data/src/core/ext/xds/xds_lb_policy_registry.cc +17 -20
  432. data/src/core/ext/xds/xds_lb_policy_registry.h +4 -4
  433. data/src/core/ext/xds/xds_listener.cc +329 -299
  434. data/src/core/ext/xds/xds_listener.h +4 -4
  435. data/src/core/ext/xds/xds_resource_type.h +13 -2
  436. data/src/core/ext/xds/xds_route_config.cc +180 -177
  437. data/src/core/ext/xds/xds_route_config.h +31 -17
  438. data/src/core/ext/xds/xds_routing.cc +3 -6
  439. data/src/core/ext/xds/xds_routing.h +7 -9
  440. data/src/core/ext/xds/xds_server_config_fetcher.cc +76 -81
  441. data/src/core/ext/xds/xds_transport.h +86 -0
  442. data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
  443. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  444. data/src/core/lib/address_utils/parse_address.cc +19 -17
  445. data/src/core/lib/address_utils/parse_address.h +8 -5
  446. data/src/core/lib/avl/avl.h +47 -25
  447. data/src/core/lib/channel/call_tracer.h +1 -1
  448. data/src/core/lib/channel/channel_args.cc +88 -19
  449. data/src/core/lib/channel/channel_args.h +113 -62
  450. data/src/core/lib/channel/channel_stack.cc +0 -1
  451. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  452. data/src/core/lib/channel/channel_stack_builder.h +2 -2
  453. data/src/core/lib/channel/channel_stack_builder_impl.cc +2 -4
  454. data/src/core/lib/channel/channelz.cc +27 -37
  455. data/src/core/lib/channel/channelz.h +9 -0
  456. data/src/core/lib/channel/promise_based_filter.h +0 -1
  457. data/src/core/lib/config/core_configuration.h +48 -35
  458. data/src/core/lib/debug/stats.cc +12 -15
  459. data/src/core/lib/debug/stats.h +11 -3
  460. data/src/core/lib/event_engine/{event_engine.cc → default_event_engine.cc} +9 -5
  461. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +4 -8
  462. data/src/core/lib/event_engine/default_event_engine_factory.cc +20 -3
  463. data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
  464. data/src/core/lib/event_engine/executor/executor.h +38 -0
  465. data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
  466. data/src/core/lib/event_engine/executor/threaded_executor.h +44 -0
  467. data/src/core/lib/event_engine/forkable.cc +101 -0
  468. data/src/core/lib/event_engine/forkable.h +61 -0
  469. data/src/core/lib/event_engine/poller.h +54 -0
  470. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.cc → posix_engine/posix_engine.cc} +30 -47
  471. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.h → posix_engine/posix_engine.h} +27 -28
  472. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.cc +4 -5
  473. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.h +8 -8
  474. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.cc +4 -4
  475. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.h +5 -5
  476. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.cc +46 -10
  477. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.h +17 -8
  478. data/src/core/lib/event_engine/promise.h +11 -2
  479. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  480. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.cc → thread_pool.cc} +49 -14
  481. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.h → thread_pool.h} +21 -10
  482. data/src/core/lib/event_engine/utils.cc +49 -0
  483. data/src/core/lib/event_engine/utils.h +40 -0
  484. data/src/core/lib/event_engine/windows/iocp.cc +149 -0
  485. data/src/core/lib/event_engine/windows/iocp.h +68 -0
  486. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  487. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  488. data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
  489. data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
  490. data/src/core/lib/gpr/time.cc +11 -9
  491. data/src/core/lib/gpr/useful.h +29 -0
  492. data/src/core/lib/gprpp/bitset.h +3 -13
  493. data/src/core/lib/gprpp/debug_location.h +39 -7
  494. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  495. data/src/core/lib/gprpp/no_destruct.h +94 -0
  496. data/src/core/lib/gprpp/ref_counted_ptr.h +0 -1
  497. data/src/core/lib/gprpp/status_helper.cc +1 -0
  498. data/src/core/lib/gprpp/table.h +0 -1
  499. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.cc +3 -5
  500. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.h +5 -7
  501. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  502. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -27
  503. data/src/core/lib/http/httpcli.cc +12 -24
  504. data/src/core/lib/http/httpcli_security_connector.cc +11 -11
  505. data/src/core/lib/iomgr/call_combiner.cc +0 -26
  506. data/src/core/lib/iomgr/closure.h +0 -9
  507. data/src/core/lib/iomgr/combiner.cc +0 -20
  508. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  509. data/src/core/lib/iomgr/error.cc +0 -773
  510. data/src/core/lib/iomgr/error.h +0 -145
  511. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  512. data/src/core/lib/iomgr/ev_poll_posix.cc +17 -9
  513. data/src/core/lib/iomgr/exec_ctx.cc +0 -12
  514. data/src/core/lib/iomgr/executor.cc +0 -10
  515. data/src/core/lib/iomgr/executor.h +0 -3
  516. data/src/core/lib/iomgr/lockfree_event.cc +0 -17
  517. data/src/core/lib/iomgr/port.h +3 -0
  518. data/src/core/lib/iomgr/resolve_address.h +29 -6
  519. data/src/core/lib/iomgr/resolve_address_posix.cc +42 -8
  520. data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
  521. data/src/core/lib/iomgr/resolve_address_windows.cc +44 -10
  522. data/src/core/lib/iomgr/resolve_address_windows.h +19 -5
  523. data/src/core/lib/iomgr/socket_windows.h +0 -2
  524. data/src/core/lib/iomgr/tcp_posix.cc +118 -6
  525. data/src/core/lib/iomgr/timer_generic.cc +6 -8
  526. data/src/core/lib/json/json.h +19 -22
  527. data/src/core/lib/json/json_args.h +34 -0
  528. data/src/core/lib/json/json_object_loader.cc +233 -0
  529. data/src/core/lib/json/json_object_loader.h +618 -0
  530. data/src/core/lib/json/json_reader.cc +86 -62
  531. data/src/core/lib/json/json_util.cc +8 -36
  532. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +3 -44
  533. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +15 -24
  534. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  535. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.cc +49 -72
  536. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +27 -27
  537. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +6 -6
  538. data/src/core/lib/promise/activity.h +56 -8
  539. data/src/core/lib/promise/arena_promise.h +84 -81
  540. data/src/core/lib/promise/context.h +0 -1
  541. data/src/core/lib/promise/detail/basic_seq.h +43 -23
  542. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  543. data/src/core/lib/promise/map.h +0 -1
  544. data/src/core/lib/promise/seq.h +25 -4
  545. data/src/core/lib/promise/sleep.cc +38 -42
  546. data/src/core/lib/promise/sleep.h +27 -24
  547. data/src/core/lib/promise/try_seq.h +26 -6
  548. data/src/core/lib/resolver/resolver.cc +0 -47
  549. data/src/core/lib/resolver/resolver.h +2 -12
  550. data/src/core/lib/resolver/resolver_factory.h +2 -3
  551. data/src/core/lib/resolver/resolver_registry.cc +1 -1
  552. data/src/core/lib/resolver/resolver_registry.h +2 -3
  553. data/src/core/lib/resolver/server_address.cc +11 -15
  554. data/src/core/lib/resolver/server_address.h +4 -8
  555. data/src/core/lib/resource_quota/api.cc +1 -1
  556. data/src/core/lib/resource_quota/arena.cc +21 -1
  557. data/src/core/lib/resource_quota/arena.h +24 -2
  558. data/src/core/lib/resource_quota/memory_quota.cc +157 -17
  559. data/src/core/lib/resource_quota/memory_quota.h +98 -17
  560. data/src/core/lib/resource_quota/periodic_update.cc +79 -0
  561. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  562. data/src/core/lib/security/authorization/evaluate_args.cc +10 -7
  563. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  564. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  565. data/src/core/lib/security/authorization/matchers.cc +13 -10
  566. data/src/core/lib/security/authorization/rbac_policy.cc +0 -1
  567. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -3
  568. data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -4
  569. data/src/core/lib/security/credentials/composite/composite_credentials.cc +3 -7
  570. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -4
  571. data/src/core/lib/security/credentials/credentials.h +16 -12
  572. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -11
  573. data/src/core/lib/security/credentials/external/external_account_credentials.cc +32 -23
  574. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  575. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -6
  576. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -12
  577. data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -4
  578. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +29 -26
  579. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -3
  580. data/src/core/lib/security/credentials/iam/iam_credentials.cc +0 -1
  581. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +3 -3
  582. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -4
  583. data/src/core/lib/security/credentials/jwt/json_token.cc +12 -3
  584. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -8
  585. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -13
  586. data/src/core/lib/security/credentials/local/local_credentials.cc +3 -4
  587. data/src/core/lib/security/credentials/local/local_credentials.h +3 -4
  588. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -18
  589. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +0 -1
  590. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -21
  591. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -4
  592. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +6 -0
  593. data/src/core/lib/security/credentials/tls/tls_credentials.cc +13 -25
  594. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -4
  595. data/src/core/lib/security/credentials/xds/xds_credentials.cc +13 -30
  596. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  597. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -18
  598. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +26 -38
  599. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  600. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  601. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +6 -5
  602. data/src/core/lib/security/security_connector/local/local_security_connector.cc +13 -11
  603. data/src/core/lib/security/security_connector/local/local_security_connector.h +2 -2
  604. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  605. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -4
  606. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +5 -5
  607. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +5 -5
  608. data/src/core/lib/security/transport/auth_filters.h +1 -1
  609. data/src/core/lib/security/transport/client_auth_filter.cc +3 -4
  610. data/src/core/lib/security/transport/security_handshaker.cc +32 -44
  611. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  612. data/src/core/lib/service_config/service_config.h +11 -0
  613. data/src/core/lib/service_config/service_config_impl.cc +98 -97
  614. data/src/core/lib/service_config/service_config_impl.h +11 -13
  615. data/src/core/lib/service_config/service_config_parser.cc +26 -27
  616. data/src/core/lib/service_config/service_config_parser.h +10 -22
  617. data/src/core/lib/slice/percent_encoding.cc +4 -13
  618. data/src/core/lib/slice/slice.cc +10 -4
  619. data/src/core/lib/surface/call.cc +8 -2
  620. data/src/core/lib/surface/channel.cc +6 -6
  621. data/src/core/lib/surface/channel.h +1 -1
  622. data/src/core/lib/surface/completion_queue.cc +0 -2
  623. data/src/core/lib/surface/completion_queue.h +0 -3
  624. data/src/core/lib/surface/init.cc +2 -6
  625. data/src/core/lib/surface/lame_client.cc +2 -3
  626. data/src/core/lib/surface/lame_client.h +1 -1
  627. data/src/core/lib/surface/server.cc +7 -12
  628. data/src/core/lib/surface/server.h +7 -7
  629. data/src/core/lib/surface/validate_metadata.cc +4 -14
  630. data/src/core/lib/surface/version.cc +2 -2
  631. data/src/core/lib/transport/connectivity_state.cc +0 -1
  632. data/src/core/lib/transport/connectivity_state.h +1 -1
  633. data/src/core/lib/transport/error_utils.cc +0 -36
  634. data/src/core/lib/transport/handshaker.cc +7 -9
  635. data/src/core/lib/transport/handshaker.h +4 -5
  636. data/src/core/lib/transport/handshaker_factory.h +2 -3
  637. data/src/core/lib/transport/handshaker_registry.cc +2 -1
  638. data/src/core/lib/transport/handshaker_registry.h +2 -4
  639. data/src/core/lib/transport/http_connect_handshaker.cc +16 -16
  640. data/src/core/lib/transport/metadata_batch.cc +5 -0
  641. data/src/core/lib/transport/metadata_batch.h +52 -7
  642. data/src/core/lib/transport/parsed_metadata.h +0 -1
  643. data/src/core/lib/transport/tcp_connect_handshaker.cc +12 -18
  644. data/src/core/lib/transport/transport.h +0 -7
  645. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +40 -21
  646. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  647. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +14 -7
  648. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  649. data/src/core/tsi/fake_transport_security.cc +53 -30
  650. data/src/core/tsi/local_transport_security.cc +9 -5
  651. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +10 -1
  652. data/src/core/tsi/ssl_transport_security.cc +47 -23
  653. data/src/core/tsi/transport_security.cc +18 -6
  654. data/src/core/tsi/transport_security.h +2 -1
  655. data/src/core/tsi/transport_security_interface.h +17 -5
  656. data/src/ruby/ext/grpc/extconf.rb +2 -0
  657. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  658. data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
  659. data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
  660. data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
  661. data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
  662. data/src/ruby/lib/grpc/grpc_c.so +0 -0
  663. data/src/ruby/lib/grpc/version.rb +1 -1
  664. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  665. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  666. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  667. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  668. data/third_party/upb/upb/arena.c +277 -0
  669. data/third_party/upb/upb/arena.h +225 -0
  670. data/third_party/upb/upb/array.c +114 -0
  671. data/third_party/upb/upb/array.h +83 -0
  672. data/third_party/upb/upb/collections.h +36 -0
  673. data/third_party/upb/upb/decode.c +161 -65
  674. data/third_party/upb/upb/decode.h +1 -0
  675. data/third_party/upb/upb/decode_fast.c +1 -1
  676. data/third_party/upb/upb/def.c +10 -2
  677. data/third_party/upb/upb/def.h +8 -1
  678. data/third_party/upb/upb/def.hpp +7 -4
  679. data/third_party/upb/upb/encode.c +29 -20
  680. data/third_party/upb/upb/encode.h +16 -6
  681. data/third_party/upb/upb/extension_registry.c +93 -0
  682. data/third_party/upb/upb/extension_registry.h +84 -0
  683. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  684. data/third_party/upb/upb/internal/table.h +385 -0
  685. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  686. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  687. data/third_party/upb/upb/json_decode.c +1512 -0
  688. data/third_party/upb/upb/json_decode.h +47 -0
  689. data/third_party/upb/upb/json_encode.c +7 -3
  690. data/third_party/upb/upb/json_encode.h +6 -3
  691. data/third_party/upb/upb/map.c +108 -0
  692. data/third_party/upb/upb/map.h +117 -0
  693. data/third_party/upb/upb/message_value.h +66 -0
  694. data/third_party/upb/upb/mini_table.c +1147 -0
  695. data/third_party/upb/upb/mini_table.h +189 -0
  696. data/third_party/upb/upb/mini_table.hpp +112 -0
  697. data/third_party/upb/upb/msg.c +2 -62
  698. data/third_party/upb/upb/msg.h +2 -45
  699. data/third_party/upb/upb/msg_internal.h +28 -22
  700. data/third_party/upb/upb/port_def.inc +2 -1
  701. data/third_party/upb/upb/port_undef.inc +1 -0
  702. data/third_party/upb/upb/reflection.c +2 -159
  703. data/third_party/upb/upb/reflection.h +2 -112
  704. data/third_party/upb/upb/status.c +86 -0
  705. data/third_party/upb/upb/status.h +66 -0
  706. data/third_party/upb/upb/table.c +2 -2
  707. data/third_party/upb/upb/table_internal.h +3 -352
  708. data/third_party/upb/upb/text_encode.c +3 -2
  709. data/third_party/upb/upb/upb.c +4 -290
  710. data/third_party/upb/upb/upb.h +7 -196
  711. metadata +89 -38
  712. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
  713. data/src/core/lib/iomgr/error_internal.h +0 -66
  714. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  715. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  716. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  717. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  718. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  719. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  720. data/src/core/lib/promise/detail/switch.h +0 -1455
  721. data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
@@ -19,12 +19,11 @@
19
19
  #include "src/core/ext/xds/xds_client.h"
20
20
 
21
21
  #include <inttypes.h>
22
- #include <limits.h>
23
22
  #include <string.h>
24
23
 
25
24
  #include <algorithm>
26
25
 
27
- #include "absl/container/inlined_vector.h"
26
+ #include "absl/memory/memory.h"
28
27
  #include "absl/strings/match.h"
29
28
  #include "absl/strings/str_cat.h"
30
29
  #include "absl/strings/str_format.h"
@@ -32,52 +31,21 @@
32
31
  #include "absl/strings/str_split.h"
33
32
  #include "absl/strings/string_view.h"
34
33
  #include "absl/strings/strip.h"
34
+ #include "absl/types/optional.h"
35
+ #include "upb/arena.h"
35
36
 
36
- #include <grpc/byte_buffer.h>
37
- #include <grpc/byte_buffer_reader.h>
38
- #include <grpc/grpc.h>
39
- #include <grpc/impl/codegen/connectivity_state.h>
40
- #include <grpc/impl/codegen/propagation_bits.h>
41
- #include <grpc/slice.h>
42
- #include <grpc/status.h>
43
- #include <grpc/support/alloc.h>
37
+ #include <grpc/event_engine/event_engine.h>
44
38
  #include <grpc/support/log.h>
45
- #include <grpc/support/string_util.h>
46
- #include <grpc/support/time.h>
47
39
 
48
- #include "src/core/ext/filters/client_channel/client_channel.h"
49
- #include "src/core/ext/xds/upb_utils.h"
50
40
  #include "src/core/ext/xds/xds_api.h"
51
41
  #include "src/core/ext/xds/xds_bootstrap.h"
52
- #include "src/core/ext/xds/xds_channel_args.h"
53
42
  #include "src/core/ext/xds/xds_client_stats.h"
54
- #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
55
- #include "src/core/ext/xds/xds_http_filters.h"
56
43
  #include "src/core/lib/backoff/backoff.h"
57
- #include "src/core/lib/channel/channel_args.h"
58
- #include "src/core/lib/channel/channel_fwd.h"
59
- #include "src/core/lib/channel/channel_stack.h"
60
- #include "src/core/lib/config/core_configuration.h"
61
- #include "src/core/lib/gpr/env.h"
62
- #include "src/core/lib/gpr/useful.h"
44
+ #include "src/core/lib/event_engine/default_event_engine.h"
63
45
  #include "src/core/lib/gprpp/debug_location.h"
64
- #include "src/core/lib/gprpp/memory.h"
65
46
  #include "src/core/lib/gprpp/orphanable.h"
66
47
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
67
48
  #include "src/core/lib/gprpp/sync.h"
68
- #include "src/core/lib/iomgr/closure.h"
69
- #include "src/core/lib/iomgr/load_file.h"
70
- #include "src/core/lib/iomgr/pollset_set.h"
71
- #include "src/core/lib/iomgr/timer.h"
72
- #include "src/core/lib/security/credentials/channel_creds_registry.h"
73
- #include "src/core/lib/security/credentials/credentials.h"
74
- #include "src/core/lib/slice/slice.h"
75
- #include "src/core/lib/slice/slice_internal.h"
76
- #include "src/core/lib/slice/slice_refcount.h"
77
- #include "src/core/lib/surface/call.h"
78
- #include "src/core/lib/surface/channel.h"
79
- #include "src/core/lib/surface/lame_client.h"
80
- #include "src/core/lib/transport/connectivity_state.h"
81
49
  #include "src/core/lib/uri/uri_parser.h"
82
50
 
83
51
  #define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
@@ -88,19 +56,12 @@
88
56
 
89
57
  namespace grpc_core {
90
58
 
59
+ using ::grpc_event_engine::experimental::EventEngine;
60
+ using ::grpc_event_engine::experimental::GetDefaultEventEngine;
61
+
91
62
  TraceFlag grpc_xds_client_trace(false, "xds_client");
92
63
  TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
93
64
 
94
- namespace {
95
-
96
- Mutex* g_mu = nullptr;
97
-
98
- const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
99
- XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
100
- char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
101
-
102
- } // namespace
103
-
104
65
  //
105
66
  // Internal class declarations
106
67
  //
@@ -113,9 +74,12 @@ class XdsClient::ChannelState::RetryableCall
113
74
  public:
114
75
  explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
115
76
 
116
- void Orphan() override;
77
+ // Disable thread-safety analysis because this method is called via
78
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
79
+ // through there.
80
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
117
81
 
118
- void OnCallFinishedLocked();
82
+ void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
119
83
 
120
84
  T* calld() const { return calld_.get(); }
121
85
  ChannelState* chand() const { return chand_.get(); }
@@ -124,9 +88,9 @@ class XdsClient::ChannelState::RetryableCall
124
88
 
125
89
  private:
126
90
  void StartNewCallLocked();
127
- void StartRetryTimerLocked();
128
- static void OnRetryTimer(void* arg, grpc_error_handle error);
129
- void OnRetryTimerLocked(grpc_error_handle error);
91
+ void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
92
+
93
+ void OnRetryTimer();
130
94
 
131
95
  // The wrapped xds call that talks to the xds server. It's instantiated
132
96
  // every time we start a new call. It's null during call retry backoff.
@@ -136,9 +100,8 @@ class XdsClient::ChannelState::RetryableCall
136
100
 
137
101
  // Retry state.
138
102
  BackOff backoff_;
139
- grpc_timer retry_timer_;
140
- grpc_closure on_retry_timer_;
141
- bool retry_timer_callback_pending_ = false;
103
+ absl::optional<EventEngine::TaskHandle> timer_handle_
104
+ ABSL_GUARDED_BY(&XdsClient::mu_);
142
105
 
143
106
  bool shutting_down_ = false;
144
107
  };
@@ -149,7 +112,6 @@ class XdsClient::ChannelState::AdsCallState
149
112
  public:
150
113
  // The ctor and dtor should not be used directly.
151
114
  explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
152
- ~AdsCallState() override;
153
115
 
154
116
  void Orphan() override;
155
117
 
@@ -187,8 +149,7 @@ class XdsClient::ChannelState::AdsCallState
187
149
  absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
188
150
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
189
151
 
190
- void ParseResource(const XdsEncodingContext& context, size_t idx,
191
- absl::string_view type_url,
152
+ void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
192
153
  absl::string_view serialized_resource) override
193
154
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
194
155
 
@@ -205,12 +166,12 @@ class XdsClient::ChannelState::AdsCallState
205
166
  class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
206
167
  public:
207
168
  ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
208
- : type_(type), name_(name) {
209
- GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
210
- grpc_schedule_on_exec_ctx);
211
- }
169
+ : type_(type), name_(name) {}
212
170
 
213
- void Orphan() override {
171
+ // Disable thread-safety analysis because this method is called via
172
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
173
+ // through there.
174
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
214
175
  MaybeCancelTimer();
215
176
  Unref(DEBUG_LOCATION, "Orphan");
216
177
  }
@@ -230,15 +191,16 @@ class XdsClient::ChannelState::AdsCallState
230
191
  if (state.resource != nullptr) return;
231
192
  // Start timer.
232
193
  ads_calld_ = std::move(ads_calld);
233
- Ref(DEBUG_LOCATION, "timer").release();
234
- timer_pending_ = true;
235
- grpc_timer_init(
236
- &timer_,
237
- ExecCtx::Get()->Now() + ads_calld_->xds_client()->request_timeout_,
238
- &timer_callback_);
194
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(
195
+ ads_calld_->xds_client()->request_timeout_,
196
+ [self = Ref(DEBUG_LOCATION, "timer")]() {
197
+ ApplicationCallbackExecCtx callback_exec_ctx;
198
+ ExecCtx exec_ctx;
199
+ self->OnTimer();
200
+ });
239
201
  }
240
202
 
241
- void MaybeCancelTimer() {
203
+ void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
242
204
  // If the timer hasn't been started yet, make sure we don't start
243
205
  // it later. This can happen if the last watch for an LDS or CDS
244
206
  // resource is cancelled and then restarted, both while an ADS
@@ -251,65 +213,72 @@ class XdsClient::ChannelState::AdsCallState
251
213
  // For details, see https://github.com/grpc/grpc/issues/29583.
252
214
  // TODO(roth): Find a way to write a test for this case.
253
215
  timer_start_needed_ = false;
254
- if (timer_pending_) {
255
- grpc_timer_cancel(&timer_);
256
- timer_pending_ = false;
216
+ if (timer_handle_.has_value()) {
217
+ GetDefaultEventEngine()->Cancel(*timer_handle_);
218
+ timer_handle_.reset();
257
219
  }
258
220
  }
259
221
 
260
222
  private:
261
- static void OnTimer(void* arg, grpc_error_handle error) {
262
- ResourceTimer* self = static_cast<ResourceTimer*>(arg);
223
+ void OnTimer() {
263
224
  {
264
- MutexLock lock(&self->ads_calld_->xds_client()->mu_);
265
- self->OnTimerLocked(GRPC_ERROR_REF(error));
266
- }
267
- self->ads_calld_->xds_client()->work_serializer_.DrainQueue();
268
- self->ads_calld_.reset();
269
- self->Unref(DEBUG_LOCATION, "timer");
270
- }
271
-
272
- void OnTimerLocked(grpc_error_handle error)
273
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
274
- if (GRPC_ERROR_IS_NONE(error) && timer_pending_) {
275
- timer_pending_ = false;
276
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
277
- gpr_log(GPR_INFO,
278
- "[xds_client %p] xds server %s: timeout obtaining resource "
279
- "{type=%s name=%s} from xds server",
280
- ads_calld_->xds_client(),
281
- ads_calld_->chand()->server_.server_uri.c_str(),
282
- std::string(type_->type_url()).c_str(),
283
- XdsClient::ConstructFullXdsResourceName(
284
- name_.authority, type_->type_url(), name_.key)
285
- .c_str());
225
+ MutexLock lock(&ads_calld_->xds_client()->mu_);
226
+ if (timer_handle_.has_value()) {
227
+ timer_handle_.reset();
228
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
229
+ gpr_log(GPR_INFO,
230
+ "[xds_client %p] xds server %s: timeout obtaining resource "
231
+ "{type=%s name=%s} from xds server",
232
+ ads_calld_->xds_client(),
233
+ ads_calld_->chand()->server_.server_uri.c_str(),
234
+ std::string(type_->type_url()).c_str(),
235
+ XdsClient::ConstructFullXdsResourceName(
236
+ name_.authority, type_->type_url(), name_.key)
237
+ .c_str());
238
+ }
239
+ auto& authority_state =
240
+ ads_calld_->xds_client()->authority_state_map_[name_.authority];
241
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
242
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
243
+ ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
244
+ state.watchers);
286
245
  }
287
- auto& authority_state =
288
- ads_calld_->xds_client()->authority_state_map_[name_.authority];
289
- ResourceState& state = authority_state.resource_map[type_][name_.key];
290
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
291
- ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
292
- state.watchers);
293
246
  }
294
- GRPC_ERROR_UNREF(error);
247
+ ads_calld_->xds_client()->work_serializer_.DrainQueue();
248
+ ads_calld_.reset();
295
249
  }
296
250
 
297
251
  const XdsResourceType* type_;
298
252
  const XdsResourceName name_;
299
253
 
300
254
  RefCountedPtr<AdsCallState> ads_calld_;
301
- bool timer_start_needed_ = true;
302
- bool timer_pending_ = false;
303
- grpc_timer timer_;
304
- grpc_closure timer_callback_;
255
+ bool timer_start_needed_ ABSL_GUARDED_BY(&XdsClient::mu_) = true;
256
+ absl::optional<EventEngine::TaskHandle> timer_handle_
257
+ ABSL_GUARDED_BY(&XdsClient::mu_);
305
258
  };
306
259
 
307
- struct ResourceTypeState {
308
- ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
260
+ class StreamEventHandler
261
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
262
+ public:
263
+ explicit StreamEventHandler(RefCountedPtr<AdsCallState> ads_calld)
264
+ : ads_calld_(std::move(ads_calld)) {}
309
265
 
310
- // Nonce and error for this resource type.
266
+ void OnRequestSent(bool ok) override { ads_calld_->OnRequestSent(ok); }
267
+ void OnRecvMessage(absl::string_view payload) override {
268
+ ads_calld_->OnRecvMessage(payload);
269
+ }
270
+ void OnStatusReceived(absl::Status status) override {
271
+ ads_calld_->OnStatusReceived(std::move(status));
272
+ }
273
+
274
+ private:
275
+ RefCountedPtr<AdsCallState> ads_calld_;
276
+ };
277
+
278
+ struct ResourceTypeState {
279
+ // Nonce and status for this resource type.
311
280
  std::string nonce;
312
- grpc_error_handle error = GRPC_ERROR_NONE;
281
+ absl::Status status;
313
282
 
314
283
  // Subscribed resources of this type.
315
284
  std::map<std::string /*authority*/,
@@ -320,15 +289,9 @@ class XdsClient::ChannelState::AdsCallState
320
289
  void SendMessageLocked(const XdsResourceType* type)
321
290
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
322
291
 
323
- static void OnRequestSent(void* arg, grpc_error_handle error);
324
- void OnRequestSentLocked(grpc_error_handle error)
325
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
326
- static void OnResponseReceived(void* arg, grpc_error_handle error);
327
- bool OnResponseReceivedLocked()
328
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
329
- static void OnStatusReceived(void* arg, grpc_error_handle error);
330
- void OnStatusReceivedLocked(grpc_error_handle error)
331
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
292
+ void OnRequestSent(bool ok);
293
+ void OnRecvMessage(absl::string_view payload);
294
+ void OnStatusReceived(absl::Status status);
332
295
 
333
296
  bool IsCurrentCallOnChannel() const;
334
297
 
@@ -340,28 +303,11 @@ class XdsClient::ChannelState::AdsCallState
340
303
  // The owning RetryableCall<>.
341
304
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
342
305
 
306
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
307
+
343
308
  bool sent_initial_message_ = false;
344
309
  bool seen_response_ = false;
345
-
346
- // Always non-NULL.
347
- grpc_call* call_;
348
-
349
- // recv_initial_metadata
350
- grpc_metadata_array initial_metadata_recv_;
351
-
352
- // send_message
353
- grpc_byte_buffer* send_message_payload_ = nullptr;
354
- grpc_closure on_request_sent_;
355
-
356
- // recv_message
357
- grpc_byte_buffer* recv_message_payload_ = nullptr;
358
- grpc_closure on_response_received_;
359
-
360
- // recv_trailing_metadata
361
- grpc_metadata_array trailing_metadata_recv_;
362
- grpc_status_code status_code_;
363
- grpc_slice status_details_;
364
- grpc_closure on_status_received_;
310
+ bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
365
311
 
366
312
  // Resource types for which requests need to be sent.
367
313
  std::set<const XdsResourceType*> buffered_requests_;
@@ -376,11 +322,11 @@ class XdsClient::ChannelState::LrsCallState
376
322
  public:
377
323
  // The ctor and dtor should not be used directly.
378
324
  explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
379
- ~LrsCallState() override;
380
325
 
381
326
  void Orphan() override;
382
327
 
383
- void MaybeStartReportingLocked();
328
+ void MaybeStartReportingLocked()
329
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
384
330
 
385
331
  RetryableCall<LrsCallState>* parent() { return parent_.get(); }
386
332
  ChannelState* chand() const { return parent_->chand(); }
@@ -388,30 +334,44 @@ class XdsClient::ChannelState::LrsCallState
388
334
  bool seen_response() const { return seen_response_; }
389
335
 
390
336
  private:
337
+ class StreamEventHandler
338
+ : public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
339
+ public:
340
+ explicit StreamEventHandler(RefCountedPtr<LrsCallState> lrs_calld)
341
+ : lrs_calld_(std::move(lrs_calld)) {}
342
+
343
+ void OnRequestSent(bool ok) override { lrs_calld_->OnRequestSent(ok); }
344
+ void OnRecvMessage(absl::string_view payload) override {
345
+ lrs_calld_->OnRecvMessage(payload);
346
+ }
347
+ void OnStatusReceived(absl::Status status) override {
348
+ lrs_calld_->OnStatusReceived(std::move(status));
349
+ }
350
+
351
+ private:
352
+ RefCountedPtr<LrsCallState> lrs_calld_;
353
+ };
354
+
391
355
  // Reports client-side load stats according to a fixed interval.
392
356
  class Reporter : public InternallyRefCounted<Reporter> {
393
357
  public:
394
358
  Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
395
359
  : parent_(std::move(parent)), report_interval_(report_interval) {
396
- GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
397
- grpc_schedule_on_exec_ctx);
398
- GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
399
- grpc_schedule_on_exec_ctx);
400
360
  ScheduleNextReportLocked();
401
361
  }
402
362
 
403
- void Orphan() override;
363
+ // Disable thread-safety analysis because this method is called via
364
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
365
+ // through there.
366
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
367
+
368
+ void OnReportDoneLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
404
369
 
405
370
  private:
406
371
  void ScheduleNextReportLocked()
407
372
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
408
- static void OnNextReportTimer(void* arg, grpc_error_handle error);
409
- bool OnNextReportTimerLocked(grpc_error_handle error)
410
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
373
+ bool OnNextReportTimer();
411
374
  bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
412
- static void OnReportDone(void* arg, grpc_error_handle error);
413
- bool OnReportDoneLocked(grpc_error_handle error)
414
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
415
375
 
416
376
  bool IsCurrentReporterOnCall() const {
417
377
  return this == parent_->reporter_.get();
@@ -424,47 +384,23 @@ class XdsClient::ChannelState::LrsCallState
424
384
  // The load reporting state.
425
385
  const Duration report_interval_;
426
386
  bool last_report_counters_were_zero_ = false;
427
- bool next_report_timer_callback_pending_ = false;
428
- grpc_timer next_report_timer_;
429
- grpc_closure on_next_report_timer_;
430
- grpc_closure on_report_done_;
387
+ absl::optional<EventEngine::TaskHandle> timer_handle_
388
+ ABSL_GUARDED_BY(&XdsClient::mu_);
431
389
  };
432
390
 
433
- static void OnInitialRequestSent(void* arg, grpc_error_handle error);
434
- void OnInitialRequestSentLocked()
435
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
436
- static void OnResponseReceived(void* arg, grpc_error_handle error);
437
- bool OnResponseReceivedLocked()
438
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
439
- static void OnStatusReceived(void* arg, grpc_error_handle error);
440
- void OnStatusReceivedLocked(grpc_error_handle error)
441
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
391
+ void OnRequestSent(bool ok);
392
+ void OnRecvMessage(absl::string_view payload);
393
+ void OnStatusReceived(absl::Status status);
442
394
 
443
395
  bool IsCurrentCallOnChannel() const;
444
396
 
445
397
  // The owning RetryableCall<>.
446
398
  RefCountedPtr<RetryableCall<LrsCallState>> parent_;
447
- bool seen_response_ = false;
448
399
 
449
- // Always non-NULL.
450
- grpc_call* call_;
400
+ OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
451
401
 
452
- // recv_initial_metadata
453
- grpc_metadata_array initial_metadata_recv_;
454
-
455
- // send_message
456
- grpc_byte_buffer* send_message_payload_ = nullptr;
457
- grpc_closure on_initial_request_sent_;
458
-
459
- // recv_message
460
- grpc_byte_buffer* recv_message_payload_ = nullptr;
461
- grpc_closure on_response_received_;
462
-
463
- // recv_trailing_metadata
464
- grpc_metadata_array trailing_metadata_recv_;
465
- grpc_status_code status_code_;
466
- grpc_slice status_details_;
467
- grpc_closure on_status_received_;
402
+ bool seen_response_ = false;
403
+ bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
468
404
 
469
405
  // Load reporting state.
470
406
  bool send_all_clusters_ = false;
@@ -473,58 +409,10 @@ class XdsClient::ChannelState::LrsCallState
473
409
  OrphanablePtr<Reporter> reporter_;
474
410
  };
475
411
 
476
- //
477
- // XdsClient::ChannelState::StateWatcher
478
- //
479
-
480
- class XdsClient::ChannelState::StateWatcher
481
- : public AsyncConnectivityStateWatcherInterface {
482
- public:
483
- explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
484
- : parent_(std::move(parent)) {}
485
-
486
- private:
487
- void OnConnectivityStateChange(grpc_connectivity_state new_state,
488
- const absl::Status& status) override {
489
- {
490
- MutexLock lock(&parent_->xds_client_->mu_);
491
- if (!parent_->shutting_down_ &&
492
- new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
493
- // In TRANSIENT_FAILURE. Notify all watchers of error.
494
- gpr_log(GPR_INFO,
495
- "[xds_client %p] xds channel for server %s in "
496
- "state TRANSIENT_FAILURE: %s",
497
- parent_->xds_client(), parent_->server_.server_uri.c_str(),
498
- status.ToString().c_str());
499
- parent_->xds_client_->NotifyOnErrorLocked(
500
- absl::UnavailableError(absl::StrCat(
501
- "xds channel in TRANSIENT_FAILURE, connectivity error: ",
502
- status.ToString())));
503
- }
504
- }
505
- parent_->xds_client()->work_serializer_.DrainQueue();
506
- }
507
-
508
- WeakRefCountedPtr<ChannelState> parent_;
509
- };
510
-
511
412
  //
512
413
  // XdsClient::ChannelState
513
414
  //
514
415
 
515
- namespace {
516
-
517
- grpc_channel* CreateXdsChannel(grpc_channel_args* args,
518
- const XdsBootstrap::XdsServer& server) {
519
- RefCountedPtr<grpc_channel_credentials> channel_creds =
520
- CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
521
- server.channel_creds_type, server.channel_creds_config);
522
- return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
523
- args);
524
- }
525
-
526
- } // namespace
527
-
528
416
  XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
529
417
  const XdsBootstrap::XdsServer& server)
530
418
  : DualRefCounted<ChannelState>(
@@ -537,9 +425,16 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
537
425
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
538
426
  xds_client_.get(), server.server_uri.c_str());
539
427
  }
540
- channel_ = CreateXdsChannel(xds_client_->args_, server);
541
- GPR_ASSERT(channel_ != nullptr);
542
- StartConnectivityWatchLocked();
428
+ absl::Status status;
429
+ transport_ = xds_client_->transport_factory_->Create(
430
+ server,
431
+ [self = WeakRef(DEBUG_LOCATION, "OnConnectivityFailure")](
432
+ absl::Status status) {
433
+ self->OnConnectivityStateChange(std::move(status));
434
+ },
435
+ &status);
436
+ GPR_ASSERT(transport_ != nullptr);
437
+ if (!status.ok()) OnConnectivityStateChangeLocked(std::move(status));
543
438
  }
544
439
 
545
440
  XdsClient::ChannelState::~ChannelState() {
@@ -547,25 +442,26 @@ XdsClient::ChannelState::~ChannelState() {
547
442
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
548
443
  xds_client(), this, server_.server_uri.c_str());
549
444
  }
550
- grpc_channel_destroy(channel_);
551
445
  xds_client_.reset(DEBUG_LOCATION, "ChannelState");
552
446
  }
553
447
 
554
448
  // This method should only ever be called when holding the lock, but we can't
555
449
  // use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
556
- // called from DualRefCounted::Unref, which cannot have a lock annotation for a
557
- // lock in this subclass.
450
+ // called from DualRefCounted::Unref, which cannot have a lock annotation for
451
+ // a lock in this subclass.
558
452
  void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
559
453
  shutting_down_ = true;
560
- CancelConnectivityWatchLocked();
454
+ transport_.reset();
561
455
  // At this time, all strong refs are removed, remove from channel map to
562
- // prevent subsequent subscription from trying to use this ChannelState as it
563
- // is shutting down.
456
+ // prevent subsequent subscription from trying to use this ChannelState as
457
+ // it is shutting down.
564
458
  xds_client_->xds_server_channel_map_.erase(server_);
565
459
  ads_calld_.reset();
566
460
  lrs_calld_.reset();
567
461
  }
568
462
 
463
+ void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
464
+
569
465
  XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
570
466
  const {
571
467
  return ads_calld_->calld();
@@ -591,41 +487,6 @@ void XdsClient::ChannelState::StopLrsCallLocked() {
591
487
  lrs_calld_.reset();
592
488
  }
593
489
 
594
- namespace {
595
-
596
- bool IsLameChannel(grpc_channel* channel) {
597
- grpc_channel_element* elem =
598
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
599
- return elem->filter == &LameClientFilter::kFilter;
600
- }
601
-
602
- } // namespace
603
-
604
- void XdsClient::ChannelState::StartConnectivityWatchLocked() {
605
- if (IsLameChannel(channel_)) {
606
- xds_client()->NotifyOnErrorLocked(
607
- absl::UnavailableError("xds client has a lame channel"));
608
- return;
609
- }
610
- ClientChannel* client_channel =
611
- ClientChannel::GetFromChannel(Channel::FromC(channel_));
612
- GPR_ASSERT(client_channel != nullptr);
613
- watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
614
- client_channel->AddConnectivityWatcher(
615
- GRPC_CHANNEL_IDLE,
616
- OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
617
- }
618
-
619
- void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
620
- if (IsLameChannel(channel_)) {
621
- return;
622
- }
623
- ClientChannel* client_channel =
624
- ClientChannel::GetFromChannel(Channel::FromC(channel_));
625
- GPR_ASSERT(client_channel != nullptr);
626
- client_channel->RemoveConnectivityWatcher(watcher_);
627
- }
628
-
629
490
  void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
630
491
  const XdsResourceName& name) {
631
492
  if (ads_calld_ == nullptr) {
@@ -658,6 +519,29 @@ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
658
519
  }
659
520
  }
660
521
 
522
+ void XdsClient::ChannelState::OnConnectivityStateChange(absl::Status status) {
523
+ {
524
+ MutexLock lock(&xds_client_->mu_);
525
+ OnConnectivityStateChangeLocked(std::move(status));
526
+ }
527
+ xds_client_->work_serializer_.DrainQueue();
528
+ }
529
+
530
+ void XdsClient::ChannelState::OnConnectivityStateChangeLocked(
531
+ absl::Status status) {
532
+ if (!shutting_down_) {
533
+ // Notify all watchers of error.
534
+ gpr_log(GPR_INFO,
535
+ "[xds_client %p] xds channel for server %s in "
536
+ "state TRANSIENT_FAILURE: %s",
537
+ xds_client(), server_.server_uri.c_str(),
538
+ status.ToString().c_str());
539
+ xds_client_->NotifyOnErrorLocked(absl::UnavailableError(
540
+ absl::StrCat("xds channel in TRANSIENT_FAILURE, connectivity error: ",
541
+ status.ToString())));
542
+ }
543
+ }
544
+
661
545
  //
662
546
  // XdsClient::ChannelState::RetryableCall<>
663
547
  //
@@ -673,9 +557,6 @@ XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
673
557
  .set_jitter(GRPC_XDS_RECONNECT_JITTER)
674
558
  .set_max_backoff(Duration::Seconds(
675
559
  GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
676
- // Closure Initialization
677
- GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
678
- grpc_schedule_on_exec_ctx);
679
560
  StartNewCallLocked();
680
561
  }
681
562
 
@@ -683,7 +564,10 @@ template <typename T>
683
564
  void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
684
565
  shutting_down_ = true;
685
566
  calld_.reset();
686
- if (retry_timer_callback_pending_) grpc_timer_cancel(&retry_timer_);
567
+ if (timer_handle_.has_value()) {
568
+ GetDefaultEventEngine()->Cancel(*timer_handle_);
569
+ timer_handle_.reset();
570
+ }
687
571
  this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
688
572
  }
689
573
 
@@ -699,13 +583,13 @@ void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
699
583
  template <typename T>
700
584
  void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
701
585
  if (shutting_down_) return;
702
- GPR_ASSERT(chand_->channel_ != nullptr);
586
+ GPR_ASSERT(chand_->transport_ != nullptr);
703
587
  GPR_ASSERT(calld_ == nullptr);
704
588
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
705
- gpr_log(
706
- GPR_INFO,
707
- "[xds_client %p] xds server %s: start new call from retryable call %p",
708
- chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
589
+ gpr_log(GPR_INFO,
590
+ "[xds_client %p] xds server %s: start new call from retryable "
591
+ "call %p",
592
+ chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
709
593
  }
710
594
  calld_ = MakeOrphanable<T>(
711
595
  this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
@@ -715,36 +599,30 @@ template <typename T>
715
599
  void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
716
600
  if (shutting_down_) return;
717
601
  const Timestamp next_attempt_time = backoff_.NextAttemptTime();
602
+ const Duration timeout =
603
+ std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
718
604
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
719
- Duration timeout =
720
- std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
721
605
  gpr_log(GPR_INFO,
722
606
  "[xds_client %p] xds server %s: call attempt failed; "
723
607
  "retry timer will fire in %" PRId64 "ms.",
724
608
  chand()->xds_client(), chand()->server_.server_uri.c_str(),
725
609
  timeout.millis());
726
610
  }
727
- this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
728
- grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
729
- retry_timer_callback_pending_ = true;
730
- }
731
-
732
- template <typename T>
733
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
734
- void* arg, grpc_error_handle error) {
735
- RetryableCall* calld = static_cast<RetryableCall*>(arg);
736
- {
737
- MutexLock lock(&calld->chand_->xds_client()->mu_);
738
- calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
739
- }
740
- calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
611
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(
612
+ timeout,
613
+ [self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
614
+ ApplicationCallbackExecCtx callback_exec_ctx;
615
+ ExecCtx exec_ctx;
616
+ self->OnRetryTimer();
617
+ });
741
618
  }
742
619
 
743
620
  template <typename T>
744
- void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
745
- grpc_error_handle error) {
746
- retry_timer_callback_pending_ = false;
747
- if (!shutting_down_ && GRPC_ERROR_IS_NONE(error)) {
621
+ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer() {
622
+ MutexLock lock(&chand_->xds_client()->mu_);
623
+ if (timer_handle_.has_value()) {
624
+ timer_handle_.reset();
625
+ if (shutting_down_) return;
748
626
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
749
627
  gpr_log(GPR_INFO,
750
628
  "[xds_client %p] xds server %s: retry timer fired (retryable "
@@ -753,7 +631,6 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
753
631
  }
754
632
  StartNewCallLocked();
755
633
  }
756
- GRPC_ERROR_UNREF(error);
757
634
  }
758
635
 
759
636
  //
@@ -811,7 +688,7 @@ void UpdateResourceMetadataNacked(const std::string& version,
811
688
  } // namespace
812
689
 
813
690
  void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
814
- const XdsEncodingContext& context, size_t idx, absl::string_view type_url,
691
+ upb_Arena* arena, size_t idx, absl::string_view type_url,
815
692
  absl::string_view serialized_resource) {
816
693
  // Check the type_url of the resource.
817
694
  bool is_v2 = false;
@@ -822,6 +699,9 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
822
699
  return;
823
700
  }
824
701
  // Parse the resource.
702
+ XdsResourceType::DecodeContext context = {
703
+ xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
704
+ xds_client()->symtab_.ptr(), arena};
825
705
  absl::StatusOr<XdsResourceType::DecodeResult> result =
826
706
  result_.type->Decode(context, serialized_resource, is_v2);
827
707
  if (!result.ok()) {
@@ -941,51 +821,30 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
941
821
  ? "AdsCallState"
942
822
  : nullptr),
943
823
  parent_(std::move(parent)) {
944
- // Init the ADS call. Note that the call will progress every time there's
945
- // activity in xds_client()->interested_parties_, which is comprised of
946
- // the polling entities from client_channel.
947
824
  GPR_ASSERT(xds_client() != nullptr);
948
- // Create a call with the specified method name.
825
+ // Init the ADS call.
949
826
  const char* method =
950
827
  chand()->server_.ShouldUseV3()
951
828
  ? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
952
829
  "StreamAggregatedResources"
953
830
  : "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
954
831
  "StreamAggregatedResources";
955
- call_ = grpc_channel_create_pollset_set_call(
956
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
957
- xds_client()->interested_parties_,
958
- StaticSlice::FromStaticString(method).c_slice(), nullptr,
959
- Timestamp::InfFuture(), nullptr);
832
+ call_ = chand()->transport_->CreateStreamingCall(
833
+ method, absl::make_unique<StreamEventHandler>(
834
+ // Passing the initial ref here. This ref will go away when
835
+ // the StreamEventHandler is destroyed.
836
+ RefCountedPtr<AdsCallState>(this)));
960
837
  GPR_ASSERT(call_ != nullptr);
961
- // Init data associated with the call.
962
- grpc_metadata_array_init(&initial_metadata_recv_);
963
- grpc_metadata_array_init(&trailing_metadata_recv_);
964
838
  // Start the call.
965
839
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
966
840
  gpr_log(GPR_INFO,
967
841
  "[xds_client %p] xds server %s: starting ADS call "
968
842
  "(calld: %p, call: %p)",
969
- xds_client(), chand()->server_.server_uri.c_str(), this, call_);
970
- }
971
- // Create the ops.
972
- grpc_call_error call_error;
973
- grpc_op ops[3];
974
- memset(ops, 0, sizeof(ops));
975
- // Op: send initial metadata.
976
- grpc_op* op = ops;
977
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
978
- op->data.send_initial_metadata.count = 0;
979
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
980
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
981
- op->reserved = nullptr;
982
- op++;
983
- call_error = grpc_call_start_batch_and_execute(
984
- call_, ops, static_cast<size_t>(op - ops), nullptr);
985
- GPR_ASSERT(GRPC_CALL_OK == call_error);
986
- // Op: send request message.
987
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
988
- grpc_schedule_on_exec_ctx);
843
+ xds_client(), chand()->server_.server_uri.c_str(), this,
844
+ call_.get());
845
+ }
846
+ // If this is a reconnect, add any necessary subscriptions from what's
847
+ // already in the cache.
989
848
  for (const auto& a : xds_client()->authority_state_map_) {
990
849
  const std::string& authority = a.first;
991
850
  // Skip authorities that are not using this xDS channel.
@@ -998,86 +857,34 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
998
857
  }
999
858
  }
1000
859
  }
860
+ // Send initial message if we added any subscriptions above.
1001
861
  for (const auto& p : state_map_) {
1002
862
  SendMessageLocked(p.first);
1003
863
  }
1004
- // Op: recv initial metadata.
1005
- op = ops;
1006
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
1007
- op->data.recv_initial_metadata.recv_initial_metadata =
1008
- &initial_metadata_recv_;
1009
- op->flags = 0;
1010
- op->reserved = nullptr;
1011
- op++;
1012
- // Op: recv response.
1013
- op->op = GRPC_OP_RECV_MESSAGE;
1014
- op->data.recv_message.recv_message = &recv_message_payload_;
1015
- op->flags = 0;
1016
- op->reserved = nullptr;
1017
- op++;
1018
- Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
1019
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1020
- grpc_schedule_on_exec_ctx);
1021
- call_error = grpc_call_start_batch_and_execute(
1022
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1023
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1024
- // Op: recv server status.
1025
- op = ops;
1026
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
1027
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
1028
- op->data.recv_status_on_client.status = &status_code_;
1029
- op->data.recv_status_on_client.status_details = &status_details_;
1030
- op->flags = 0;
1031
- op->reserved = nullptr;
1032
- op++;
1033
- // This callback signals the end of the call, so it relies on the initial
1034
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
1035
- // unreffed.
1036
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1037
- grpc_schedule_on_exec_ctx);
1038
- call_error = grpc_call_start_batch_and_execute(
1039
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1040
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1041
- }
1042
-
1043
- XdsClient::ChannelState::AdsCallState::~AdsCallState() {
1044
- grpc_metadata_array_destroy(&initial_metadata_recv_);
1045
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
1046
- grpc_byte_buffer_destroy(send_message_payload_);
1047
- grpc_byte_buffer_destroy(recv_message_payload_);
1048
- grpc_slice_unref_internal(status_details_);
1049
- GPR_ASSERT(call_ != nullptr);
1050
- grpc_call_unref(call_);
1051
864
  }
1052
865
 
1053
866
  void XdsClient::ChannelState::AdsCallState::Orphan() {
1054
- GPR_ASSERT(call_ != nullptr);
1055
- // If we are here because xds_client wants to cancel the call,
1056
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
1057
- // we are here because xds_client has to orphan a failed call, then the
1058
- // following cancellation will be a no-op.
1059
- grpc_call_cancel_internal(call_);
1060
867
  state_map_.clear();
1061
- // Note that the initial ref is hold by on_status_received_. So the
1062
- // corresponding unref happens in on_status_received_ instead of here.
868
+ // Note that the initial ref is held by the StreamEventHandler, which
869
+ // will be destroyed when call_ is destroyed, which may not happen
870
+ // here, since there may be other refs held to call_ by internal callbacks.
871
+ call_.reset();
1063
872
  }
1064
873
 
1065
874
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
1066
875
  const XdsResourceType* type)
1067
876
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
1068
877
  // Buffer message sending if an existing message is in flight.
1069
- if (send_message_payload_ != nullptr) {
878
+ if (send_message_pending_) {
1070
879
  buffered_requests_.insert(type);
1071
880
  return;
1072
881
  }
1073
882
  auto& state = state_map_[type];
1074
- grpc_slice request_payload_slice;
1075
- request_payload_slice = xds_client()->api_.CreateAdsRequest(
883
+ std::string serialized_message = xds_client()->api_.CreateAdsRequest(
1076
884
  chand()->server_,
1077
885
  chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
1078
886
  chand()->resource_type_version_map_[type], state.nonce,
1079
- ResourceNamesForRequest(type), GRPC_ERROR_REF(state.error),
1080
- !sent_initial_message_);
887
+ ResourceNamesForRequest(type), state.status, !sent_initial_message_);
1081
888
  sent_initial_message_ = true;
1082
889
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1083
890
  gpr_log(GPR_INFO,
@@ -1086,32 +893,11 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
1086
893
  xds_client(), chand()->server_.server_uri.c_str(),
1087
894
  std::string(type->type_url()).c_str(),
1088
895
  chand()->resource_type_version_map_[type].c_str(),
1089
- state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
1090
- }
1091
- GRPC_ERROR_UNREF(state.error);
1092
- state.error = GRPC_ERROR_NONE;
1093
- // Create message payload.
1094
- send_message_payload_ =
1095
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1096
- grpc_slice_unref_internal(request_payload_slice);
1097
- // Send the message.
1098
- grpc_op op;
1099
- memset(&op, 0, sizeof(op));
1100
- op.op = GRPC_OP_SEND_MESSAGE;
1101
- op.data.send_message.send_message = send_message_payload_;
1102
- Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
1103
- GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
1104
- grpc_schedule_on_exec_ctx);
1105
- grpc_call_error call_error =
1106
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
1107
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1108
- gpr_log(GPR_ERROR,
1109
- "[xds_client %p] xds server %s: error starting ADS send_message "
1110
- "batch on calld=%p: call_error=%d",
1111
- xds_client(), chand()->server_.server_uri.c_str(), this,
1112
- call_error);
1113
- GPR_ASSERT(GRPC_CALL_OK == call_error);
896
+ state.nonce.c_str(), state.status.ToString().c_str());
1114
897
  }
898
+ state.status = absl::OkStatus();
899
+ call_->SendMessage(std::move(serialized_message));
900
+ send_message_pending_ = true;
1115
901
  }
1116
902
 
1117
903
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
@@ -1142,22 +928,10 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
1142
928
  return false;
1143
929
  }
1144
930
 
1145
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1146
- void* arg, grpc_error_handle error) {
1147
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1148
- {
1149
- MutexLock lock(&ads_calld->xds_client()->mu_);
1150
- ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
1151
- }
1152
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1153
- }
1154
-
1155
- void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1156
- grpc_error_handle error) {
1157
- if (IsCurrentCallOnChannel() && GRPC_ERROR_IS_NONE(error)) {
1158
- // Clean up the sent message.
1159
- grpc_byte_buffer_destroy(send_message_payload_);
1160
- send_message_payload_ = nullptr;
931
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
932
+ MutexLock lock(&xds_client()->mu_);
933
+ send_message_pending_ = false;
934
+ if (ok && IsCurrentCallOnChannel()) {
1161
935
  // Continue to send another pending message if any.
1162
936
  // TODO(roth): The current code to handle buffered messages has the
1163
937
  // advantage of sending only the most recent list of resource names for
@@ -1173,184 +947,135 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1173
947
  buffered_requests_.erase(it);
1174
948
  }
1175
949
  }
1176
- GRPC_ERROR_UNREF(error);
1177
950
  }
1178
951
 
1179
- void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1180
- void* arg, grpc_error_handle /* error */) {
1181
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1182
- bool done;
952
+ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
953
+ absl::string_view payload) {
1183
954
  {
1184
- MutexLock lock(&ads_calld->xds_client()->mu_);
1185
- done = ads_calld->OnResponseReceivedLocked();
1186
- }
1187
- ads_calld->xds_client()->work_serializer_.DrainQueue();
1188
- if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1189
- }
1190
-
1191
- bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1192
- // Empty payload means the call was cancelled.
1193
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1194
- return true;
1195
- }
1196
- // Read the response.
1197
- grpc_byte_buffer_reader bbr;
1198
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1199
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1200
- grpc_byte_buffer_reader_destroy(&bbr);
1201
- grpc_byte_buffer_destroy(recv_message_payload_);
1202
- recv_message_payload_ = nullptr;
1203
- // Parse and validate the response.
1204
- AdsResponseParser parser(this);
1205
- absl::Status status = xds_client()->api_.ParseAdsResponse(
1206
- chand()->server_, response_slice, &parser);
1207
- grpc_slice_unref_internal(response_slice);
1208
- if (!status.ok()) {
1209
- // Ignore unparsable response.
1210
- gpr_log(GPR_ERROR,
1211
- "[xds_client %p] xds server %s: error parsing ADS response (%s) "
1212
- "-- ignoring",
1213
- xds_client(), chand()->server_.server_uri.c_str(),
1214
- status.ToString().c_str());
1215
- } else {
1216
- seen_response_ = true;
1217
- AdsResponseParser::Result result = parser.TakeResult();
1218
- // Update nonce.
1219
- auto& state = state_map_[result.type];
1220
- state.nonce = result.nonce;
1221
- // If we got an error, set state.error so that we'll NACK the update.
1222
- if (!result.errors.empty()) {
1223
- std::string error = absl::StrJoin(result.errors, "; ");
1224
- gpr_log(
1225
- GPR_ERROR,
1226
- "[xds_client %p] xds server %s: ADS response invalid for resource "
1227
- "type %s version %s, will NACK: nonce=%s error=%s",
1228
- xds_client(), chand()->server_.server_uri.c_str(),
1229
- result.type_url.c_str(), result.version.c_str(), state.nonce.c_str(),
1230
- error.c_str());
1231
- GRPC_ERROR_UNREF(state.error);
1232
- state.error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(error),
1233
- GRPC_ERROR_INT_GRPC_STATUS,
1234
- GRPC_STATUS_UNAVAILABLE);
1235
- }
1236
- // Delete resources not seen in update if needed.
1237
- if (result.type->AllResourcesRequiredInSotW()) {
1238
- for (auto& a : xds_client()->authority_state_map_) {
1239
- const std::string& authority = a.first;
1240
- AuthorityState& authority_state = a.second;
1241
- // Skip authorities that are not using this xDS channel.
1242
- if (authority_state.channel_state != chand()) continue;
1243
- auto seen_authority_it = result.resources_seen.find(authority);
1244
- // Find this resource type.
1245
- auto type_it = authority_state.resource_map.find(result.type);
1246
- if (type_it == authority_state.resource_map.end()) continue;
1247
- // Iterate over resource ids.
1248
- for (auto& r : type_it->second) {
1249
- const XdsResourceKey& resource_key = r.first;
1250
- ResourceState& resource_state = r.second;
1251
- if (seen_authority_it == result.resources_seen.end() ||
1252
- seen_authority_it->second.find(resource_key) ==
1253
- seen_authority_it->second.end()) {
1254
- // If the resource was newly requested but has not yet been
1255
- // received, we don't want to generate an error for the watchers,
1256
- // because this ADS response may be in reaction to an earlier
1257
- // request that did not yet request the new resource, so its absence
1258
- // from the response does not necessarily indicate that the resource
1259
- // does not exist. For that case, we rely on the request timeout
1260
- // instead.
1261
- if (resource_state.resource == nullptr) continue;
1262
- if (chand()->server_.IgnoreResourceDeletion()) {
1263
- if (!resource_state.ignored_deletion) {
1264
- gpr_log(GPR_ERROR,
1265
- "[xds_client %p] xds server %s: ignoring deletion "
1266
- "for resource type %s name %s",
1267
- xds_client(), chand()->server_.server_uri.c_str(),
1268
- result.type_url.c_str(),
1269
- XdsClient::ConstructFullXdsResourceName(
1270
- authority, result.type_url.c_str(), resource_key)
1271
- .c_str());
1272
- resource_state.ignored_deletion = true;
955
+ MutexLock lock(&xds_client()->mu_);
956
+ if (!IsCurrentCallOnChannel()) return;
957
+ // Parse and validate the response.
958
+ AdsResponseParser parser(this);
959
+ absl::Status status =
960
+ xds_client()->api_.ParseAdsResponse(chand()->server_, payload, &parser);
961
+ if (!status.ok()) {
962
+ // Ignore unparsable response.
963
+ gpr_log(GPR_ERROR,
964
+ "[xds_client %p] xds server %s: error parsing ADS response (%s) "
965
+ "-- ignoring",
966
+ xds_client(), chand()->server_.server_uri.c_str(),
967
+ status.ToString().c_str());
968
+ } else {
969
+ seen_response_ = true;
970
+ AdsResponseParser::Result result = parser.TakeResult();
971
+ // Update nonce.
972
+ auto& state = state_map_[result.type];
973
+ state.nonce = result.nonce;
974
+ // If we got an error, set state.error so that we'll NACK the update.
975
+ if (!result.errors.empty()) {
976
+ state.status = absl::UnavailableError(
977
+ absl::StrCat("xDS response validation errors: [",
978
+ absl::StrJoin(result.errors, "; "), "]"));
979
+ gpr_log(GPR_ERROR,
980
+ "[xds_client %p] xds server %s: ADS response invalid for "
981
+ "resource "
982
+ "type %s version %s, will NACK: nonce=%s status=%s",
983
+ xds_client(), chand()->server_.server_uri.c_str(),
984
+ result.type_url.c_str(), result.version.c_str(),
985
+ state.nonce.c_str(), state.status.ToString().c_str());
986
+ }
987
+ // Delete resources not seen in update if needed.
988
+ if (result.type->AllResourcesRequiredInSotW()) {
989
+ for (auto& a : xds_client()->authority_state_map_) {
990
+ const std::string& authority = a.first;
991
+ AuthorityState& authority_state = a.second;
992
+ // Skip authorities that are not using this xDS channel.
993
+ if (authority_state.channel_state != chand()) continue;
994
+ auto seen_authority_it = result.resources_seen.find(authority);
995
+ // Find this resource type.
996
+ auto type_it = authority_state.resource_map.find(result.type);
997
+ if (type_it == authority_state.resource_map.end()) continue;
998
+ // Iterate over resource ids.
999
+ for (auto& r : type_it->second) {
1000
+ const XdsResourceKey& resource_key = r.first;
1001
+ ResourceState& resource_state = r.second;
1002
+ if (seen_authority_it == result.resources_seen.end() ||
1003
+ seen_authority_it->second.find(resource_key) ==
1004
+ seen_authority_it->second.end()) {
1005
+ // If the resource was newly requested but has not yet been
1006
+ // received, we don't want to generate an error for the
1007
+ // watchers, because this ADS response may be in reaction to an
1008
+ // earlier request that did not yet request the new resource, so
1009
+ // its absence from the response does not necessarily indicate
1010
+ // that the resource does not exist. For that case, we rely on
1011
+ // the request timeout instead.
1012
+ if (resource_state.resource == nullptr) continue;
1013
+ if (chand()->server_.IgnoreResourceDeletion()) {
1014
+ if (!resource_state.ignored_deletion) {
1015
+ gpr_log(GPR_ERROR,
1016
+ "[xds_client %p] xds server %s: ignoring deletion "
1017
+ "for resource type %s name %s",
1018
+ xds_client(), chand()->server_.server_uri.c_str(),
1019
+ result.type_url.c_str(),
1020
+ XdsClient::ConstructFullXdsResourceName(
1021
+ authority, result.type_url.c_str(), resource_key)
1022
+ .c_str());
1023
+ resource_state.ignored_deletion = true;
1024
+ }
1025
+ } else {
1026
+ resource_state.resource.reset();
1027
+ xds_client()->NotifyWatchersOnResourceDoesNotExist(
1028
+ resource_state.watchers);
1273
1029
  }
1274
- } else {
1275
- resource_state.resource.reset();
1276
- xds_client()->NotifyWatchersOnResourceDoesNotExist(
1277
- resource_state.watchers);
1278
1030
  }
1279
1031
  }
1280
1032
  }
1281
1033
  }
1282
- }
1283
- // If we had valid resources, update the version.
1284
- if (result.have_valid_resources) {
1285
- chand()->resource_type_version_map_[result.type] =
1286
- std::move(result.version);
1287
- // Start load reporting if needed.
1288
- auto& lrs_call = chand()->lrs_calld_;
1289
- if (lrs_call != nullptr) {
1290
- LrsCallState* lrs_calld = lrs_call->calld();
1291
- if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1034
+ // If we had valid resources, update the version.
1035
+ if (result.have_valid_resources) {
1036
+ chand()->resource_type_version_map_[result.type] =
1037
+ std::move(result.version);
1038
+ // Start load reporting if needed.
1039
+ auto& lrs_call = chand()->lrs_calld_;
1040
+ if (lrs_call != nullptr) {
1041
+ LrsCallState* lrs_calld = lrs_call->calld();
1042
+ if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1043
+ }
1292
1044
  }
1045
+ // Send ACK or NACK.
1046
+ SendMessageLocked(result.type);
1293
1047
  }
1294
- // Send ACK or NACK.
1295
- SendMessageLocked(result.type);
1296
- }
1297
- if (xds_client()->shutting_down_) return true;
1298
- // Keep listening for updates.
1299
- grpc_op op;
1300
- memset(&op, 0, sizeof(op));
1301
- op.op = GRPC_OP_RECV_MESSAGE;
1302
- op.data.recv_message.recv_message = &recv_message_payload_;
1303
- op.flags = 0;
1304
- op.reserved = nullptr;
1305
- GPR_ASSERT(call_ != nullptr);
1306
- // Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
1307
- const grpc_call_error call_error =
1308
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1309
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1310
- return false;
1048
+ }
1049
+ xds_client()->work_serializer_.DrainQueue();
1311
1050
  }
1312
1051
 
1313
1052
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1314
- void* arg, grpc_error_handle error) {
1315
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1053
+ absl::Status status) {
1316
1054
  {
1317
- MutexLock lock(&ads_calld->xds_client()->mu_);
1318
- ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1319
- }
1320
- ads_calld->xds_client()->work_serializer_.DrainQueue();
1321
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1322
- }
1323
-
1324
- void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1325
- grpc_error_handle error) {
1326
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1327
- char* status_details = grpc_slice_to_c_string(status_details_);
1328
- gpr_log(GPR_INFO,
1329
- "[xds_client %p] xds server %s: ADS call status received "
1330
- "(chand=%p, ads_calld=%p, call=%p): "
1331
- "status=%d, details='%s', error='%s'",
1332
- xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1333
- call_, status_code_, status_details,
1334
- grpc_error_std_string(error).c_str());
1335
- gpr_free(status_details);
1336
- }
1337
- // Ignore status from a stale call.
1338
- if (IsCurrentCallOnChannel()) {
1339
- // Try to restart the call.
1340
- parent_->OnCallFinishedLocked();
1341
- // Send error to all watchers.
1342
- xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
1343
- "xDS call failed: xDS server: %s, ADS call status code=%d, "
1344
- "details='%s', error='%s'",
1345
- chand()->server_.server_uri, status_code_,
1346
- StringViewFromSlice(status_details_), grpc_error_std_string(error))));
1055
+ MutexLock lock(&xds_client()->mu_);
1056
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1057
+ gpr_log(GPR_INFO,
1058
+ "[xds_client %p] xds server %s: ADS call status received "
1059
+ "(chand=%p, ads_calld=%p, call=%p): %s",
1060
+ xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1061
+ call_.get(), status.ToString().c_str());
1062
+ }
1063
+ // Ignore status from a stale call.
1064
+ if (IsCurrentCallOnChannel()) {
1065
+ // Try to restart the call.
1066
+ parent_->OnCallFinishedLocked();
1067
+ // Send error to all watchers.
1068
+ xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
1069
+ "xDS call failed: xDS server: %s, ADS call status: %s",
1070
+ chand()->server_.server_uri, status.ToString().c_str())));
1071
+ }
1347
1072
  }
1348
- GRPC_ERROR_UNREF(error);
1073
+ xds_client()->work_serializer_.DrainQueue();
1349
1074
  }
1350
1075
 
1351
1076
  bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
1352
- // If the retryable ADS call is null (which only happens when the xds channel
1353
- // is shutting down), all the ADS calls are stale.
1077
+ // If the retryable ADS call is null (which only happens when the xds
1078
+ // channel is shutting down), all the ADS calls are stale.
1354
1079
  if (chand()->ads_calld_ == nullptr) return false;
1355
1080
  return this == chand()->ads_calld_->calld();
1356
1081
  }
@@ -1380,38 +1105,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1380
1105
  //
1381
1106
 
1382
1107
  void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1383
- if (next_report_timer_callback_pending_) {
1384
- grpc_timer_cancel(&next_report_timer_);
1108
+ if (timer_handle_.has_value() &&
1109
+ GetDefaultEventEngine()->Cancel(*timer_handle_)) {
1110
+ timer_handle_.reset();
1111
+ Unref(DEBUG_LOCATION, "Orphan");
1385
1112
  }
1386
1113
  }
1387
1114
 
1388
1115
  void XdsClient::ChannelState::LrsCallState::Reporter::
1389
1116
  ScheduleNextReportLocked() {
1390
- const Timestamp next_report_time = ExecCtx::Get()->Now() + report_interval_;
1391
- grpc_timer_init(&next_report_timer_, next_report_time,
1392
- &on_next_report_timer_);
1393
- next_report_timer_callback_pending_ = true;
1394
- }
1395
-
1396
- void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1397
- void* arg, grpc_error_handle error) {
1398
- Reporter* self = static_cast<Reporter*>(arg);
1399
- bool done;
1400
- {
1401
- MutexLock lock(&self->xds_client()->mu_);
1402
- done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
1403
- }
1404
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
1117
+ timer_handle_ = GetDefaultEventEngine()->RunAfter(report_interval_, [this]() {
1118
+ ApplicationCallbackExecCtx callback_exec_ctx;
1119
+ ExecCtx exec_ctx;
1120
+ if (OnNextReportTimer()) {
1121
+ Unref(DEBUG_LOCATION, "OnNextReportTimer()");
1122
+ }
1123
+ });
1405
1124
  }
1406
1125
 
1407
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1408
- grpc_error_handle error) {
1409
- next_report_timer_callback_pending_ = false;
1410
- if (!GRPC_ERROR_IS_NONE(error) || !IsCurrentReporterOnCall()) {
1411
- GRPC_ERROR_UNREF(error);
1412
- return true;
1413
- }
1414
- return SendReportLocked();
1126
+ bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer() {
1127
+ MutexLock lock(&xds_client()->mu_);
1128
+ timer_handle_.reset();
1129
+ if (!IsCurrentReporterOnCall()) return true;
1130
+ SendReportLocked();
1131
+ return false;
1415
1132
  }
1416
1133
 
1417
1134
  namespace {
@@ -1451,65 +1168,34 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1451
1168
  ScheduleNextReportLocked();
1452
1169
  return false;
1453
1170
  }
1454
- // Create a request that contains the snapshot.
1455
- grpc_slice request_payload_slice =
1171
+ // Send a request that contains the snapshot.
1172
+ std::string serialized_payload =
1456
1173
  xds_client()->api_.CreateLrsRequest(std::move(snapshot));
1457
- parent_->send_message_payload_ =
1458
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1459
- grpc_slice_unref_internal(request_payload_slice);
1460
- // Send the report.
1461
- grpc_op op;
1462
- memset(&op, 0, sizeof(op));
1463
- op.op = GRPC_OP_SEND_MESSAGE;
1464
- op.data.send_message.send_message = parent_->send_message_payload_;
1465
- grpc_call_error call_error = grpc_call_start_batch_and_execute(
1466
- parent_->call_, &op, 1, &on_report_done_);
1467
- if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
1468
- gpr_log(GPR_ERROR,
1469
- "[xds_client %p] xds server %s: error starting LRS send_message "
1470
- "batch on calld=%p: call_error=%d",
1471
- xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
1472
- call_error);
1473
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1474
- }
1174
+ parent_->call_->SendMessage(std::move(serialized_payload));
1175
+ parent_->send_message_pending_ = true;
1475
1176
  return false;
1476
1177
  }
1477
1178
 
1478
- void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1479
- void* arg, grpc_error_handle error) {
1480
- Reporter* self = static_cast<Reporter*>(arg);
1481
- bool done;
1482
- {
1483
- MutexLock lock(&self->xds_client()->mu_);
1484
- done = self->OnReportDoneLocked(GRPC_ERROR_REF(error));
1485
- }
1486
- if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
1487
- }
1488
-
1489
- bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1490
- grpc_error_handle error) {
1491
- grpc_byte_buffer_destroy(parent_->send_message_payload_);
1492
- parent_->send_message_payload_ = nullptr;
1179
+ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked() {
1180
+ // If a reporter starts a send_message op, then the reporting interval
1181
+ // changes and we destroy that reporter and create a new one, and then
1182
+ // the send_message op started by the old reporter finishes, this
1183
+ // method will be called even though it was for a completion started
1184
+ // by the old reporter. In that case, the timer will be pending, so
1185
+ // we just ignore the completion and wait for the timer to fire.
1186
+ if (timer_handle_.has_value()) return;
1493
1187
  // If there are no more registered stats to report, cancel the call.
1494
1188
  auto it =
1495
1189
  xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
1496
- if (it == xds_client()->xds_load_report_server_map_.end() ||
1497
- it->second.load_report_map.empty()) {
1498
- it->second.channel_state->StopLrsCallLocked();
1499
- GRPC_ERROR_UNREF(error);
1500
- return true;
1501
- }
1502
- if (!GRPC_ERROR_IS_NONE(error) || !IsCurrentReporterOnCall()) {
1503
- GRPC_ERROR_UNREF(error);
1504
- // If this reporter is no longer the current one on the call, the reason
1505
- // might be that it was orphaned for a new one due to config update.
1506
- if (!IsCurrentReporterOnCall()) {
1507
- parent_->MaybeStartReportingLocked();
1190
+ if (it == xds_client()->xds_load_report_server_map_.end()) return;
1191
+ if (it->second.load_report_map.empty()) {
1192
+ if (it->second.channel_state != nullptr) {
1193
+ it->second.channel_state->StopLrsCallLocked();
1508
1194
  }
1509
- return true;
1195
+ return;
1510
1196
  }
1197
+ // Otherwise, schedule the next load report.
1511
1198
  ScheduleNextReportLocked();
1512
- return false;
1513
1199
  }
1514
1200
 
1515
1201
  //
@@ -1527,124 +1213,46 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1527
1213
  // activity in xds_client()->interested_parties_, which is comprised of
1528
1214
  // the polling entities from client_channel.
1529
1215
  GPR_ASSERT(xds_client() != nullptr);
1530
- const char* method =
1531
- chand()->server_.ShouldUseV3()
1532
- ? "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats"
1533
- : "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats";
1534
- call_ = grpc_channel_create_pollset_set_call(
1535
- chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
1536
- xds_client()->interested_parties_,
1537
- Slice::FromStaticString(method).c_slice(), nullptr,
1538
- Timestamp::InfFuture(), nullptr);
1216
+ const char* method = chand()->server_.ShouldUseV3()
1217
+ ? "/envoy.service.load_stats.v3."
1218
+ "LoadReportingService/StreamLoadStats"
1219
+ : "/envoy.service.load_stats.v2."
1220
+ "LoadReportingService/StreamLoadStats";
1221
+ call_ = chand()->transport_->CreateStreamingCall(
1222
+ method, absl::make_unique<StreamEventHandler>(
1223
+ // Passing the initial ref here. This ref will go away when
1224
+ // the StreamEventHandler is destroyed.
1225
+ RefCountedPtr<LrsCallState>(this)));
1539
1226
  GPR_ASSERT(call_ != nullptr);
1540
- // Init the request payload.
1541
- grpc_slice request_payload_slice =
1542
- xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1543
- send_message_payload_ =
1544
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1545
- grpc_slice_unref_internal(request_payload_slice);
1546
- // Init other data associated with the LRS call.
1547
- grpc_metadata_array_init(&initial_metadata_recv_);
1548
- grpc_metadata_array_init(&trailing_metadata_recv_);
1549
1227
  // Start the call.
1550
1228
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1551
- gpr_log(
1552
- GPR_INFO,
1553
- "[xds_client %p] xds server %s: starting LRS call (calld=%p, call=%p)",
1554
- xds_client(), chand()->server_.server_uri.c_str(), this, call_);
1555
- }
1556
- // Create the ops.
1557
- grpc_call_error call_error;
1558
- grpc_op ops[3];
1559
- memset(ops, 0, sizeof(ops));
1560
- // Op: send initial metadata.
1561
- grpc_op* op = ops;
1562
- op->op = GRPC_OP_SEND_INITIAL_METADATA;
1563
- op->data.send_initial_metadata.count = 0;
1564
- op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
1565
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
1566
- op->reserved = nullptr;
1567
- op++;
1568
- // Op: send request message.
1569
- GPR_ASSERT(send_message_payload_ != nullptr);
1570
- op->op = GRPC_OP_SEND_MESSAGE;
1571
- op->data.send_message.send_message = send_message_payload_;
1572
- op->flags = 0;
1573
- op->reserved = nullptr;
1574
- op++;
1575
- Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
1576
- GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
1577
- grpc_schedule_on_exec_ctx);
1578
- call_error = grpc_call_start_batch_and_execute(
1579
- call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
1580
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1581
- // Op: recv initial metadata.
1582
- op = ops;
1583
- op->op = GRPC_OP_RECV_INITIAL_METADATA;
1584
- op->data.recv_initial_metadata.recv_initial_metadata =
1585
- &initial_metadata_recv_;
1586
- op->flags = 0;
1587
- op->reserved = nullptr;
1588
- op++;
1589
- // Op: recv response.
1590
- op->op = GRPC_OP_RECV_MESSAGE;
1591
- op->data.recv_message.recv_message = &recv_message_payload_;
1592
- op->flags = 0;
1593
- op->reserved = nullptr;
1594
- op++;
1595
- Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
1596
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
1597
- grpc_schedule_on_exec_ctx);
1598
- call_error = grpc_call_start_batch_and_execute(
1599
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
1600
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1601
- // Op: recv server status.
1602
- op = ops;
1603
- op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
1604
- op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
1605
- op->data.recv_status_on_client.status = &status_code_;
1606
- op->data.recv_status_on_client.status_details = &status_details_;
1607
- op->flags = 0;
1608
- op->reserved = nullptr;
1609
- op++;
1610
- // This callback signals the end of the call, so it relies on the initial
1611
- // ref instead of a new ref. When it's invoked, it's the initial ref that is
1612
- // unreffed.
1613
- GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
1614
- grpc_schedule_on_exec_ctx);
1615
- call_error = grpc_call_start_batch_and_execute(
1616
- call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
1617
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1618
- }
1619
-
1620
- XdsClient::ChannelState::LrsCallState::~LrsCallState() {
1621
- grpc_metadata_array_destroy(&initial_metadata_recv_);
1622
- grpc_metadata_array_destroy(&trailing_metadata_recv_);
1623
- grpc_byte_buffer_destroy(send_message_payload_);
1624
- grpc_byte_buffer_destroy(recv_message_payload_);
1625
- grpc_slice_unref_internal(status_details_);
1626
- GPR_ASSERT(call_ != nullptr);
1627
- grpc_call_unref(call_);
1229
+ gpr_log(GPR_INFO,
1230
+ "[xds_client %p] xds server %s: starting LRS call (calld=%p, "
1231
+ "call=%p)",
1232
+ xds_client(), chand()->server_.server_uri.c_str(), this,
1233
+ call_.get());
1234
+ }
1235
+ // Send the initial request.
1236
+ std::string serialized_payload =
1237
+ xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1238
+ call_->SendMessage(std::move(serialized_payload));
1239
+ send_message_pending_ = true;
1628
1240
  }
1629
1241
 
1630
1242
  void XdsClient::ChannelState::LrsCallState::Orphan() {
1631
1243
  reporter_.reset();
1632
- GPR_ASSERT(call_ != nullptr);
1633
- // If we are here because xds_client wants to cancel the call,
1634
- // on_status_received_ will complete the cancellation and clean up. Otherwise,
1635
- // we are here because xds_client has to orphan a failed call, then the
1636
- // following cancellation will be a no-op.
1637
- grpc_call_cancel_internal(call_);
1638
- // Note that the initial ref is hold by on_status_received_. So the
1639
- // corresponding unref happens in on_status_received_ instead of here.
1244
+ // Note that the initial ref is held by the StreamEventHandler, which
1245
+ // will be destroyed when call_ is destroyed, which may not happen
1246
+ // here, since there may be other refs held to call_ by internal callbacks.
1247
+ call_.reset();
1640
1248
  }
1641
1249
 
1642
1250
  void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1643
1251
  // Don't start again if already started.
1644
1252
  if (reporter_ != nullptr) return;
1645
- // Don't start if the previous send_message op (of the initial request or the
1646
- // last report of the previous reporter) hasn't completed.
1647
- if (send_message_payload_ != nullptr) return;
1253
+ // Don't start if the previous send_message op (of the initial request or
1254
+ // the last report of the previous reporter) hasn't completed.
1255
+ if (call_ != nullptr && send_message_pending_) return;
1648
1256
  // Don't start if no LRS response has arrived.
1649
1257
  if (!seen_response()) return;
1650
1258
  // Don't start if the ADS call hasn't received any valid response. Note that
@@ -1660,166 +1268,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1660
1268
  Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
1661
1269
  }
1662
1270
 
1663
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1664
- void* arg, grpc_error_handle /*error*/) {
1665
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1666
- {
1667
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1668
- lrs_calld->OnInitialRequestSentLocked();
1271
+ void XdsClient::ChannelState::LrsCallState::OnRequestSent(bool /*ok*/) {
1272
+ MutexLock lock(&xds_client()->mu_);
1273
+ send_message_pending_ = false;
1274
+ if (reporter_ != nullptr) {
1275
+ reporter_->OnReportDoneLocked();
1276
+ } else {
1277
+ MaybeStartReportingLocked();
1669
1278
  }
1670
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1671
1279
  }
1672
1280
 
1673
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1674
- // Clear the send_message_payload_.
1675
- grpc_byte_buffer_destroy(send_message_payload_);
1676
- send_message_payload_ = nullptr;
1677
- MaybeStartReportingLocked();
1678
- }
1679
-
1680
- void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1681
- void* arg, grpc_error_handle /*error*/) {
1682
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1683
- bool done;
1684
- {
1685
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1686
- done = lrs_calld->OnResponseReceivedLocked();
1687
- }
1688
- if (done) lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1689
- }
1690
-
1691
- bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1692
- // Empty payload means the call was cancelled.
1693
- if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1694
- return true;
1695
- }
1696
- // Read the response.
1697
- grpc_byte_buffer_reader bbr;
1698
- grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1699
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1700
- grpc_byte_buffer_reader_destroy(&bbr);
1701
- grpc_byte_buffer_destroy(recv_message_payload_);
1702
- recv_message_payload_ = nullptr;
1703
- // This anonymous lambda is a hack to avoid the usage of goto.
1704
- [&]() {
1705
- // Parse the response.
1706
- bool send_all_clusters = false;
1707
- std::set<std::string> new_cluster_names;
1708
- Duration new_load_reporting_interval;
1709
- grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1710
- response_slice, &send_all_clusters, &new_cluster_names,
1711
- &new_load_reporting_interval);
1712
- if (!GRPC_ERROR_IS_NONE(parse_error)) {
1713
- gpr_log(GPR_ERROR,
1714
- "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1715
- xds_client(), chand()->server_.server_uri.c_str(),
1716
- grpc_error_std_string(parse_error).c_str());
1717
- GRPC_ERROR_UNREF(parse_error);
1718
- return;
1281
+ void XdsClient::ChannelState::LrsCallState::OnRecvMessage(
1282
+ absl::string_view payload) {
1283
+ MutexLock lock(&xds_client()->mu_);
1284
+ // If we're no longer the current call, ignore the result.
1285
+ if (!IsCurrentCallOnChannel()) return;
1286
+ // Parse the response.
1287
+ bool send_all_clusters = false;
1288
+ std::set<std::string> new_cluster_names;
1289
+ Duration new_load_reporting_interval;
1290
+ absl::Status status = xds_client()->api_.ParseLrsResponse(
1291
+ payload, &send_all_clusters, &new_cluster_names,
1292
+ &new_load_reporting_interval);
1293
+ if (!status.ok()) {
1294
+ gpr_log(GPR_ERROR,
1295
+ "[xds_client %p] xds server %s: LRS response parsing failed: %s",
1296
+ xds_client(), chand()->server_.server_uri.c_str(),
1297
+ status.ToString().c_str());
1298
+ return;
1299
+ }
1300
+ seen_response_ = true;
1301
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1302
+ gpr_log(
1303
+ GPR_INFO,
1304
+ "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1305
+ " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1306
+ "ms",
1307
+ xds_client(), chand()->server_.server_uri.c_str(),
1308
+ new_cluster_names.size(), send_all_clusters,
1309
+ new_load_reporting_interval.millis());
1310
+ size_t i = 0;
1311
+ for (const auto& name : new_cluster_names) {
1312
+ gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1313
+ xds_client(), i++, name.c_str());
1719
1314
  }
1720
- seen_response_ = true;
1315
+ }
1316
+ if (new_load_reporting_interval <
1317
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1318
+ new_load_reporting_interval =
1319
+ Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1721
1320
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1722
- gpr_log(
1723
- GPR_INFO,
1724
- "[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
1725
- " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1726
- "ms",
1727
- xds_client(), chand()->server_.server_uri.c_str(),
1728
- new_cluster_names.size(), send_all_clusters,
1729
- new_load_reporting_interval.millis());
1730
- size_t i = 0;
1731
- for (const auto& name : new_cluster_names) {
1732
- gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1733
- xds_client(), i++, name.c_str());
1734
- }
1735
- }
1736
- if (new_load_reporting_interval <
1737
- Duration::Milliseconds(
1738
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
1739
- new_load_reporting_interval = Duration::Milliseconds(
1740
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1741
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1742
- gpr_log(GPR_INFO,
1743
- "[xds_client %p] xds server %s: increased load_report_interval "
1744
- "to minimum value %dms",
1745
- xds_client(), chand()->server_.server_uri.c_str(),
1746
- GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1747
- }
1321
+ gpr_log(GPR_INFO,
1322
+ "[xds_client %p] xds server %s: increased load_report_interval "
1323
+ "to minimum value %dms",
1324
+ xds_client(), chand()->server_.server_uri.c_str(),
1325
+ GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1748
1326
  }
1749
- // Ignore identical update.
1750
- if (send_all_clusters == send_all_clusters_ &&
1751
- cluster_names_ == new_cluster_names &&
1752
- load_reporting_interval_ == new_load_reporting_interval) {
1753
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1754
- gpr_log(
1755
- GPR_INFO,
1756
- "[xds_client %p] xds server %s: incoming LRS response identical "
1757
- "to current, ignoring.",
1758
- xds_client(), chand()->server_.server_uri.c_str());
1759
- }
1760
- return;
1327
+ }
1328
+ // Ignore identical update.
1329
+ if (send_all_clusters == send_all_clusters_ &&
1330
+ cluster_names_ == new_cluster_names &&
1331
+ load_reporting_interval_ == new_load_reporting_interval) {
1332
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1333
+ gpr_log(GPR_INFO,
1334
+ "[xds_client %p] xds server %s: incoming LRS response identical "
1335
+ "to current, ignoring.",
1336
+ xds_client(), chand()->server_.server_uri.c_str());
1761
1337
  }
1762
- // Stop current load reporting (if any) to adopt the new config.
1763
- reporter_.reset();
1764
- // Record the new config.
1765
- send_all_clusters_ = send_all_clusters;
1766
- cluster_names_ = std::move(new_cluster_names);
1767
- load_reporting_interval_ = new_load_reporting_interval;
1768
- // Try starting sending load report.
1769
- MaybeStartReportingLocked();
1770
- }();
1771
- grpc_slice_unref_internal(response_slice);
1772
- if (xds_client()->shutting_down_) return true;
1773
- // Keep listening for LRS config updates.
1774
- grpc_op op;
1775
- memset(&op, 0, sizeof(op));
1776
- op.op = GRPC_OP_RECV_MESSAGE;
1777
- op.data.recv_message.recv_message = &recv_message_payload_;
1778
- op.flags = 0;
1779
- op.reserved = nullptr;
1780
- GPR_ASSERT(call_ != nullptr);
1781
- // Reuse the "OnResponseReceivedLocked" ref taken in ctor.
1782
- const grpc_call_error call_error =
1783
- grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1784
- GPR_ASSERT(GRPC_CALL_OK == call_error);
1785
- return false;
1786
- }
1787
-
1788
- void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1789
- void* arg, grpc_error_handle error) {
1790
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1791
- {
1792
- MutexLock lock(&lrs_calld->xds_client()->mu_);
1793
- lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1338
+ return;
1794
1339
  }
1795
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1340
+ // Stop current load reporting (if any) to adopt the new config.
1341
+ reporter_.reset();
1342
+ // Record the new config.
1343
+ send_all_clusters_ = send_all_clusters;
1344
+ cluster_names_ = std::move(new_cluster_names);
1345
+ load_reporting_interval_ = new_load_reporting_interval;
1346
+ // Try starting sending load report.
1347
+ MaybeStartReportingLocked();
1796
1348
  }
1797
1349
 
1798
- void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1799
- grpc_error_handle error) {
1800
- GPR_ASSERT(call_ != nullptr);
1350
+ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1351
+ absl::Status status) {
1352
+ MutexLock lock(&xds_client()->mu_);
1801
1353
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1802
- char* status_details = grpc_slice_to_c_string(status_details_);
1803
1354
  gpr_log(GPR_INFO,
1804
1355
  "[xds_client %p] xds server %s: LRS call status received "
1805
- "(chand=%p, calld=%p, call=%p): "
1806
- "status=%d, details='%s', error='%s'",
1356
+ "(chand=%p, calld=%p, call=%p): %s",
1807
1357
  xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
1808
- call_, status_code_, status_details,
1809
- grpc_error_std_string(error).c_str());
1810
- gpr_free(status_details);
1358
+ call_.get(), status.ToString().c_str());
1811
1359
  }
1812
1360
  // Ignore status from a stale call.
1813
1361
  if (IsCurrentCallOnChannel()) {
1814
1362
  // Try to restart the call.
1815
1363
  parent_->OnCallFinishedLocked();
1816
1364
  }
1817
- GRPC_ERROR_UNREF(error);
1818
1365
  }
1819
1366
 
1820
1367
  bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1821
- // If the retryable LRS call is null (which only happens when the xds channel
1822
- // is shutting down), all the LRS calls are stale.
1368
+ // If the retryable LRS call is null (which only happens when the xds
1369
+ // channel is shutting down), all the LRS calls are stale.
1823
1370
  if (chand()->lrs_calld_ == nullptr) return false;
1824
1371
  return this == chand()->lrs_calld_->calld();
1825
1372
  }
@@ -1828,81 +1375,51 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1828
1375
  // XdsClient
1829
1376
  //
1830
1377
 
1831
- namespace {
1832
-
1833
- Duration GetRequestTimeout(const grpc_channel_args* args) {
1834
- return Duration::Milliseconds(grpc_channel_args_find_integer(
1835
- args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1836
- {15000, 0, INT_MAX}));
1837
- }
1838
-
1839
- grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1840
- absl::InlinedVector<grpc_arg, 1> args_to_add = {
1841
- grpc_channel_arg_integer_create(
1842
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1843
- 5 * 60 * GPR_MS_PER_SEC),
1844
- };
1845
- return grpc_channel_args_copy_and_add(args, args_to_add.data(),
1846
- args_to_add.size());
1847
- }
1848
-
1849
- } // namespace
1850
-
1851
1378
  XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1852
- const grpc_channel_args* args)
1379
+ OrphanablePtr<XdsTransportFactory> transport_factory,
1380
+ Duration resource_request_timeout)
1853
1381
  : DualRefCounted<XdsClient>(
1854
1382
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1855
1383
  : nullptr),
1856
1384
  bootstrap_(std::move(bootstrap)),
1857
- args_(ModifyChannelArgs(args)),
1858
- request_timeout_(GetRequestTimeout(args)),
1385
+ transport_factory_(std::move(transport_factory)),
1386
+ request_timeout_(resource_request_timeout),
1859
1387
  xds_federation_enabled_(XdsFederationEnabled()),
1860
- interested_parties_(grpc_pollset_set_create()),
1861
- certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1862
- bootstrap_->certificate_providers())),
1863
- api_(this, &grpc_xds_client_trace, bootstrap_->node(),
1864
- &bootstrap_->certificate_providers(), &symtab_) {
1388
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_) {
1865
1389
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1866
1390
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1867
1391
  }
1868
- // Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
1869
- // destroyed.
1870
- grpc_init();
1871
1392
  }
1872
1393
 
1873
1394
  XdsClient::~XdsClient() {
1874
1395
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1875
1396
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1876
1397
  }
1877
- grpc_channel_args_destroy(args_);
1878
- grpc_pollset_set_destroy(interested_parties_);
1879
- // Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
1880
- // is destroyed.
1881
- grpc_shutdown();
1882
1398
  }
1883
1399
 
1884
1400
  void XdsClient::Orphan() {
1885
1401
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1886
1402
  gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
1887
1403
  }
1888
- {
1889
- MutexLock lock(g_mu);
1890
- if (g_xds_client == this) g_xds_client = nullptr;
1891
- }
1892
- {
1893
- MutexLock lock(&mu_);
1894
- shutting_down_ = true;
1895
- // Clear cache and any remaining watchers that may not have been cancelled.
1896
- authority_state_map_.clear();
1897
- invalid_watchers_.clear();
1404
+ MutexLock lock(&mu_);
1405
+ shutting_down_ = true;
1406
+ // Clear cache and any remaining watchers that may not have been cancelled.
1407
+ authority_state_map_.clear();
1408
+ invalid_watchers_.clear();
1409
+ // We may still be sending lingering queued load report data, so don't
1410
+ // just clear the load reporting map, but we do want to clear the refs
1411
+ // we're holding to the ChannelState objects, to make sure that
1412
+ // everything shuts down properly.
1413
+ for (auto& p : xds_load_report_server_map_) {
1414
+ p.second.channel_state.reset(DEBUG_LOCATION, "XdsClient::Orphan()");
1898
1415
  }
1899
1416
  }
1900
1417
 
1901
1418
  RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
1902
- const XdsBootstrap::XdsServer& server) {
1419
+ const XdsBootstrap::XdsServer& server, const char* reason) {
1903
1420
  auto it = xds_server_channel_map_.find(server);
1904
1421
  if (it != xds_server_channel_map_.end()) {
1905
- return it->second->Ref(DEBUG_LOCATION, "Authority");
1422
+ return it->second->Ref(DEBUG_LOCATION, reason);
1906
1423
  }
1907
1424
  // Channel not found, so create a new one.
1908
1425
  auto channel_state = MakeRefCounted<ChannelState>(
@@ -1980,7 +1497,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1980
1497
  // needed.
1981
1498
  if (authority_state.channel_state == nullptr) {
1982
1499
  authority_state.channel_state =
1983
- GetOrCreateChannelStateLocked(*xds_server);
1500
+ GetOrCreateChannelStateLocked(*xds_server, "start watch");
1984
1501
  }
1985
1502
  authority_state.channel_state->SubscribeLocked(type, *resource_name);
1986
1503
  }
@@ -2056,7 +1573,8 @@ const XdsResourceType* XdsClient::GetResourceTypeLocked(
2056
1573
  absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
2057
1574
  absl::string_view name, const XdsResourceType* type) {
2058
1575
  // Old-style names use the empty string for authority.
2059
- // authority is prefixed with "old:" to indicate that it's an old-style name.
1576
+ // authority is prefixed with "old:" to indicate that it's an old-style
1577
+ // name.
2060
1578
  if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
2061
1579
  return XdsResourceName{"old:", {std::string(name), {}}};
2062
1580
  }
@@ -2101,37 +1619,42 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
2101
1619
  if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2102
1620
  auto key =
2103
1621
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2104
- MutexLock lock(&mu_);
2105
- // We jump through some hoops here to make sure that the const
2106
- // XdsBootstrap::XdsServer& and absl::string_views
2107
- // stored in the XdsClusterDropStats object point to the
2108
- // XdsBootstrap::XdsServer and strings
2109
- // in the load_report_map_ key, so that they have the same lifetime.
2110
- auto server_it =
2111
- xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2112
- if (server_it->second.channel_state == nullptr) {
2113
- server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2114
- }
2115
- auto load_report_it = server_it->second.load_report_map
2116
- .emplace(std::move(key), LoadReportState())
2117
- .first;
2118
- LoadReportState& load_report_state = load_report_it->second;
2119
1622
  RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
2120
- if (load_report_state.drop_stats != nullptr) {
2121
- cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
2122
- }
2123
- if (cluster_drop_stats == nullptr) {
1623
+ {
1624
+ MutexLock lock(&mu_);
1625
+ // We jump through some hoops here to make sure that the const
1626
+ // XdsBootstrap::XdsServer& and absl::string_views
1627
+ // stored in the XdsClusterDropStats object point to the
1628
+ // XdsBootstrap::XdsServer and strings
1629
+ // in the load_report_map_ key, so that they have the same lifetime.
1630
+ auto server_it =
1631
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
1632
+ .first;
1633
+ if (server_it->second.channel_state == nullptr) {
1634
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1635
+ xds_server, "load report map (drop stats)");
1636
+ }
1637
+ auto load_report_it = server_it->second.load_report_map
1638
+ .emplace(std::move(key), LoadReportState())
1639
+ .first;
1640
+ LoadReportState& load_report_state = load_report_it->second;
2124
1641
  if (load_report_state.drop_stats != nullptr) {
2125
- load_report_state.deleted_drop_stats +=
2126
- load_report_state.drop_stats->GetSnapshotAndReset();
1642
+ cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
2127
1643
  }
2128
- cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
2129
- Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
2130
- load_report_it->first.first /*cluster_name*/,
2131
- load_report_it->first.second /*eds_service_name*/);
2132
- load_report_state.drop_stats = cluster_drop_stats.get();
1644
+ if (cluster_drop_stats == nullptr) {
1645
+ if (load_report_state.drop_stats != nullptr) {
1646
+ load_report_state.deleted_drop_stats +=
1647
+ load_report_state.drop_stats->GetSnapshotAndReset();
1648
+ }
1649
+ cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1650
+ Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
1651
+ load_report_it->first.first /*cluster_name*/,
1652
+ load_report_it->first.second /*eds_service_name*/);
1653
+ load_report_state.drop_stats = cluster_drop_stats.get();
1654
+ }
1655
+ server_it->second.channel_state->MaybeStartLrsCall();
2133
1656
  }
2134
- server_it->second.channel_state->MaybeStartLrsCall();
1657
+ work_serializer_.DrainQueue();
2135
1658
  return cluster_drop_stats;
2136
1659
  }
2137
1660
 
@@ -2162,39 +1685,45 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
2162
1685
  if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
2163
1686
  auto key =
2164
1687
  std::make_pair(std::string(cluster_name), std::string(eds_service_name));
2165
- MutexLock lock(&mu_);
2166
- // We jump through some hoops here to make sure that the const
2167
- // XdsBootstrap::XdsServer& and absl::string_views
2168
- // stored in the XdsClusterDropStats object point to the
2169
- // XdsBootstrap::XdsServer and strings
2170
- // in the load_report_map_ key, so that they have the same lifetime.
2171
- auto server_it =
2172
- xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
2173
- if (server_it->second.channel_state == nullptr) {
2174
- server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
2175
- }
2176
- auto load_report_it = server_it->second.load_report_map
2177
- .emplace(std::move(key), LoadReportState())
2178
- .first;
2179
- LoadReportState& load_report_state = load_report_it->second;
2180
- LoadReportState::LocalityState& locality_state =
2181
- load_report_state.locality_stats[locality];
2182
1688
  RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
2183
- if (locality_state.locality_stats != nullptr) {
2184
- cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
2185
- }
2186
- if (cluster_locality_stats == nullptr) {
1689
+ {
1690
+ MutexLock lock(&mu_);
1691
+ // We jump through some hoops here to make sure that the const
1692
+ // XdsBootstrap::XdsServer& and absl::string_views
1693
+ // stored in the XdsClusterDropStats object point to the
1694
+ // XdsBootstrap::XdsServer and strings
1695
+ // in the load_report_map_ key, so that they have the same lifetime.
1696
+ auto server_it =
1697
+ xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
1698
+ .first;
1699
+ if (server_it->second.channel_state == nullptr) {
1700
+ server_it->second.channel_state = GetOrCreateChannelStateLocked(
1701
+ xds_server, "load report map (locality stats)");
1702
+ }
1703
+ auto load_report_it = server_it->second.load_report_map
1704
+ .emplace(std::move(key), LoadReportState())
1705
+ .first;
1706
+ LoadReportState& load_report_state = load_report_it->second;
1707
+ LoadReportState::LocalityState& locality_state =
1708
+ load_report_state.locality_stats[locality];
2187
1709
  if (locality_state.locality_stats != nullptr) {
2188
- locality_state.deleted_locality_stats +=
2189
- locality_state.locality_stats->GetSnapshotAndReset();
1710
+ cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
1711
+ }
1712
+ if (cluster_locality_stats == nullptr) {
1713
+ if (locality_state.locality_stats != nullptr) {
1714
+ locality_state.deleted_locality_stats +=
1715
+ locality_state.locality_stats->GetSnapshotAndReset();
1716
+ }
1717
+ cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
1718
+ Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
1719
+ load_report_it->first.first /*cluster_name*/,
1720
+ load_report_it->first.second /*eds_service_name*/,
1721
+ std::move(locality));
1722
+ locality_state.locality_stats = cluster_locality_stats.get();
2190
1723
  }
2191
- cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
2192
- Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
2193
- load_report_it->first.first /*cluster_name*/,
2194
- load_report_it->first.second /*eds_service_name*/, std::move(locality));
2195
- locality_state.locality_stats = cluster_locality_stats.get();
1724
+ server_it->second.channel_state->MaybeStartLrsCall();
2196
1725
  }
2197
- server_it->second.channel_state->MaybeStartLrsCall();
1726
+ work_serializer_.DrainQueue();
2198
1727
  return cluster_locality_stats;
2199
1728
  }
2200
1729
 
@@ -2225,7 +1754,7 @@ void XdsClient::RemoveClusterLocalityStats(
2225
1754
  void XdsClient::ResetBackoff() {
2226
1755
  MutexLock lock(&mu_);
2227
1756
  for (auto& p : xds_server_channel_map_) {
2228
- grpc_channel_reset_connect_backoff(p.second->channel());
1757
+ p.second->ResetBackoff();
2229
1758
  }
2230
1759
  }
2231
1760
 
@@ -2394,192 +1923,4 @@ std::string XdsClient::DumpClientConfigBinary() {
2394
1923
  return api_.AssembleClientConfig(resource_type_metadata_map);
2395
1924
  }
2396
1925
 
2397
- //
2398
- // accessors for global state
2399
- //
2400
-
2401
- void XdsClientGlobalInit() {
2402
- g_mu = new Mutex;
2403
- XdsHttpFilterRegistry::Init();
2404
- XdsClusterSpecifierPluginRegistry::Init();
2405
- }
2406
-
2407
- // TODO(roth): Find a better way to clear the fallback config that does
2408
- // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2409
- void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2410
- gpr_free(g_fallback_bootstrap_config);
2411
- g_fallback_bootstrap_config = nullptr;
2412
- delete g_mu;
2413
- g_mu = nullptr;
2414
- XdsHttpFilterRegistry::Shutdown();
2415
- XdsClusterSpecifierPluginRegistry::Shutdown();
2416
- }
2417
-
2418
- namespace {
2419
-
2420
- std::string GetBootstrapContents(const char* fallback_config,
2421
- grpc_error_handle* error) {
2422
- // First, try GRPC_XDS_BOOTSTRAP env var.
2423
- UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2424
- if (path != nullptr) {
2425
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2426
- gpr_log(GPR_INFO,
2427
- "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2428
- "environment variable: %s",
2429
- path.get());
2430
- }
2431
- grpc_slice contents;
2432
- *error =
2433
- grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2434
- if (!GRPC_ERROR_IS_NONE(*error)) return "";
2435
- std::string contents_str(StringViewFromSlice(contents));
2436
- grpc_slice_unref_internal(contents);
2437
- return contents_str;
2438
- }
2439
- // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2440
- UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2441
- if (env_config != nullptr) {
2442
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2443
- gpr_log(GPR_INFO,
2444
- "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2445
- "environment variable");
2446
- }
2447
- return env_config.get();
2448
- }
2449
- // Finally, try fallback config.
2450
- if (fallback_config != nullptr) {
2451
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2452
- gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2453
- }
2454
- return fallback_config;
2455
- }
2456
- // No bootstrap config found.
2457
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2458
- "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2459
- "not defined");
2460
- return "";
2461
- }
2462
-
2463
- } // namespace
2464
-
2465
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2466
- grpc_error_handle* error) {
2467
- RefCountedPtr<XdsClient> xds_client;
2468
- // If getting bootstrap from channel args, create a local XdsClient
2469
- // instance for the channel or server instead of using the global instance.
2470
- const char* bootstrap_config = grpc_channel_args_find_string(
2471
- args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2472
- if (bootstrap_config != nullptr) {
2473
- std::unique_ptr<XdsBootstrap> bootstrap =
2474
- XdsBootstrap::Create(bootstrap_config, error);
2475
- if (GRPC_ERROR_IS_NONE(*error)) {
2476
- grpc_channel_args* xds_channel_args =
2477
- grpc_channel_args_find_pointer<grpc_channel_args>(
2478
- args,
2479
- GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2480
- return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2481
- }
2482
- return nullptr;
2483
- }
2484
- // Otherwise, use the global instance.
2485
- {
2486
- MutexLock lock(g_mu);
2487
- if (g_xds_client != nullptr) {
2488
- auto xds_client = g_xds_client->RefIfNonZero();
2489
- if (xds_client != nullptr) return xds_client;
2490
- }
2491
- // Find bootstrap contents.
2492
- std::string bootstrap_contents =
2493
- GetBootstrapContents(g_fallback_bootstrap_config, error);
2494
- if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
2495
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2496
- gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2497
- bootstrap_contents.c_str());
2498
- }
2499
- // Parse bootstrap.
2500
- std::unique_ptr<XdsBootstrap> bootstrap =
2501
- XdsBootstrap::Create(bootstrap_contents, error);
2502
- if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
2503
- // Instantiate XdsClient.
2504
- xds_client =
2505
- MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2506
- g_xds_client = xds_client.get();
2507
- }
2508
- return xds_client;
2509
- }
2510
-
2511
- namespace internal {
2512
-
2513
- void SetXdsChannelArgsForTest(grpc_channel_args* args) {
2514
- MutexLock lock(g_mu);
2515
- g_channel_args = args;
2516
- }
2517
-
2518
- void UnsetGlobalXdsClientForTest() {
2519
- MutexLock lock(g_mu);
2520
- g_xds_client = nullptr;
2521
- }
2522
-
2523
- void SetXdsFallbackBootstrapConfig(const char* config) {
2524
- MutexLock lock(g_mu);
2525
- gpr_free(g_fallback_bootstrap_config);
2526
- g_fallback_bootstrap_config = gpr_strdup(config);
2527
- }
2528
-
2529
- } // namespace internal
2530
-
2531
- //
2532
- // embedding XdsClient in channel args
2533
- //
2534
-
2535
- #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2536
-
2537
- namespace {
2538
-
2539
- void* XdsClientArgCopy(void* p) {
2540
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2541
- xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2542
- return p;
2543
- }
2544
-
2545
- void XdsClientArgDestroy(void* p) {
2546
- XdsClient* xds_client = static_cast<XdsClient*>(p);
2547
- xds_client->Unref(DEBUG_LOCATION, "channel arg");
2548
- }
2549
-
2550
- int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
2551
-
2552
- const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2553
- XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2554
-
2555
- } // namespace
2556
-
2557
- grpc_arg XdsClient::MakeChannelArg() const {
2558
- return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2559
- const_cast<XdsClient*>(this),
2560
- &kXdsClientArgVtable);
2561
- }
2562
-
2563
- RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2564
- const grpc_channel_args& args) {
2565
- XdsClient* xds_client =
2566
- grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2567
- if (xds_client == nullptr) return nullptr;
2568
- return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2569
- }
2570
-
2571
1926
  } // namespace grpc_core
2572
-
2573
- // The returned bytes may contain NULL(0), so we can't use c-string.
2574
- grpc_slice grpc_dump_xds_configs(void) {
2575
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2576
- grpc_core::ExecCtx exec_ctx;
2577
- grpc_error_handle error = GRPC_ERROR_NONE;
2578
- auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2579
- if (!GRPC_ERROR_IS_NONE(error)) {
2580
- // If we isn't using xDS, just return an empty string.
2581
- GRPC_ERROR_UNREF(error);
2582
- return grpc_empty_slice();
2583
- }
2584
- return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
2585
- }