grpc 1.50.0 → 1.51.0

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

Potentially problematic release.


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

Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -19,18 +19,27 @@
19
19
  // promise-style. Most of this will be removed once the promises conversion is
20
20
  // completed.
21
21
 
22
+ // TODO(ctiller): When removing this file, also reduce the number of *'s on the
23
+ // server initial metadata latch.
24
+
22
25
  #include <grpc/support/port_platform.h>
23
26
 
24
27
  #include <stdint.h>
25
28
  #include <stdlib.h>
26
29
 
27
30
  #include <atomic>
31
+ #include <memory>
28
32
  #include <new>
33
+ #include <string>
29
34
  #include <utility>
30
35
 
31
36
  #include "absl/container/inlined_vector.h"
32
37
  #include "absl/meta/type_traits.h"
38
+ #include "absl/status/status.h"
39
+ #include "absl/strings/string_view.h"
40
+ #include "absl/types/optional.h"
33
41
 
42
+ #include <grpc/event_engine/event_engine.h>
34
43
  #include <grpc/impl/codegen/grpc_types.h>
35
44
  #include <grpc/support/log.h>
36
45
 
@@ -39,6 +48,7 @@
39
48
  #include "src/core/lib/channel/channel_fwd.h"
40
49
  #include "src/core/lib/channel/channel_stack.h"
41
50
  #include "src/core/lib/channel/context.h"
51
+ #include "src/core/lib/event_engine/default_event_engine.h" // IWYU pragma: keep
42
52
  #include "src/core/lib/gprpp/debug_location.h"
43
53
  #include "src/core/lib/gprpp/time.h"
44
54
  #include "src/core/lib/iomgr/call_combiner.h"
@@ -50,8 +60,10 @@
50
60
  #include "src/core/lib/promise/arena_promise.h"
51
61
  #include "src/core/lib/promise/context.h"
52
62
  #include "src/core/lib/promise/latch.h"
63
+ #include "src/core/lib/promise/pipe.h"
53
64
  #include "src/core/lib/promise/poll.h"
54
65
  #include "src/core/lib/resource_quota/arena.h"
66
+ #include "src/core/lib/slice/slice_buffer.h"
55
67
  #include "src/core/lib/transport/error_utils.h"
56
68
  #include "src/core/lib/transport/metadata_batch.h"
57
69
  #include "src/core/lib/transport/transport.h"
@@ -99,6 +111,16 @@ class ChannelFilter {
99
111
  virtual bool GetChannelInfo(const grpc_channel_info*) { return false; }
100
112
 
101
113
  virtual ~ChannelFilter() = default;
114
+
115
+ grpc_event_engine::experimental::EventEngine*
116
+ hack_until_per_channel_stack_event_engines_land_get_event_engine() {
117
+ return event_engine_.get();
118
+ }
119
+
120
+ private:
121
+ // TODO(ctiller): remove once per-channel-stack event engines land
122
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_ =
123
+ grpc_event_engine::experimental::GetDefaultEventEngine();
102
124
  };
103
125
 
104
126
  // Designator for whether a filter is client side or server side.
@@ -112,6 +134,8 @@ enum class FilterEndpoint {
112
134
  // Flags for MakePromiseBasedFilter.
113
135
  static constexpr uint8_t kFilterExaminesServerInitialMetadata = 1;
114
136
  static constexpr uint8_t kFilterIsLast = 2;
137
+ static constexpr uint8_t kFilterExaminesOutboundMessages = 4;
138
+ static constexpr uint8_t kFilterExaminesInboundMessages = 8;
115
139
 
116
140
  namespace promise_filter_detail {
117
141
 
@@ -142,16 +166,22 @@ class BaseCallData : public Activity, private Wakeable {
142
166
  Waker MakeNonOwningWaker() final;
143
167
  Waker MakeOwningWaker() final;
144
168
 
169
+ std::string ActivityDebugTag() const override { return DebugTag(); }
170
+
145
171
  void Finalize(const grpc_call_final_info* final_info) {
146
172
  finalization_.Run(final_info);
147
173
  }
148
174
 
175
+ virtual void StartBatch(grpc_transport_stream_op_batch* batch) = 0;
176
+
149
177
  protected:
150
178
  class ScopedContext
151
179
  : public promise_detail::Context<Arena>,
152
180
  public promise_detail::Context<grpc_call_context_element>,
153
181
  public promise_detail::Context<grpc_polling_entity>,
154
- public promise_detail::Context<CallFinalization> {
182
+ public promise_detail::Context<CallFinalization>,
183
+ public promise_detail::Context<
184
+ grpc_event_engine::experimental::EventEngine> {
155
185
  public:
156
186
  explicit ScopedContext(BaseCallData* call_data)
157
187
  : promise_detail::Context<Arena>(call_data->arena_),
@@ -159,8 +189,9 @@ class BaseCallData : public Activity, private Wakeable {
159
189
  call_data->context_),
160
190
  promise_detail::Context<grpc_polling_entity>(
161
191
  call_data->pollent_.load(std::memory_order_acquire)),
162
- promise_detail::Context<CallFinalization>(&call_data->finalization_) {
163
- }
192
+ promise_detail::Context<CallFinalization>(&call_data->finalization_),
193
+ promise_detail::Context<grpc_event_engine::experimental::EventEngine>(
194
+ call_data->event_engine_) {}
164
195
  };
165
196
 
166
197
  class Flusher {
@@ -181,7 +212,7 @@ class BaseCallData : public Activity, private Wakeable {
181
212
  }
182
213
 
183
214
  void Complete(grpc_transport_stream_op_batch* batch) {
184
- call_closures_.Add(batch->on_complete, GRPC_ERROR_NONE,
215
+ call_closures_.Add(batch->on_complete, absl::OkStatus(),
185
216
  "Flusher::Complete");
186
217
  }
187
218
 
@@ -227,16 +258,170 @@ class BaseCallData : public Activity, private Wakeable {
227
258
  grpc_transport_stream_op_batch* batch_;
228
259
  };
229
260
 
230
- static MetadataHandle<grpc_metadata_batch> WrapMetadata(
261
+ static Arena::PoolPtr<grpc_metadata_batch> WrapMetadata(
231
262
  grpc_metadata_batch* p) {
232
- return MetadataHandle<grpc_metadata_batch>(p);
263
+ return Arena::PoolPtr<grpc_metadata_batch>(p,
264
+ Arena::PooledDeleter(nullptr));
233
265
  }
234
266
 
235
267
  static grpc_metadata_batch* UnwrapMetadata(
236
- MetadataHandle<grpc_metadata_batch> p) {
237
- return p.Unwrap();
268
+ Arena::PoolPtr<grpc_metadata_batch> p) {
269
+ return p.release();
238
270
  }
239
271
 
272
+ // State machine for sending messages: handles intercepting send_message ops
273
+ // and forwarding them through pipes to the promise, then getting the result
274
+ // down the stack.
275
+ // Split into its own class so that we don't spend the memory instantiating
276
+ // these members for filters that don't need to intercept sent messages.
277
+ class SendMessage {
278
+ public:
279
+ explicit SendMessage(BaseCallData* base)
280
+ : base_(base), pipe_(base->arena()) {}
281
+ PipeReceiver<MessageHandle>* outgoing_pipe() { return &pipe_.receiver; }
282
+
283
+ // Start a send_message op.
284
+ void StartOp(CapturedBatch batch);
285
+ // Publish the outbound pipe to the filter.
286
+ // This happens when the promise requests to call the next filter: until
287
+ // this occurs messages can't be sent as we don't know the pipe that the
288
+ // promise expects to send on.
289
+ void GotPipe(PipeReceiver<MessageHandle>* receiver);
290
+ // Called from client/server polling to do the send message part of the
291
+ // work.
292
+ void WakeInsideCombiner(Flusher* flusher);
293
+ // Call is completed, we have trailing metadata. Close things out.
294
+ void Done(const ServerMetadata& metadata);
295
+ // Return true if we have a batch captured (for debug logs)
296
+ bool HaveCapturedBatch() const { return batch_.is_captured(); }
297
+ // Return true if we're not actively sending a message.
298
+ bool IsIdle() const;
299
+
300
+ private:
301
+ enum class State : uint8_t {
302
+ // Starting state: no batch started, no outgoing pipe configured.
303
+ kInitial,
304
+ // We have an outgoing pipe, but no batch started.
305
+ // (this is the steady state).
306
+ kIdle,
307
+ // We have a batch started, but no outgoing pipe configured.
308
+ // Stall until we have one.
309
+ kGotBatchNoPipe,
310
+ // We have a batch, and an outgoing pipe. On the next poll we'll push the
311
+ // message into the pipe to the promise.
312
+ kGotBatch,
313
+ // We've pushed a message into the promise, and we're now waiting for it
314
+ // to pop out the other end so we can forward it down the stack.
315
+ kPushedToPipe,
316
+ // We've forwarded a message down the stack, and now we're waiting for
317
+ // completion.
318
+ kForwardedBatch,
319
+ // We've got the completion callback, we'll close things out during poll
320
+ // and then forward completion callbacks up and transition back to idle.
321
+ kBatchCompleted,
322
+ // We're done.
323
+ kCancelled,
324
+ };
325
+ static const char* StateString(State);
326
+
327
+ void OnComplete(absl::Status status);
328
+
329
+ BaseCallData* const base_;
330
+ State state_ = State::kInitial;
331
+ Pipe<MessageHandle> pipe_;
332
+ PipeReceiver<MessageHandle>* receiver_ = nullptr;
333
+ absl::optional<PipeSender<MessageHandle>::PushType> push_;
334
+ absl::optional<PipeReceiver<MessageHandle>::NextType> next_;
335
+ absl::optional<NextResult<MessageHandle>> next_result_;
336
+ CapturedBatch batch_;
337
+ grpc_closure* intercepted_on_complete_;
338
+ grpc_closure on_complete_ =
339
+ MakeMemberClosure<SendMessage, &SendMessage::OnComplete>(this);
340
+ absl::Status completed_status_;
341
+ };
342
+
343
+ // State machine for receiving messages: handles intercepting recv_message
344
+ // ops, forwarding them down the stack, and then publishing the result via
345
+ // pipes to the promise (and ultimately calling the right callbacks for the
346
+ // batch when our promise has completed processing of them).
347
+ // Split into its own class so that we don't spend the memory instantiating
348
+ // these members for filters that don't need to intercept sent messages.
349
+ class ReceiveMessage {
350
+ public:
351
+ explicit ReceiveMessage(BaseCallData* base)
352
+ : base_(base), pipe_(base->arena()) {}
353
+ PipeSender<MessageHandle>* incoming_pipe() { return &pipe_.sender; }
354
+
355
+ // Start a recv_message op.
356
+ void StartOp(CapturedBatch& batch);
357
+ // Publish the inbound pipe to the filter.
358
+ // This happens when the promise requests to call the next filter: until
359
+ // this occurs messages can't be received as we don't know the pipe that the
360
+ // promise expects to forward them with.
361
+ void GotPipe(PipeSender<MessageHandle>* sender);
362
+ // Called from client/server polling to do the receive message part of the
363
+ // work.
364
+ void WakeInsideCombiner(Flusher* flusher);
365
+ // Call is completed, we have trailing metadata. Close things out.
366
+ void Done(const ServerMetadata& metadata, Flusher* flusher);
367
+
368
+ private:
369
+ enum class State : uint8_t {
370
+ // Starting state: no batch started, no incoming pipe configured.
371
+ kInitial,
372
+ // We have an incoming pipe, but no batch started.
373
+ // (this is the steady state).
374
+ kIdle,
375
+ // We received a batch and forwarded it on, but have not got an incoming
376
+ // pipe configured.
377
+ kForwardedBatchNoPipe,
378
+ // We received a batch and forwarded it on.
379
+ kForwardedBatch,
380
+ // We got the completion for the recv_message, but we don't yet have a
381
+ // pipe configured. Stall until this changes.
382
+ kBatchCompletedNoPipe,
383
+ // We got the completion for the recv_message, and we have a pipe
384
+ // configured: next poll will push the message into the pipe for the
385
+ // filter to process.
386
+ kBatchCompleted,
387
+ // We've pushed a message into the promise, and we're now waiting for it
388
+ // to pop out the other end so we can forward it up the stack.
389
+ kPushedToPipe,
390
+ // We've got a message out of the pipe, now we need to wait for processing
391
+ // to completely quiesce in the promise prior to forwarding the completion
392
+ // up the stack.
393
+ kPulledFromPipe,
394
+ // We're done.
395
+ kCancelled,
396
+ // Call got terminated whilst we had forwarded a recv_message down the
397
+ // stack: we need to keep track of that until we get the completion so
398
+ // that we do the right thing in OnComplete.
399
+ kCancelledWhilstForwarding,
400
+ // Call got terminated whilst we had a recv_message batch completed, and
401
+ // we've now received the completion.
402
+ // On the next poll we'll close things out and forward on completions,
403
+ // then transition to cancelled.
404
+ kBatchCompletedButCancelled,
405
+ };
406
+ static const char* StateString(State);
407
+
408
+ void OnComplete(absl::Status status);
409
+
410
+ BaseCallData* const base_;
411
+ Pipe<MessageHandle> pipe_;
412
+ PipeSender<MessageHandle>* sender_;
413
+ State state_ = State::kInitial;
414
+ uint32_t scratch_flags_;
415
+ absl::optional<SliceBuffer>* intercepted_slice_buffer_;
416
+ uint32_t* intercepted_flags_;
417
+ absl::optional<PipeSender<MessageHandle>::PushType> push_;
418
+ absl::optional<PipeReceiver<MessageHandle>::NextType> next_;
419
+ absl::Status completed_status_;
420
+ grpc_closure* intercepted_on_complete_;
421
+ grpc_closure on_complete_ =
422
+ MakeMemberClosure<ReceiveMessage, &ReceiveMessage::OnComplete>(this);
423
+ };
424
+
240
425
  Arena* arena() { return arena_; }
241
426
  grpc_call_element* elem() const { return elem_; }
242
427
  CallCombiner* call_combiner() const { return call_combiner_; }
@@ -245,12 +430,26 @@ class BaseCallData : public Activity, private Wakeable {
245
430
  Latch<ServerMetadata*>* server_initial_metadata_latch() const {
246
431
  return server_initial_metadata_latch_;
247
432
  }
433
+ PipeReceiver<MessageHandle>* outgoing_messages_pipe() const {
434
+ return send_message_ == nullptr ? nullptr : send_message_->outgoing_pipe();
435
+ }
436
+ PipeSender<MessageHandle>* incoming_messages_pipe() const {
437
+ return receive_message_ == nullptr ? nullptr
438
+ : receive_message_->incoming_pipe();
439
+ }
440
+ SendMessage* send_message() const { return send_message_; }
441
+ ReceiveMessage* receive_message() const { return receive_message_; }
248
442
 
249
443
  bool is_last() const {
250
444
  return grpc_call_stack_element(call_stack_, call_stack_->count - 1) ==
251
445
  elem_;
252
446
  }
253
447
 
448
+ virtual void WakeInsideCombiner(Flusher* flusher) = 0;
449
+
450
+ virtual absl::string_view ClientOrServerString() const = 0;
451
+ std::string LogTag() const;
452
+
254
453
  private:
255
454
  // Wakeable implementation.
256
455
  void Wakeup() final;
@@ -266,7 +465,10 @@ class BaseCallData : public Activity, private Wakeable {
266
465
  CallFinalization finalization_;
267
466
  grpc_call_context_element* const context_;
268
467
  std::atomic<grpc_polling_entity*> pollent_{nullptr};
269
- Latch<ServerMetadata*>* server_initial_metadata_latch_ = nullptr;
468
+ Latch<ServerMetadata*>* const server_initial_metadata_latch_;
469
+ SendMessage* const send_message_;
470
+ ReceiveMessage* const receive_message_;
471
+ grpc_event_engine::experimental::EventEngine* event_engine_;
270
472
  };
271
473
 
272
474
  class ClientCallData : public BaseCallData {
@@ -278,7 +480,7 @@ class ClientCallData : public BaseCallData {
278
480
  // Activity implementation.
279
481
  void ForceImmediateRepoll() final;
280
482
  // Handle one grpc_transport_stream_op_batch
281
- void StartBatch(grpc_transport_stream_op_batch* batch);
483
+ void StartBatch(grpc_transport_stream_op_batch* batch) override;
282
484
 
283
485
  private:
284
486
  // At what stage is our handling of send initial metadata?
@@ -303,8 +505,8 @@ class ClientCallData : public BaseCallData {
303
505
  kQueued,
304
506
  // We've forwarded the op to the next filter.
305
507
  kForwarded,
306
- // The op has completed from below, but we haven't yet forwarded it up (the
307
- // promise gets to interject and mutate it).
508
+ // The op has completed from below, but we haven't yet forwarded it up
509
+ // (the promise gets to interject and mutate it).
308
510
  kComplete,
309
511
  // We've called the recv_metadata_ready callback from the original
310
512
  // recv_trailing_metadata op that was presented to us.
@@ -314,11 +516,15 @@ class ClientCallData : public BaseCallData {
314
516
  kCancelled
315
517
  };
316
518
 
519
+ static const char* StateString(SendInitialState);
520
+ static const char* StateString(RecvTrailingState);
521
+ std::string DebugString() const;
522
+
317
523
  struct RecvInitialMetadata;
318
524
  class PollContext;
319
525
 
320
526
  // Handle cancellation.
321
- void Cancel(grpc_error_handle error);
527
+ void Cancel(grpc_error_handle error, Flusher* flusher);
322
528
  // Begin running the promise - which will ultimately take some initial
323
529
  // metadata and return some trailing metadata.
324
530
  void StartPromise(Flusher* flusher);
@@ -344,15 +550,20 @@ class ClientCallData : public BaseCallData {
344
550
  void SetStatusFromError(grpc_metadata_batch* metadata,
345
551
  grpc_error_handle error);
346
552
  // Wakeup and poll the promise if appropriate.
347
- void WakeInsideCombiner(Flusher* flusher);
553
+ void WakeInsideCombiner(Flusher* flusher) override;
348
554
  void OnWakeup() override;
349
555
 
556
+ absl::string_view ClientOrServerString() const override { return "CLI"; }
557
+
350
558
  // Contained promise
351
559
  ArenaPromise<ServerMetadataHandle> promise_;
352
560
  // Queued batch containing at least a send_initial_metadata op.
353
561
  CapturedBatch send_initial_metadata_batch_;
354
562
  // Pointer to where trailing metadata will be stored.
355
563
  grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
564
+ // Trailing metadata as returned by the promise, if we hadn't received
565
+ // trailing metadata from below yet (so we can substitute it in).
566
+ ServerMetadataHandle cancelling_metadata_;
356
567
  // State tracking recv initial metadata for filters that care about it.
357
568
  RecvInitialMetadata* recv_initial_metadata_ = nullptr;
358
569
  // Closure to call when we're done with the trailing metadata.
@@ -360,7 +571,7 @@ class ClientCallData : public BaseCallData {
360
571
  // Our closure pointing to RecvTrailingMetadataReadyCallback.
361
572
  grpc_closure recv_trailing_metadata_ready_;
362
573
  // Error received during cancellation.
363
- grpc_error_handle cancelled_error_ = GRPC_ERROR_NONE;
574
+ grpc_error_handle cancelled_error_;
364
575
  // State of the send_initial_metadata op.
365
576
  SendInitialState send_initial_state_ = SendInitialState::kInitial;
366
577
  // State of the recv_trailing_metadata op.
@@ -378,7 +589,10 @@ class ServerCallData : public BaseCallData {
378
589
  // Activity implementation.
379
590
  void ForceImmediateRepoll() final;
380
591
  // Handle one grpc_transport_stream_op_batch
381
- void StartBatch(grpc_transport_stream_op_batch* batch);
592
+ void StartBatch(grpc_transport_stream_op_batch* batch) override;
593
+
594
+ protected:
595
+ absl::string_view ClientOrServerString() const override { return "SVR"; }
382
596
 
383
597
  private:
384
598
  // At what stage is our handling of recv initial metadata?
@@ -398,6 +612,10 @@ class ServerCallData : public BaseCallData {
398
612
  enum class SendTrailingState {
399
613
  // Start state: no op seen
400
614
  kInitial,
615
+ // We saw the op, but it was with a send message op (or one was in progress)
616
+ // - so we'll wait for that to complete before processing the trailing
617
+ // metadata.
618
+ kQueuedBehindSendMessage,
401
619
  // We saw the op, and are waiting for the promise to complete
402
620
  // to forward it.
403
621
  kQueued,
@@ -407,11 +625,15 @@ class ServerCallData : public BaseCallData {
407
625
  kCancelled
408
626
  };
409
627
 
628
+ static const char* StateString(RecvInitialState state);
629
+ static const char* StateString(SendTrailingState state);
630
+ std::string DebugString() const;
631
+
410
632
  class PollContext;
411
633
  struct SendInitialMetadata;
412
634
 
413
- // Handle cancellation.
414
- void Cancel(grpc_error_handle error, Flusher* flusher);
635
+ // Shut things down when the call completes.
636
+ void Completed(grpc_error_handle error, Flusher* flusher);
415
637
  // Construct a promise that will "call" the next filter.
416
638
  // Effectively:
417
639
  // - put the modified initial metadata into the batch being sent up.
@@ -424,22 +646,31 @@ class ServerCallData : public BaseCallData {
424
646
  static void RecvInitialMetadataReadyCallback(void* arg,
425
647
  grpc_error_handle error);
426
648
  void RecvInitialMetadataReady(grpc_error_handle error);
649
+ static void RecvTrailingMetadataReadyCallback(void* arg,
650
+ grpc_error_handle error);
651
+ void RecvTrailingMetadataReady(grpc_error_handle error);
427
652
  // Wakeup and poll the promise if appropriate.
428
- void WakeInsideCombiner(Flusher* flusher);
653
+ void WakeInsideCombiner(Flusher* flusher) override;
429
654
  void OnWakeup() override;
430
655
 
431
656
  // Contained promise
432
657
  ArenaPromise<ServerMetadataHandle> promise_;
433
658
  // Pointer to where initial metadata will be stored.
434
659
  grpc_metadata_batch* recv_initial_metadata_ = nullptr;
660
+ // Pointer to where trailing metadata will be stored.
661
+ grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
435
662
  // State for sending initial metadata.
436
663
  SendInitialMetadata* send_initial_metadata_ = nullptr;
437
- // Closure to call when we're done with the trailing metadata.
664
+ // Closure to call when we're done with the initial metadata.
438
665
  grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
439
666
  // Our closure pointing to RecvInitialMetadataReadyCallback.
440
667
  grpc_closure recv_initial_metadata_ready_;
668
+ // Closure to call when we're done with the trailing metadata.
669
+ grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
670
+ // Our closure pointing to RecvTrailingMetadataReadyCallback.
671
+ grpc_closure recv_trailing_metadata_ready_;
441
672
  // Error received during cancellation.
442
- grpc_error_handle cancelled_error_ = GRPC_ERROR_NONE;
673
+ grpc_error_handle cancelled_error_;
443
674
  // Trailing metadata batch
444
675
  CapturedBatch send_trailing_metadata_batch_;
445
676
  // State of the send_initial_metadata op.
@@ -456,23 +687,116 @@ class ServerCallData : public BaseCallData {
456
687
  // Specific call data per channel filter.
457
688
  // Note that we further specialize for clients and servers since their
458
689
  // implementations are very different.
459
- template <class ChannelFilter, FilterEndpoint endpoint>
690
+ template <FilterEndpoint endpoint>
460
691
  class CallData;
461
692
 
462
693
  // Client implementation of call data.
463
- template <class ChannelFilter>
464
- class CallData<ChannelFilter, FilterEndpoint::kClient> : public ClientCallData {
694
+ template <>
695
+ class CallData<FilterEndpoint::kClient> : public ClientCallData {
465
696
  public:
466
697
  using ClientCallData::ClientCallData;
467
698
  };
468
699
 
469
700
  // Server implementation of call data.
470
- template <class ChannelFilter>
471
- class CallData<ChannelFilter, FilterEndpoint::kServer> : public ServerCallData {
701
+ template <>
702
+ class CallData<FilterEndpoint::kServer> : public ServerCallData {
472
703
  public:
473
704
  using ServerCallData::ServerCallData;
474
705
  };
475
706
 
707
+ struct BaseCallDataMethods {
708
+ static void SetPollsetOrPollsetSet(grpc_call_element* elem,
709
+ grpc_polling_entity* pollent) {
710
+ static_cast<BaseCallData*>(elem->call_data)->set_pollent(pollent);
711
+ }
712
+
713
+ static void DestructCallData(grpc_call_element* elem,
714
+ const grpc_call_final_info* final_info) {
715
+ auto* cd = static_cast<BaseCallData*>(elem->call_data);
716
+ cd->Finalize(final_info);
717
+ cd->~BaseCallData();
718
+ }
719
+
720
+ static void StartTransportStreamOpBatch(
721
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
722
+ static_cast<BaseCallData*>(elem->call_data)->StartBatch(batch);
723
+ }
724
+ };
725
+
726
+ template <typename CallData, uint8_t kFlags>
727
+ struct CallDataFilterWithFlagsMethods {
728
+ static absl::Status InitCallElem(grpc_call_element* elem,
729
+ const grpc_call_element_args* args) {
730
+ new (elem->call_data) CallData(elem, args, kFlags);
731
+ return absl::OkStatus();
732
+ }
733
+
734
+ static void DestroyCallElem(grpc_call_element* elem,
735
+ const grpc_call_final_info* final_info,
736
+ grpc_closure* then_schedule_closure) {
737
+ BaseCallDataMethods::DestructCallData(elem, final_info);
738
+ if ((kFlags & kFilterIsLast) != 0) {
739
+ ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, absl::OkStatus());
740
+ } else {
741
+ GPR_ASSERT(then_schedule_closure == nullptr);
742
+ }
743
+ }
744
+ };
745
+
746
+ struct ChannelFilterMethods {
747
+ static ArenaPromise<ServerMetadataHandle> MakeCallPromise(
748
+ grpc_channel_element* elem, CallArgs call_args,
749
+ NextPromiseFactory next_promise_factory) {
750
+ return static_cast<ChannelFilter*>(elem->channel_data)
751
+ ->MakeCallPromise(std::move(call_args),
752
+ std::move(next_promise_factory));
753
+ }
754
+
755
+ static void StartTransportOp(grpc_channel_element* elem,
756
+ grpc_transport_op* op) {
757
+ if (!static_cast<ChannelFilter*>(elem->channel_data)
758
+ ->StartTransportOp(op)) {
759
+ grpc_channel_next_op(elem, op);
760
+ }
761
+ }
762
+
763
+ static void PostInitChannelElem(grpc_channel_stack*,
764
+ grpc_channel_element* elem) {
765
+ static_cast<ChannelFilter*>(elem->channel_data)->PostInit();
766
+ }
767
+
768
+ static void DestroyChannelElem(grpc_channel_element* elem) {
769
+ static_cast<ChannelFilter*>(elem->channel_data)->~ChannelFilter();
770
+ }
771
+
772
+ static void GetChannelInfo(grpc_channel_element* elem,
773
+ const grpc_channel_info* info) {
774
+ if (!static_cast<ChannelFilter*>(elem->channel_data)
775
+ ->GetChannelInfo(info)) {
776
+ grpc_channel_next_get_info(elem, info);
777
+ }
778
+ }
779
+ };
780
+
781
+ template <typename F, uint8_t kFlags>
782
+ struct ChannelFilterWithFlagsMethods {
783
+ static absl::Status InitChannelElem(grpc_channel_element* elem,
784
+ grpc_channel_element_args* args) {
785
+ GPR_ASSERT(args->is_last == ((kFlags & kFilterIsLast) != 0));
786
+ auto status = F::Create(ChannelArgs::FromC(args->channel_args),
787
+ ChannelFilter::Args(args->channel_stack, elem));
788
+ if (!status.ok()) {
789
+ static_assert(
790
+ sizeof(promise_filter_detail::InvalidChannelFilter) <= sizeof(F),
791
+ "InvalidChannelFilter must fit in F");
792
+ new (elem->channel_data) promise_filter_detail::InvalidChannelFilter();
793
+ return absl_status_to_grpc_error(status.status());
794
+ }
795
+ new (elem->channel_data) F(std::move(*status));
796
+ return absl::OkStatus();
797
+ }
798
+ };
799
+
476
800
  } // namespace promise_filter_detail
477
801
 
478
802
  // F implements ChannelFilter and :
@@ -484,83 +808,36 @@ class CallData<ChannelFilter, FilterEndpoint::kServer> : public ServerCallData {
484
808
  template <typename F, FilterEndpoint kEndpoint, uint8_t kFlags = 0>
485
809
  absl::enable_if_t<std::is_base_of<ChannelFilter, F>::value, grpc_channel_filter>
486
810
  MakePromiseBasedFilter(const char* name) {
487
- using CallData = promise_filter_detail::CallData<F, kEndpoint>;
811
+ using CallData = promise_filter_detail::CallData<kEndpoint>;
488
812
 
489
813
  return grpc_channel_filter{
490
814
  // start_transport_stream_op_batch
491
- [](grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
492
- static_cast<CallData*>(elem->call_data)->StartBatch(batch);
493
- },
815
+ promise_filter_detail::BaseCallDataMethods::StartTransportStreamOpBatch,
494
816
  // make_call_promise
495
- [](grpc_channel_element* elem, CallArgs call_args,
496
- NextPromiseFactory next_promise_factory) {
497
- return static_cast<ChannelFilter*>(elem->channel_data)
498
- ->MakeCallPromise(std::move(call_args),
499
- std::move(next_promise_factory));
500
- },
817
+ promise_filter_detail::ChannelFilterMethods::MakeCallPromise,
501
818
  // start_transport_op
502
- [](grpc_channel_element* elem, grpc_transport_op* op) {
503
- if (!static_cast<ChannelFilter*>(elem->channel_data)
504
- ->StartTransportOp(op)) {
505
- grpc_channel_next_op(elem, op);
506
- }
507
- },
819
+ promise_filter_detail::ChannelFilterMethods::StartTransportOp,
508
820
  // sizeof_call_data
509
821
  sizeof(CallData),
510
822
  // init_call_elem
511
- [](grpc_call_element* elem, const grpc_call_element_args* args) {
512
- new (elem->call_data) CallData(elem, args, kFlags);
513
- return GRPC_ERROR_NONE;
514
- },
823
+ promise_filter_detail::CallDataFilterWithFlagsMethods<
824
+ CallData, kFlags>::InitCallElem,
515
825
  // set_pollset_or_pollset_set
516
- [](grpc_call_element* elem, grpc_polling_entity* pollent) {
517
- static_cast<CallData*>(elem->call_data)->set_pollent(pollent);
518
- },
826
+ promise_filter_detail::BaseCallDataMethods::SetPollsetOrPollsetSet,
519
827
  // destroy_call_elem
520
- [](grpc_call_element* elem, const grpc_call_final_info* final_info,
521
- grpc_closure* then_schedule_closure) {
522
- auto* cd = static_cast<CallData*>(elem->call_data);
523
- cd->Finalize(final_info);
524
- cd->~CallData();
525
- if ((kFlags & kFilterIsLast) != 0) {
526
- ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, GRPC_ERROR_NONE);
527
- } else {
528
- GPR_ASSERT(then_schedule_closure == nullptr);
529
- }
530
- },
828
+ promise_filter_detail::CallDataFilterWithFlagsMethods<
829
+ CallData, kFlags>::DestroyCallElem,
531
830
  // sizeof_channel_data
532
831
  sizeof(F),
533
832
  // init_channel_elem
534
- [](grpc_channel_element* elem, grpc_channel_element_args* args) {
535
- GPR_ASSERT(args->is_last == ((kFlags & kFilterIsLast) != 0));
536
- auto status = F::Create(ChannelArgs::FromC(args->channel_args),
537
- ChannelFilter::Args(args->channel_stack, elem));
538
- if (!status.ok()) {
539
- static_assert(
540
- sizeof(promise_filter_detail::InvalidChannelFilter) <= sizeof(F),
541
- "InvalidChannelFilter must fit in F");
542
- new (elem->channel_data)
543
- promise_filter_detail::InvalidChannelFilter();
544
- return absl_status_to_grpc_error(status.status());
545
- }
546
- new (elem->channel_data) F(std::move(*status));
547
- return GRPC_ERROR_NONE;
548
- },
833
+ promise_filter_detail::ChannelFilterWithFlagsMethods<
834
+ F, kFlags>::InitChannelElem,
549
835
  // post_init_channel_elem
550
- [](grpc_channel_stack*, grpc_channel_element* elem) {
551
- static_cast<ChannelFilter*>(elem->channel_data)->PostInit();
552
- },
836
+ promise_filter_detail::ChannelFilterMethods::PostInitChannelElem,
553
837
  // destroy_channel_elem
554
- [](grpc_channel_element* elem) {
555
- static_cast<ChannelFilter*>(elem->channel_data)->~ChannelFilter();
556
- },
838
+ promise_filter_detail::ChannelFilterMethods::DestroyChannelElem,
557
839
  // get_channel_info
558
- [](grpc_channel_element* elem, const grpc_channel_info* info) {
559
- if (!static_cast<ChannelFilter*>(elem->channel_data)
560
- ->GetChannelInfo(info)) {
561
- grpc_channel_next_get_info(elem, info);
562
- }
563
- },
840
+ promise_filter_detail::ChannelFilterMethods::GetChannelInfo,
564
841
  // name
565
842
  name,
566
843
  };