grpc 1.50.0 → 1.51.0

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

Potentially problematic release.


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

Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -23,10 +23,8 @@
23
23
 
24
24
  #include <algorithm>
25
25
 
26
- #include "absl/memory/memory.h"
27
26
  #include "absl/strings/match.h"
28
27
  #include "absl/strings/str_cat.h"
29
- #include "absl/strings/str_format.h"
30
28
  #include "absl/strings/str_join.h"
31
29
  #include "absl/strings/str_split.h"
32
30
  #include "absl/strings/string_view.h"
@@ -58,7 +56,6 @@
58
56
  namespace grpc_core {
59
57
 
60
58
  using ::grpc_event_engine::experimental::EventEngine;
61
- using ::grpc_event_engine::experimental::GetDefaultEventEngine;
62
59
 
63
60
  TraceFlag grpc_xds_client_trace(false, "xds_client");
64
61
  TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
@@ -180,10 +177,45 @@ class XdsClient::ChannelState::AdsCallState
180
177
  Unref(DEBUG_LOCATION, "Orphan");
181
178
  }
182
179
 
180
+ void MarkSubscriptionSendStarted()
181
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
182
+ subscription_sent_ = true;
183
+ }
184
+
185
+ void MaybeMarkSubscriptionSendComplete(
186
+ RefCountedPtr<AdsCallState> ads_calld)
187
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
188
+ if (subscription_sent_) MaybeStartTimer(std::move(ads_calld));
189
+ }
190
+
191
+ void MarkSeen() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
192
+ resource_seen_ = true;
193
+ MaybeCancelTimer();
194
+ }
195
+
196
+ void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
197
+ if (timer_handle_.has_value() &&
198
+ ads_calld_->xds_client()->engine()->Cancel(*timer_handle_)) {
199
+ timer_handle_.reset();
200
+ }
201
+ }
202
+
203
+ private:
183
204
  void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld)
184
205
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
185
- if (!timer_start_needed_) return;
186
- timer_start_needed_ = false;
206
+ // Don't start timer if we've already either seen the resource or
207
+ // marked it as non-existing.
208
+ // Note: There are edge cases where we can have seen the resource
209
+ // before we have sent the initial subscription request, such as
210
+ // when we unsubscribe and then resubscribe to a given resource
211
+ // and then get a response containing that resource, all while a
212
+ // send_message op is in flight.
213
+ if (resource_seen_) return;
214
+ // Don't start timer if we haven't yet sent the initial subscription
215
+ // request for the resource.
216
+ if (!subscription_sent_) return;
217
+ // Don't start timer if it's already running.
218
+ if (timer_handle_.has_value()) return;
187
219
  // Check if we already have a cached version of this resource
188
220
  // (i.e., if this is the initial request for the resource after an
189
221
  // ADS stream restart). If so, we don't start the timer, because
@@ -195,7 +227,7 @@ class XdsClient::ChannelState::AdsCallState
195
227
  if (state.resource != nullptr) return;
196
228
  // Start timer.
197
229
  ads_calld_ = std::move(ads_calld);
198
- timer_handle_ = GetDefaultEventEngine()->RunAfter(
230
+ timer_handle_ = ads_calld_->xds_client()->engine()->RunAfter(
199
231
  ads_calld_->xds_client()->request_timeout_,
200
232
  [self = Ref(DEBUG_LOCATION, "timer")]() {
201
233
  ApplicationCallbackExecCtx callback_exec_ctx;
@@ -204,49 +236,28 @@ class XdsClient::ChannelState::AdsCallState
204
236
  });
205
237
  }
206
238
 
207
- void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
208
- // If the timer hasn't been started yet, make sure we don't start
209
- // it later. This can happen if the last watch for an LDS or CDS
210
- // resource is cancelled and then restarted, both while an ADS
211
- // request for a different resource type is being sent (causing
212
- // the unsubscription and then resubscription requests to be
213
- // queued), and then we get a response for the LDS or CDS resource.
214
- // In that case, we would call MaybeCancelTimer() when we receive the
215
- // response and then MaybeStartTimer() when we finally send the new
216
- // LDS or CDS request, thus causing the timer to fire when it shouldn't.
217
- // For details, see https://github.com/grpc/grpc/issues/29583.
218
- // TODO(roth): Find a way to write a test for this case.
219
- timer_start_needed_ = false;
220
- if (timer_handle_.has_value()) {
221
- GetDefaultEventEngine()->Cancel(*timer_handle_);
222
- timer_handle_.reset();
223
- }
224
- }
225
-
226
- private:
227
239
  void OnTimer() {
240
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
241
+ gpr_log(GPR_INFO,
242
+ "[xds_client %p] xds server %s: timeout obtaining resource "
243
+ "{type=%s name=%s} from xds server",
244
+ ads_calld_->xds_client(),
245
+ ads_calld_->chand()->server_.server_uri().c_str(),
246
+ std::string(type_->type_url()).c_str(),
247
+ XdsClient::ConstructFullXdsResourceName(
248
+ name_.authority, type_->type_url(), name_.key)
249
+ .c_str());
250
+ }
228
251
  {
229
252
  MutexLock lock(&ads_calld_->xds_client()->mu_);
230
- if (timer_handle_.has_value()) {
231
- timer_handle_.reset();
232
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
233
- gpr_log(GPR_INFO,
234
- "[xds_client %p] xds server %s: timeout obtaining resource "
235
- "{type=%s name=%s} from xds server",
236
- ads_calld_->xds_client(),
237
- ads_calld_->chand()->server_.server_uri().c_str(),
238
- std::string(type_->type_url()).c_str(),
239
- XdsClient::ConstructFullXdsResourceName(
240
- name_.authority, type_->type_url(), name_.key)
241
- .c_str());
242
- }
243
- auto& authority_state =
244
- ads_calld_->xds_client()->authority_state_map_[name_.authority];
245
- ResourceState& state = authority_state.resource_map[type_][name_.key];
246
- state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
247
- ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
248
- state.watchers);
249
- }
253
+ timer_handle_.reset();
254
+ resource_seen_ = true;
255
+ auto& authority_state =
256
+ ads_calld_->xds_client()->authority_state_map_[name_.authority];
257
+ ResourceState& state = authority_state.resource_map[type_][name_.key];
258
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
259
+ ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
260
+ state.watchers);
250
261
  }
251
262
  ads_calld_->xds_client()->work_serializer_.DrainQueue();
252
263
  ads_calld_.reset();
@@ -256,7 +267,13 @@ class XdsClient::ChannelState::AdsCallState
256
267
  const XdsResourceName name_;
257
268
 
258
269
  RefCountedPtr<AdsCallState> ads_calld_;
259
- bool timer_start_needed_ ABSL_GUARDED_BY(&XdsClient::mu_) = true;
270
+ // True if we have sent the initial subscription request for this
271
+ // resource on this ADS stream.
272
+ bool subscription_sent_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
273
+ // True if we have either (a) seen the resource in a response on this
274
+ // stream or (b) declared the resource to not exist due to the timer
275
+ // firing.
276
+ bool resource_seen_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
260
277
  absl::optional<EventEngine::TaskHandle> timer_handle_
261
278
  ABSL_GUARDED_BY(&XdsClient::mu_);
262
279
  };
@@ -311,7 +328,9 @@ class XdsClient::ChannelState::AdsCallState
311
328
 
312
329
  bool sent_initial_message_ = false;
313
330
  bool seen_response_ = false;
314
- bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
331
+
332
+ const XdsResourceType* send_message_pending_
333
+ ABSL_GUARDED_BY(&XdsClient::mu_) = nullptr;
315
334
 
316
335
  // Resource types for which requests need to be sent.
317
336
  std::set<const XdsResourceType*> buffered_requests_;
@@ -592,7 +611,7 @@ void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
592
611
  shutting_down_ = true;
593
612
  calld_.reset();
594
613
  if (timer_handle_.has_value()) {
595
- GetDefaultEventEngine()->Cancel(*timer_handle_);
614
+ chand()->xds_client()->engine()->Cancel(*timer_handle_);
596
615
  timer_handle_.reset();
597
616
  }
598
617
  this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
@@ -635,7 +654,7 @@ void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
635
654
  chand()->xds_client(), chand()->server_.server_uri().c_str(),
636
655
  timeout.millis());
637
656
  }
638
- timer_handle_ = GetDefaultEventEngine()->RunAfter(
657
+ timer_handle_ = chand()->xds_client()->engine()->RunAfter(
639
658
  timeout,
640
659
  [self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
641
660
  ApplicationCallbackExecCtx callback_exec_ctx;
@@ -722,8 +741,7 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
722
741
  "resource index ", idx, ": ",
723
742
  resource_name.empty() ? "" : absl::StrCat(resource_name, ": "));
724
743
  // Check the type_url of the resource.
725
- bool is_v2 = false;
726
- if (!result_.type->IsType(type_url, &is_v2)) {
744
+ if (result_.type_url != type_url) {
727
745
  result_.errors.emplace_back(
728
746
  absl::StrCat(error_prefix, "incorrect resource type ", type_url,
729
747
  " (should be ", result_.type_url, ")"));
@@ -734,7 +752,7 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
734
752
  xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
735
753
  xds_client()->symtab_.ptr(), arena};
736
754
  XdsResourceType::DecodeResult decode_result =
737
- result_.type->Decode(context, serialized_resource, is_v2);
755
+ result_.type->Decode(context, serialized_resource);
738
756
  // If we didn't already have the resource name from the Resource
739
757
  // wrapper, try to get it from the decoding result.
740
758
  if (resource_name.empty()) {
@@ -772,7 +790,7 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
772
790
  if (it != timer_it->second.subscribed_resources.end()) {
773
791
  auto res_it = it->second.find(parsed_resource_name->key);
774
792
  if (res_it != it->second.end()) {
775
- res_it->second->MaybeCancelTimer();
793
+ res_it->second->MarkSeen();
776
794
  }
777
795
  }
778
796
  }
@@ -875,13 +893,10 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
875
893
  GPR_ASSERT(xds_client() != nullptr);
876
894
  // Init the ADS call.
877
895
  const char* method =
878
- chand()->server_.ShouldUseV3()
879
- ? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
880
- "StreamAggregatedResources"
881
- : "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
882
- "StreamAggregatedResources";
896
+ "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
897
+ "StreamAggregatedResources";
883
898
  call_ = chand()->transport_->CreateStreamingCall(
884
- method, absl::make_unique<StreamEventHandler>(
899
+ method, std::make_unique<StreamEventHandler>(
885
900
  // Passing the initial ref here. This ref will go away when
886
901
  // the StreamEventHandler is destroyed.
887
902
  RefCountedPtr<AdsCallState>(this)));
@@ -926,15 +941,13 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
926
941
  const XdsResourceType* type)
927
942
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
928
943
  // Buffer message sending if an existing message is in flight.
929
- if (send_message_pending_) {
944
+ if (send_message_pending_ != nullptr) {
930
945
  buffered_requests_.insert(type);
931
946
  return;
932
947
  }
933
948
  auto& state = state_map_[type];
934
949
  std::string serialized_message = xds_client()->api_.CreateAdsRequest(
935
- chand()->server_,
936
- chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
937
- chand()->resource_type_version_map_[type], state.nonce,
950
+ type->type_url(), chand()->resource_type_version_map_[type], state.nonce,
938
951
  ResourceNamesForRequest(type), state.status, !sent_initial_message_);
939
952
  sent_initial_message_ = true;
940
953
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -948,7 +961,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
948
961
  }
949
962
  state.status = absl::OkStatus();
950
963
  call_->SendMessage(std::move(serialized_message));
951
- send_message_pending_ = true;
964
+ send_message_pending_ = type;
952
965
  }
953
966
 
954
967
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
@@ -981,7 +994,18 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
981
994
 
982
995
  void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
983
996
  MutexLock lock(&xds_client()->mu_);
984
- send_message_pending_ = false;
997
+ // For each resource that was in the message we just sent, start the
998
+ // resource timer if needed.
999
+ if (ok) {
1000
+ auto& resource_type_state = state_map_[send_message_pending_];
1001
+ for (const auto& p : resource_type_state.subscribed_resources) {
1002
+ for (auto& q : p.second) {
1003
+ q.second->MaybeMarkSubscriptionSendComplete(
1004
+ Ref(DEBUG_LOCATION, "ResourceTimer"));
1005
+ }
1006
+ }
1007
+ }
1008
+ send_message_pending_ = nullptr;
985
1009
  if (ok && IsCurrentCallOnChannel()) {
986
1010
  // Continue to send another pending message if any.
987
1011
  // TODO(roth): The current code to handle buffered messages has the
@@ -1007,8 +1031,7 @@ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
1007
1031
  if (!IsCurrentCallOnChannel()) return;
1008
1032
  // Parse and validate the response.
1009
1033
  AdsResponseParser parser(this);
1010
- absl::Status status =
1011
- xds_client()->api_.ParseAdsResponse(chand()->server_, payload, &parser);
1034
+ absl::Status status = xds_client()->api_.ParseAdsResponse(payload, &parser);
1012
1035
  if (!status.ok()) {
1013
1036
  // Ignore unparsable response.
1014
1037
  gpr_log(GPR_ERROR,
@@ -1076,6 +1099,8 @@ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
1076
1099
  }
1077
1100
  } else {
1078
1101
  resource_state.resource.reset();
1102
+ resource_state.meta.client_status =
1103
+ XdsApi::ResourceMetadata::DOES_NOT_EXIST;
1079
1104
  xds_client()->NotifyWatchersOnResourceDoesNotExist(
1080
1105
  resource_state.watchers);
1081
1106
  }
@@ -1083,8 +1108,8 @@ void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
1083
1108
  }
1084
1109
  }
1085
1110
  }
1086
- // If we had valid resources, update the version.
1087
- if (result.have_valid_resources) {
1111
+ // If we had valid resources or the update was empty, update the version.
1112
+ if (result.have_valid_resources || result.errors.empty()) {
1088
1113
  chand()->resource_type_version_map_[result.type] =
1089
1114
  std::move(result.version);
1090
1115
  // Start load reporting if needed.
@@ -1112,13 +1137,26 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1112
1137
  xds_client(), chand()->server_.server_uri().c_str(), chand(),
1113
1138
  this, call_.get(), status.ToString().c_str());
1114
1139
  }
1140
+ // Cancel any does-not-exist timers that may be pending.
1141
+ for (const auto& p : state_map_) {
1142
+ for (const auto& q : p.second.subscribed_resources) {
1143
+ for (auto& r : q.second) {
1144
+ r.second->MaybeCancelTimer();
1145
+ }
1146
+ }
1147
+ }
1115
1148
  // Ignore status from a stale call.
1116
1149
  if (IsCurrentCallOnChannel()) {
1117
1150
  // Try to restart the call.
1118
1151
  parent_->OnCallFinishedLocked();
1119
- // Send error to all watchers for the channel.
1120
- chand()->SetChannelStatusLocked(absl::UnavailableError(absl::StrFormat(
1121
- "xDS call failed; status: %s", status.ToString().c_str())));
1152
+ // If we didn't receive a response on the stream, report the
1153
+ // stream failure as a connectivity failure, which will report the
1154
+ // error to all watchers of resources on this channel.
1155
+ if (!seen_response_) {
1156
+ chand()->SetChannelStatusLocked(absl::UnavailableError(
1157
+ absl::StrCat("xDS call failed with no responses received; status: ",
1158
+ status.ToString())));
1159
+ }
1122
1160
  }
1123
1161
  }
1124
1162
  xds_client()->work_serializer_.DrainQueue();
@@ -1144,7 +1182,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1144
1182
  resource_names.emplace_back(XdsClient::ConstructFullXdsResourceName(
1145
1183
  authority, type->type_url(), resource_key));
1146
1184
  OrphanablePtr<ResourceTimer>& resource_timer = p.second;
1147
- resource_timer->MaybeStartTimer(Ref(DEBUG_LOCATION, "ResourceTimer"));
1185
+ resource_timer->MarkSubscriptionSendStarted();
1148
1186
  }
1149
1187
  }
1150
1188
  }
@@ -1157,7 +1195,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1157
1195
 
1158
1196
  void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1159
1197
  if (timer_handle_.has_value() &&
1160
- GetDefaultEventEngine()->Cancel(*timer_handle_)) {
1198
+ xds_client()->engine()->Cancel(*timer_handle_)) {
1161
1199
  timer_handle_.reset();
1162
1200
  Unref(DEBUG_LOCATION, "Orphan");
1163
1201
  }
@@ -1165,7 +1203,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
1165
1203
 
1166
1204
  void XdsClient::ChannelState::LrsCallState::Reporter::
1167
1205
  ScheduleNextReportLocked() {
1168
- timer_handle_ = GetDefaultEventEngine()->RunAfter(report_interval_, [this]() {
1206
+ timer_handle_ = xds_client()->engine()->RunAfter(report_interval_, [this]() {
1169
1207
  ApplicationCallbackExecCtx callback_exec_ctx;
1170
1208
  ExecCtx exec_ctx;
1171
1209
  if (OnNextReportTimer()) {
@@ -1264,13 +1302,10 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1264
1302
  // activity in xds_client()->interested_parties_, which is comprised of
1265
1303
  // the polling entities from client_channel.
1266
1304
  GPR_ASSERT(xds_client() != nullptr);
1267
- const char* method = chand()->server_.ShouldUseV3()
1268
- ? "/envoy.service.load_stats.v3."
1269
- "LoadReportingService/StreamLoadStats"
1270
- : "/envoy.service.load_stats.v2."
1271
- "LoadReportingService/StreamLoadStats";
1305
+ const char* method =
1306
+ "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats";
1272
1307
  call_ = chand()->transport_->CreateStreamingCall(
1273
- method, absl::make_unique<StreamEventHandler>(
1308
+ method, std::make_unique<StreamEventHandler>(
1274
1309
  // Passing the initial ref here. This ref will go away when
1275
1310
  // the StreamEventHandler is destroyed.
1276
1311
  RefCountedPtr<LrsCallState>(this)));
@@ -1284,8 +1319,7 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
1284
1319
  call_.get());
1285
1320
  }
1286
1321
  // Send the initial request.
1287
- std::string serialized_payload =
1288
- xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
1322
+ std::string serialized_payload = xds_client()->api_.CreateLrsInitialRequest();
1289
1323
  call_->SendMessage(std::move(serialized_payload));
1290
1324
  send_message_pending_ = true;
1291
1325
  }
@@ -1436,7 +1470,8 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1436
1470
  transport_factory_(std::move(transport_factory)),
1437
1471
  request_timeout_(resource_request_timeout),
1438
1472
  xds_federation_enabled_(XdsFederationEnabled()),
1439
- api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_) {
1473
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_),
1474
+ engine_(grpc_event_engine::experimental::GetDefaultEventEngine()) {
1440
1475
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1441
1476
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1442
1477
  }
@@ -1654,16 +1689,13 @@ void XdsClient::MaybeRegisterResourceTypeLocked(
1654
1689
  return;
1655
1690
  }
1656
1691
  resource_types_.emplace(resource_type->type_url(), resource_type);
1657
- v2_resource_types_.emplace(resource_type->v2_type_url(), resource_type);
1658
- resource_type->InitUpbSymtab(symtab_.ptr());
1692
+ resource_type->InitUpbSymtab(this, symtab_.ptr());
1659
1693
  }
1660
1694
 
1661
1695
  const XdsResourceType* XdsClient::GetResourceTypeLocked(
1662
1696
  absl::string_view resource_type) {
1663
1697
  auto it = resource_types_.find(resource_type);
1664
1698
  if (it != resource_types_.end()) return it->second;
1665
- auto it2 = v2_resource_types_.find(resource_type);
1666
- if (it2 != v2_resource_types_.end()) return it2->second;
1667
1699
  return nullptr;
1668
1700
  }
1669
1701
 
@@ -1681,7 +1713,7 @@ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
1681
1713
  // Split the resource type off of the path to get the id.
1682
1714
  std::pair<absl::string_view, absl::string_view> path_parts = absl::StrSplit(
1683
1715
  absl::StripPrefix(uri->path(), "/"), absl::MaxSplits('/', 1));
1684
- if (!type->IsType(path_parts.first, nullptr)) {
1716
+ if (type->type_url() != path_parts.first) {
1685
1717
  return absl::InvalidArgumentError(
1686
1718
  "xdstp URI path must indicate valid xDS resource type");
1687
1719
  }
@@ -32,6 +32,8 @@
32
32
  #include "absl/strings/string_view.h"
33
33
  #include "upb/def.hpp"
34
34
 
35
+ #include <grpc/event_engine/event_engine.h>
36
+
35
37
  #include "src/core/ext/xds/xds_api.h"
36
38
  #include "src/core/ext/xds/xds_bootstrap.h"
37
39
  #include "src/core/ext/xds/xds_client_stats.h"
@@ -143,6 +145,10 @@ class XdsClient : public DualRefCounted<XdsClient> {
143
145
  // implementation.
144
146
  std::string DumpClientConfigBinary();
145
147
 
148
+ grpc_event_engine::experimental::EventEngine* engine() {
149
+ return engine_.get();
150
+ }
151
+
146
152
  private:
147
153
  struct XdsResourceKey {
148
154
  std::string id;
@@ -301,14 +307,13 @@ class XdsClient : public DualRefCounted<XdsClient> {
301
307
  const bool xds_federation_enabled_;
302
308
  XdsApi api_;
303
309
  WorkSerializer work_serializer_;
310
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine_;
304
311
 
305
312
  Mutex mu_;
306
313
 
307
314
  // Stores resource type objects seen by type URL.
308
315
  std::map<absl::string_view /*resource_type*/, const XdsResourceType*>
309
316
  resource_types_ ABSL_GUARDED_BY(mu_);
310
- std::map<absl::string_view /*v2_resource_type*/, const XdsResourceType*>
311
- v2_resource_types_ ABSL_GUARDED_BY(mu_);
312
317
  upb::SymbolTable symtab_ ABSL_GUARDED_BY(mu_);
313
318
 
314
319
  // Map of existing xDS server channels.
@@ -37,8 +37,6 @@
37
37
  #include "src/core/ext/xds/xds_bootstrap.h"
38
38
  #include "src/core/ext/xds/xds_bootstrap_grpc.h"
39
39
  #include "src/core/ext/xds/xds_channel_args.h"
40
- #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
41
- #include "src/core/ext/xds/xds_http_filters.h"
42
40
  #include "src/core/ext/xds/xds_transport.h"
43
41
  #include "src/core/ext/xds/xds_transport_grpc.h"
44
42
  #include "src/core/lib/channel/channel_args.h"
@@ -52,8 +50,8 @@
52
50
  #include "src/core/lib/iomgr/error.h"
53
51
  #include "src/core/lib/iomgr/exec_ctx.h"
54
52
  #include "src/core/lib/iomgr/load_file.h"
53
+ #include "src/core/lib/slice/slice.h"
55
54
  #include "src/core/lib/slice/slice_internal.h"
56
- #include "src/core/lib/slice/slice_refcount.h"
57
55
  #include "src/core/lib/transport/error_utils.h"
58
56
 
59
57
  namespace grpc_core {
@@ -64,30 +62,13 @@ namespace grpc_core {
64
62
 
65
63
  namespace {
66
64
 
67
- Mutex* g_mu = nullptr;
65
+ Mutex* g_mu = new Mutex;
68
66
  const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
69
67
  GrpcXdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
70
68
  char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
71
69
 
72
70
  } // namespace
73
71
 
74
- void XdsClientGlobalInit() {
75
- g_mu = new Mutex;
76
- XdsHttpFilterRegistry::Init();
77
- XdsClusterSpecifierPluginRegistry::Init();
78
- }
79
-
80
- // TODO(roth): Find a better way to clear the fallback config that does
81
- // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
82
- void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
83
- gpr_free(g_fallback_bootstrap_config);
84
- g_fallback_bootstrap_config = nullptr;
85
- delete g_mu;
86
- g_mu = nullptr;
87
- XdsHttpFilterRegistry::Shutdown();
88
- XdsClusterSpecifierPluginRegistry::Shutdown();
89
- }
90
-
91
72
  namespace {
92
73
 
93
74
  absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
@@ -103,9 +84,9 @@ absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
103
84
  grpc_slice contents;
104
85
  grpc_error_handle error =
105
86
  grpc_load_file(path->c_str(), /*add_null_terminator=*/true, &contents);
106
- if (!GRPC_ERROR_IS_NONE(error)) return grpc_error_to_absl_status(error);
87
+ if (!error.ok()) return grpc_error_to_absl_status(error);
107
88
  std::string contents_str(StringViewFromSlice(contents));
108
- grpc_slice_unref_internal(contents);
89
+ CSliceUnref(contents);
109
90
  return contents_str;
110
91
  }
111
92
  // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
@@ -218,7 +199,7 @@ void SetXdsFallbackBootstrapConfig(const char* config) {
218
199
  grpc_slice grpc_dump_xds_configs(void) {
219
200
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
220
201
  grpc_core::ExecCtx exec_ctx;
221
- grpc_error_handle error = GRPC_ERROR_NONE;
202
+ grpc_error_handle error;
222
203
  auto xds_client = grpc_core::GrpcXdsClient::GetOrCreate(
223
204
  grpc_core::ChannelArgs(), "grpc_dump_xds_configs()");
224
205
  if (!xds_client.ok()) {