grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -0,0 +1,307 @@
1
+ // Copyright 2023 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
16
+ #define GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
17
+
18
+ #include <grpc/event_engine/event_engine.h>
19
+ #include <grpc/event_engine/slice.h>
20
+ #include <grpc/event_engine/slice_buffer.h>
21
+ #include <grpc/slice_buffer.h>
22
+ #include <grpc/support/port_platform.h>
23
+ #include <stddef.h>
24
+ #include <stdint.h>
25
+
26
+ #include <atomic>
27
+ #include <cstring>
28
+ #include <functional>
29
+ #include <memory>
30
+ #include <optional>
31
+ #include <utility>
32
+
33
+ #include "absl/base/thread_annotations.h"
34
+ #include "absl/log/check.h"
35
+ #include "absl/status/status.h"
36
+ #include "absl/status/statusor.h"
37
+ #include "src/core/lib/event_engine/extensions/chaotic_good_extension.h"
38
+ #include "src/core/lib/event_engine/query_extensions.h"
39
+ #include "src/core/lib/iomgr/exec_ctx.h"
40
+ #include "src/core/lib/promise/activity.h"
41
+ #include "src/core/lib/promise/cancel_callback.h"
42
+ #include "src/core/lib/promise/if.h"
43
+ #include "src/core/lib/promise/map.h"
44
+ #include "src/core/lib/promise/poll.h"
45
+ #include "src/core/lib/slice/slice.h"
46
+ #include "src/core/lib/slice/slice_buffer.h"
47
+ #include "src/core/util/dump_args.h"
48
+ #include "src/core/util/sync.h"
49
+
50
+ namespace grpc_core {
51
+
52
+ // Wrapper around event engine endpoint that provides a promise like API.
53
+ class PromiseEndpoint {
54
+ public:
55
+ using WriteArgs =
56
+ grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs;
57
+
58
+ PromiseEndpoint(
59
+ std::unique_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
60
+ endpoint,
61
+ SliceBuffer already_received);
62
+ PromiseEndpoint() = default;
63
+ ~PromiseEndpoint() = default;
64
+ /// Prevent copying of PromiseEndpoint; moving is fine.
65
+ PromiseEndpoint(const PromiseEndpoint&) = delete;
66
+ PromiseEndpoint& operator=(const PromiseEndpoint&) = delete;
67
+ PromiseEndpoint(PromiseEndpoint&&) = default;
68
+ PromiseEndpoint& operator=(PromiseEndpoint&&) = default;
69
+
70
+ // Returns a promise that resolves to a `absl::Status` indicating the result
71
+ // of the write operation.
72
+ //
73
+ // Concurrent writes are not supported, which means callers should not call
74
+ // `Write()` before the previous write finishes. Doing that results in
75
+ // undefined behavior.
76
+ auto Write(SliceBuffer data, WriteArgs write_args) {
77
+ GRPC_LATENT_SEE_PARENT_SCOPE("GRPC:Write");
78
+ // Start write and assert previous write finishes.
79
+ auto prev = write_state_->state.exchange(WriteState::kWriting,
80
+ std::memory_order_relaxed);
81
+ CHECK(prev == WriteState::kIdle);
82
+ bool completed;
83
+ if (data.Length() == 0) {
84
+ completed = true;
85
+ } else {
86
+ // TODO(ladynana): Replace this with `SliceBufferCast<>` when it is
87
+ // available.
88
+ grpc_slice_buffer_swap(write_state_->buffer.c_slice_buffer(),
89
+ data.c_slice_buffer());
90
+ // If `Write()` returns true immediately, the callback will not be called.
91
+ // We still need to call our callback to pick up the result.
92
+ write_state_->waker = GetContext<Activity>()->MakeNonOwningWaker();
93
+ completed = endpoint_->Write(
94
+ [write_state = write_state_](absl::Status status) {
95
+ ExecCtx exec_ctx;
96
+ write_state->Complete(std::move(status));
97
+ },
98
+ &write_state_->buffer, std::move(write_args));
99
+ if (completed) write_state_->waker = Waker();
100
+ }
101
+ return If(
102
+ completed,
103
+ [this]() {
104
+ return [write_state = write_state_]() {
105
+ auto prev = write_state->state.exchange(WriteState::kIdle,
106
+ std::memory_order_relaxed);
107
+ CHECK(prev == WriteState::kWriting);
108
+ return absl::OkStatus();
109
+ };
110
+ },
111
+ GRPC_LATENT_SEE_PROMISE(
112
+ "DelayedWrite", ([this]() {
113
+ return [write_state = write_state_]() -> Poll<absl::Status> {
114
+ // If current write isn't finished return `Pending()`, else
115
+ // return write result.
116
+ WriteState::State expected = WriteState::kWritten;
117
+ if (write_state->state.compare_exchange_strong(
118
+ expected, WriteState::kIdle, std::memory_order_acquire,
119
+ std::memory_order_relaxed)) {
120
+ // State was Written, and we changed it to Idle. We can return
121
+ // the result.
122
+ return std::move(write_state->result);
123
+ }
124
+ // State was not Written; since we're polling it must be
125
+ // Writing. Assert that and return Pending.
126
+ CHECK(expected == WriteState::kWriting);
127
+ return Pending();
128
+ };
129
+ })));
130
+ }
131
+
132
+ // Returns a promise that resolves to `SliceBuffer` with
133
+ // `num_bytes` bytes.
134
+ //
135
+ // Concurrent reads are not supported, which means callers should not call
136
+ // `Read()` before the previous read finishes. Doing that results in
137
+ // undefined behavior.
138
+ auto Read(size_t num_bytes) {
139
+ GRPC_LATENT_SEE_PARENT_SCOPE("GRPC:Read");
140
+ // Assert previous read finishes.
141
+ CHECK(!read_state_->complete.load(std::memory_order_relaxed));
142
+ // Should not have pending reads.
143
+ CHECK_EQ(read_state_->pending_buffer.Count(), 0u);
144
+ bool complete = true;
145
+ while (read_state_->buffer.Length() < num_bytes) {
146
+ GRPC_LATENT_SEE_INNER_SCOPE("GRPC:Read:Loop");
147
+ // Set read args with hinted bytes.
148
+ grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs
149
+ read_args;
150
+ read_args.set_read_hint_bytes(
151
+ static_cast<int64_t>(num_bytes - read_state_->buffer.Length()));
152
+ // If `Read()` returns true immediately, the callback will not be
153
+ // called.
154
+ read_state_->waker = GetContext<Activity>()->MakeNonOwningWaker();
155
+ if (endpoint_->Read(
156
+ [read_state = read_state_, num_bytes](absl::Status status) {
157
+ ExecCtx exec_ctx;
158
+ read_state->Complete(std::move(status), num_bytes);
159
+ },
160
+ &read_state_->pending_buffer, std::move(read_args))) {
161
+ read_state_->waker = Waker();
162
+ read_state_->pending_buffer.MoveFirstNBytesIntoSliceBuffer(
163
+ read_state_->pending_buffer.Length(), read_state_->buffer);
164
+ DCHECK_EQ(read_state_->pending_buffer.Count(), 0u);
165
+ } else {
166
+ complete = false;
167
+ break;
168
+ }
169
+ }
170
+ return If(
171
+ complete,
172
+ [this, num_bytes]() {
173
+ SliceBuffer ret;
174
+ grpc_slice_buffer_move_first_no_inline(
175
+ read_state_->buffer.c_slice_buffer(), num_bytes,
176
+ ret.c_slice_buffer());
177
+ return [ret = std::move(
178
+ ret)]() mutable -> Poll<absl::StatusOr<SliceBuffer>> {
179
+ return std::move(ret);
180
+ };
181
+ },
182
+ GRPC_LATENT_SEE_PROMISE(
183
+ "DelayedRead", ([this, num_bytes]() {
184
+ return [read_state = read_state_,
185
+ num_bytes]() -> Poll<absl::StatusOr<SliceBuffer>> {
186
+ if (!read_state->complete.load(std::memory_order_acquire)) {
187
+ return Pending();
188
+ }
189
+ // If read succeeds, return `SliceBuffer` with `num_bytes`
190
+ // bytes.
191
+ if (read_state->result.ok()) {
192
+ SliceBuffer ret;
193
+ grpc_slice_buffer_move_first_no_inline(
194
+ read_state->buffer.c_slice_buffer(), num_bytes,
195
+ ret.c_slice_buffer());
196
+ read_state->complete.store(false, std::memory_order_relaxed);
197
+ return std::move(ret);
198
+ }
199
+ read_state->complete.store(false, std::memory_order_relaxed);
200
+ return std::move(read_state->result);
201
+ };
202
+ })));
203
+ }
204
+
205
+ // Returns a promise that resolves to `Slice` with at least
206
+ // `num_bytes` bytes which should be less than INT64_MAX bytes.
207
+ //
208
+ // Concurrent reads are not supported, which means callers should not call
209
+ // `ReadSlice()` before the previous read finishes. Doing that results in
210
+ // undefined behavior.
211
+ auto ReadSlice(size_t num_bytes) {
212
+ return Map(Read(num_bytes),
213
+ [](absl::StatusOr<SliceBuffer> buffer) -> absl::StatusOr<Slice> {
214
+ if (!buffer.ok()) return buffer.status();
215
+ return buffer->JoinIntoSlice();
216
+ });
217
+ }
218
+
219
+ // Returns a promise that resolves to a byte with type `uint8_t`.
220
+ auto ReadByte() {
221
+ return Map(ReadSlice(1),
222
+ [](absl::StatusOr<Slice> slice) -> absl::StatusOr<uint8_t> {
223
+ if (!slice.ok()) return slice.status();
224
+ return (*slice)[0];
225
+ });
226
+ }
227
+
228
+ // Enables RPC receive coalescing and alignment of memory holding received
229
+ // RPCs.
230
+ void EnforceRxMemoryAlignmentAndCoalescing() {
231
+ auto* chaotic_good_ext = grpc_event_engine::experimental::QueryExtension<
232
+ grpc_event_engine::experimental::ChaoticGoodExtension>(endpoint_.get());
233
+ if (chaotic_good_ext != nullptr) {
234
+ chaotic_good_ext->EnforceRxMemoryAlignment();
235
+ chaotic_good_ext->EnableRpcReceiveCoalescing();
236
+ }
237
+ }
238
+
239
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
240
+ GetPeerAddress() const;
241
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
242
+ GetLocalAddress() const;
243
+
244
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
245
+ GetEventEngineEndpoint() const {
246
+ return endpoint_;
247
+ }
248
+
249
+ private:
250
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
251
+ endpoint_;
252
+
253
+ struct ReadState : public RefCounted<ReadState> {
254
+ std::atomic<bool> complete{false};
255
+ // Read buffer used for storing successful reads given by
256
+ // `EventEngine::Endpoint` but not yet requested by the caller.
257
+ grpc_event_engine::experimental::SliceBuffer buffer;
258
+ // Buffer used to accept data from `EventEngine::Endpoint`.
259
+ // Every time after a successful read from `EventEngine::Endpoint`, the data
260
+ // in this buffer should be appended to `buffer`.
261
+ grpc_event_engine::experimental::SliceBuffer pending_buffer;
262
+ // Used for store the result from `EventEngine::Endpoint::Read()`.
263
+ absl::Status result;
264
+ Waker waker;
265
+ // Backing endpoint: we keep this on ReadState as reads will need to
266
+ // repeatedly read until the target size is hit, and we don't want to access
267
+ // the main object during this dance (indeed the main object may be
268
+ // deleted).
269
+ std::weak_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
270
+ endpoint;
271
+
272
+ void Complete(absl::Status status, size_t num_bytes_requested);
273
+ };
274
+
275
+ struct WriteState : public RefCounted<WriteState> {
276
+ enum State : uint8_t {
277
+ kIdle, // Not writing.
278
+ kWriting, // Write started, but not completed.
279
+ kWritten, // Write completed.
280
+ };
281
+
282
+ std::atomic<State> state{kIdle};
283
+ // Write buffer used for `EventEngine::Endpoint::Write()` to ensure the
284
+ // memory behind the buffer is not lost.
285
+ grpc_event_engine::experimental::SliceBuffer buffer;
286
+ // Used for store the result from `EventEngine::Endpoint::Write()`.
287
+ absl::Status result;
288
+ Waker waker;
289
+
290
+ void Complete(absl::Status status) {
291
+ result = std::move(status);
292
+ auto w = std::move(waker);
293
+ auto prev = state.exchange(kWritten, std::memory_order_release);
294
+ // Previous state should be Writing. If we got anything else we've entered
295
+ // the callback path twice.
296
+ CHECK(prev == kWriting);
297
+ w.Wakeup();
298
+ }
299
+ };
300
+
301
+ RefCountedPtr<WriteState> write_state_ = MakeRefCounted<WriteState>();
302
+ RefCountedPtr<ReadState> read_state_ = MakeRefCounted<ReadState>();
303
+ };
304
+
305
+ } // namespace grpc_core
306
+
307
+ #endif // GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
@@ -102,11 +102,10 @@ class ChildPolicyHandler::Helper final
102
102
  parent()->channel_control_helper()->RequestReresolution();
103
103
  }
104
104
 
105
- void AddTraceEvent(TraceSeverity severity,
106
- absl::string_view message) override {
105
+ void AddTraceEvent(absl::string_view message) override {
107
106
  if (parent()->shutting_down_) return;
108
107
  if (!CalledByPendingChild() && !CalledByCurrentChild()) return;
109
- parent()->channel_control_helper()->AddTraceEvent(severity, message);
108
+ parent()->channel_control_helper()->AddTraceEvent(message);
110
109
  }
111
110
 
112
111
  void set_child(LoadBalancingPolicy* child) { child_ = child; }
@@ -289,7 +288,6 @@ OrphanablePtr<LoadBalancingPolicy> ChildPolicyHandler::CreateChildPolicy(
289
288
  << lb_policy.get() << ")";
290
289
  }
291
290
  channel_control_helper()->AddTraceEvent(
292
- ChannelControlHelper::TRACE_INFO,
293
291
  absl::StrCat("Created new LB policy \"", child_policy_name, "\""));
294
292
  grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
295
293
  interested_parties());
@@ -81,9 +81,8 @@ class LoadBalancingPolicy::DelegatingChannelControlHelper
81
81
  return parent_helper()->GetStatsPluginGroup();
82
82
  }
83
83
 
84
- void AddTraceEvent(TraceSeverity severity,
85
- absl::string_view message) override {
86
- parent_helper()->AddTraceEvent(severity, message);
84
+ void AddTraceEvent(absl::string_view message) override {
85
+ parent_helper()->AddTraceEvent(message);
87
86
  }
88
87
 
89
88
  private:
@@ -221,11 +221,7 @@ class HealthProducer::HealthChecker::HealthStreamEventHandler final
221
221
  LOG(ERROR) << kErrorMessage;
222
222
  auto* channelz_node =
223
223
  health_checker_->producer_->subchannel_->channelz_node();
224
- if (channelz_node != nullptr) {
225
- channelz_node->AddTraceEvent(
226
- channelz::ChannelTrace::Error,
227
- grpc_slice_from_static_string(kErrorMessage));
228
- }
224
+ GRPC_CHANNELZ_LOG(channelz_node) << kErrorMessage;
229
225
  SetHealthStatusLocked(client, GRPC_CHANNEL_READY, kErrorMessage);
230
226
  }
231
227
  }
@@ -336,9 +336,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
336
336
  GetStatsPluginGroup() = 0;
337
337
 
338
338
  /// Adds a trace message associated with the channel.
339
- enum TraceSeverity { TRACE_INFO, TRACE_WARNING, TRACE_ERROR };
340
- virtual void AddTraceEvent(TraceSeverity severity,
341
- absl::string_view message) = 0;
339
+ virtual void AddTraceEvent(absl::string_view message) = 0;
342
340
  };
343
341
 
344
342
  class DelegatingChannelControlHelper;
@@ -145,11 +145,7 @@ class OrcaProducer::OrcaStreamEventHandler final
145
145
  "Orca stream returned UNIMPLEMENTED; disabling";
146
146
  LOG(ERROR) << kErrorMessage;
147
147
  auto* channelz_node = producer_->subchannel_->channelz_node();
148
- if (channelz_node != nullptr) {
149
- channelz_node->AddTraceEvent(
150
- channelz::ChannelTrace::Error,
151
- grpc_slice_from_static_string(kErrorMessage));
152
- }
148
+ GRPC_CHANNELZ_LOG(channelz_node) << kErrorMessage;
153
149
  }
154
150
  }
155
151
 
@@ -528,6 +528,9 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
528
528
  });
529
529
  if (endpoints.empty()) {
530
530
  status = absl::UnavailableError("address list must not be empty");
531
+ // TODO(roth): Replace this one-off special case with a more
532
+ // general solution.
533
+ if (IsPickFirstIgnoreEmptyUpdatesEnabled()) args.addresses = status;
531
534
  } else {
532
535
  // Shuffle the list if needed.
533
536
  auto config = static_cast<PickFirstConfig*>(args.config.get());
@@ -397,7 +397,14 @@ absl::Status CdsLb::UpdateLocked(UpdateArgs args) {
397
397
  cluster_name_, new_cluster_config->cluster->use_http_connect,
398
398
  endpoint_config.endpoints,
399
399
  child_name_state_.priority_child_numbers);
400
- update_args.resolution_note = endpoint_config.resolution_note;
400
+ std::vector<absl::string_view> resolution_notes;
401
+ if (!args.resolution_note.empty()) {
402
+ resolution_notes.emplace_back(args.resolution_note);
403
+ }
404
+ if (!endpoint_config.resolution_note.empty()) {
405
+ resolution_notes.emplace_back(endpoint_config.resolution_note);
406
+ }
407
+ update_args.resolution_note = absl::StrJoin(resolution_notes, "; ");
401
408
  // Construct child policy config.
402
409
  child_policy_config_json = CreateChildPolicyConfigForLeafCluster(
403
410
  *new_cluster_config, endpoint_config, aggregate_cluster_resource);
@@ -405,6 +412,8 @@ absl::Status CdsLb::UpdateLocked(UpdateArgs args) {
405
412
  // Aggregate cluster.
406
413
  [&](const XdsConfig::ClusterConfig::AggregateConfig& aggregate_config) {
407
414
  child_name_state_.Reset();
415
+ // Populate resolution_note for child policy.
416
+ update_args.resolution_note = aggregate_config.resolution_note;
408
417
  // Construct child policy config.
409
418
  child_policy_config_json =
410
419
  CreateChildPolicyConfigForAggregateCluster(aggregate_config);
@@ -28,6 +28,7 @@ extern void GcpAuthenticationFilterRegister(
28
28
  extern void RegisterXdsChannelStackModifier(
29
29
  CoreConfiguration::Builder* builder);
30
30
  extern void RegisterChannelDefaultCreds(CoreConfiguration::Builder* builder);
31
+ extern void RegisterDefaultCallCreds(CoreConfiguration::Builder* builder);
31
32
  extern void RegisterXdsResolver(CoreConfiguration::Builder* builder);
32
33
  extern void RegisterCloud2ProdResolver(CoreConfiguration::Builder* builder);
33
34
  extern void RegisterXdsClusterManagerLbPolicy(
@@ -52,6 +53,7 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
52
53
  GcpAuthenticationFilterRegister(builder);
53
54
  RegisterXdsChannelStackModifier(builder);
54
55
  RegisterChannelDefaultCreds(builder);
56
+ RegisterDefaultCallCreds(builder);
55
57
  RegisterXdsResolver(builder);
56
58
  RegisterCloud2ProdResolver(builder);
57
59
  RegisterXdsClusterManagerLbPolicy(builder);
@@ -41,10 +41,10 @@ XdsConfig::ClusterConfig::ClusterConfig(
41
41
 
42
42
  XdsConfig::ClusterConfig::ClusterConfig(
43
43
  std::shared_ptr<const XdsClusterResource> cluster,
44
- std::vector<absl::string_view> leaf_clusters)
44
+ std::vector<absl::string_view> leaf_clusters, std::string resolution_note)
45
45
  : cluster(std::move(cluster)),
46
46
  children(absl::in_place_type_t<AggregateConfig>(),
47
- std::move(leaf_clusters)) {}
47
+ std::move(leaf_clusters), std::move(resolution_note)) {}
48
48
 
49
49
  //
50
50
  // XdsConfig
@@ -81,7 +81,10 @@ std::string XdsConfig::ToString() const {
81
81
  [&](const ClusterConfig::AggregateConfig& aggregate_config) {
82
82
  parts.push_back(absl::StrCat(
83
83
  " leaf_clusters: [",
84
- absl::StrJoin(aggregate_config.leaf_clusters, ", "), "]\n"));
84
+ absl::StrJoin(aggregate_config.leaf_clusters, ", "),
85
+ "],\n"
86
+ " resolution_note: \"",
87
+ aggregate_config.resolution_note, "\"\n"));
85
88
  });
86
89
  parts.push_back(
87
90
  " }\n"
@@ -66,11 +66,15 @@ struct XdsConfig : public RefCounted<XdsConfig> {
66
66
  // The list of leaf clusters for an aggregate cluster.
67
67
  struct AggregateConfig {
68
68
  std::vector<absl::string_view> leaf_clusters;
69
+ std::string resolution_note;
69
70
 
70
- explicit AggregateConfig(std::vector<absl::string_view> leaf_clusters)
71
- : leaf_clusters(std::move(leaf_clusters)) {}
71
+ AggregateConfig(std::vector<absl::string_view> leaf_clusters,
72
+ std::string resolution_note)
73
+ : leaf_clusters(std::move(leaf_clusters)),
74
+ resolution_note(std::move(resolution_note)) {}
72
75
  bool operator==(const AggregateConfig& other) const {
73
- return leaf_clusters == other.leaf_clusters;
76
+ return leaf_clusters == other.leaf_clusters &&
77
+ resolution_note == other.resolution_note;
74
78
  }
75
79
  };
76
80
  std::variant<EndpointConfig, AggregateConfig> children;
@@ -81,7 +85,8 @@ struct XdsConfig : public RefCounted<XdsConfig> {
81
85
  std::string resolution_note);
82
86
  // Ctor for aggregate clusters.
83
87
  ClusterConfig(std::shared_ptr<const XdsClusterResource> cluster,
84
- std::vector<absl::string_view> leaf_clusters);
88
+ std::vector<absl::string_view> leaf_clusters,
89
+ std::string resolution_note);
85
90
 
86
91
  bool operator==(const ClusterConfig& other) const {
87
92
  return cluster == other.cluster && children == other.children;
@@ -656,8 +656,12 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
656
656
  cluster_config_map,
657
657
  std::set<absl::string_view>* eds_resources_seen,
658
658
  std::set<absl::string_view>* dns_names_seen,
659
- absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters) {
660
- if (depth > 0) CHECK_NE(leaf_clusters, nullptr);
659
+ absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters,
660
+ std::vector<std::string>* resolution_notes) {
661
+ if (depth > 0) {
662
+ CHECK_NE(leaf_clusters, nullptr);
663
+ CHECK_NE(resolution_notes, nullptr);
664
+ }
661
665
  if (depth == kMaxXdsAggregateClusterRecursionDepth) {
662
666
  *leaf_clusters =
663
667
  absl::UnavailableError("aggregate cluster graph exceeds max depth");
@@ -687,6 +691,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
687
691
  // If there was an error fetching the CDS resource, report the error.
688
692
  if (!state.update.ok()) {
689
693
  cluster_config = state.update.status();
694
+ if (resolution_notes != nullptr) {
695
+ resolution_notes->emplace_back(state.update.status().message());
696
+ }
690
697
  return true;
691
698
  }
692
699
  // If we don't have the resource yet, we can't return a config yet.
@@ -785,12 +792,13 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
785
792
  // Recursively expand leaf clusters.
786
793
  absl::StatusOr<std::vector<absl::string_view>> child_leaf_clusters;
787
794
  child_leaf_clusters.emplace();
795
+ std::vector<std::string> child_resolution_notes;
788
796
  bool have_all_resources = true;
789
797
  for (const std::string& child_name :
790
798
  aggregate.prioritized_cluster_names) {
791
799
  have_all_resources &= PopulateClusterConfigMap(
792
800
  child_name, depth + 1, cluster_config_map, eds_resources_seen,
793
- dns_names_seen, &child_leaf_clusters);
801
+ dns_names_seen, &child_leaf_clusters, &child_resolution_notes);
794
802
  if (!child_leaf_clusters.ok()) break;
795
803
  }
796
804
  // Note that we cannot use the cluster_config reference we
@@ -807,12 +815,18 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
807
815
  }
808
816
  return true;
809
817
  }
810
- // If needed, propagate leaf cluster list up the tree.
818
+ // If needed, propagate leaf cluster list and resolution note
819
+ // lists up the tree.
811
820
  if (leaf_clusters != nullptr) {
812
821
  (*leaf_clusters)
813
822
  ->insert((*leaf_clusters)->end(), child_leaf_clusters->begin(),
814
823
  child_leaf_clusters->end());
815
824
  }
825
+ if (resolution_notes != nullptr) {
826
+ resolution_notes->insert(resolution_notes->end(),
827
+ child_resolution_notes.begin(),
828
+ child_resolution_notes.end());
829
+ }
816
830
  // If there are no leaf clusters, report an error for the cluster.
817
831
  if (have_all_resources && child_leaf_clusters->empty()) {
818
832
  aggregate_cluster_config = absl::UnavailableError(
@@ -825,8 +839,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
825
839
  // at the root of the tree, because we need to make sure the list
826
840
  // of underlying cluster names stays alive so that the leaf cluster
827
841
  // list of the root aggregate cluster can point to those strings.
828
- aggregate_cluster_config.emplace(std::move(cluster_resource),
829
- std::move(*child_leaf_clusters));
842
+ aggregate_cluster_config.emplace(
843
+ std::move(cluster_resource), std::move(*child_leaf_clusters),
844
+ absl::StrJoin(child_resolution_notes, "; "));
830
845
  return have_all_resources;
831
846
  });
832
847
  }
@@ -172,7 +172,8 @@ class XdsDependencyManager final : public RefCounted<XdsDependencyManager>,
172
172
  cluster_config_map,
173
173
  std::set<absl::string_view>* eds_resources_seen,
174
174
  std::set<absl::string_view>* dns_names_seen,
175
- absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters = nullptr);
175
+ absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters = nullptr,
176
+ std::vector<std::string>* resolution_notes = nullptr);
176
177
 
177
178
  // Called when an external cluster subscription is unreffed.
178
179
  void OnClusterSubscriptionUnref(absl::string_view cluster_name,