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
@@ -52,6 +52,23 @@ struct CompareChannelFiltersByName {
52
52
  return a.name() < b.name();
53
53
  }
54
54
  };
55
+
56
+ struct CompareFusedChannelFiltersByName {
57
+ bool operator()(ChannelInit::FilterRegistration* a,
58
+ ChannelInit::FilterRegistration* b) const {
59
+ // Sort by descending order based on number of filters contained in the
60
+ // FusedFilter.
61
+ int num_filters_a =
62
+ std::count(a->name().name().begin(), a->name().name().end(), '+') + 1;
63
+ int num_filters_b =
64
+ std::count(b->name().name().begin(), b->name().name().end(), '+') + 1;
65
+ if (num_filters_a == num_filters_b) {
66
+ return a->name().name() > b->name().name();
67
+ }
68
+ return num_filters_a > num_filters_b;
69
+ }
70
+ };
71
+
55
72
  } // namespace
56
73
 
57
74
  ChannelInit::FilterRegistration& ChannelInit::FilterRegistration::After(
@@ -111,6 +128,14 @@ ChannelInit::FilterRegistration& ChannelInit::Builder::RegisterFilter(
111
128
  return *filters_[type].back();
112
129
  }
113
130
 
131
+ void ChannelInit::Builder::RegisterFusedFilter(
132
+ grpc_channel_stack_type type, UniqueTypeName name,
133
+ const grpc_channel_filter* filter, FilterAdder filter_adder,
134
+ SourceLocation registration_source) {
135
+ fused_filters_[type].emplace_back(std::make_unique<FilterRegistration>(
136
+ name, filter, filter_adder, registration_source));
137
+ }
138
+
114
139
  class ChannelInit::DependencyTracker {
115
140
  public:
116
141
  // Declare that a filter exists.
@@ -232,10 +257,61 @@ class ChannelInit::DependencyTracker {
232
257
  size_t nodes_taken_ = 0;
233
258
  };
234
259
 
235
- ChannelInit::StackConfig ChannelInit::BuildStackConfig(
260
+ template <bool is_terminal>
261
+ std::vector<ChannelInit::FilterNode> ChannelInit::SelectFiltersByPredicate(
262
+ const std::vector<Filter>& filters, ChannelStackBuilder* builder) {
263
+ std::vector<FilterNode> filter_list;
264
+ int i = 0;
265
+ // Create an in-place linked list of individual filters
266
+ for (const auto& filter : filters) {
267
+ if (!is_terminal && SkipV2(filter.version)) continue;
268
+ if (!filter.CheckPredicates(builder->channel_args())) continue;
269
+ filter_list.push_back(FilterNode{&filter, ++i});
270
+ }
271
+ if (!filter_list.empty()) {
272
+ filter_list.back().next = -1;
273
+ }
274
+ return filter_list;
275
+ }
276
+
277
+ void ChannelInit::MergeFilters(std::vector<FilterNode>& filter_list,
278
+ const std::vector<Filter>& fused_filters) {
279
+ int i = 0;
280
+ int j = 0;
281
+ // Iterate through fused filters (by size) and check if a given fused filter
282
+ // can replace one of the existing sequence of filters.
283
+ for (auto& curr_fused_filter : fused_filters) {
284
+ i = 0;
285
+ while (i != -1 && filter_list[i].next != -1) {
286
+ std::string fused_prefix(filter_list[i].curr->name.name());
287
+ j = filter_list[i].next;
288
+ do {
289
+ absl::StrAppend(&fused_prefix, "+", filter_list[j].curr->name.name());
290
+ if (fused_prefix == curr_fused_filter.name.name()) {
291
+ filter_list[i].curr = &curr_fused_filter;
292
+ filter_list[i].next = filter_list[j].next;
293
+ }
294
+ j = filter_list[j].next;
295
+ } while (j != -1);
296
+ i = filter_list[i].next;
297
+ }
298
+ }
299
+ }
300
+
301
+ void ChannelInit::AppendFiltersToBuilder(
302
+ const std::vector<FilterNode>& filter_list, ChannelStackBuilder* builder) {
303
+ int i = 0;
304
+ while (i != -1 && !filter_list.empty()) {
305
+ builder->AppendFilter(filter_list[i].curr->filter);
306
+ i = filter_list[i].next;
307
+ };
308
+ }
309
+
310
+ std::tuple<std::vector<ChannelInit::Filter>, std::vector<ChannelInit::Filter>>
311
+ ChannelInit::SortFilterRegistrationsByDependencies(
236
312
  const std::vector<std::unique_ptr<ChannelInit::FilterRegistration>>&
237
- registrations,
238
- PostProcessor* post_processors, grpc_channel_stack_type type) {
313
+ filter_registrations,
314
+ grpc_channel_stack_type type) {
239
315
  // Phase 1: Build a map from filter to the set of filters that must be
240
316
  // initialized before it.
241
317
  // We order this map (and the set of dependent filters) by filter name to
@@ -244,7 +320,7 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
244
320
  // this will help overall stability.
245
321
  DependencyTracker dependencies;
246
322
  std::vector<Filter> terminal_filters;
247
- for (const auto& registration : registrations) {
323
+ for (const auto& registration : filter_registrations) {
248
324
  if (registration->terminal_) {
249
325
  CHECK(registration->after_.empty());
250
326
  CHECK(registration->before_.empty());
@@ -258,7 +334,7 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
258
334
  dependencies.Declare(registration.get());
259
335
  }
260
336
  }
261
- for (const auto& registration : registrations) {
337
+ for (const auto& registration : filter_registrations) {
262
338
  if (registration->terminal_) continue;
263
339
  for (UniqueTypeName after : registration->after_) {
264
340
  dependencies.InsertEdge(after, registration->name_);
@@ -267,7 +343,7 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
267
343
  dependencies.InsertEdge(registration->name_, before);
268
344
  }
269
345
  if (registration->before_all_) {
270
- for (const auto& other : registrations) {
346
+ for (const auto& other : filter_registrations) {
271
347
  if (other.get() == registration.get()) continue;
272
348
  if (other->terminal_) continue;
273
349
  dependencies.InsertEdge(registration->name_, other->name_);
@@ -286,6 +362,42 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
286
362
  std::move(registration->predicates_), registration->version_,
287
363
  registration->ordering_, registration->registration_source_);
288
364
  }
365
+ // Log out the graph we built if that's been requested.
366
+ if (GRPC_TRACE_FLAG_ENABLED(channel_stack)) {
367
+ PrintChannelStackTrace(type, filter_registrations, dependencies, filters,
368
+ terminal_filters);
369
+ }
370
+ return std::tuple(std::move(filters), std::move(terminal_filters));
371
+ }
372
+
373
+ std::vector<ChannelInit::Filter> ChannelInit::SortFusedFilterRegistrations(
374
+ const std::vector<std::unique_ptr<FilterRegistration>>&
375
+ filter_registrations) {
376
+ std::vector<FilterRegistration*> fused_filter_registrations;
377
+ std::vector<Filter> filters;
378
+ for (const auto& registration : filter_registrations) {
379
+ CHECK(!registration->terminal_);
380
+ fused_filter_registrations.push_back(registration.get());
381
+ }
382
+ std::sort(fused_filter_registrations.begin(),
383
+ fused_filter_registrations.end(),
384
+ CompareFusedChannelFiltersByName());
385
+
386
+ for (auto registration : fused_filter_registrations) {
387
+ filters.emplace_back(
388
+ registration->name_, registration->filter_, registration->filter_adder_,
389
+ std::move(registration->predicates_), registration->version_,
390
+ registration->ordering_, registration->registration_source_);
391
+ }
392
+ return filters;
393
+ }
394
+
395
+ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
396
+ const std::vector<std::unique_ptr<ChannelInit::FilterRegistration>>&
397
+ filter_registrations,
398
+ const std::vector<std::unique_ptr<ChannelInit::FilterRegistration>>&
399
+ fused_filter_registrations,
400
+ PostProcessor* post_processors, grpc_channel_stack_type type) {
289
401
  // Collect post processors that need to be applied.
290
402
  // We've already ensured the one-per-slot constraint, so now we can just
291
403
  // collect everything up into a vector and run it in order.
@@ -294,27 +406,32 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig(
294
406
  if (post_processors[i] == nullptr) continue;
295
407
  post_processor_functions.emplace_back(std::move(post_processors[i]));
296
408
  }
297
- // Log out the graph we built if that's been requested.
298
- if (GRPC_TRACE_FLAG_ENABLED(channel_stack)) {
299
- PrintChannelStackTrace(type, registrations, dependencies, filters,
300
- terminal_filters);
301
- }
409
+
410
+ auto sorted_filters =
411
+ SortFilterRegistrationsByDependencies(filter_registrations, type);
412
+ std::vector<Filter> filters = std::move(std::get<0>(sorted_filters));
413
+ std::vector<Filter> terminal_filters = std::move(std::get<1>(sorted_filters));
414
+
415
+ std::vector<Filter> fused_filters =
416
+ SortFusedFilterRegistrations(fused_filter_registrations);
417
+
302
418
  // Check if there are no terminal filters: this would be an error.
303
- // GRPC_CLIENT_DYNAMIC stacks don't use this mechanism, so we don't check that
304
- // condition here.
305
- // Right now we only log: many tests end up with a core configuration that
306
- // is invalid.
419
+ // GRPC_CLIENT_DYNAMIC stacks don't use this mechanism, so we don't check
420
+ // that condition here. Right now we only log: many tests end up with a
421
+ // core configuration that is invalid.
307
422
  // TODO(ctiller): evaluate if we can turn this into a crash one day.
308
- // Right now it forces too many tests to know about channel initialization,
309
- // either by supplying a valid configuration or by including an opt-out flag.
423
+ // Right now it forces too many tests to know about channel
424
+ // initialization, either by supplying a valid configuration or by
425
+ // including an opt-out flag.
310
426
  if (terminal_filters.empty() && type != GRPC_CLIENT_DYNAMIC) {
311
- LOG(ERROR) << "No terminal filters registered for channel stack type "
312
- << grpc_channel_stack_type_string(type)
313
- << "; this is common for unit tests messing with "
314
- "CoreConfiguration, but will result in a "
315
- "ChannelInit::CreateStack that never completes successfully.";
427
+ VLOG(2) << "No terminal filters registered for channel stack type "
428
+ << grpc_channel_stack_type_string(type)
429
+ << "; this is common for unit tests messing with "
430
+ "CoreConfiguration, but will result in a "
431
+ "ChannelInit::CreateStack that never completes successfully.";
316
432
  }
317
- return StackConfig{std::move(filters), std::move(terminal_filters),
433
+ return StackConfig{std::move(filters), std::move(fused_filters),
434
+ std::move(terminal_filters),
318
435
  std::move(post_processor_functions)};
319
436
  };
320
437
 
@@ -333,6 +450,7 @@ void ChannelInit::PrintChannelStackTrace(
333
450
  MutexLock lock(m);
334
451
  // List the channel stack type (since we'll be repeatedly printing graphs in
335
452
  // this loop).
453
+
336
454
  LOG(INFO) << "ORDERED CHANNEL STACK " << grpc_channel_stack_type_string(type)
337
455
  << ":";
338
456
  // First build up a map of filter -> file:line: strings, because it helps
@@ -411,7 +529,7 @@ ChannelInit ChannelInit::Builder::Build() {
411
529
  ChannelInit result;
412
530
  for (int i = 0; i < GRPC_NUM_CHANNEL_STACK_TYPES; i++) {
413
531
  result.stack_configs_[i] =
414
- BuildStackConfig(filters_[i], post_processors_[i],
532
+ BuildStackConfig(filters_[i], fused_filters_[i], post_processors_[i],
415
533
  static_cast<grpc_channel_stack_type>(i));
416
534
  }
417
535
  return result;
@@ -426,41 +544,40 @@ bool ChannelInit::Filter::CheckPredicates(const ChannelArgs& args) const {
426
544
 
427
545
  bool ChannelInit::CreateStack(ChannelStackBuilder* builder) const {
428
546
  const auto& stack_config = stack_configs_[builder->channel_stack_type()];
429
- for (const auto& filter : stack_config.filters) {
430
- if (SkipV2(filter.version)) continue;
431
- if (!filter.CheckPredicates(builder->channel_args())) continue;
432
- builder->AppendFilter(filter.filter);
433
- }
434
- int found_terminators = 0;
435
- for (const auto& terminator : stack_config.terminators) {
436
- if (!terminator.CheckPredicates(builder->channel_args())) continue;
437
- builder->AppendFilter(terminator.filter);
438
- ++found_terminators;
439
- }
440
- if (found_terminators != 1) {
547
+ auto filter_list =
548
+ SelectFiltersByPredicate<false>(stack_config.filters, builder);
549
+ auto terminal_filter_list =
550
+ SelectFiltersByPredicate<true>(stack_config.terminators, builder);
551
+
552
+ if (terminal_filter_list.size() != 1) {
553
+ int filter_count = terminal_filter_list.size();
441
554
  std::string error = absl::StrCat(
442
- found_terminators,
443
- " terminating filters found creating a channel of type ",
555
+ filter_count, " terminating filters found creating a channel of type ",
444
556
  grpc_channel_stack_type_string(builder->channel_stack_type()),
445
557
  " with arguments ", builder->channel_args().ToString(),
446
558
  " (we insist upon one and only one terminating "
447
559
  "filter)\n");
448
- if (stack_config.terminators.empty()) {
560
+ if (terminal_filter_list.empty()) {
449
561
  absl::StrAppend(&error, " No terminal filters were registered");
450
562
  } else {
451
- for (const auto& terminator : stack_config.terminators) {
452
- absl::StrAppend(&error, " ", terminator.name, " registered @ ",
453
- terminator.registration_source.file(), ":",
454
- terminator.registration_source.line(), ": enabled = ",
455
- terminator.CheckPredicates(builder->channel_args())
456
- ? "true"
457
- : "false",
458
- "\n");
563
+ for (const auto& terminator : terminal_filter_list) {
564
+ absl::StrAppend(
565
+ &error, " ", terminator.curr->name, " registered @ ",
566
+ terminator.curr->registration_source.file(), ":",
567
+ terminator.curr->registration_source.line(), ": enabled = ",
568
+ terminator.curr->CheckPredicates(builder->channel_args()) ? "true"
569
+ : "false",
570
+ "\n");
459
571
  }
460
572
  }
461
573
  LOG(ERROR) << error;
462
574
  return false;
463
575
  }
576
+
577
+ MergeFilters(filter_list, stack_config.fused_filters);
578
+ AppendFiltersToBuilder(filter_list, builder);
579
+ AppendFiltersToBuilder(terminal_filter_list, builder);
580
+
464
581
  for (const auto& post_processor : stack_config.post_processors) {
465
582
  post_processor(*builder);
466
583
  }
@@ -270,6 +270,8 @@ class ChannelInit {
270
270
  return *this;
271
271
  }
272
272
 
273
+ const UniqueTypeName& name() { return name_; }
274
+
273
275
  private:
274
276
  friend class ChannelInit;
275
277
  const UniqueTypeName name_;
@@ -322,6 +324,34 @@ class ChannelInit {
322
324
  .SkipV3();
323
325
  }
324
326
 
327
+ // Register a builder in the normal fused filter registration pass.
328
+ // This occurs first during channel build time.
329
+ // The FilterRegistration methods can be called to declaratively define
330
+ // properties of the filter being registered.
331
+ // TODO(ctiller): remove in favor of the version that does not mention
332
+ // grpc_channel_filter
333
+ void RegisterFusedFilter(grpc_channel_stack_type type, UniqueTypeName name,
334
+ const grpc_channel_filter* filter,
335
+ FilterAdder filter_adder = nullptr,
336
+ SourceLocation registration_source = {});
337
+
338
+ void RegisterFusedFilter(grpc_channel_stack_type type,
339
+ const grpc_channel_filter* filter,
340
+ SourceLocation registration_source = {}) {
341
+ CHECK(filter != nullptr);
342
+ RegisterFusedFilter(type, NameFromChannelFilter(filter), filter, nullptr,
343
+ registration_source);
344
+ }
345
+
346
+ template <typename Filter>
347
+ void RegisterFusedFilter(grpc_channel_stack_type type,
348
+ SourceLocation registration_source = {}) {
349
+ RegisterFusedFilter(
350
+ type, UniqueTypeNameFor<Filter>(), &Filter::kFilter,
351
+ [](InterceptionChainBuilder& builder) { builder.Add<Filter>(); },
352
+ registration_source);
353
+ }
354
+
325
355
  // Register a post processor for the builder.
326
356
  // These run after the main graph has been placed into the builder.
327
357
  // At most one filter per slot per channel stack type can be added.
@@ -341,6 +371,8 @@ class ChannelInit {
341
371
  private:
342
372
  std::vector<std::unique_ptr<FilterRegistration>>
343
373
  filters_[GRPC_NUM_CHANNEL_STACK_TYPES];
374
+ std::vector<std::unique_ptr<FilterRegistration>>
375
+ fused_filters_[GRPC_NUM_CHANNEL_STACK_TYPES];
344
376
  PostProcessor post_processors_[GRPC_NUM_CHANNEL_STACK_TYPES]
345
377
  [static_cast<int>(PostProcessorSlot::kCount)];
346
378
  };
@@ -382,17 +414,48 @@ class ChannelInit {
382
414
  Ordering ordering;
383
415
  bool CheckPredicates(const ChannelArgs& args) const;
384
416
  };
417
+
418
+ struct FilterNode {
419
+ const Filter* curr;
420
+ int next;
421
+ };
422
+
385
423
  struct StackConfig {
386
424
  std::vector<Filter> filters;
425
+ std::vector<Filter> fused_filters;
387
426
  std::vector<Filter> terminators;
388
427
  std::vector<PostProcessor> post_processors;
389
428
  };
390
429
 
391
430
  StackConfig stack_configs_[GRPC_NUM_CHANNEL_STACK_TYPES];
392
431
 
432
+ static std::tuple<std::vector<Filter>, std::vector<Filter>>
433
+ SortFilterRegistrationsByDependencies(
434
+ const std::vector<std::unique_ptr<FilterRegistration>>&
435
+ filter_registrations,
436
+ grpc_channel_stack_type type);
437
+
438
+ static std::vector<Filter> SortFusedFilterRegistrations(
439
+ const std::vector<std::unique_ptr<FilterRegistration>>&
440
+ filter_registrations);
441
+
442
+ template <bool is_terminal>
443
+ static std::vector<FilterNode> SelectFiltersByPredicate(
444
+ const std::vector<Filter>& filters, ChannelStackBuilder* builder);
445
+
446
+ static void MergeFilters(std::vector<FilterNode>& filter_list,
447
+ const std::vector<Filter>& fused_filters);
448
+
449
+ static void AppendFiltersToBuilder(const std::vector<FilterNode>& filter_list,
450
+ ChannelStackBuilder* builder);
451
+
393
452
  static StackConfig BuildStackConfig(
394
- const std::vector<std::unique_ptr<FilterRegistration>>& registrations,
453
+ const std::vector<std::unique_ptr<FilterRegistration>>&
454
+ filter_registrations,
455
+ const std::vector<std::unique_ptr<FilterRegistration>>&
456
+ fused_filter_registrations,
395
457
  PostProcessor* post_processors, grpc_channel_stack_type type);
458
+
396
459
  static void PrintChannelStackTrace(
397
460
  grpc_channel_stack_type type,
398
461
  const std::vector<std::unique_ptr<ChannelInit::FilterRegistration>>&
@@ -40,6 +40,7 @@
40
40
  #include "absl/log/check.h"
41
41
  #include "absl/log/log.h"
42
42
  #include "absl/status/status.h"
43
+ #include "absl/strings/escaping.h"
43
44
  #include "absl/strings/str_cat.h"
44
45
  #include "absl/strings/string_view.h"
45
46
  #include "src/core/call/metadata_batch.h"
@@ -398,18 +399,26 @@ bool FilterStackCall::PrepareApplicationMetadata(size_t count,
398
399
  is_trailing ? &send_trailing_metadata_ : &send_initial_metadata_;
399
400
  for (size_t i = 0; i < count; i++) {
400
401
  grpc_metadata* md = &metadata[i];
401
- if (!GRPC_LOG_IF_ERROR("validate_metadata",
402
- grpc_validate_header_key_is_legal(md->key))) {
402
+ if (auto status = grpc_validate_header_key_is_legal(md->key);
403
+ !status.ok()) {
404
+ LOG(ERROR) << "Metadata key '"
405
+ << absl::CEscape(StringViewFromSlice(md->key))
406
+ << "' is invalid: " << status;
403
407
  return false;
404
- } else if (!grpc_is_binary_header_internal(md->key) &&
405
- !GRPC_LOG_IF_ERROR(
406
- "validate_metadata",
407
- grpc_validate_header_nonbin_value_is_legal(md->value))) {
408
- return false;
409
- } else if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
408
+ }
409
+ if (!grpc_is_binary_header_internal(md->key)) {
410
+ if (auto status = grpc_validate_header_nonbin_value_is_legal(md->value);
411
+ !status.ok()) {
412
+ LOG(ERROR) << "Metadata value for key " << StringViewFromSlice(md->key)
413
+ << " is invalid: " << status;
414
+ return false;
415
+ }
416
+ }
417
+ if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
410
418
  // HTTP2 hpack encoding has a maximum limit.
411
419
  return false;
412
- } else if (grpc_slice_str_cmp(md->key, "content-length") == 0) {
420
+ }
421
+ if (grpc_slice_str_cmp(md->key, "content-length") == 0) {
413
422
  // Filter "content-length metadata"
414
423
  continue;
415
424
  }
@@ -71,21 +71,12 @@ static bool g_shutting_down ABSL_GUARDED_BY(g_init_mu) = false;
71
71
 
72
72
  namespace grpc_core {
73
73
  void RegisterSecurityFilters(CoreConfiguration::Builder* builder) {
74
- if (IsCallv3ClientAuthFilterEnabled()) {
75
- builder->channel_init()
76
- ->RegisterFilter<ClientAuthFilter>(GRPC_CLIENT_SUBCHANNEL)
77
- .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
78
- builder->channel_init()
79
- ->RegisterFilter<ClientAuthFilter>(GRPC_CLIENT_DIRECT_CHANNEL)
80
- .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
81
- } else {
82
- builder->channel_init()
83
- ->RegisterV2Filter<LegacyClientAuthFilter>(GRPC_CLIENT_SUBCHANNEL)
84
- .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
85
- builder->channel_init()
86
- ->RegisterV2Filter<LegacyClientAuthFilter>(GRPC_CLIENT_DIRECT_CHANNEL)
87
- .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
88
- }
74
+ builder->channel_init()
75
+ ->RegisterFilter<ClientAuthFilter>(GRPC_CLIENT_SUBCHANNEL)
76
+ .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
77
+ builder->channel_init()
78
+ ->RegisterFilter<ClientAuthFilter>(GRPC_CLIENT_DIRECT_CHANNEL)
79
+ .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR);
89
80
  builder->channel_init()
90
81
  ->RegisterFilter<ServerAuthFilter>(GRPC_SERVER_CHANNEL)
91
82
  .IfHasChannelArg(GRPC_SERVER_CREDENTIALS_ARG);
@@ -63,7 +63,7 @@ namespace grpc_core {
63
63
 
64
64
  absl::StatusOr<RefCountedPtr<Channel>> LegacyChannel::Create(
65
65
  std::string target, ChannelArgs args,
66
- grpc_channel_stack_type channel_stack_type) {
66
+ grpc_channel_stack_type channel_stack_type, const Blackboard* blackboard) {
67
67
  if (grpc_channel_stack_type_is_client(channel_stack_type)) {
68
68
  auto channel_args_mutator =
69
69
  grpc_channel_args_get_client_channel_creation_mutator();
@@ -113,6 +113,7 @@ absl::StatusOr<RefCountedPtr<Channel>> LegacyChannel::Create(
113
113
  grpc_channel_stack_type_string(channel_stack_type), channel_stack_type,
114
114
  args);
115
115
  builder.SetTarget(target.c_str());
116
+ builder.SetBlackboard(blackboard);
116
117
  if (!CoreConfiguration::Get().channel_init().CreateStack(&builder)) {
117
118
  return nullptr;
118
119
  }
@@ -161,10 +162,7 @@ LegacyChannel::LegacyChannel(bool is_client, std::string target,
161
162
  node = channelz_node()->RefAsSubclass<channelz::ChannelNode>();
162
163
  }
163
164
  *channel_stack_->on_destroy = [node = std::move(node)]() {
164
- if (node != nullptr) {
165
- node->AddTraceEvent(channelz::ChannelTrace::Severity::Info,
166
- grpc_slice_from_static_string("Channel destroyed"));
167
- }
165
+ GRPC_CHANNELZ_LOG(node) << "Channel destroyed";
168
166
  ShutdownInternally();
169
167
  };
170
168
  }
@@ -29,6 +29,7 @@
29
29
  #include "absl/status/statusor.h"
30
30
  #include "src/core/call/call_arena_allocator.h"
31
31
  #include "src/core/client_channel/client_channel_filter.h"
32
+ #include "src/core/filter/blackboard.h"
32
33
  #include "src/core/lib/channel/channel_args.h"
33
34
  #include "src/core/lib/channel/channel_fwd.h"
34
35
  #include "src/core/lib/channel/channel_stack.h" // IWYU pragma: keep
@@ -47,7 +48,8 @@ class LegacyChannel final : public Channel {
47
48
  public:
48
49
  static absl::StatusOr<RefCountedPtr<Channel>> Create(
49
50
  std::string target, ChannelArgs args,
50
- grpc_channel_stack_type channel_stack_type);
51
+ grpc_channel_stack_type channel_stack_type,
52
+ const Blackboard* blackboard = nullptr);
51
53
 
52
54
  // Do not instantiate directly -- use Create() instead.
53
55
  LegacyChannel(bool is_client, std::string target,
@@ -22,6 +22,6 @@
22
22
  #include <grpc/grpc.h>
23
23
  #include <grpc/support/port_platform.h>
24
24
 
25
- const char* grpc_version_string(void) { return "48.0.0"; }
25
+ const char* grpc_version_string(void) { return "49.0.0"; }
26
26
 
27
- const char* grpc_g_stands_for(void) { return "gradient"; }
27
+ const char* grpc_g_stands_for(void) { return "gee"; }
@@ -0,0 +1,110 @@
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
+ #include "src/core/lib/transport/promise_endpoint.h"
16
+
17
+ #include <grpc/event_engine/event_engine.h>
18
+ #include <grpc/event_engine/slice_buffer.h>
19
+ #include <grpc/slice_buffer.h>
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <atomic>
23
+ #include <functional>
24
+ #include <memory>
25
+ #include <optional>
26
+ #include <utility>
27
+
28
+ #include "absl/log/check.h"
29
+ #include "absl/status/status.h"
30
+ #include "src/core/lib/slice/slice_buffer.h"
31
+ #include "src/core/util/sync.h"
32
+
33
+ namespace grpc_core {
34
+
35
+ PromiseEndpoint::PromiseEndpoint(
36
+ std::unique_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
37
+ endpoint,
38
+ SliceBuffer already_received)
39
+ : endpoint_(std::move(endpoint)) {
40
+ CHECK_NE(endpoint_, nullptr);
41
+ read_state_->endpoint = endpoint_;
42
+ // TODO(ladynana): Replace this with `SliceBufferCast<>` when it is
43
+ // available.
44
+ grpc_slice_buffer_swap(read_state_->buffer.c_slice_buffer(),
45
+ already_received.c_slice_buffer());
46
+ }
47
+
48
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
49
+ PromiseEndpoint::GetPeerAddress() const {
50
+ return endpoint_->GetPeerAddress();
51
+ }
52
+
53
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
54
+ PromiseEndpoint::GetLocalAddress() const {
55
+ return endpoint_->GetLocalAddress();
56
+ }
57
+
58
+ void PromiseEndpoint::ReadState::Complete(absl::Status status,
59
+ const size_t num_bytes_requested) {
60
+ GRPC_LATENT_SEE_INNER_SCOPE("PromiseEndpoint::ReadState::Complete");
61
+ while (true) {
62
+ if (!status.ok()) {
63
+ // Invalidates all previous reads.
64
+ pending_buffer.Clear();
65
+ buffer.Clear();
66
+ result = status;
67
+ auto w = std::move(waker);
68
+ complete.store(true, std::memory_order_release);
69
+ w.Wakeup();
70
+ return;
71
+ }
72
+ // Appends `pending_buffer` to `buffer`.
73
+ pending_buffer.MoveFirstNBytesIntoSliceBuffer(pending_buffer.Length(),
74
+ buffer);
75
+ DCHECK(pending_buffer.Count() == 0u);
76
+ if (buffer.Length() < num_bytes_requested) {
77
+ GRPC_LATENT_SEE_INNER_SCOPE("PromiseEndpoint::ReadState::Continue");
78
+ // A further read is needed.
79
+ // Set read args with number of bytes needed as hint.
80
+ grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs
81
+ read_args;
82
+ read_args.set_read_hint_bytes(
83
+ static_cast<int64_t>(num_bytes_requested - buffer.Length()));
84
+ // If `Read()` returns true immediately, the callback will not be
85
+ // called. We still need to call our callback to pick up the result and
86
+ // maybe do further reads.
87
+ auto ep = endpoint.lock();
88
+ if (ep == nullptr) {
89
+ status = absl::UnavailableError("Endpoint closed during read.");
90
+ continue;
91
+ }
92
+ if (ep->Read(
93
+ [self = Ref(), num_bytes_requested](absl::Status status) {
94
+ ExecCtx exec_ctx;
95
+ self->Complete(std::move(status), num_bytes_requested);
96
+ },
97
+ &pending_buffer, std::move(read_args))) {
98
+ continue;
99
+ }
100
+ return;
101
+ }
102
+ result = status;
103
+ auto w = std::move(waker);
104
+ complete.store(true, std::memory_order_release);
105
+ w.Wakeup();
106
+ return;
107
+ }
108
+ }
109
+
110
+ } // namespace grpc_core