grpc 1.47.0 → 1.49.0.pre1

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