grpc 1.64.3 → 1.65.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 (632) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -58
  3. data/include/grpc/event_engine/event_engine.h +13 -6
  4. data/include/grpc/impl/channel_arg_names.h +7 -3
  5. data/include/grpc/module.modulemap +1 -0
  6. data/include/grpc/passive_listener.h +62 -0
  7. data/include/grpc/support/log.h +7 -17
  8. data/include/grpc/support/port_platform.h +3 -0
  9. data/src/core/channelz/channel_trace.cc +1 -1
  10. data/src/core/channelz/channel_trace.h +1 -1
  11. data/src/core/channelz/channelz.cc +3 -3
  12. data/src/core/channelz/channelz.h +7 -7
  13. data/src/core/channelz/channelz_registry.cc +4 -3
  14. data/src/core/client_channel/backup_poller.cc +4 -5
  15. data/src/core/client_channel/client_channel.cc +1324 -0
  16. data/src/core/client_channel/client_channel.h +243 -0
  17. data/src/core/client_channel/client_channel_filter.cc +266 -709
  18. data/src/core/client_channel/client_channel_filter.h +11 -64
  19. data/src/core/client_channel/client_channel_internal.h +16 -5
  20. data/src/core/client_channel/client_channel_plugin.cc +1 -14
  21. data/src/core/client_channel/client_channel_service_config.h +3 -3
  22. data/src/core/client_channel/config_selector.cc +1 -1
  23. data/src/core/client_channel/config_selector.h +1 -1
  24. data/src/core/client_channel/dynamic_filters.cc +3 -3
  25. data/src/core/client_channel/dynamic_filters.h +1 -3
  26. data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
  27. data/src/core/client_channel/load_balanced_call_destination.h +49 -0
  28. data/src/core/client_channel/retry_filter.cc +2 -9
  29. data/src/core/client_channel/retry_filter.h +2 -7
  30. data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
  31. data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
  32. data/src/core/client_channel/retry_service_config.cc +4 -5
  33. data/src/core/client_channel/retry_service_config.h +3 -3
  34. data/src/core/client_channel/subchannel.cc +220 -112
  35. data/src/core/client_channel/subchannel.h +31 -18
  36. data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
  37. data/src/core/client_channel/subchannel_pool_interface.h +2 -4
  38. data/src/core/client_channel/subchannel_stream_client.cc +36 -49
  39. data/src/core/client_channel/subchannel_stream_client.h +2 -4
  40. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
  41. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
  42. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
  43. data/src/core/ext/filters/census/grpc_context.cc +2 -4
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
  45. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
  46. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
  49. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
  50. data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
  51. data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
  52. data/src/core/ext/filters/http/client_authority_filter.h +1 -0
  53. data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
  54. data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
  55. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
  56. data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
  57. data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
  58. data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
  59. data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
  60. data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
  61. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  62. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  63. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
  64. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
  65. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
  66. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  67. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
  68. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
  70. data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
  71. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
  73. data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
  74. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
  75. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
  76. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
  77. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
  78. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
  80. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
  81. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -43
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
  83. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
  84. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  85. data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
  86. data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
  87. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
  88. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
  89. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
  93. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
  94. data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
  95. data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
  97. data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
  98. data/src/core/handshaker/handshaker.cc +6 -14
  99. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
  100. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
  101. data/src/core/handshaker/security/secure_endpoint.cc +38 -32
  102. data/src/core/handshaker/security/secure_endpoint.h +0 -2
  103. data/src/core/handshaker/security/security_handshaker.cc +25 -37
  104. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
  105. data/src/core/lib/address_utils/parse_address.cc +27 -39
  106. data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
  107. data/src/core/lib/avl/avl.h +1 -1
  108. data/src/core/lib/channel/channel_args.cc +13 -17
  109. data/src/core/lib/channel/channel_args.h +19 -8
  110. data/src/core/lib/channel/channel_stack.cc +5 -63
  111. data/src/core/lib/channel/channel_stack.h +13 -37
  112. data/src/core/lib/channel/channel_stack_builder.h +0 -5
  113. data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
  114. data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
  115. data/src/core/lib/channel/connected_channel.cc +37 -676
  116. data/src/core/lib/channel/promise_based_filter.cc +41 -47
  117. data/src/core/lib/channel/promise_based_filter.h +124 -477
  118. data/src/core/lib/channel/status_util.cc +1 -1
  119. data/src/core/lib/compression/compression.cc +1 -1
  120. data/src/core/lib/compression/message_compress.cc +6 -6
  121. data/src/core/lib/config/config_vars.cc +3 -8
  122. data/src/core/lib/config/config_vars.h +1 -5
  123. data/src/core/lib/debug/event_log.h +1 -1
  124. data/src/core/lib/debug/trace.cc +43 -59
  125. data/src/core/lib/debug/trace.h +2 -97
  126. data/src/core/lib/debug/trace_flags.cc +255 -0
  127. data/src/core/lib/debug/trace_flags.h +133 -0
  128. data/src/core/lib/debug/trace_impl.h +115 -0
  129. data/src/core/lib/event_engine/ares_resolver.cc +5 -7
  130. data/src/core/lib/event_engine/ares_resolver.h +1 -3
  131. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  132. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
  133. data/src/core/lib/event_engine/event_engine.cc +29 -4
  134. data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
  135. data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
  136. data/src/core/lib/event_engine/forkable.cc +4 -5
  137. data/src/core/lib/event_engine/forkable.h +0 -11
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
  139. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
  140. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
  142. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
  143. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
  144. data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
  146. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
  148. data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
  149. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
  150. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
  151. data/src/core/lib/event_engine/shim.cc +1 -1
  152. data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
  153. data/src/core/lib/event_engine/thread_local.h +1 -1
  154. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
  159. data/src/core/lib/event_engine/trace.h +6 -17
  160. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  161. data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
  162. data/src/core/lib/event_engine/windows/win_socket.h +4 -5
  163. data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
  164. data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
  165. data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
  166. data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
  167. data/src/core/lib/experiments/experiments.cc +35 -151
  168. data/src/core/lib/experiments/experiments.h +12 -45
  169. data/src/core/lib/gprpp/bitset.h +1 -1
  170. data/src/core/lib/gprpp/crash.cc +2 -3
  171. data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
  172. data/src/core/lib/gprpp/dump_args.cc +54 -0
  173. data/src/core/lib/gprpp/dump_args.h +69 -0
  174. data/src/core/lib/gprpp/glob.cc +70 -0
  175. data/src/core/lib/gprpp/glob.h +29 -0
  176. data/src/core/lib/gprpp/per_cpu.cc +1 -1
  177. data/src/core/lib/gprpp/posix/stat.cc +3 -4
  178. data/src/core/lib/gprpp/posix/thd.cc +8 -9
  179. data/src/core/lib/gprpp/ref_counted.h +30 -22
  180. data/src/core/lib/gprpp/single_set_ptr.h +5 -3
  181. data/src/core/lib/gprpp/status_helper.cc +11 -30
  182. data/src/core/lib/gprpp/status_helper.h +3 -31
  183. data/src/core/lib/gprpp/time.cc +3 -4
  184. data/src/core/lib/gprpp/time.h +3 -2
  185. data/src/core/lib/gprpp/unique_type_name.h +1 -1
  186. data/src/core/lib/gprpp/validation_errors.cc +10 -1
  187. data/src/core/lib/gprpp/validation_errors.h +11 -0
  188. data/src/core/lib/gprpp/windows/stat.cc +3 -4
  189. data/src/core/lib/gprpp/windows/thd.cc +3 -2
  190. data/src/core/lib/gprpp/work_serializer.cc +48 -57
  191. data/src/core/lib/iomgr/buffer_list.cc +4 -2
  192. data/src/core/lib/iomgr/call_combiner.cc +18 -27
  193. data/src/core/lib/iomgr/call_combiner.h +1 -3
  194. data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
  195. data/src/core/lib/iomgr/closure.h +2 -4
  196. data/src/core/lib/iomgr/combiner.cc +6 -8
  197. data/src/core/lib/iomgr/combiner.h +0 -2
  198. data/src/core/lib/iomgr/endpoint.cc +0 -6
  199. data/src/core/lib/iomgr/endpoint.h +0 -2
  200. data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
  201. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  202. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  203. data/src/core/lib/iomgr/error.cc +13 -21
  204. data/src/core/lib/iomgr/error.h +1 -1
  205. data/src/core/lib/iomgr/ev_apple.cc +3 -5
  206. data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
  207. data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
  208. data/src/core/lib/iomgr/ev_posix.cc +8 -9
  209. data/src/core/lib/iomgr/ev_posix.h +10 -7
  210. data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
  211. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
  212. data/src/core/lib/iomgr/exec_ctx.cc +2 -2
  213. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  214. data/src/core/lib/iomgr/executor.cc +6 -15
  215. data/src/core/lib/iomgr/executor.h +1 -1
  216. data/src/core/lib/iomgr/fork_posix.cc +8 -10
  217. data/src/core/lib/iomgr/fork_windows.cc +3 -1
  218. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
  219. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
  220. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  221. data/src/core/lib/iomgr/iocp_windows.cc +4 -3
  222. data/src/core/lib/iomgr/iomgr.cc +13 -17
  223. data/src/core/lib/iomgr/lockfree_event.cc +3 -5
  224. data/src/core/lib/iomgr/pollset.h +0 -2
  225. data/src/core/lib/iomgr/pollset_windows.cc +0 -2
  226. data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
  227. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  228. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  229. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  230. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
  231. data/src/core/lib/iomgr/socket_windows.cc +4 -6
  232. data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
  233. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
  234. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
  235. data/src/core/lib/iomgr/tcp_posix.cc +57 -84
  236. data/src/core/lib/iomgr/tcp_posix.h +0 -2
  237. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
  238. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
  239. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
  240. data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
  241. data/src/core/lib/iomgr/tcp_windows.cc +25 -41
  242. data/src/core/lib/iomgr/timer_generic.cc +17 -20
  243. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  244. data/src/core/lib/iomgr/timer_manager.cc +17 -30
  245. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  246. data/src/core/lib/iomgr/vsock.cc +1 -1
  247. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
  248. data/src/core/lib/promise/activity.h +27 -4
  249. data/src/core/lib/promise/cancel_callback.h +24 -0
  250. data/src/core/lib/promise/context.h +11 -0
  251. data/src/core/lib/promise/detail/basic_seq.h +1 -2
  252. data/src/core/lib/promise/detail/join_state.h +354 -398
  253. data/src/core/lib/promise/detail/promise_like.h +6 -5
  254. data/src/core/lib/promise/detail/seq_state.h +1178 -1178
  255. data/src/core/lib/promise/for_each.h +6 -6
  256. data/src/core/lib/promise/interceptor_list.h +6 -7
  257. data/src/core/lib/promise/latch.h +9 -9
  258. data/src/core/lib/promise/map.h +17 -0
  259. data/src/core/lib/promise/observable.h +182 -0
  260. data/src/core/lib/promise/party.cc +7 -8
  261. data/src/core/lib/promise/party.h +10 -8
  262. data/src/core/lib/promise/pipe.h +16 -35
  263. data/src/core/lib/promise/promise.h +1 -0
  264. data/src/core/lib/promise/status_flag.h +2 -0
  265. data/src/core/lib/resource_quota/arena.cc +56 -79
  266. data/src/core/lib/resource_quota/arena.h +118 -209
  267. data/src/core/lib/resource_quota/memory_quota.cc +12 -13
  268. data/src/core/lib/resource_quota/memory_quota.h +2 -3
  269. data/src/core/lib/resource_quota/periodic_update.cc +1 -1
  270. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  271. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  272. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  273. data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
  274. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
  275. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
  276. data/src/core/lib/security/authorization/matchers.cc +3 -3
  277. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
  278. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
  279. data/src/core/lib/security/context/security_context.cc +12 -13
  280. data/src/core/lib/security/context/security_context.h +31 -8
  281. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  282. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
  283. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
  284. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
  285. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
  286. data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
  287. data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
  288. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
  289. data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
  290. data/src/core/lib/security/credentials/credentials.cc +6 -6
  291. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
  292. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
  293. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
  294. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
  295. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
  296. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
  297. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
  299. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  300. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
  301. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
  302. data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
  303. data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
  304. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  305. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
  306. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
  307. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
  308. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  309. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  310. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  312. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  313. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
  314. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
  315. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  316. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
  317. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
  318. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
  319. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
  320. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
  321. data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
  322. data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
  323. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
  324. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
  325. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
  326. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
  327. data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
  328. data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
  329. data/src/core/lib/security/security_connector/security_connector.cc +1 -4
  330. data/src/core/lib/security/security_connector/security_connector.h +1 -3
  331. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
  332. data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
  333. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
  334. data/src/core/lib/security/transport/auth_filters.h +1 -0
  335. data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
  336. data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
  337. data/src/core/lib/security/util/json_util.h +1 -1
  338. data/src/core/lib/slice/slice.h +1 -1
  339. data/src/core/lib/slice/slice_refcount.h +2 -4
  340. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  341. data/src/core/lib/surface/api_trace.h +1 -3
  342. data/src/core/lib/surface/call.cc +64 -3738
  343. data/src/core/lib/surface/call.h +41 -143
  344. data/src/core/lib/surface/call_log_batch.cc +1 -1
  345. data/src/core/lib/surface/call_utils.cc +276 -0
  346. data/src/core/lib/surface/call_utils.h +449 -0
  347. data/src/core/lib/surface/channel.cc +8 -3
  348. data/src/core/lib/surface/channel.h +10 -7
  349. data/src/core/lib/surface/channel_create.cc +14 -6
  350. data/src/core/lib/surface/channel_create.h +3 -2
  351. data/src/core/lib/surface/channel_init.cc +21 -77
  352. data/src/core/lib/surface/channel_init.h +19 -97
  353. data/src/core/lib/surface/client_call.cc +419 -0
  354. data/src/core/lib/surface/client_call.h +180 -0
  355. data/src/core/lib/surface/completion_queue.cc +28 -33
  356. data/src/core/lib/surface/completion_queue.h +0 -8
  357. data/src/core/lib/surface/filter_stack_call.cc +1157 -0
  358. data/src/core/lib/surface/filter_stack_call.h +369 -0
  359. data/src/core/lib/surface/init.cc +7 -6
  360. data/src/core/lib/surface/lame_client.cc +1 -1
  361. data/src/core/lib/surface/legacy_channel.cc +40 -27
  362. data/src/core/lib/surface/legacy_channel.h +9 -18
  363. data/src/core/lib/surface/server_call.cc +222 -0
  364. data/src/core/lib/surface/server_call.h +167 -0
  365. data/src/core/lib/surface/version.cc +2 -2
  366. data/src/core/lib/transport/bdp_estimator.cc +3 -5
  367. data/src/core/lib/transport/bdp_estimator.h +2 -4
  368. data/src/core/lib/transport/call_arena_allocator.h +9 -7
  369. data/src/core/lib/transport/call_destination.h +76 -0
  370. data/src/core/lib/transport/call_filters.cc +28 -10
  371. data/src/core/lib/transport/call_filters.h +128 -22
  372. data/src/core/lib/transport/call_spine.cc +5 -6
  373. data/src/core/lib/transport/call_spine.h +159 -334
  374. data/src/core/lib/transport/connectivity_state.cc +8 -10
  375. data/src/core/lib/transport/connectivity_state.h +0 -2
  376. data/src/core/lib/transport/interception_chain.cc +155 -0
  377. data/src/core/lib/transport/interception_chain.h +236 -0
  378. data/src/core/lib/transport/metadata_batch.h +10 -1
  379. data/src/core/lib/transport/metadata_info.h +1 -1
  380. data/src/core/lib/transport/transport.cc +3 -6
  381. data/src/core/lib/transport/transport.h +43 -40
  382. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  383. data/src/core/load_balancing/endpoint_list.cc +5 -5
  384. data/src/core/load_balancing/endpoint_list.h +1 -1
  385. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
  386. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
  387. data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
  388. data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
  389. data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
  390. data/src/core/load_balancing/health_check_client.cc +10 -13
  391. data/src/core/load_balancing/lb_policy.cc +5 -8
  392. data/src/core/load_balancing/lb_policy.h +19 -3
  393. data/src/core/load_balancing/lb_policy_factory.h +1 -1
  394. data/src/core/load_balancing/lb_policy_registry.cc +2 -3
  395. data/src/core/load_balancing/lb_policy_registry.h +1 -1
  396. data/src/core/load_balancing/oob_backend_metric.cc +2 -4
  397. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
  398. data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
  399. data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
  400. data/src/core/load_balancing/priority/priority.cc +26 -28
  401. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
  402. data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
  403. data/src/core/load_balancing/rls/rls.cc +82 -82
  404. data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
  405. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
  406. data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
  407. data/src/core/load_balancing/xds/cds.cc +14 -16
  408. data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
  409. data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
  410. data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
  411. data/src/core/load_balancing/xds/xds_override_host.h +3 -3
  412. data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
  413. data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
  414. data/src/core/resolver/binder/binder_resolver.cc +3 -2
  415. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
  416. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  417. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
  418. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
  419. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  420. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
  421. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
  422. data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
  423. data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
  424. data/src/core/resolver/endpoint_addresses.cc +1 -1
  425. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  426. data/src/core/resolver/fake/fake_resolver.h +1 -1
  427. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  428. data/src/core/resolver/polling_resolver.cc +30 -35
  429. data/src/core/resolver/resolver.cc +2 -6
  430. data/src/core/resolver/resolver.h +0 -2
  431. data/src/core/resolver/resolver_registry.cc +6 -8
  432. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  433. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
  434. data/src/core/resolver/xds/xds_resolver.cc +13 -15
  435. data/src/core/server/server.cc +269 -389
  436. data/src/core/server/server.h +37 -19
  437. data/src/core/server/server_call_tracer_filter.cc +7 -14
  438. data/src/core/server/server_config_selector.h +1 -1
  439. data/src/core/server/server_config_selector_filter.cc +3 -3
  440. data/src/core/server/server_interface.h +2 -0
  441. data/src/core/server/xds_channel_stack_modifier.cc +1 -1
  442. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  443. data/src/core/server/xds_server_config_fetcher.cc +1 -4
  444. data/src/core/service_config/service_config.h +1 -1
  445. data/src/core/service_config/service_config_call_data.h +13 -11
  446. data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
  447. data/src/core/service_config/service_config_impl.cc +5 -5
  448. data/src/core/service_config/service_config_impl.h +1 -1
  449. data/src/core/service_config/service_config_parser.cc +3 -6
  450. data/src/core/service_config/service_config_parser.h +1 -1
  451. data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
  452. data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
  453. data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
  454. data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
  455. data/src/core/telemetry/metrics.cc +178 -0
  456. data/src/core/telemetry/metrics.h +562 -0
  457. data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
  458. data/src/core/{lib/debug → telemetry}/stats.h +5 -5
  459. data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
  460. data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
  461. data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
  462. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
  463. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
  464. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
  465. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  466. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
  467. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
  468. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
  469. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  470. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
  471. data/src/core/tsi/fake_transport_security.cc +14 -17
  472. data/src/core/tsi/local_transport_security.cc +6 -5
  473. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
  474. data/src/core/tsi/ssl_transport_security.cc +76 -81
  475. data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
  476. data/src/core/tsi/ssl_transport_security_utils.h +11 -0
  477. data/src/core/tsi/transport_security.cc +0 -4
  478. data/src/core/tsi/transport_security.h +0 -2
  479. data/src/core/tsi/transport_security_interface.h +0 -4
  480. data/src/core/{lib/gpr → util}/alloc.h +3 -3
  481. data/src/core/{lib/gpr → util}/android/log.cc +0 -19
  482. data/src/core/{lib/gpr → util}/atm.cc +1 -1
  483. data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
  484. data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
  485. data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
  486. data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
  487. data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
  488. data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
  489. data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
  490. data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
  491. data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
  492. data/src/core/{lib/http → util/http_client}/parser.h +5 -6
  493. data/src/core/{lib → util}/json/json.h +5 -4
  494. data/src/core/{lib → util}/json/json_args.h +5 -5
  495. data/src/core/{lib → util}/json/json_channel_args.h +6 -6
  496. data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
  497. data/src/core/{lib → util}/json/json_object_loader.h +7 -7
  498. data/src/core/{lib → util}/json/json_reader.cc +3 -2
  499. data/src/core/{lib → util}/json/json_reader.h +6 -6
  500. data/src/core/{lib → util}/json/json_util.cc +4 -4
  501. data/src/core/{lib → util}/json/json_util.h +6 -6
  502. data/src/core/{lib → util}/json/json_writer.cc +3 -3
  503. data/src/core/{lib → util}/json/json_writer.h +6 -6
  504. data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
  505. data/src/core/util/log.cc +165 -0
  506. data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
  507. data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
  508. data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
  509. data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
  510. data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
  511. data/src/core/{lib/gpr → util}/spinlock.h +3 -3
  512. data/src/core/{lib/gpr → util}/string.cc +2 -2
  513. data/src/core/{lib/gpr → util}/string.h +3 -3
  514. data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
  515. data/src/core/{lib/gpr → util}/time_precise.h +3 -3
  516. data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
  517. data/src/core/{lib/gpr → util}/useful.h +3 -3
  518. data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
  519. data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
  520. data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
  521. data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
  522. data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
  523. data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
  524. data/src/core/xds/grpc/certificate_provider_store.h +4 -4
  525. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  526. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
  527. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  528. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
  529. data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
  530. data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
  531. data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
  532. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  533. data/src/core/xds/grpc/xds_cluster.cc +4 -5
  534. data/src/core/xds/grpc/xds_cluster.h +1 -1
  535. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  536. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  537. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  538. data/src/core/xds/grpc/xds_common_types.h +1 -1
  539. data/src/core/xds/grpc/xds_endpoint.cc +4 -5
  540. data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
  541. data/src/core/xds/grpc/xds_http_filters.h +2 -2
  542. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
  543. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
  544. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  545. data/src/core/xds/grpc/xds_listener.cc +4 -6
  546. data/src/core/xds/grpc/xds_route_config.cc +7 -8
  547. data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
  548. data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
  549. data/src/core/xds/xds_client/xds_api.cc +5 -9
  550. data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
  551. data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
  552. data/src/core/xds/xds_client/xds_client.cc +39 -45
  553. data/src/core/xds/xds_client/xds_client.h +0 -3
  554. data/src/core/xds/xds_client/xds_client_stats.cc +6 -6
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/bin/math_pb.rb +1 -22
  557. data/src/ruby/ext/grpc/rb_call.c +8 -1
  558. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  559. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  560. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  561. data/src/ruby/ext/grpc/rb_server.c +39 -22
  562. data/src/ruby/lib/grpc/version.rb +1 -1
  563. data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
  564. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
  565. data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
  566. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
  567. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
  568. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
  569. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
  570. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  571. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  572. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  573. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  576. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  577. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  584. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  589. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  590. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  591. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  593. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  594. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  595. metadata +103 -93
  596. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  597. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  598. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  599. data/src/core/handshaker/security/tsi_error.cc +0 -31
  600. data/src/core/handshaker/security/tsi_error.h +0 -30
  601. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  602. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  603. data/src/core/lib/channel/context.h +0 -105
  604. data/src/core/lib/channel/metrics.cc +0 -334
  605. data/src/core/lib/channel/metrics.h +0 -365
  606. data/src/core/lib/event_engine/trace.cc +0 -25
  607. data/src/core/lib/gpr/log.cc +0 -166
  608. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  609. data/src/core/lib/promise/trace.cc +0 -20
  610. data/src/core/lib/promise/trace.h +0 -24
  611. data/src/core/lib/resource_quota/trace.cc +0 -19
  612. data/src/core/lib/resource_quota/trace.h +0 -24
  613. data/src/core/lib/slice/slice_refcount.cc +0 -20
  614. data/src/core/lib/surface/api_trace.cc +0 -25
  615. data/src/core/lib/surface/call_trace.h +0 -24
  616. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  617. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  618. data/src/core/lib/transport/batch_builder.cc +0 -172
  619. data/src/core/lib/transport/batch_builder.h +0 -474
  620. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  621. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  622. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  623. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  624. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  625. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  626. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  627. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  628. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  629. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  630. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  631. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  632. /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -44,7 +44,6 @@
44
44
  #include "src/core/lib/config/core_configuration.h"
45
45
  #include "src/core/lib/debug/trace.h"
46
46
  #include "src/core/lib/experiments/experiments.h"
47
- #include "src/core/lib/gpr/alloc.h"
48
47
  #include "src/core/lib/gprpp/debug_location.h"
49
48
  #include "src/core/lib/gprpp/orphanable.h"
50
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -73,12 +72,11 @@
73
72
  #include "src/core/lib/slice/slice.h"
74
73
  #include "src/core/lib/slice/slice_buffer.h"
75
74
  #include "src/core/lib/surface/call.h"
76
- #include "src/core/lib/surface/call_trace.h"
77
75
  #include "src/core/lib/surface/channel_stack_type.h"
78
- #include "src/core/lib/transport/batch_builder.h"
79
76
  #include "src/core/lib/transport/error_utils.h"
80
77
  #include "src/core/lib/transport/metadata_batch.h"
81
78
  #include "src/core/lib/transport/transport.h"
79
+ #include "src/core/util/alloc.h"
82
80
 
83
81
  typedef struct connected_channel_channel_data {
84
82
  grpc_core::Transport* transport;
@@ -245,683 +243,48 @@ static void connected_channel_get_channel_info(
245
243
 
246
244
  namespace grpc_core {
247
245
  namespace {
248
-
249
- #if defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL) || \
250
- defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
251
- class ConnectedChannelStream : public Orphanable {
252
- public:
253
- explicit ConnectedChannelStream(Transport* transport)
254
- : transport_(transport), stream_(nullptr, StreamDeleter(this)) {
255
- GRPC_STREAM_REF_INIT(
256
- &stream_refcount_, 1,
257
- [](void* p, grpc_error_handle) {
258
- static_cast<ConnectedChannelStream*>(p)->BeginDestroy();
259
- },
260
- this, "ConnectedChannelStream");
261
- }
262
-
263
- Transport* transport() { return transport_; }
264
- grpc_closure* stream_destroyed_closure() { return &stream_destroyed_; }
265
-
266
- BatchBuilder::Target batch_target() {
267
- return BatchBuilder::Target{transport_, stream_.get(), &stream_refcount_};
268
- }
269
-
270
- void IncrementRefCount(const char* reason = "smartptr") {
271
- #ifndef NDEBUG
272
- grpc_stream_ref(&stream_refcount_, reason);
273
- #else
274
- (void)reason;
275
- grpc_stream_ref(&stream_refcount_);
276
- #endif
277
- }
278
-
279
- void Unref(const char* reason = "smartptr") {
280
- #ifndef NDEBUG
281
- grpc_stream_unref(&stream_refcount_, reason);
282
- #else
283
- (void)reason;
284
- grpc_stream_unref(&stream_refcount_);
285
- #endif
286
- }
287
-
288
- RefCountedPtr<ConnectedChannelStream> InternalRef() {
289
- IncrementRefCount("smartptr");
290
- return RefCountedPtr<ConnectedChannelStream>(this);
291
- }
292
-
293
- void Orphan() final {
294
- bool finished = finished_.IsSet();
295
- if (grpc_call_trace.enabled()) {
296
- gpr_log(GPR_DEBUG, "%s[connected] Orphan stream, finished: %d",
297
- party_->DebugTag().c_str(), finished);
298
- }
299
- // If we hadn't already observed the stream to be finished, we need to
300
- // cancel it at the transport.
301
- if (!finished) {
302
- party_->Spawn(
303
- "finish",
304
- [self = InternalRef()]() {
305
- if (!self->finished_.IsSet()) {
306
- self->finished_.Set();
307
- }
308
- return Empty{};
309
- },
310
- [](Empty) {});
311
- GetContext<BatchBuilder>()->Cancel(batch_target(),
312
- absl::CancelledError());
313
- }
314
- Unref("orphan connected stream");
315
- }
316
-
317
- // Returns a promise that implements the receive message loop.
318
- auto RecvMessages(PipeSender<MessageHandle>* incoming_messages,
319
- bool cancel_on_error);
320
- // Returns a promise that implements the send message loop.
321
- auto SendMessages(PipeReceiver<MessageHandle>* outgoing_messages);
322
-
323
- void SetStream(grpc_stream* stream) { stream_.reset(stream); }
324
- grpc_stream* stream() { return stream_.get(); }
325
- grpc_stream_refcount* stream_refcount() { return &stream_refcount_; }
326
-
327
- void set_finished() { finished_.Set(); }
328
- auto WaitFinished() { return finished_.Wait(); }
329
-
330
- private:
331
- class StreamDeleter {
332
- public:
333
- explicit StreamDeleter(ConnectedChannelStream* impl) : impl_(impl) {}
334
- void operator()(grpc_stream* stream) const {
335
- if (stream == nullptr) return;
336
- impl_->transport()->filter_stack_transport()->DestroyStream(
337
- stream, impl_->stream_destroyed_closure());
338
- }
339
-
340
- private:
341
- ConnectedChannelStream* impl_;
342
- };
343
- using StreamPtr = std::unique_ptr<grpc_stream, StreamDeleter>;
344
-
345
- void StreamDestroyed() {
346
- call_context_->RunInContext([this] { this->~ConnectedChannelStream(); });
347
- }
348
-
349
- void BeginDestroy() {
350
- if (stream_ != nullptr) {
351
- stream_.reset();
352
- } else {
353
- StreamDestroyed();
354
- }
355
- }
356
-
357
- Transport* const transport_;
358
- RefCountedPtr<CallContext> const call_context_{
359
- GetContext<CallContext>()->Ref()};
360
- grpc_closure stream_destroyed_ =
361
- MakeMemberClosure<ConnectedChannelStream,
362
- &ConnectedChannelStream::StreamDestroyed>(
363
- this, DEBUG_LOCATION);
364
- grpc_stream_refcount stream_refcount_;
365
- StreamPtr stream_;
366
- Arena* arena_ = GetContext<Arena>();
367
- Party* const party_ = GetContext<Party>();
368
- ExternallyObservableLatch<void> finished_;
246
+ const grpc_channel_filter kConnectedFilter{
247
+ connected_channel_start_transport_stream_op_batch,
248
+ connected_channel_start_transport_op,
249
+ sizeof(call_data),
250
+ connected_channel_init_call_elem,
251
+ set_pollset_or_pollset_set,
252
+ connected_channel_destroy_call_elem,
253
+ sizeof(channel_data),
254
+ connected_channel_init_channel_elem,
255
+ +[](grpc_channel_stack* channel_stack, grpc_channel_element* elem) {
256
+ // HACK(ctiller): increase call stack size for the channel to make
257
+ // space for channel data. We need a cleaner (but performant) way to
258
+ // do this, and I'm not sure what that is yet. This is only "safe"
259
+ // because call stacks place no additional data after the last call
260
+ // element, and the last call element MUST be the connected channel.
261
+ auto* transport =
262
+ static_cast<channel_data*>(elem->channel_data)->transport;
263
+ if (transport->filter_stack_transport() != nullptr) {
264
+ channel_stack->call_stack_size +=
265
+ transport->filter_stack_transport()->SizeOfStream();
266
+ }
267
+ },
268
+ connected_channel_destroy_channel_elem,
269
+ connected_channel_get_channel_info,
270
+ "connected",
369
271
  };
370
272
 
371
- auto ConnectedChannelStream::RecvMessages(
372
- PipeSender<MessageHandle>* incoming_messages, bool cancel_on_error) {
373
- return Loop([self = InternalRef(), cancel_on_error,
374
- incoming_messages = std::move(*incoming_messages)]() mutable {
375
- return Seq(
376
- GetContext<BatchBuilder>()->ReceiveMessage(self->batch_target()),
377
- [cancel_on_error, &incoming_messages](
378
- absl::StatusOr<absl::optional<MessageHandle>> status) mutable {
379
- bool has_message = status.ok() && status->has_value();
380
- auto publish_message = [&incoming_messages, &status]() {
381
- auto pending_message = std::move(**status);
382
- if (grpc_call_trace.enabled()) {
383
- gpr_log(GPR_INFO,
384
- "%s[connected] RecvMessage: received payload of %" PRIdPTR
385
- " bytes",
386
- GetContext<Activity>()->DebugTag().c_str(),
387
- pending_message->payload()->Length());
388
- }
389
- return Map(incoming_messages.Push(std::move(pending_message)),
390
- [](bool ok) -> LoopCtl<absl::Status> {
391
- if (!ok) {
392
- if (grpc_call_trace.enabled()) {
393
- gpr_log(
394
- GPR_INFO,
395
- "%s[connected] RecvMessage: failed to "
396
- "push message towards the application",
397
- GetContext<Activity>()->DebugTag().c_str());
398
- }
399
- return absl::OkStatus();
400
- }
401
- return Continue{};
402
- });
403
- };
404
- auto publish_close = [cancel_on_error, &incoming_messages,
405
- &status]() mutable {
406
- if (grpc_call_trace.enabled()) {
407
- gpr_log(GPR_INFO,
408
- "%s[connected] RecvMessage: reached end of stream with "
409
- "status:%s",
410
- GetContext<Activity>()->DebugTag().c_str(),
411
- status.status().ToString().c_str());
412
- }
413
- if (cancel_on_error && !status.ok()) {
414
- incoming_messages.CloseWithError();
415
- } else {
416
- incoming_messages.Close();
417
- }
418
- return Immediate(LoopCtl<absl::Status>(status.status()));
419
- };
420
- return If(has_message, std::move(publish_message),
421
- std::move(publish_close));
422
- });
423
- });
424
- }
425
-
426
- auto ConnectedChannelStream::SendMessages(
427
- PipeReceiver<MessageHandle>* outgoing_messages) {
428
- return ForEach(std::move(*outgoing_messages),
429
- [self = InternalRef()](MessageHandle message) {
430
- return GetContext<BatchBuilder>()->SendMessage(
431
- self->batch_target(), std::move(message));
432
- });
433
- }
434
- #endif // defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL) ||
435
- // defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
436
-
437
- #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
438
- ArenaPromise<ServerMetadataHandle> MakeClientCallPromise(Transport* transport,
439
- CallArgs call_args,
440
- NextPromiseFactory) {
441
- OrphanablePtr<ConnectedChannelStream> stream(
442
- GetContext<Arena>()->New<ConnectedChannelStream>(transport));
443
- stream->SetStream(static_cast<grpc_stream*>(GetContext<Arena>()->Alloc(
444
- transport->filter_stack_transport()->SizeOfStream())));
445
- transport->filter_stack_transport()->InitStream(stream->stream(),
446
- stream->stream_refcount(),
447
- nullptr, GetContext<Arena>());
448
- auto* party = GetContext<Party>();
449
- party->Spawn("set_polling_entity", call_args.polling_entity->Wait(),
450
- [transport, stream = stream->InternalRef()](
451
- grpc_polling_entity polling_entity) {
452
- transport->SetPollingEntity(stream->stream(), &polling_entity);
453
- });
454
- // Start a loop to send messages from client_to_server_messages to the
455
- // transport. When the pipe closes and the loop completes, send a trailing
456
- // metadata batch to close the stream.
457
- party->Spawn(
458
- "send_messages",
459
- TrySeq(stream->SendMessages(call_args.client_to_server_messages),
460
- [stream = stream->InternalRef()]() {
461
- return GetContext<BatchBuilder>()->SendClientTrailingMetadata(
462
- stream->batch_target());
463
- }),
464
- [](absl::Status) {});
465
- // Start a promise to receive server initial metadata and then forward it up
466
- // through the receiving pipe.
467
- auto server_initial_metadata = Arena::MakePooled<ServerMetadata>();
468
- party->Spawn(
469
- "recv_initial_metadata",
470
- TrySeq(GetContext<BatchBuilder>()->ReceiveServerInitialMetadata(
471
- stream->batch_target()),
472
- [pipe = call_args.server_initial_metadata](
473
- ServerMetadataHandle server_initial_metadata) {
474
- if (grpc_call_trace.enabled()) {
475
- gpr_log(GPR_DEBUG,
476
- "%s[connected] Publish client initial metadata: %s",
477
- GetContext<Activity>()->DebugTag().c_str(),
478
- server_initial_metadata->DebugString().c_str());
479
- }
480
- return Map(pipe->Push(std::move(server_initial_metadata)),
481
- [](bool r) {
482
- if (r) return absl::OkStatus();
483
- return absl::CancelledError();
484
- });
485
- }),
486
- [](absl::Status) {});
487
-
488
- // Build up the rest of the main call promise:
489
-
490
- // Create a promise that will send initial metadata and then signal completion
491
- // of that via the token.
492
- auto send_initial_metadata = Seq(
493
- GetContext<BatchBuilder>()->SendClientInitialMetadata(
494
- stream->batch_target(), std::move(call_args.client_initial_metadata)),
495
- [sent_initial_metadata_token =
496
- std::move(call_args.client_initial_metadata_outstanding)](
497
- absl::Status status) mutable {
498
- sent_initial_metadata_token.Complete(status.ok());
499
- return status;
500
- });
501
- // Create a promise that will receive server trailing metadata.
502
- // If this fails, we massage the error into metadata that we can report
503
- // upwards.
504
- auto server_trailing_metadata = Arena::MakePooled<ServerMetadata>();
505
- auto recv_trailing_metadata = Map(
506
- GetContext<BatchBuilder>()->ReceiveServerTrailingMetadata(
507
- stream->batch_target()),
508
- [](absl::StatusOr<ServerMetadataHandle> status) mutable {
509
- if (!status.ok()) {
510
- auto server_trailing_metadata = Arena::MakePooled<ServerMetadata>();
511
- grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
512
- std::string message;
513
- grpc_error_get_status(status.status(), Timestamp::InfFuture(),
514
- &status_code, &message, nullptr, nullptr);
515
- server_trailing_metadata->Set(GrpcStatusMetadata(), status_code);
516
- server_trailing_metadata->Set(GrpcMessageMetadata(),
517
- Slice::FromCopiedString(message));
518
- return server_trailing_metadata;
519
- } else {
520
- return std::move(*status);
521
- }
522
- });
523
- // Finally the main call promise.
524
- // Concurrently: send initial metadata and receive messages, until BOTH
525
- // complete (or one fails).
526
- // Next: receive trailing metadata, and return that up the stack.
527
- auto recv_messages =
528
- stream->RecvMessages(call_args.server_to_client_messages, false);
529
- return Map(
530
- [send_initial_metadata = std::move(send_initial_metadata),
531
- recv_messages = std::move(recv_messages),
532
- recv_trailing_metadata = std::move(recv_trailing_metadata),
533
- done_send_initial_metadata = false, done_recv_messages = false,
534
- done_recv_trailing_metadata =
535
- false]() mutable -> Poll<ServerMetadataHandle> {
536
- if (!done_send_initial_metadata) {
537
- auto p = send_initial_metadata();
538
- if (auto* r = p.value_if_ready()) {
539
- done_send_initial_metadata = true;
540
- if (!r->ok()) return StatusCast<ServerMetadataHandle>(*r);
541
- }
542
- }
543
- if (!done_recv_messages) {
544
- auto p = recv_messages();
545
- if (p.ready()) {
546
- // NOTE: ignore errors here, they'll be collected in the
547
- // recv_trailing_metadata.
548
- done_recv_messages = true;
549
- } else {
550
- return Pending{};
551
- }
552
- }
553
- if (!done_recv_trailing_metadata) {
554
- auto p = recv_trailing_metadata();
555
- if (auto* r = p.value_if_ready()) {
556
- done_recv_trailing_metadata = true;
557
- return std::move(*r);
558
- }
559
- }
560
- return Pending{};
561
- },
562
- [stream = std::move(stream)](ServerMetadataHandle result) {
563
- stream->set_finished();
564
- return result;
565
- });
566
- }
567
- #endif
568
-
569
- #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
570
- ArenaPromise<ServerMetadataHandle> MakeServerCallPromise(
571
- Transport* transport, CallArgs, NextPromiseFactory next_promise_factory) {
572
- OrphanablePtr<ConnectedChannelStream> stream(
573
- GetContext<Arena>()->New<ConnectedChannelStream>(transport));
574
-
575
- stream->SetStream(static_cast<grpc_stream*>(GetContext<Arena>()->Alloc(
576
- transport->filter_stack_transport()->SizeOfStream())));
577
- transport->filter_stack_transport()->InitStream(
578
- stream->stream(), stream->stream_refcount(),
579
- GetContext<CallContext>()->server_call_context()->server_stream_data(),
580
- GetContext<Arena>());
581
- auto* party = GetContext<Party>();
582
-
583
- // Arifacts we need for the lifetime of the call.
584
- struct CallData {
585
- Pipe<MessageHandle> server_to_client;
586
- Pipe<MessageHandle> client_to_server;
587
- Pipe<ServerMetadataHandle> server_initial_metadata;
588
- Latch<ServerMetadataHandle> failure_latch;
589
- Latch<grpc_polling_entity> polling_entity_latch;
590
- bool sent_initial_metadata = false;
591
- bool sent_trailing_metadata = false;
592
- };
593
- auto* call_data = GetContext<Arena>()->New<CallData>();
594
- GetContext<CallFinalization>()->Add(
595
- [call_data](const grpc_call_final_info*) { call_data->~CallData(); });
596
-
597
- party->Spawn("set_polling_entity", call_data->polling_entity_latch.Wait(),
598
- [transport, stream = stream->InternalRef()](
599
- grpc_polling_entity polling_entity) {
600
- transport->SetPollingEntity(stream->stream(), &polling_entity);
601
- });
602
-
603
- auto server_to_client_empty =
604
- call_data->server_to_client.receiver.AwaitEmpty();
605
-
606
- // Create a promise that will receive client initial metadata, and then run
607
- // the main stem of the call (calling next_promise_factory up through the
608
- // filters).
609
- // Race the main call with failure_latch, allowing us to forcefully complete
610
- // the call in the case of a failure.
611
- auto recv_initial_metadata_then_run_promise =
612
- TrySeq(GetContext<BatchBuilder>()->ReceiveClientInitialMetadata(
613
- stream->batch_target()),
614
- [next_promise_factory = std::move(next_promise_factory),
615
- server_to_client_empty = std::move(server_to_client_empty),
616
- call_data](ClientMetadataHandle client_initial_metadata) {
617
- auto call_promise = next_promise_factory(CallArgs{
618
- std::move(client_initial_metadata),
619
- ClientInitialMetadataOutstandingToken::Empty(),
620
- &call_data->polling_entity_latch,
621
- &call_data->server_initial_metadata.sender,
622
- &call_data->client_to_server.receiver,
623
- &call_data->server_to_client.sender,
624
- });
625
- return Race(call_data->failure_latch.Wait(),
626
- [call_promise = std::move(call_promise),
627
- server_to_client_empty =
628
- std::move(server_to_client_empty)]() mutable
629
- -> Poll<ServerMetadataHandle> {
630
- // TODO(ctiller): this is deeply weird and we need
631
- // to clean this up.
632
- //
633
- // The following few lines check to ensure that
634
- // there's no message currently pending in the
635
- // outgoing message queue, and if (and only if)
636
- // that's true decides to poll the main promise to
637
- // see if there's a result.
638
- //
639
- // This essentially introduces a polling priority
640
- // scheme that makes the current promise structure
641
- // work out the way we want when talking to
642
- // transports.
643
- //
644
- // The problem is that transports are going to need
645
- // to replicate this structure when they convert to
646
- // promises, and that becomes troubling as we'll be
647
- // replicating weird throughout the stack.
648
- //
649
- // Instead we likely need to change the way we're
650
- // composing promises through the stack.
651
- //
652
- // Proposed is to change filters from a promise
653
- // that takes ClientInitialMetadata and returns
654
- // ServerTrailingMetadata with three pipes for
655
- // ServerInitialMetadata and
656
- // ClientToServerMessages, ServerToClientMessages.
657
- // Instead we'll have five pipes, moving
658
- // ClientInitialMetadata and ServerTrailingMetadata
659
- // to pipes that can be intercepted.
660
- //
661
- // The effect of this change will be to cripple the
662
- // things that can be done in a filter (but cripple
663
- // in line with what most filters actually do).
664
- // We'll likely need to add a `CallContext::Cancel`
665
- // to allow filters to cancel a request, but this
666
- // would also have the advantage of centralizing
667
- // our cancellation machinery which seems like an
668
- // additional win - with the net effect that the
669
- // shape of the call gets made explicit at the top
670
- // & bottom of the stack.
671
- //
672
- // There's a small set of filters (retry, this one,
673
- // lame client, clinet channel) that terminate
674
- // stacks and need a richer set of semantics, but
675
- // that ends up being fine because we can spawn
676
- // tasks in parties to handle those edge cases, and
677
- // keep the majority of filters simple: they just
678
- // call InterceptAndMap on a handful of filters at
679
- // call initialization time and then proceed to
680
- // actually filter.
681
- //
682
- // So that's the plan, why isn't it enacted here?
683
- //
684
- // Well, the plan ends up being easy to implement
685
- // in the promise based world (I did a prototype on
686
- // a branch in an afternoon). It's heinous to
687
- // implement in promise_based_filter, and that code
688
- // is load bearing for us at the time of writing.
689
- // It's not worth delaying promises for a further N
690
- // months (N ~ 6) to make that change.
691
- //
692
- // Instead, we'll move forward with this, get
693
- // promise_based_filter out of the picture, and
694
- // then during the mop-up phase for promises tweak
695
- // the compute structure to move to the magical
696
- // five pipes (I'm reminded of an old Onion
697
- // article), and end up in a good happy place.
698
- if (server_to_client_empty().pending()) {
699
- return Pending{};
700
- }
701
- return call_promise();
702
- });
703
- });
704
-
705
- // Promise factory that accepts a ServerMetadataHandle, and sends it as the
706
- // trailing metadata for this call.
707
- auto send_trailing_metadata = [call_data, stream = stream->InternalRef()](
708
- ServerMetadataHandle
709
- server_trailing_metadata) {
710
- bool is_cancellation =
711
- server_trailing_metadata->get(GrpcCallWasCancelled()).value_or(false);
712
- return GetContext<BatchBuilder>()->SendServerTrailingMetadata(
713
- stream->batch_target(), std::move(server_trailing_metadata),
714
- is_cancellation ||
715
- !std::exchange(call_data->sent_initial_metadata, true));
716
- };
717
-
718
- // Runs the receive message loop, either until all the messages
719
- // are received or the server call is complete.
720
- party->Spawn(
721
- "recv_messages",
722
- Race(
723
- Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
724
- Map(stream->RecvMessages(&call_data->client_to_server.sender, true),
725
- [failure_latch = &call_data->failure_latch](absl::Status status) {
726
- if (!status.ok() && !failure_latch->is_set()) {
727
- failure_latch->Set(ServerMetadataFromStatus(status));
728
- }
729
- return status;
730
- })),
731
- [](absl::Status) {});
732
-
733
- // Run a promise that will send initial metadata (if that pipe sends some).
734
- // And then run the send message loop until that completes.
735
-
736
- auto send_initial_metadata = Seq(
737
- Race(Map(stream->WaitFinished(),
738
- [](Empty) { return NextResult<ServerMetadataHandle>(true); }),
739
- call_data->server_initial_metadata.receiver.Next()),
740
- [call_data, stream = stream->InternalRef()](
741
- NextResult<ServerMetadataHandle> next_result) mutable {
742
- auto md = !call_data->sent_initial_metadata && next_result.has_value()
743
- ? std::move(next_result.value())
744
- : nullptr;
745
- if (md != nullptr) {
746
- call_data->sent_initial_metadata = true;
747
- auto* party = GetContext<Party>();
748
- party->Spawn("connected/send_initial_metadata",
749
- GetContext<BatchBuilder>()->SendServerInitialMetadata(
750
- stream->batch_target(), std::move(md)),
751
- [](absl::Status) {});
752
- return Immediate(absl::OkStatus());
753
- }
754
- return Immediate(absl::CancelledError());
755
- });
756
- party->Spawn(
757
- "send_initial_metadata_then_messages",
758
- Race(Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
759
- TrySeq(std::move(send_initial_metadata),
760
- stream->SendMessages(&call_data->server_to_client.receiver))),
761
- [](absl::Status) {});
762
-
763
- // Spawn a job to fetch the "client trailing metadata" - if this is OK then
764
- // it's client done, otherwise it's a signal of cancellation from the client
765
- // which we'll use failure_latch to signal.
766
-
767
- party->Spawn(
768
- "recv_trailing_metadata",
769
- Seq(GetContext<BatchBuilder>()->ReceiveClientTrailingMetadata(
770
- stream->batch_target()),
771
- [failure_latch = &call_data->failure_latch](
772
- absl::StatusOr<ClientMetadataHandle> status) mutable {
773
- if (grpc_call_trace.enabled()) {
774
- gpr_log(
775
- GPR_DEBUG,
776
- "%s[connected] Got trailing metadata; status=%s metadata=%s",
777
- GetContext<Activity>()->DebugTag().c_str(),
778
- status.status().ToString().c_str(),
779
- status.ok() ? (*status)->DebugString().c_str() : "<none>");
780
- }
781
- ClientMetadataHandle trailing_metadata;
782
- if (status.ok()) {
783
- trailing_metadata = std::move(*status);
784
- } else {
785
- trailing_metadata = Arena::MakePooled<ClientMetadata>();
786
- grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
787
- std::string message;
788
- grpc_error_get_status(status.status(), Timestamp::InfFuture(),
789
- &status_code, &message, nullptr, nullptr);
790
- trailing_metadata->Set(GrpcStatusMetadata(), status_code);
791
- trailing_metadata->Set(GrpcMessageMetadata(),
792
- Slice::FromCopiedString(message));
793
- }
794
- if (trailing_metadata->get(GrpcStatusMetadata())
795
- .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK) {
796
- if (!failure_latch->is_set()) {
797
- failure_latch->Set(std::move(trailing_metadata));
798
- }
799
- }
800
- return Empty{};
801
- }),
802
- [](Empty) {});
803
-
804
- // Finally assemble the main call promise:
805
- // Receive initial metadata from the client and start the promise up the
806
- // filter stack.
807
- // Upon completion, send trailing metadata to the client and then return it
808
- // (allowing the call code to decide on what signalling to give the
809
- // application).
810
-
811
- struct CleanupPollingEntityLatch {
812
- void operator()(Latch<grpc_polling_entity>* latch) {
813
- if (!latch->is_set()) latch->Set(grpc_polling_entity());
814
- }
815
- };
816
- auto cleanup_polling_entity_latch =
817
- std::unique_ptr<Latch<grpc_polling_entity>, CleanupPollingEntityLatch>(
818
- &call_data->polling_entity_latch);
819
- struct CleanupSendInitialMetadata {
820
- void operator()(CallData* call_data) {
821
- call_data->server_initial_metadata.receiver.CloseWithError();
822
- }
823
- };
824
- auto cleanup_send_initial_metadata =
825
- std::unique_ptr<CallData, CleanupSendInitialMetadata>(call_data);
826
-
827
- return Map(
828
- Seq(std::move(recv_initial_metadata_then_run_promise),
829
- std::move(send_trailing_metadata)),
830
- [cleanup_polling_entity_latch = std::move(cleanup_polling_entity_latch),
831
- cleanup_send_initial_metadata = std::move(cleanup_send_initial_metadata),
832
- stream = std::move(stream)](ServerMetadataHandle md) {
833
- stream->set_finished();
834
- return md;
835
- });
836
- }
837
- #endif
838
-
839
- template <ArenaPromise<ServerMetadataHandle> (*make_call_promise)(
840
- Transport*, CallArgs, NextPromiseFactory)>
841
- grpc_channel_filter MakeConnectedFilter() {
842
- // Create a vtable that contains both the legacy call methods (for filter
843
- // stack based calls) and the new promise based method for creating
844
- // promise based calls (the latter iff make_call_promise != nullptr). In
845
- // this way the filter can be inserted into either kind of channel stack,
846
- // and only if all the filters in the stack are promise based will the
847
- // call be promise based.
848
- auto make_call_wrapper = +[](grpc_channel_element* elem, CallArgs call_args,
849
- NextPromiseFactory next) {
850
- Transport* transport =
851
- static_cast<channel_data*>(elem->channel_data)->transport;
852
- return make_call_promise(transport, std::move(call_args), std::move(next));
853
- };
854
- return {
855
- connected_channel_start_transport_stream_op_batch,
856
- make_call_promise != nullptr ? make_call_wrapper : nullptr,
857
- /* init_call: */ nullptr,
858
- connected_channel_start_transport_op,
859
- sizeof(call_data),
860
- connected_channel_init_call_elem,
861
- set_pollset_or_pollset_set,
862
- connected_channel_destroy_call_elem,
863
- sizeof(channel_data),
864
- connected_channel_init_channel_elem,
865
- +[](grpc_channel_stack* channel_stack, grpc_channel_element* elem) {
866
- // HACK(ctiller): increase call stack size for the channel to make
867
- // space for channel data. We need a cleaner (but performant) way to
868
- // do this, and I'm not sure what that is yet. This is only "safe"
869
- // because call stacks place no additional data after the last call
870
- // element, and the last call element MUST be the connected channel.
871
- auto* transport =
872
- static_cast<channel_data*>(elem->channel_data)->transport;
873
- if (transport->filter_stack_transport() != nullptr) {
874
- channel_stack->call_stack_size +=
875
- transport->filter_stack_transport()->SizeOfStream();
876
- }
877
- },
878
- connected_channel_destroy_channel_elem,
879
- connected_channel_get_channel_info,
880
- "connected",
881
- };
882
- }
883
-
884
- ArenaPromise<ServerMetadataHandle> MakeClientTransportCallPromise(
885
- Transport* transport, CallArgs call_args, NextPromiseFactory) {
886
- auto spine = GetContext<CallContext>()->MakeCallSpine(std::move(call_args));
887
- transport->client_transport()->StartCall(CallHandler{spine});
888
- return spine->PullServerTrailingMetadata();
889
- }
890
-
891
- const grpc_channel_filter kClientPromiseBasedTransportFilter =
892
- MakeConnectedFilter<MakeClientTransportCallPromise>();
893
-
894
- #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
895
- const grpc_channel_filter kClientEmulatedFilter =
896
- MakeConnectedFilter<MakeClientCallPromise>();
897
- #else
898
- const grpc_channel_filter kClientEmulatedFilter =
899
- MakeConnectedFilter<nullptr>();
900
- #endif
901
-
902
- #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
903
- const grpc_channel_filter kServerEmulatedFilter =
904
- MakeConnectedFilter<MakeServerCallPromise>();
905
- #else
906
- const grpc_channel_filter kServerEmulatedFilter =
907
- MakeConnectedFilter<nullptr>();
908
- #endif
909
-
910
273
  // noop filter for the v3 stack: placeholder for now because other code requires
911
274
  // we have a terminator.
912
275
  // TODO(ctiller): delete when v3 transition is complete.
913
- const grpc_channel_filter kServerPromiseBasedTransportFilter = {
276
+ const grpc_channel_filter kPromiseBasedTransportFilter = {
914
277
  nullptr,
915
- [](grpc_channel_element*, CallArgs, NextPromiseFactory)
916
- -> ArenaPromise<ServerMetadataHandle> { Crash("not implemented"); },
917
- /* init_call: */ [](grpc_channel_element*, CallSpineInterface*) {},
918
278
  connected_channel_start_transport_op,
919
279
  0,
920
280
  nullptr,
921
281
  set_pollset_or_pollset_set,
922
282
  nullptr,
923
283
  sizeof(channel_data),
924
- connected_channel_init_channel_elem,
284
+ +[](grpc_channel_element*, grpc_channel_element_args*) {
285
+ return absl::InternalError(
286
+ "Cannot use filter based stack with promise based transports");
287
+ },
925
288
  +[](grpc_channel_stack*, grpc_channel_element*) {},
926
289
  connected_channel_destroy_channel_elem,
927
290
  connected_channel_get_channel_info,
@@ -937,7 +300,6 @@ bool TransportSupportsServerPromiseBasedCalls(const ChannelArgs& args) {
937
300
  auto* transport = args.GetObject<Transport>();
938
301
  return transport->server_transport() != nullptr;
939
302
  }
940
-
941
303
  } // namespace
942
304
 
943
305
  void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
@@ -950,31 +312,30 @@ void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
950
312
  // Option 1, and our ideal: the transport supports promise based calls,
951
313
  // and so we simply use the transport directly.
952
314
  builder->channel_init()
953
- ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL,
954
- &kClientPromiseBasedTransportFilter)
315
+ ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kPromiseBasedTransportFilter)
955
316
  .Terminal()
956
317
  .If(TransportSupportsClientPromiseBasedCalls);
957
318
  builder->channel_init()
958
319
  ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL,
959
- &kClientPromiseBasedTransportFilter)
320
+ &kPromiseBasedTransportFilter)
960
321
  .Terminal()
961
322
  .If(TransportSupportsClientPromiseBasedCalls);
962
323
  builder->channel_init()
963
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &kServerPromiseBasedTransportFilter)
324
+ ->RegisterFilter(GRPC_SERVER_CHANNEL, &kPromiseBasedTransportFilter)
964
325
  .Terminal()
965
326
  .If(TransportSupportsServerPromiseBasedCalls);
966
327
 
967
328
  // Option 2: the transport does not support promise based calls.
968
329
  builder->channel_init()
969
- ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kClientEmulatedFilter)
330
+ ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kConnectedFilter)
970
331
  .Terminal()
971
332
  .IfNot(TransportSupportsClientPromiseBasedCalls);
972
333
  builder->channel_init()
973
- ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &kClientEmulatedFilter)
334
+ ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &kConnectedFilter)
974
335
  .Terminal()
975
336
  .IfNot(TransportSupportsClientPromiseBasedCalls);
976
337
  builder->channel_init()
977
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &kServerEmulatedFilter)
338
+ ->RegisterFilter(GRPC_SERVER_CHANNEL, &kConnectedFilter)
978
339
  .Terminal()
979
340
  .IfNot(TransportSupportsServerPromiseBasedCalls);
980
341
  }