grpc 1.46.2 → 1.48.0.pre1

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 (810) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +138 -128
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +62 -18
  5. data/include/grpc/event_engine/memory_allocator.h +0 -15
  6. data/include/grpc/event_engine/port.h +1 -1
  7. data/include/grpc/event_engine/slice.h +286 -0
  8. data/include/grpc/event_engine/slice_buffer.h +118 -0
  9. data/include/grpc/grpc.h +3 -3
  10. data/include/grpc/grpc_security.h +11 -0
  11. data/include/grpc/impl/codegen/compression_types.h +2 -1
  12. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  13. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  14. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  15. data/include/grpc/impl/codegen/port_platform.h +106 -39
  16. data/include/grpc/impl/codegen/slice.h +1 -1
  17. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  18. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +35 -35
  19. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +20 -1
  20. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  21. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  22. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  23. data/src/core/ext/filters/client_channel/backup_poller.cc +8 -6
  24. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  25. data/src/core/ext/filters/client_channel/channel_connectivity.cc +43 -21
  26. data/src/core/ext/filters/client_channel/client_channel.cc +111 -82
  27. data/src/core/ext/filters/client_channel/client_channel.h +43 -8
  28. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  29. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  30. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  31. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  32. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  33. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  34. data/src/core/ext/filters/client_channel/config_selector.h +8 -6
  35. data/src/core/ext/filters/client_channel/connector.h +9 -3
  36. data/src/core/ext/filters/client_channel/dynamic_filters.cc +19 -6
  37. data/src/core/ext/filters/client_channel/dynamic_filters.h +12 -2
  38. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  39. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  40. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  41. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  42. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  43. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  45. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -5
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +132 -62
  52. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  56. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +407 -0
  57. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  58. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1036 -0
  59. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  60. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +149 -147
  61. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +176 -85
  62. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +303 -203
  63. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -1
  64. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +92 -54
  65. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +240 -214
  66. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +119 -111
  67. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +86 -71
  68. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +101 -25
  69. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  70. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +35 -11
  71. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +36 -20
  72. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +78 -14
  73. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  74. data/src/core/ext/filters/client_channel/lb_policy.h +18 -31
  75. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  76. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +11 -6
  77. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  78. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  79. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  80. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  81. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +1 -0
  82. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  83. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +26 -6
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +139 -48
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  86. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  87. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -6
  88. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +36 -14
  89. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  90. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  91. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  92. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  93. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +39 -7
  94. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -19
  95. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  96. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +61 -16
  97. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +14 -2
  98. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  99. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +17 -12
  100. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +111 -46
  101. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  102. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +12 -18
  103. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  104. data/src/core/ext/filters/client_channel/retry_filter.cc +75 -36
  105. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  106. data/src/core/ext/filters/client_channel/retry_service_config.cc +12 -13
  107. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  108. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  109. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  110. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +24 -6
  111. data/src/core/ext/filters/client_channel/subchannel.cc +186 -187
  112. data/src/core/ext/filters/client_channel/subchannel.h +80 -36
  113. data/src/core/ext/filters/client_channel/subchannel_interface.h +51 -41
  114. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  115. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  116. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  117. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +24 -95
  118. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +17 -9
  119. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -9
  120. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  121. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +22 -6
  122. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  123. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  124. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  125. data/src/core/ext/filters/http/client/http_client_filter.cc +30 -10
  126. data/src/core/ext/filters/http/client/http_client_filter.h +15 -2
  127. data/src/core/ext/filters/http/client_authority_filter.cc +16 -20
  128. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  129. data/src/core/ext/filters/http/http_filters_plugin.cc +16 -9
  130. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +65 -187
  131. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  132. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +45 -107
  133. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  134. data/src/core/ext/filters/http/server/http_server_filter.cc +95 -255
  135. data/src/core/ext/filters/http/server/http_server_filter.h +37 -3
  136. data/src/core/ext/filters/message_size/message_size_filter.cc +45 -41
  137. data/src/core/ext/filters/message_size/message_size_filter.h +15 -2
  138. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -3
  139. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  140. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  141. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  142. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  143. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  144. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  145. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  146. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +104 -138
  147. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  148. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +58 -29
  149. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  150. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  151. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  152. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  153. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +260 -491
  154. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +6 -1
  155. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  156. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  157. data/src/core/ext/transport/chttp2/transport/flow_control.cc +145 -261
  158. data/src/core/ext/transport/chttp2/transport/flow_control.h +179 -288
  159. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  160. data/src/core/ext/transport/chttp2/transport/frame_data.cc +59 -211
  161. data/src/core/ext/transport/chttp2/transport/frame_data.h +13 -36
  162. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  163. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  164. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  165. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  166. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  167. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  168. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +10 -42
  169. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  170. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +10 -12
  171. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  172. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  173. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  174. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  175. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  176. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -13
  177. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  178. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +53 -37
  179. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  180. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  181. data/src/core/ext/transport/chttp2/transport/internal.h +31 -112
  182. data/src/core/ext/transport/chttp2/transport/parsing.cc +77 -43
  183. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +11 -11
  184. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  185. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  186. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  187. data/src/core/ext/transport/chttp2/transport/writing.cc +54 -21
  188. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  189. data/src/core/ext/transport/inproc/inproc_transport.cc +93 -86
  190. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  191. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  192. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  193. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  194. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  195. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  196. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  197. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  198. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  199. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  200. data/src/core/ext/xds/certificate_provider_store.cc +6 -2
  201. data/src/core/ext/xds/certificate_provider_store.h +10 -1
  202. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  203. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  204. data/src/core/ext/xds/upb_utils.h +1 -2
  205. data/src/core/ext/xds/xds_api.cc +16 -18
  206. data/src/core/ext/xds/xds_api.h +12 -5
  207. data/src/core/ext/xds/xds_bootstrap.cc +39 -26
  208. data/src/core/ext/xds/xds_bootstrap.h +11 -11
  209. data/src/core/ext/xds/xds_certificate_provider.cc +16 -4
  210. data/src/core/ext/xds/xds_certificate_provider.h +17 -2
  211. data/src/core/ext/xds/xds_channel_stack_modifier.cc +14 -5
  212. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  213. data/src/core/ext/xds/xds_client.cc +121 -46
  214. data/src/core/ext/xds/xds_client.h +19 -4
  215. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  216. data/src/core/ext/xds/xds_client_stats.h +4 -3
  217. data/src/core/ext/xds/xds_cluster.cc +126 -25
  218. data/src/core/ext/xds/xds_cluster.h +12 -1
  219. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  220. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  221. data/src/core/ext/xds/xds_common_types.cc +36 -22
  222. data/src/core/ext/xds/xds_common_types.h +12 -4
  223. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  224. data/src/core/ext/xds/xds_endpoint.h +13 -5
  225. data/src/core/ext/xds/xds_http_fault_filter.cc +10 -8
  226. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  227. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  228. data/src/core/ext/xds/xds_http_filters.h +3 -3
  229. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  230. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  231. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  232. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  233. data/src/core/ext/xds/xds_listener.cc +70 -42
  234. data/src/core/ext/xds/xds_listener.h +10 -1
  235. data/src/core/ext/xds/xds_resource_type.h +3 -3
  236. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  237. data/src/core/ext/xds/xds_route_config.cc +56 -28
  238. data/src/core/ext/xds/xds_route_config.h +11 -2
  239. data/src/core/ext/xds/xds_routing.cc +16 -0
  240. data/src/core/ext/xds/xds_routing.h +7 -2
  241. data/src/core/ext/xds/xds_server_config_fetcher.cc +56 -7
  242. data/src/core/lib/address_utils/parse_address.cc +5 -8
  243. data/src/core/lib/address_utils/parse_address.h +3 -2
  244. data/src/core/lib/address_utils/sockaddr_utils.cc +60 -26
  245. data/src/core/lib/address_utils/sockaddr_utils.h +9 -4
  246. data/src/core/lib/avl/avl.h +6 -4
  247. data/src/core/lib/backoff/backoff.cc +1 -1
  248. data/src/core/lib/backoff/backoff.h +1 -1
  249. data/src/core/lib/channel/call_finalization.h +4 -0
  250. data/src/core/lib/channel/call_tracer.h +11 -5
  251. data/src/core/lib/channel/channel_args.cc +41 -22
  252. data/src/core/lib/channel/channel_args.h +34 -3
  253. data/src/core/lib/channel/channel_args_preconditioning.cc +4 -3
  254. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  255. data/src/core/lib/channel/channel_fwd.h +26 -0
  256. data/src/core/lib/channel/channel_stack.cc +45 -7
  257. data/src/core/lib/channel/channel_stack.h +45 -9
  258. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  259. data/src/core/lib/channel/channel_stack_builder.h +17 -32
  260. data/src/core/lib/channel/channel_stack_builder_impl.cc +38 -43
  261. data/src/core/lib/channel/channel_stack_builder_impl.h +4 -6
  262. data/src/core/lib/channel/channel_trace.cc +8 -13
  263. data/src/core/lib/channel/channel_trace.h +6 -3
  264. data/src/core/lib/channel/channelz.cc +10 -14
  265. data/src/core/lib/channel/channelz.h +15 -7
  266. data/src/core/lib/channel/channelz_registry.cc +11 -19
  267. data/src/core/lib/channel/channelz_registry.h +10 -9
  268. data/src/core/lib/channel/connected_channel.cc +22 -31
  269. data/src/core/lib/channel/connected_channel.h +2 -0
  270. data/src/core/lib/channel/promise_based_filter.cc +451 -190
  271. data/src/core/lib/channel/promise_based_filter.h +162 -27
  272. data/src/core/lib/channel/status_util.cc +2 -0
  273. data/src/core/lib/channel/status_util.h +0 -3
  274. data/src/core/lib/compression/compression.cc +6 -1
  275. data/src/core/lib/compression/compression_internal.cc +48 -16
  276. data/src/core/lib/compression/compression_internal.h +4 -3
  277. data/src/core/lib/compression/message_compress.cc +3 -1
  278. data/src/core/lib/compression/message_compress.h +2 -3
  279. data/src/core/lib/config/core_configuration.cc +3 -0
  280. data/src/core/lib/config/core_configuration.h +2 -1
  281. data/src/core/lib/debug/stats.cc +9 -9
  282. data/src/core/lib/debug/stats.h +2 -1
  283. data/src/core/lib/debug/stats_data.cc +2 -1
  284. data/src/core/lib/debug/stats_data.h +0 -4
  285. data/src/core/lib/debug/trace.h +13 -12
  286. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  287. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  288. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  289. data/src/core/lib/event_engine/event_engine.cc +29 -14
  290. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  291. data/src/core/lib/event_engine/handle_containers.h +67 -0
  292. data/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc +159 -0
  293. data/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h +122 -0
  294. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  295. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  296. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  297. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  298. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  299. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  300. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  301. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  302. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  303. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  304. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  305. data/src/core/lib/{iomgr/event_engine → event_engine}/promise.h +27 -9
  306. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  307. data/src/core/lib/event_engine/slice.cc +102 -0
  308. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  309. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  310. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  311. data/src/core/lib/gpr/log.cc +5 -0
  312. data/src/core/lib/gpr/time_posix.cc +6 -9
  313. data/src/core/lib/gpr/time_windows.cc +10 -7
  314. data/src/core/lib/gpr/tls.h +3 -5
  315. data/src/core/lib/gprpp/bitset.h +5 -1
  316. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  317. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  318. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  319. data/src/core/lib/gprpp/examine_stack.h +0 -1
  320. data/src/core/lib/gprpp/fork.cc +3 -6
  321. data/src/core/lib/gprpp/global_config.h +2 -4
  322. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  323. data/src/core/lib/gprpp/global_config_env.h +3 -1
  324. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  325. data/src/core/lib/gprpp/host_port.cc +2 -0
  326. data/src/core/lib/gprpp/manual_constructor.h +0 -68
  327. data/src/core/lib/gprpp/match.h +2 -0
  328. data/src/core/lib/gprpp/memory.h +1 -5
  329. data/src/core/lib/gprpp/orphanable.h +1 -4
  330. data/src/core/lib/gprpp/ref_counted.h +1 -3
  331. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  332. data/src/core/lib/gprpp/stat.h +0 -2
  333. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  334. data/src/core/lib/gprpp/status_helper.cc +50 -32
  335. data/src/core/lib/gprpp/status_helper.h +4 -0
  336. data/src/core/lib/gprpp/sync.h +3 -1
  337. data/src/core/lib/gprpp/table.h +10 -0
  338. data/src/core/lib/gprpp/thd.h +2 -5
  339. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  340. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  341. data/src/core/lib/gprpp/time.cc +16 -0
  342. data/src/core/lib/gprpp/time.h +10 -1
  343. data/src/core/lib/gprpp/time_util.cc +4 -0
  344. data/src/core/lib/gprpp/time_util.h +1 -1
  345. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  346. data/src/core/lib/http/format_request.cc +34 -4
  347. data/src/core/lib/http/format_request.h +3 -1
  348. data/src/core/lib/http/httpcli.cc +106 -93
  349. data/src/core/lib/http/httpcli.h +58 -10
  350. data/src/core/lib/http/httpcli_security_connector.cc +19 -8
  351. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  352. data/src/core/lib/http/parser.cc +6 -7
  353. data/src/core/lib/http/parser.h +3 -0
  354. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  355. data/src/core/lib/iomgr/endpoint.cc +4 -4
  356. data/src/core/lib/iomgr/endpoint.h +7 -5
  357. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -6
  358. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  359. data/src/core/lib/iomgr/error.cc +11 -9
  360. data/src/core/lib/iomgr/error.h +9 -5
  361. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  362. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  363. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  364. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  365. data/src/core/lib/iomgr/ev_posix.cc +55 -96
  366. data/src/core/lib/iomgr/ev_posix.h +5 -3
  367. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  368. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  369. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  370. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  371. data/src/core/lib/iomgr/iomgr.cc +7 -1
  372. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  373. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  374. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  375. data/src/core/lib/iomgr/load_file.cc +1 -1
  376. data/src/core/lib/iomgr/pollset_set.h +1 -2
  377. data/src/core/lib/iomgr/port.h +25 -6
  378. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  379. data/src/core/lib/iomgr/resolve_address.h +21 -14
  380. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  381. data/src/core/lib/iomgr/resolve_address_posix.cc +9 -15
  382. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  383. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -15
  384. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  385. data/src/core/lib/iomgr/sockaddr.h +2 -3
  386. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  387. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  388. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  389. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  390. data/src/core/lib/iomgr/tcp_client.h +24 -13
  391. data/src/core/lib/iomgr/tcp_client_cfstream.cc +24 -10
  392. data/src/core/lib/iomgr/tcp_client_posix.cc +154 -29
  393. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  394. data/src/core/lib/iomgr/tcp_client_windows.cc +27 -16
  395. data/src/core/lib/iomgr/tcp_posix.cc +96 -52
  396. data/src/core/lib/iomgr/tcp_server_posix.cc +33 -19
  397. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +41 -38
  398. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -6
  399. data/src/core/lib/iomgr/tcp_server_windows.cc +20 -12
  400. data/src/core/lib/iomgr/tcp_windows.cc +12 -9
  401. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  402. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  403. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  404. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  405. data/src/core/lib/iomgr/work_serializer.h +2 -3
  406. data/src/core/lib/json/json.h +1 -2
  407. data/src/core/lib/json/json_reader.cc +9 -1
  408. data/src/core/lib/json/json_util.cc +7 -0
  409. data/src/core/lib/json/json_util.h +10 -1
  410. data/src/core/lib/json/json_writer.cc +6 -1
  411. data/src/core/lib/matchers/matchers.cc +6 -3
  412. data/src/core/lib/matchers/matchers.h +2 -0
  413. data/src/core/lib/promise/activity.cc +1 -2
  414. data/src/core/lib/promise/activity.h +13 -19
  415. data/src/core/lib/promise/arena_promise.h +11 -1
  416. data/src/core/lib/promise/call_push_pull.h +4 -0
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  419. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  420. data/src/core/lib/promise/latch.h +0 -1
  421. data/src/core/lib/promise/loop.h +2 -0
  422. data/src/core/lib/promise/promise.h +1 -0
  423. data/src/core/lib/promise/race.h +0 -1
  424. data/src/core/lib/promise/seq.h +0 -2
  425. data/src/core/lib/promise/sleep.cc +38 -31
  426. data/src/core/lib/promise/sleep.h +32 -22
  427. data/src/core/lib/promise/try_seq.h +2 -2
  428. data/src/core/lib/resolver/resolver.cc +5 -0
  429. data/src/core/lib/resolver/resolver.h +3 -0
  430. data/src/core/lib/resolver/resolver_factory.h +6 -4
  431. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  432. data/src/core/lib/resolver/resolver_registry.h +12 -1
  433. data/src/core/lib/resolver/server_address.cc +17 -3
  434. data/src/core/lib/resolver/server_address.h +13 -6
  435. data/src/core/lib/resource_quota/api.cc +14 -1
  436. data/src/core/lib/resource_quota/api.h +4 -1
  437. data/src/core/lib/resource_quota/arena.cc +0 -6
  438. data/src/core/lib/resource_quota/arena.h +1 -2
  439. data/src/core/lib/resource_quota/memory_quota.cc +62 -62
  440. data/src/core/lib/resource_quota/memory_quota.h +35 -30
  441. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  442. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  443. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  444. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  445. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  446. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  447. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  448. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  449. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  450. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +15 -0
  451. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  452. data/src/core/lib/security/authorization/matchers.cc +9 -1
  453. data/src/core/lib/security/authorization/matchers.h +7 -0
  454. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  455. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  456. data/src/core/lib/security/context/security_context.cc +5 -2
  457. data/src/core/lib/security/context/security_context.h +14 -2
  458. data/src/core/lib/security/credentials/alts/alts_credentials.cc +12 -4
  459. data/src/core/lib/security/credentials/alts/alts_credentials.h +8 -3
  460. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  461. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  462. data/src/core/lib/security/credentials/call_creds_util.cc +10 -0
  463. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  464. data/src/core/lib/security/credentials/channel_creds_registry.h +7 -1
  465. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  466. data/src/core/lib/security/credentials/composite/composite_credentials.cc +11 -7
  467. data/src/core/lib/security/credentials/composite/composite_credentials.h +21 -6
  468. data/src/core/lib/security/credentials/credentials.cc +4 -8
  469. data/src/core/lib/security/credentials/credentials.h +27 -18
  470. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +108 -9
  471. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +18 -0
  472. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  473. data/src/core/lib/security/credentials/external/external_account_credentials.cc +27 -9
  474. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  475. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  476. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  477. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +22 -4
  478. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  479. data/src/core/lib/security/credentials/fake/fake_credentials.cc +21 -9
  480. data/src/core/lib/security/credentials/fake/fake_credentials.h +15 -3
  481. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  482. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +51 -24
  483. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +12 -3
  484. data/src/core/lib/security/credentials/iam/iam_credentials.cc +13 -4
  485. data/src/core/lib/security/credentials/iam/iam_credentials.h +12 -2
  486. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +12 -2
  487. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +9 -4
  488. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  489. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  490. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +14 -7
  491. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +16 -2
  492. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  494. data/src/core/lib/security/credentials/local/local_credentials.cc +12 -5
  495. data/src/core/lib/security/credentials/local/local_credentials.h +9 -2
  496. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +36 -19
  497. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +24 -4
  498. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +12 -8
  499. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +25 -1
  500. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -2
  501. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +17 -4
  502. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  503. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  504. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +39 -10
  505. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +14 -11
  506. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +35 -3
  507. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +34 -11
  508. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  509. data/src/core/lib/security/credentials/tls/tls_credentials.cc +17 -2
  510. data/src/core/lib/security/credentials/tls/tls_credentials.h +7 -3
  511. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  512. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  513. data/src/core/lib/security/credentials/xds/xds_credentials.cc +20 -4
  514. data/src/core/lib/security/credentials/xds/xds_credentials.h +19 -5
  515. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  516. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  517. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +18 -2
  518. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  519. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  520. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  521. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  522. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  523. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  524. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  525. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  526. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  527. data/src/core/lib/security/security_connector/security_connector.h +19 -7
  528. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +19 -7
  529. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  530. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  531. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  532. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  533. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  534. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  535. data/src/core/lib/security/transport/auth_filters.h +7 -0
  536. data/src/core/lib/security/transport/client_auth_filter.cc +24 -17
  537. data/src/core/lib/security/transport/secure_endpoint.cc +81 -20
  538. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  539. data/src/core/lib/security/transport/security_handshaker.cc +49 -16
  540. data/src/core/lib/security/transport/security_handshaker.h +5 -1
  541. data/src/core/lib/security/transport/server_auth_filter.cc +29 -6
  542. data/src/core/lib/security/util/json_util.cc +3 -2
  543. data/src/core/lib/security/util/json_util.h +0 -2
  544. data/src/core/lib/service_config/service_config.h +4 -8
  545. data/src/core/lib/service_config/service_config_call_data.h +6 -2
  546. data/src/core/lib/service_config/service_config_impl.cc +13 -6
  547. data/src/core/lib/service_config/service_config_impl.h +9 -4
  548. data/src/core/lib/service_config/service_config_parser.cc +8 -2
  549. data/src/core/lib/service_config/service_config_parser.h +7 -0
  550. data/src/core/lib/slice/b64.cc +1 -1
  551. data/src/core/lib/slice/b64.h +2 -0
  552. data/src/core/lib/slice/percent_encoding.cc +4 -1
  553. data/src/core/lib/slice/percent_encoding.h +0 -6
  554. data/src/core/lib/slice/slice.cc +2 -1
  555. data/src/core/lib/slice/slice.h +10 -5
  556. data/src/core/lib/slice/slice_api.cc +1 -1
  557. data/src/core/lib/slice/slice_buffer.cc +79 -23
  558. data/src/core/lib/slice/slice_buffer.h +137 -0
  559. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  560. data/src/core/lib/slice/slice_internal.h +4 -3
  561. data/src/core/lib/slice/slice_refcount.h +2 -3
  562. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  563. data/src/core/lib/slice/slice_string_helpers.cc +0 -16
  564. data/src/core/lib/slice/slice_string_helpers.h +1 -8
  565. data/src/core/lib/surface/builtins.cc +7 -2
  566. data/src/core/lib/surface/byte_buffer.cc +7 -1
  567. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  568. data/src/core/lib/surface/call.cc +90 -137
  569. data/src/core/lib/surface/call.h +21 -3
  570. data/src/core/lib/surface/call_details.cc +4 -4
  571. data/src/core/lib/surface/call_log_batch.cc +7 -1
  572. data/src/core/lib/surface/call_test_only.h +4 -1
  573. data/src/core/lib/surface/channel.cc +179 -242
  574. data/src/core/lib/surface/channel.h +97 -58
  575. data/src/core/lib/surface/channel_init.h +2 -0
  576. data/src/core/lib/surface/channel_ping.cc +8 -2
  577. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  578. data/src/core/lib/surface/channel_stack_type.h +0 -2
  579. data/src/core/lib/surface/completion_queue.cc +29 -20
  580. data/src/core/lib/surface/completion_queue.h +7 -2
  581. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  582. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  583. data/src/core/lib/surface/event_string.cc +1 -7
  584. data/src/core/lib/surface/event_string.h +1 -1
  585. data/src/core/lib/surface/init.cc +17 -46
  586. data/src/core/lib/surface/init.h +0 -8
  587. data/src/core/lib/surface/lame_client.cc +63 -109
  588. data/src/core/lib/surface/lame_client.h +41 -3
  589. data/src/core/lib/surface/metadata_array.cc +2 -0
  590. data/src/core/lib/surface/server.cc +83 -64
  591. data/src/core/lib/surface/server.h +42 -9
  592. data/src/core/lib/surface/validate_metadata.cc +3 -6
  593. data/src/core/lib/surface/validate_metadata.h +3 -0
  594. data/src/core/lib/surface/version.cc +2 -2
  595. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  596. data/src/core/lib/transport/bdp_estimator.h +2 -3
  597. data/src/core/lib/transport/connectivity_state.cc +6 -4
  598. data/src/core/lib/transport/connectivity_state.h +2 -3
  599. data/src/core/lib/transport/error_utils.cc +16 -8
  600. data/src/core/lib/transport/error_utils.h +5 -1
  601. data/src/core/lib/{channel → transport}/handshaker.cc +12 -7
  602. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  603. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  604. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  605. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  606. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +28 -14
  607. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  608. data/src/core/lib/transport/metadata_batch.cc +287 -0
  609. data/src/core/lib/transport/metadata_batch.h +133 -264
  610. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  611. data/src/core/lib/transport/parsed_metadata.h +10 -3
  612. data/src/core/lib/transport/status_conversion.cc +2 -0
  613. data/src/core/lib/transport/status_conversion.h +2 -2
  614. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  615. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  616. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  617. data/src/core/lib/transport/timeout_encoding.h +5 -1
  618. data/src/core/lib/transport/transport.cc +18 -20
  619. data/src/core/lib/transport/transport.h +48 -16
  620. data/src/core/lib/transport/transport_fwd.h +20 -0
  621. data/src/core/lib/transport/transport_impl.h +11 -0
  622. data/src/core/lib/transport/transport_op_string.cc +17 -18
  623. data/src/core/lib/uri/uri_parser.cc +11 -3
  624. data/src/core/lib/uri/uri_parser.h +0 -2
  625. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  626. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  627. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  628. data/src/core/tsi/fake_transport_security.cc +13 -1
  629. data/src/core/tsi/fake_transport_security.h +6 -0
  630. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  631. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  632. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  633. data/src/core/tsi/ssl_transport_security.cc +1 -1
  634. data/src/core/tsi/transport_security_grpc.cc +3 -2
  635. data/src/core/tsi/transport_security_grpc.h +5 -2
  636. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  637. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  638. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  639. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  640. data/src/ruby/ext/grpc/extconf.rb +50 -19
  641. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  642. data/src/ruby/lib/grpc/errors.rb +1 -1
  643. data/src/ruby/lib/grpc/version.rb +1 -1
  644. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  645. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  646. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  647. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  648. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  649. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  650. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  651. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  652. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  653. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  654. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  655. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  656. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  657. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  658. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  659. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  660. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  661. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  662. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  663. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  664. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  665. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  666. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  667. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  668. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  669. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  670. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  671. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  672. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  673. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  674. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +510 -0
  675. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  676. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  677. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  678. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  679. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  680. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  681. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  682. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  683. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  684. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  685. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  686. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  687. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  688. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  689. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  690. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  691. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  692. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  693. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  694. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  695. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  696. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  697. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  698. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  699. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  700. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  701. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  702. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  703. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  704. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  705. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  706. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  707. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  708. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  709. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  710. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  711. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  712. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  713. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  714. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  715. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  716. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  717. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  718. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  719. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  720. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  721. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  722. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  723. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  724. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  725. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  726. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  727. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  728. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  729. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  730. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  731. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  732. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  733. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  734. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  735. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  736. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  737. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  738. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  739. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  740. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  741. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  742. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  743. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  744. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  745. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  746. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  747. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  748. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  749. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  750. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  751. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  752. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  753. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  754. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  755. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  756. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  757. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  758. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  759. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  760. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  761. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  762. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  763. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  764. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  765. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  766. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  767. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  768. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  769. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  770. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  771. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  772. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  773. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  774. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  775. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  776. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  777. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  778. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  779. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  780. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  781. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  782. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  783. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  784. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  785. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  786. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  787. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  788. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  789. metadata +69 -38
  790. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  791. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  792. data/src/core/lib/event_engine/sockaddr.h +0 -44
  793. data/src/core/lib/gprpp/capture.h +0 -76
  794. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  795. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  796. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  797. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  798. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  799. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  800. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  801. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  802. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  803. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  804. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  805. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  806. data/src/core/lib/slice/slice_split.cc +0 -100
  807. data/src/core/lib/slice/slice_split.h +0 -40
  808. data/src/core/lib/transport/byte_stream.cc +0 -164
  809. data/src/core/lib/transport/byte_stream.h +0 -166
  810. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -16,9 +16,20 @@
16
16
 
17
17
  #include "src/core/lib/channel/promise_based_filter.h"
18
18
 
19
- #include <cstdlib>
19
+ #include <memory>
20
+ #include <string>
21
+
22
+ #include "absl/base/attributes.h"
23
+ #include "absl/memory/memory.h"
24
+ #include "absl/types/variant.h"
25
+ #include "absl/utility/utility.h"
26
+
27
+ #include <grpc/status.h>
20
28
 
21
29
  #include "src/core/lib/channel/channel_stack.h"
30
+ #include "src/core/lib/gprpp/manual_constructor.h"
31
+ #include "src/core/lib/iomgr/error.h"
32
+ #include "src/core/lib/slice/slice.h"
22
33
 
23
34
  namespace grpc_core {
24
35
  namespace promise_filter_detail {
@@ -70,6 +81,131 @@ void BaseCallData::Wakeup() {
70
81
 
71
82
  void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
72
83
 
84
+ ///////////////////////////////////////////////////////////////////////////////
85
+ // BaseCallData::CapturedBatch
86
+
87
+ namespace {
88
+ uintptr_t* RefCountField(grpc_transport_stream_op_batch* b) {
89
+ return &b->handler_private.closure.error_data.scratch;
90
+ }
91
+ } // namespace
92
+
93
+ BaseCallData::CapturedBatch::CapturedBatch() : batch_(nullptr) {}
94
+
95
+ BaseCallData::CapturedBatch::CapturedBatch(
96
+ grpc_transport_stream_op_batch* batch) {
97
+ *RefCountField(batch) = 1;
98
+ batch_ = batch;
99
+ }
100
+
101
+ BaseCallData::CapturedBatch::~CapturedBatch() {
102
+ if (batch_ == nullptr) return;
103
+ // A ref can be dropped by destruction, but it must not release the batch
104
+ uintptr_t& refcnt = *RefCountField(batch_);
105
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
106
+ --refcnt;
107
+ GPR_ASSERT(refcnt != 0);
108
+ }
109
+
110
+ BaseCallData::CapturedBatch::CapturedBatch(const CapturedBatch& rhs)
111
+ : batch_(rhs.batch_) {
112
+ if (batch_ == nullptr) return;
113
+ uintptr_t& refcnt = *RefCountField(batch_);
114
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
115
+ ++refcnt;
116
+ }
117
+
118
+ BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
119
+ const CapturedBatch& b) {
120
+ CapturedBatch temp(b);
121
+ Swap(&temp);
122
+ return *this;
123
+ }
124
+
125
+ BaseCallData::CapturedBatch::CapturedBatch(CapturedBatch&& rhs) noexcept
126
+ : batch_(rhs.batch_) {
127
+ rhs.batch_ = nullptr;
128
+ }
129
+
130
+ BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
131
+ CapturedBatch&& b) noexcept {
132
+ Swap(&b);
133
+ return *this;
134
+ }
135
+
136
+ void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) {
137
+ auto* batch = absl::exchange(batch_, nullptr);
138
+ GPR_ASSERT(batch != nullptr);
139
+ uintptr_t& refcnt = *RefCountField(batch);
140
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
141
+ if (--refcnt == 0) {
142
+ releaser->Resume(batch);
143
+ }
144
+ }
145
+
146
+ void BaseCallData::CapturedBatch::CompleteWith(Flusher* releaser) {
147
+ auto* batch = absl::exchange(batch_, nullptr);
148
+ GPR_ASSERT(batch != nullptr);
149
+ uintptr_t& refcnt = *RefCountField(batch);
150
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
151
+ if (--refcnt == 0) {
152
+ releaser->Complete(batch);
153
+ }
154
+ }
155
+
156
+ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
157
+ Flusher* releaser) {
158
+ auto* batch = absl::exchange(batch_, nullptr);
159
+ GPR_ASSERT(batch != nullptr);
160
+ uintptr_t& refcnt = *RefCountField(batch);
161
+ if (refcnt == 0) {
162
+ // refcnt==0 ==> cancelled
163
+ GRPC_ERROR_UNREF(error);
164
+ return;
165
+ }
166
+ refcnt = 0;
167
+ releaser->Cancel(batch, error);
168
+ }
169
+
170
+ ///////////////////////////////////////////////////////////////////////////////
171
+ // BaseCallData::Flusher
172
+
173
+ BaseCallData::Flusher::Flusher(BaseCallData* call) : call_(call) {
174
+ GRPC_CALL_STACK_REF(call_->call_stack(), "flusher");
175
+ }
176
+
177
+ BaseCallData::Flusher::~Flusher() {
178
+ if (release_.empty()) {
179
+ if (call_closures_.size() == 0) {
180
+ GRPC_CALL_COMBINER_STOP(call_->call_combiner(), "nothing to flush");
181
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
182
+ return;
183
+ }
184
+ call_closures_.RunClosures(call_->call_combiner());
185
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
186
+ return;
187
+ }
188
+ auto call_next_op = [](void* p, grpc_error_handle) {
189
+ auto* batch = static_cast<grpc_transport_stream_op_batch*>(p);
190
+ BaseCallData* call =
191
+ static_cast<BaseCallData*>(batch->handler_private.extra_arg);
192
+ grpc_call_next_op(call->elem(), batch);
193
+ GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch");
194
+ };
195
+ for (size_t i = 1; i < release_.size(); i++) {
196
+ auto* batch = release_[i];
197
+ batch->handler_private.extra_arg = call_;
198
+ GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch,
199
+ nullptr);
200
+ GRPC_CALL_STACK_REF(call_->call_stack(), "flusher_batch");
201
+ call_closures_.Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
202
+ "flusher_batch");
203
+ }
204
+ call_closures_.RunClosuresWithoutYielding(call_->call_combiner());
205
+ grpc_call_next_op(call_->elem(), release_[0]);
206
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
207
+ }
208
+
73
209
  ///////////////////////////////////////////////////////////////////////////////
74
210
  // ClientCallData
75
211
 
@@ -104,8 +240,10 @@ struct ClientCallData::RecvInitialMetadata final {
104
240
 
105
241
  class ClientCallData::PollContext {
106
242
  public:
107
- explicit PollContext(ClientCallData* self) : self_(self) {
243
+ explicit PollContext(ClientCallData* self, Flusher* flusher)
244
+ : self_(self), flusher_(flusher) {
108
245
  GPR_ASSERT(self_->poll_ctx_ == nullptr);
246
+
109
247
  self_->poll_ctx_ = this;
110
248
  scoped_activity_.Init(self_);
111
249
  have_scoped_activity_ = true;
@@ -143,7 +281,7 @@ class ClientCallData::PollContext {
143
281
  }
144
282
  self_->recv_initial_metadata_->state =
145
283
  RecvInitialMetadata::kResponded;
146
- call_closures_.Add(
284
+ flusher_->AddClosure(
147
285
  absl::exchange(self_->recv_initial_metadata_->original_on_ready,
148
286
  nullptr),
149
287
  GRPC_ERROR_NONE,
@@ -171,7 +309,7 @@ class ClientCallData::PollContext {
171
309
  destroy_md = false;
172
310
  }
173
311
  self_->recv_trailing_state_ = RecvTrailingState::kResponded;
174
- call_closures_.Add(
312
+ flusher_->AddClosure(
175
313
  absl::exchange(self_->original_recv_trailing_metadata_ready_,
176
314
  nullptr),
177
315
  GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:1");
@@ -195,7 +333,7 @@ class ClientCallData::PollContext {
195
333
  case RecvInitialMetadata::kCompleteWaitingForLatch:
196
334
  self_->recv_initial_metadata_->state =
197
335
  RecvInitialMetadata::kResponded;
198
- call_closures_.Add(
336
+ flusher_->AddClosure(
199
337
  absl::exchange(
200
338
  self_->recv_initial_metadata_->original_on_ready,
201
339
  nullptr),
@@ -237,7 +375,7 @@ class ClientCallData::PollContext {
237
375
  case RecvInitialMetadata::kCompleteAndSetLatch:
238
376
  self_->recv_initial_metadata_->state =
239
377
  RecvInitialMetadata::kResponded;
240
- call_closures_.Add(
378
+ flusher_->AddClosure(
241
379
  absl::exchange(
242
380
  self_->recv_initial_metadata_->original_on_ready,
243
381
  nullptr),
@@ -247,21 +385,21 @@ class ClientCallData::PollContext {
247
385
  }
248
386
  if (self_->send_initial_state_ == SendInitialState::kQueued) {
249
387
  self_->send_initial_state_ = SendInitialState::kCancelled;
250
- cancel_send_initial_metadata_error_ = error;
388
+ self_->send_initial_metadata_batch_.CancelWith(error, flusher_);
251
389
  } else {
252
390
  GPR_ASSERT(
253
391
  self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
254
392
  self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
255
393
  self_->call_combiner()->Cancel(GRPC_ERROR_REF(error));
256
- forward_batch_ =
257
- grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
258
- [](void* p, grpc_error_handle) {
259
- GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
260
- "finish_cancel");
261
- },
262
- self_->call_combiner(), nullptr));
263
- forward_batch_->cancel_stream = true;
264
- forward_batch_->payload->cancel_stream.cancel_error = error;
394
+ CapturedBatch b(grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
395
+ [](void* p, grpc_error_handle) {
396
+ GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
397
+ "finish_cancel");
398
+ },
399
+ self_->call_combiner(), nullptr)));
400
+ b->cancel_stream = true;
401
+ b->payload->cancel_stream.cancel_error = error;
402
+ b.ResumeWith(flusher_);
265
403
  }
266
404
  self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
267
405
  }
@@ -280,7 +418,7 @@ class ClientCallData::PollContext {
280
418
  // promise transition).
281
419
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
282
420
  self_->recv_trailing_state_ = RecvTrailingState::kResponded;
283
- call_closures_.Add(
421
+ flusher_->AddClosure(
284
422
  absl::exchange(self_->original_recv_trailing_metadata_ready_,
285
423
  nullptr),
286
424
  GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:2");
@@ -292,77 +430,42 @@ class ClientCallData::PollContext {
292
430
  ~PollContext() {
293
431
  self_->poll_ctx_ = nullptr;
294
432
  if (have_scoped_activity_) scoped_activity_.Destroy();
295
- GRPC_CALL_STACK_REF(self_->call_stack(), "finish_poll");
296
- bool in_combiner = true;
297
- if (call_closures_.size() != 0) {
298
- if (forward_batch_ != nullptr) {
299
- call_closures_.RunClosuresWithoutYielding(self_->call_combiner());
300
- } else {
301
- in_combiner = false;
302
- call_closures_.RunClosures(self_->call_combiner());
303
- }
304
- }
305
- if (forward_batch_ != nullptr) {
306
- GPR_ASSERT(in_combiner);
307
- in_combiner = false;
308
- forward_send_initial_metadata_ = false;
309
- grpc_call_next_op(self_->elem(), forward_batch_);
310
- }
311
- if (cancel_send_initial_metadata_error_ != GRPC_ERROR_NONE) {
312
- GPR_ASSERT(in_combiner);
313
- forward_send_initial_metadata_ = false;
314
- in_combiner = false;
315
- grpc_transport_stream_op_batch_finish_with_failure(
316
- absl::exchange(self_->send_initial_metadata_batch_, nullptr),
317
- cancel_send_initial_metadata_error_, self_->call_combiner());
318
- }
319
- if (absl::exchange(forward_send_initial_metadata_, false)) {
320
- GPR_ASSERT(in_combiner);
321
- in_combiner = false;
322
- grpc_call_next_op(
323
- self_->elem(),
324
- absl::exchange(self_->send_initial_metadata_batch_, nullptr));
325
- }
326
433
  if (repoll_) {
327
- if (in_combiner) {
328
- self_->WakeInsideCombiner();
329
- } else {
330
- struct NextPoll : public grpc_closure {
331
- grpc_call_stack* call_stack;
332
- ClientCallData* call_data;
333
- };
334
- auto run = [](void* p, grpc_error_handle) {
335
- auto* next_poll = static_cast<NextPoll*>(p);
336
- next_poll->call_data->WakeInsideCombiner();
337
- GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
338
- delete next_poll;
339
- };
340
- auto* p = absl::make_unique<NextPoll>().release();
341
- p->call_stack = self_->call_stack();
342
- p->call_data = self_;
343
- GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
344
- GRPC_CLOSURE_INIT(p, run, p, nullptr);
345
- GRPC_CALL_COMBINER_START(self_->call_combiner(), p, GRPC_ERROR_NONE,
346
- "re-poll");
347
- }
348
- } else if (in_combiner) {
349
- GRPC_CALL_COMBINER_STOP(self_->call_combiner(), "poll paused");
434
+ struct NextPoll : public grpc_closure {
435
+ grpc_call_stack* call_stack;
436
+ ClientCallData* call_data;
437
+ };
438
+ auto run = [](void* p, grpc_error_handle) {
439
+ auto* next_poll = static_cast<NextPoll*>(p);
440
+ {
441
+ Flusher flusher(next_poll->call_data);
442
+ next_poll->call_data->WakeInsideCombiner(&flusher);
443
+ }
444
+ GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
445
+ delete next_poll;
446
+ };
447
+ // Unique ptr --> release to suppress clang-tidy warnings about allocating
448
+ // in a destructor.
449
+ auto* p = absl::make_unique<NextPoll>().release();
450
+ p->call_stack = self_->call_stack();
451
+ p->call_data = self_;
452
+ GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
453
+ GRPC_CLOSURE_INIT(p, run, p, nullptr);
454
+ flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
350
455
  }
351
- GRPC_CALL_STACK_UNREF(self_->call_stack(), "finish_poll");
352
456
  }
353
457
 
354
458
  void Repoll() { repoll_ = true; }
355
459
 
356
- void ForwardSendInitialMetadata() { forward_send_initial_metadata_ = true; }
460
+ void ForwardSendInitialMetadata() {
461
+ self_->send_initial_metadata_batch_.ResumeWith(flusher_);
462
+ }
357
463
 
358
464
  private:
359
465
  ManualConstructor<ScopedActivity> scoped_activity_;
360
466
  ClientCallData* self_;
361
- CallCombinerClosureList call_closures_;
362
- grpc_error_handle cancel_send_initial_metadata_error_ = GRPC_ERROR_NONE;
363
- grpc_transport_stream_op_batch* forward_batch_ = nullptr;
467
+ Flusher* flusher_;
364
468
  bool repoll_ = false;
365
- bool forward_send_initial_metadata_ = false;
366
469
  bool have_scoped_activity_;
367
470
  };
368
471
 
@@ -393,9 +496,11 @@ void ClientCallData::ForceImmediateRepoll() {
393
496
  }
394
497
 
395
498
  // Handle one grpc_transport_stream_op_batch
396
- void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
499
+ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
397
500
  // Fake out the activity based context.
398
501
  ScopedContext context(this);
502
+ CapturedBatch batch(b);
503
+ Flusher flusher(this);
399
504
 
400
505
  // If this is a cancel stream, cancel anything we have pending and propagate
401
506
  // the cancellation.
@@ -405,7 +510,12 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
405
510
  !batch->recv_initial_metadata && !batch->recv_message &&
406
511
  !batch->recv_trailing_metadata);
407
512
  Cancel(batch->payload->cancel_stream.cancel_error);
408
- grpc_call_next_op(elem(), batch);
513
+ if (is_last()) {
514
+ GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
515
+ batch.CompleteWith(&flusher);
516
+ } else {
517
+ batch.ResumeWith(&flusher);
518
+ }
409
519
  return;
410
520
  }
411
521
 
@@ -451,40 +561,43 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
451
561
  // If we're already cancelled, just terminate the batch.
452
562
  if (send_initial_state_ == SendInitialState::kCancelled ||
453
563
  recv_trailing_state_ == RecvTrailingState::kCancelled) {
454
- grpc_transport_stream_op_batch_finish_with_failure(
455
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
456
- return;
564
+ batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
565
+ } else {
566
+ // Otherwise, we should not have seen a send_initial_metadata op yet.
567
+ GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
568
+ // Mark ourselves as queued.
569
+ send_initial_state_ = SendInitialState::kQueued;
570
+ if (batch->recv_trailing_metadata) {
571
+ // If there's a recv_trailing_metadata op, we queue that too.
572
+ GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
573
+ recv_trailing_state_ = RecvTrailingState::kQueued;
574
+ }
575
+ // This is the queuing!
576
+ send_initial_metadata_batch_ = batch;
577
+ // And kick start the promise.
578
+ StartPromise(&flusher);
457
579
  }
458
- // Otherwise, we should not have seen a send_initial_metadata op yet.
459
- GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
460
- // Mark ourselves as queued.
461
- send_initial_state_ = SendInitialState::kQueued;
462
- if (batch->recv_trailing_metadata) {
463
- // If there's a recv_trailing_metadata op, we queue that too.
580
+ } else if (batch->recv_trailing_metadata) {
581
+ // recv_trailing_metadata *without* send_initial_metadata: hook it so we
582
+ // can respond to it, and push it down.
583
+ if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
584
+ batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
585
+ } else {
464
586
  GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
465
- recv_trailing_state_ = RecvTrailingState::kQueued;
587
+ recv_trailing_state_ = RecvTrailingState::kForwarded;
588
+ HookRecvTrailingMetadata(batch);
466
589
  }
467
- // This is the queuing!
468
- send_initial_metadata_batch_ = batch;
469
- // And kick start the promise.
470
- StartPromise();
471
- return;
590
+ } else if (!GRPC_ERROR_IS_NONE(cancelled_error_)) {
591
+ batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
472
592
  }
473
593
 
474
- // recv_trailing_metadata *without* send_initial_metadata: hook it so we can
475
- // respond to it, and push it down.
476
- if (batch->recv_trailing_metadata) {
477
- if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
478
- grpc_transport_stream_op_batch_finish_with_failure(
479
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
480
- return;
594
+ if (batch.is_captured()) {
595
+ if (!is_last()) {
596
+ batch.ResumeWith(&flusher);
597
+ } else {
598
+ batch.CancelWith(GRPC_ERROR_CANCELLED, &flusher);
481
599
  }
482
- GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
483
- recv_trailing_state_ = RecvTrailingState::kForwarded;
484
- HookRecvTrailingMetadata(batch);
485
600
  }
486
-
487
- grpc_call_next_op(elem(), batch);
488
601
  }
489
602
 
490
603
  // Handle cancellation.
@@ -502,19 +615,23 @@ void ClientCallData::Cancel(grpc_error_handle error) {
502
615
  recv_trailing_state_ = RecvTrailingState::kCancelled;
503
616
  }
504
617
  struct FailBatch : public grpc_closure {
505
- grpc_transport_stream_op_batch* batch;
506
- CallCombiner* call_combiner;
618
+ CapturedBatch batch;
619
+ ClientCallData* call;
507
620
  };
508
621
  auto fail = [](void* p, grpc_error_handle error) {
509
622
  auto* f = static_cast<FailBatch*>(p);
510
- grpc_transport_stream_op_batch_finish_with_failure(
511
- f->batch, GRPC_ERROR_REF(error), f->call_combiner);
623
+ {
624
+ Flusher flusher(f->call);
625
+ f->batch.CancelWith(GRPC_ERROR_REF(error), &flusher);
626
+ GRPC_CALL_STACK_UNREF(f->call->call_stack(), "cancel pending batch");
627
+ }
512
628
  delete f;
513
629
  };
514
630
  auto* b = new FailBatch();
515
631
  GRPC_CLOSURE_INIT(b, fail, b, nullptr);
516
- b->batch = absl::exchange(send_initial_metadata_batch_, nullptr);
517
- b->call_combiner = call_combiner();
632
+ b->batch = std::move(send_initial_metadata_batch_);
633
+ b->call = this;
634
+ GRPC_CALL_STACK_REF(call_stack(), "cancel pending batch");
518
635
  GRPC_CALL_COMBINER_START(call_combiner(), b,
519
636
  GRPC_ERROR_REF(cancelled_error_),
520
637
  "cancel pending batch");
@@ -545,12 +662,12 @@ void ClientCallData::Cancel(grpc_error_handle error) {
545
662
 
546
663
  // Begin running the promise - which will ultimately take some initial
547
664
  // metadata and return some trailing metadata.
548
- void ClientCallData::StartPromise() {
665
+ void ClientCallData::StartPromise(Flusher* flusher) {
549
666
  GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
550
667
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
551
668
 
552
669
  // Construct the promise.
553
- PollContext ctx(this);
670
+ PollContext ctx(this, flusher);
554
671
  promise_ = filter->MakeCallPromise(
555
672
  CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
556
673
  ->send_initial_metadata.send_initial_metadata),
@@ -580,28 +697,26 @@ void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
580
697
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
581
698
  abort(); // unreachable
582
699
  }
583
- if (error != GRPC_ERROR_NONE) {
700
+ Flusher flusher(this);
701
+ if (!GRPC_ERROR_IS_NONE(error)) {
584
702
  recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
585
- GRPC_CALL_COMBINER_START(
586
- call_combiner(),
703
+ flusher.AddClosure(
587
704
  absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
588
705
  GRPC_ERROR_REF(error), "propagate cancellation");
589
706
  } else if (send_initial_state_ == SendInitialState::kCancelled ||
590
707
  recv_trailing_state_ == RecvTrailingState::kResponded) {
591
708
  recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
592
- GRPC_CALL_COMBINER_START(
593
- call_combiner(),
709
+ flusher.AddClosure(
594
710
  absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
595
711
  GRPC_ERROR_REF(cancelled_error_), "propagate cancellation");
596
712
  }
597
- WakeInsideCombiner();
713
+ WakeInsideCombiner(&flusher);
598
714
  }
599
715
 
600
716
  // Interject our callback into the op batch for recv trailing metadata ready.
601
717
  // Stash a pointer to the trailing metadata that will be filled in, so we can
602
718
  // manipulate it later.
603
- void ClientCallData::HookRecvTrailingMetadata(
604
- grpc_transport_stream_op_batch* batch) {
719
+ void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) {
605
720
  recv_trailing_metadata_ =
606
721
  batch->payload->recv_trailing_metadata.recv_trailing_metadata;
607
722
  original_recv_trailing_metadata_ready_ =
@@ -665,7 +780,7 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
665
780
  GPR_ASSERT(poll_ctx_ != nullptr);
666
781
  if (send_initial_state_ == SendInitialState::kQueued) {
667
782
  // First poll: pass the send_initial_metadata op down the stack.
668
- GPR_ASSERT(send_initial_metadata_batch_ != nullptr);
783
+ GPR_ASSERT(send_initial_metadata_batch_.is_captured());
669
784
  send_initial_state_ = SendInitialState::kForwarded;
670
785
  if (recv_trailing_state_ == RecvTrailingState::kQueued) {
671
786
  // (and the recv_trailing_metadata op if it's part of the queuing)
@@ -707,18 +822,20 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
707
822
  }
708
823
 
709
824
  void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
825
+ Flusher flusher(this);
710
826
  // If we were cancelled prior to receiving this callback, we should simply
711
827
  // forward the callback up with the same error.
712
828
  if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
713
829
  if (grpc_closure* call_closure =
714
830
  absl::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
715
- Closure::Run(DEBUG_LOCATION, call_closure, GRPC_ERROR_REF(error));
831
+ flusher.AddClosure(call_closure, GRPC_ERROR_REF(error),
832
+ "propagate failure");
716
833
  }
717
834
  return;
718
835
  }
719
836
  // If there was an error, we'll put that into the trailing metadata and
720
837
  // proceed as if there was not.
721
- if (error != GRPC_ERROR_NONE) {
838
+ if (!GRPC_ERROR_IS_NONE(error)) {
722
839
  SetStatusFromError(recv_trailing_metadata_, error);
723
840
  }
724
841
  // Record that we've got the callback.
@@ -726,7 +843,7 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
726
843
  recv_trailing_state_ = RecvTrailingState::kComplete;
727
844
  // Repoll the promise.
728
845
  ScopedContext context(this);
729
- WakeInsideCombiner();
846
+ WakeInsideCombiner(&flusher);
730
847
  }
731
848
 
732
849
  // Given an error, fill in ServerMetadataHandle to represent that error.
@@ -743,37 +860,114 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
743
860
  }
744
861
 
745
862
  // Wakeup and poll the promise if appropriate.
746
- void ClientCallData::WakeInsideCombiner() { PollContext(this).Run(); }
863
+ void ClientCallData::WakeInsideCombiner(Flusher* flusher) {
864
+ PollContext(this, flusher).Run();
865
+ }
747
866
 
748
867
  void ClientCallData::OnWakeup() {
868
+ Flusher flusher(this);
749
869
  ScopedContext context(this);
750
- WakeInsideCombiner();
870
+ WakeInsideCombiner(&flusher);
751
871
  }
752
872
 
753
873
  ///////////////////////////////////////////////////////////////////////////////
754
874
  // ServerCallData
755
875
 
876
+ struct ServerCallData::SendInitialMetadata {
877
+ enum State {
878
+ kInitial,
879
+ kGotLatch,
880
+ kQueuedWaitingForLatch,
881
+ kQueuedAndGotLatch,
882
+ kQueuedAndSetLatch,
883
+ kForwarded,
884
+ kCancelled,
885
+ };
886
+ State state = kInitial;
887
+ CapturedBatch batch;
888
+ Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
889
+ };
890
+
891
+ class ServerCallData::PollContext {
892
+ public:
893
+ explicit PollContext(ServerCallData* self, Flusher* flusher)
894
+ : self_(self), flusher_(flusher) {
895
+ GPR_ASSERT(self_->poll_ctx_ == nullptr);
896
+ self_->poll_ctx_ = this;
897
+ scoped_activity_.Init(self_);
898
+ have_scoped_activity_ = true;
899
+ }
900
+
901
+ PollContext(const PollContext&) = delete;
902
+ PollContext& operator=(const PollContext&) = delete;
903
+
904
+ ~PollContext() {
905
+ self_->poll_ctx_ = nullptr;
906
+ if (have_scoped_activity_) scoped_activity_.Destroy();
907
+ if (repoll_) {
908
+ struct NextPoll : public grpc_closure {
909
+ grpc_call_stack* call_stack;
910
+ ServerCallData* call_data;
911
+ };
912
+ auto run = [](void* p, grpc_error_handle) {
913
+ auto* next_poll = static_cast<NextPoll*>(p);
914
+ {
915
+ Flusher flusher(next_poll->call_data);
916
+ next_poll->call_data->WakeInsideCombiner(&flusher);
917
+ }
918
+ GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
919
+ delete next_poll;
920
+ };
921
+ auto* p = absl::make_unique<NextPoll>().release();
922
+ p->call_stack = self_->call_stack();
923
+ p->call_data = self_;
924
+ GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
925
+ GRPC_CLOSURE_INIT(p, run, p, nullptr);
926
+ flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
927
+ }
928
+ }
929
+
930
+ void Repoll() { repoll_ = true; }
931
+ void ClearRepoll() { repoll_ = false; }
932
+
933
+ private:
934
+ ManualConstructor<ScopedActivity> scoped_activity_;
935
+ ServerCallData* const self_;
936
+ Flusher* const flusher_;
937
+ bool repoll_ = false;
938
+ bool have_scoped_activity_;
939
+ };
940
+
756
941
  ServerCallData::ServerCallData(grpc_call_element* elem,
757
942
  const grpc_call_element_args* args,
758
943
  uint8_t flags)
759
944
  : BaseCallData(elem, args, flags) {
945
+ if (server_initial_metadata_latch() != nullptr) {
946
+ send_initial_metadata_ = arena()->New<SendInitialMetadata>();
947
+ }
760
948
  GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
761
949
  RecvInitialMetadataReadyCallback, this,
762
950
  grpc_schedule_on_exec_ctx);
763
951
  }
764
952
 
765
953
  ServerCallData::~ServerCallData() {
766
- GPR_ASSERT(!is_polling_);
954
+ GPR_ASSERT(poll_ctx_ == nullptr);
767
955
  GRPC_ERROR_UNREF(cancelled_error_);
768
956
  }
769
957
 
770
958
  // Activity implementation.
771
- void ServerCallData::ForceImmediateRepoll() { abort(); } // Not implemented.
959
+ void ServerCallData::ForceImmediateRepoll() {
960
+ GPR_ASSERT(poll_ctx_ != nullptr);
961
+ poll_ctx_->Repoll();
962
+ }
772
963
 
773
964
  // Handle one grpc_transport_stream_op_batch
774
- void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
965
+ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
775
966
  // Fake out the activity based context.
776
967
  ScopedContext context(this);
968
+ CapturedBatch batch(b);
969
+ Flusher flusher(this);
970
+ bool wake = false;
777
971
 
778
972
  // If this is a cancel stream, cancel anything we have pending and
779
973
  // propagate the cancellation.
@@ -782,8 +976,14 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
782
976
  !batch->send_trailing_metadata && !batch->send_message &&
783
977
  !batch->recv_initial_metadata && !batch->recv_message &&
784
978
  !batch->recv_trailing_metadata);
785
- Cancel(batch->payload->cancel_stream.cancel_error);
786
- grpc_call_next_op(elem(), batch);
979
+ Cancel(GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error),
980
+ &flusher);
981
+ if (is_last()) {
982
+ GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
983
+ batch.CompleteWith(&flusher);
984
+ } else {
985
+ batch.ResumeWith(&flusher);
986
+ }
787
987
  return;
788
988
  }
789
989
 
@@ -805,61 +1005,85 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
805
1005
  recv_initial_state_ = RecvInitialState::kForwarded;
806
1006
  }
807
1007
 
1008
+ // send_initial_metadata
1009
+ if (send_initial_metadata_ != nullptr && batch->send_initial_metadata) {
1010
+ switch (send_initial_metadata_->state) {
1011
+ case SendInitialMetadata::kInitial:
1012
+ send_initial_metadata_->state =
1013
+ SendInitialMetadata::kQueuedWaitingForLatch;
1014
+ break;
1015
+ case SendInitialMetadata::kGotLatch:
1016
+ send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
1017
+ break;
1018
+ case SendInitialMetadata::kCancelled:
1019
+ batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1020
+ break;
1021
+ case SendInitialMetadata::kQueuedAndGotLatch:
1022
+ case SendInitialMetadata::kQueuedWaitingForLatch:
1023
+ case SendInitialMetadata::kQueuedAndSetLatch:
1024
+ case SendInitialMetadata::kForwarded:
1025
+ abort(); // not reachable
1026
+ }
1027
+ send_initial_metadata_->batch = batch;
1028
+ wake = true;
1029
+ }
1030
+
808
1031
  // send_trailing_metadata
809
- if (batch->send_trailing_metadata) {
1032
+ if (batch.is_captured() && batch->send_trailing_metadata) {
810
1033
  switch (send_trailing_state_) {
811
1034
  case SendTrailingState::kInitial:
812
1035
  send_trailing_metadata_batch_ = batch;
813
1036
  send_trailing_state_ = SendTrailingState::kQueued;
814
- WakeInsideCombiner([this](grpc_error_handle error) {
815
- GPR_ASSERT(send_trailing_state_ == SendTrailingState::kQueued);
816
- Cancel(error);
817
- });
1037
+ wake = true;
818
1038
  break;
819
1039
  case SendTrailingState::kQueued:
820
1040
  case SendTrailingState::kForwarded:
821
1041
  abort(); // unreachable
822
1042
  break;
823
1043
  case SendTrailingState::kCancelled:
824
- grpc_transport_stream_op_batch_finish_with_failure(
825
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
1044
+ batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
826
1045
  break;
827
1046
  }
828
- return;
829
1047
  }
830
1048
 
831
- grpc_call_next_op(elem(), batch);
1049
+ if (wake) WakeInsideCombiner(&flusher);
1050
+ if (batch.is_captured()) batch.ResumeWith(&flusher);
832
1051
  }
833
1052
 
834
1053
  // Handle cancellation.
835
- void ServerCallData::Cancel(grpc_error_handle error) {
1054
+ void ServerCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
836
1055
  // Track the latest reason for cancellation.
837
1056
  GRPC_ERROR_UNREF(cancelled_error_);
838
- cancelled_error_ = GRPC_ERROR_REF(error);
1057
+ cancelled_error_ = error;
839
1058
  // Stop running the promise.
840
1059
  promise_ = ArenaPromise<ServerMetadataHandle>();
841
1060
  if (send_trailing_state_ == SendTrailingState::kQueued) {
842
1061
  send_trailing_state_ = SendTrailingState::kCancelled;
843
- struct FailBatch : public grpc_closure {
844
- grpc_transport_stream_op_batch* batch;
845
- CallCombiner* call_combiner;
846
- };
847
- auto fail = [](void* p, grpc_error_handle error) {
848
- auto* f = static_cast<FailBatch*>(p);
849
- grpc_transport_stream_op_batch_finish_with_failure(
850
- f->batch, GRPC_ERROR_REF(error), f->call_combiner);
851
- delete f;
852
- };
853
- auto* b = new FailBatch();
854
- GRPC_CLOSURE_INIT(b, fail, b, nullptr);
855
- b->batch = absl::exchange(send_trailing_metadata_batch_, nullptr);
856
- b->call_combiner = call_combiner();
857
- GRPC_CALL_COMBINER_START(call_combiner(), b,
858
- GRPC_ERROR_REF(cancelled_error_),
859
- "cancel pending batch");
1062
+ send_trailing_metadata_batch_.CancelWith(GRPC_ERROR_REF(error), flusher);
860
1063
  } else {
861
1064
  send_trailing_state_ = SendTrailingState::kCancelled;
862
1065
  }
1066
+ if (send_initial_metadata_ != nullptr) {
1067
+ switch (send_initial_metadata_->state) {
1068
+ case SendInitialMetadata::kInitial:
1069
+ case SendInitialMetadata::kGotLatch:
1070
+ case SendInitialMetadata::kForwarded:
1071
+ case SendInitialMetadata::kCancelled:
1072
+ break;
1073
+ case SendInitialMetadata::kQueuedWaitingForLatch:
1074
+ case SendInitialMetadata::kQueuedAndGotLatch:
1075
+ case SendInitialMetadata::kQueuedAndSetLatch:
1076
+ send_initial_metadata_->batch.CancelWith(GRPC_ERROR_REF(error),
1077
+ flusher);
1078
+ break;
1079
+ }
1080
+ send_initial_metadata_->state = SendInitialMetadata::kCancelled;
1081
+ }
1082
+ if (auto* closure =
1083
+ absl::exchange(original_recv_initial_metadata_ready_, nullptr)) {
1084
+ flusher->AddClosure(closure, GRPC_ERROR_REF(error),
1085
+ "original_recv_initial_metadata");
1086
+ }
863
1087
  }
864
1088
 
865
1089
  // Construct a promise that will "call" the next filter.
@@ -872,6 +1096,31 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
872
1096
  GPR_ASSERT(UnwrapMetadata(std::move(call_args.client_initial_metadata)) ==
873
1097
  recv_initial_metadata_);
874
1098
  forward_recv_initial_metadata_callback_ = true;
1099
+ if (send_initial_metadata_ != nullptr) {
1100
+ GPR_ASSERT(send_initial_metadata_->server_initial_metadata_publisher ==
1101
+ nullptr);
1102
+ GPR_ASSERT(call_args.server_initial_metadata != nullptr);
1103
+ send_initial_metadata_->server_initial_metadata_publisher =
1104
+ call_args.server_initial_metadata;
1105
+ switch (send_initial_metadata_->state) {
1106
+ case SendInitialMetadata::kInitial:
1107
+ send_initial_metadata_->state = SendInitialMetadata::kGotLatch;
1108
+ break;
1109
+ case SendInitialMetadata::kGotLatch:
1110
+ case SendInitialMetadata::kQueuedAndGotLatch:
1111
+ case SendInitialMetadata::kQueuedAndSetLatch:
1112
+ case SendInitialMetadata::kForwarded:
1113
+ abort(); // not reachable
1114
+ break;
1115
+ case SendInitialMetadata::kQueuedWaitingForLatch:
1116
+ send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
1117
+ break;
1118
+ case SendInitialMetadata::kCancelled:
1119
+ break;
1120
+ }
1121
+ } else {
1122
+ GPR_ASSERT(call_args.server_initial_metadata == nullptr);
1123
+ }
875
1124
  return ArenaPromise<ServerMetadataHandle>(
876
1125
  [this]() { return PollTrailingMetadata(); });
877
1126
  }
@@ -903,12 +1152,14 @@ void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
903
1152
  }
904
1153
 
905
1154
  void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
1155
+ Flusher flusher(this);
906
1156
  GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded);
907
1157
  // If there was an error we just propagate that through
908
- if (error != GRPC_ERROR_NONE) {
1158
+ if (!GRPC_ERROR_IS_NONE(error)) {
909
1159
  recv_initial_state_ = RecvInitialState::kResponded;
910
- Closure::Run(DEBUG_LOCATION, original_recv_initial_metadata_ready_,
911
- GRPC_ERROR_REF(error));
1160
+ flusher.AddClosure(
1161
+ absl::exchange(original_recv_initial_metadata_ready_, nullptr),
1162
+ GRPC_ERROR_REF(error), "propagate error");
912
1163
  return;
913
1164
  }
914
1165
  // Record that we've got the callback.
@@ -925,30 +1176,46 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
925
1176
  return MakeNextPromise(std::move(call_args));
926
1177
  });
927
1178
  // Poll once.
928
- bool own_error = false;
929
- WakeInsideCombiner([&error, &own_error](grpc_error_handle new_error) {
930
- GPR_ASSERT(error == GRPC_ERROR_NONE);
931
- error = GRPC_ERROR_REF(new_error);
932
- own_error = true;
933
- });
934
- Closure::Run(DEBUG_LOCATION, original_recv_initial_metadata_ready_,
935
- GRPC_ERROR_REF(error));
936
- if (own_error) GRPC_ERROR_UNREF(error);
1179
+ WakeInsideCombiner(&flusher);
1180
+ if (auto* closure =
1181
+ absl::exchange(original_recv_initial_metadata_ready_, nullptr)) {
1182
+ flusher.AddClosure(closure, GRPC_ERROR_NONE,
1183
+ "original_recv_initial_metadata");
1184
+ }
937
1185
  }
938
1186
 
939
1187
  // Wakeup and poll the promise if appropriate.
940
- void ServerCallData::WakeInsideCombiner(
941
- absl::FunctionRef<void(grpc_error_handle)> cancel) {
942
- GPR_ASSERT(!is_polling_);
943
- bool forward_send_trailing_metadata = false;
944
- is_polling_ = true;
945
- if (recv_initial_state_ == RecvInitialState::kComplete) {
1188
+ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
1189
+ PollContext poll_ctx(this, flusher);
1190
+ if (send_initial_metadata_ != nullptr &&
1191
+ send_initial_metadata_->state ==
1192
+ SendInitialMetadata::kQueuedAndGotLatch) {
1193
+ send_initial_metadata_->state = SendInitialMetadata::kQueuedAndSetLatch;
1194
+ send_initial_metadata_->server_initial_metadata_publisher->Set(
1195
+ send_initial_metadata_->batch->payload->send_initial_metadata
1196
+ .send_initial_metadata);
1197
+ }
1198
+ poll_ctx.ClearRepoll();
1199
+ if (promise_.has_value()) {
946
1200
  Poll<ServerMetadataHandle> poll;
947
- {
948
- ScopedActivity activity(this);
949
- poll = promise_();
1201
+ poll = promise_();
1202
+ if (send_initial_metadata_ != nullptr &&
1203
+ send_initial_metadata_->state ==
1204
+ SendInitialMetadata::kQueuedAndSetLatch) {
1205
+ Poll<ServerMetadata**> p = server_initial_metadata_latch()->Wait()();
1206
+ if (ServerMetadata*** ppp = absl::get_if<ServerMetadata**>(&p)) {
1207
+ ServerMetadata* md = **ppp;
1208
+ if (send_initial_metadata_->batch->payload->send_initial_metadata
1209
+ .send_initial_metadata != md) {
1210
+ *send_initial_metadata_->batch->payload->send_initial_metadata
1211
+ .send_initial_metadata = std::move(*md);
1212
+ }
1213
+ send_initial_metadata_->state = SendInitialMetadata::kForwarded;
1214
+ send_initial_metadata_->batch.ResumeWith(flusher);
1215
+ }
950
1216
  }
951
1217
  if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
1218
+ promise_ = ArenaPromise<ServerMetadataHandle>();
952
1219
  auto* md = UnwrapMetadata(std::move(*r));
953
1220
  bool destroy_md = true;
954
1221
  switch (send_trailing_state_) {
@@ -960,7 +1227,7 @@ void ServerCallData::WakeInsideCombiner(
960
1227
  } else {
961
1228
  destroy_md = false;
962
1229
  }
963
- forward_send_trailing_metadata = true;
1230
+ send_trailing_metadata_batch_.ResumeWith(flusher);
964
1231
  send_trailing_state_ = SendTrailingState::kForwarded;
965
1232
  } break;
966
1233
  case SendTrailingState::kForwarded:
@@ -977,8 +1244,7 @@ void ServerCallData::WakeInsideCombiner(
977
1244
  error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
978
1245
  message->as_string_view());
979
1246
  }
980
- cancel(error);
981
- GRPC_ERROR_UNREF(error);
1247
+ Cancel(error, flusher);
982
1248
  } break;
983
1249
  case SendTrailingState::kCancelled:
984
1250
  // Nothing to do.
@@ -989,11 +1255,6 @@ void ServerCallData::WakeInsideCombiner(
989
1255
  }
990
1256
  }
991
1257
  }
992
- is_polling_ = false;
993
- if (forward_send_trailing_metadata) {
994
- grpc_call_next_op(elem(),
995
- absl::exchange(send_trailing_metadata_batch_, nullptr));
996
- }
997
1258
  }
998
1259
 
999
1260
  void ServerCallData::OnWakeup() { abort(); } // not implemented