grpc 1.50.0.pre1 → 1.52.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1009) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +206 -49
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/event_engine.h +27 -6
  7. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  8. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  9. data/include/grpc/event_engine/memory_allocator.h +1 -1
  10. data/include/grpc/event_engine/slice.h +24 -4
  11. data/include/grpc/event_engine/slice_buffer.h +31 -2
  12. data/include/grpc/fork.h +25 -1
  13. data/include/grpc/grpc.h +3 -13
  14. data/include/grpc/grpc_posix.h +1 -1
  15. data/include/grpc/impl/codegen/atm.h +3 -71
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
  18. data/include/grpc/impl/codegen/atm_windows.h +3 -106
  19. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  21. data/include/grpc/impl/codegen/compression_types.h +3 -82
  22. data/include/grpc/impl/codegen/connectivity_state.h +3 -20
  23. data/include/grpc/impl/codegen/fork.h +4 -25
  24. data/include/grpc/impl/codegen/gpr_types.h +2 -34
  25. data/include/grpc/impl/codegen/grpc_types.h +3 -791
  26. data/include/grpc/impl/codegen/log.h +3 -86
  27. data/include/grpc/impl/codegen/port_platform.h +3 -758
  28. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  29. data/include/grpc/impl/codegen/slice.h +3 -106
  30. data/include/grpc/impl/codegen/status.h +4 -131
  31. data/include/grpc/impl/codegen/sync.h +3 -42
  32. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  33. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  34. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  35. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  36. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  37. data/include/grpc/impl/compression_types.h +109 -0
  38. data/include/grpc/impl/connectivity_state.h +47 -0
  39. data/include/grpc/impl/grpc_types.h +824 -0
  40. data/include/grpc/impl/propagation_bits.h +54 -0
  41. data/include/grpc/impl/slice_type.h +112 -0
  42. data/include/grpc/load_reporting.h +1 -1
  43. data/include/grpc/module.modulemap +5 -1
  44. data/include/grpc/slice.h +1 -1
  45. data/include/grpc/status.h +131 -1
  46. data/include/grpc/support/atm.h +70 -1
  47. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  48. data/include/grpc/support/atm_gcc_sync.h +58 -1
  49. data/include/grpc/support/atm_windows.h +105 -1
  50. data/include/grpc/support/log.h +87 -1
  51. data/include/grpc/support/log_windows.h +1 -1
  52. data/include/grpc/support/port_platform.h +767 -1
  53. data/include/grpc/support/string_util.h +1 -1
  54. data/include/grpc/support/sync.h +35 -2
  55. data/include/grpc/support/sync_abseil.h +11 -1
  56. data/include/grpc/support/sync_custom.h +13 -1
  57. data/include/grpc/support/sync_generic.h +24 -1
  58. data/include/grpc/support/sync_posix.h +27 -1
  59. data/include/grpc/support/sync_windows.h +15 -1
  60. data/include/grpc/support/time.h +25 -2
  61. data/src/core/ext/filters/census/grpc_context.cc +17 -18
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
  63. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  66. data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
  67. data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
  68. data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
  69. data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
  70. data/src/core/ext/filters/client_channel/client_channel.h +10 -10
  71. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
  73. data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
  74. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
  75. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  76. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  77. data/src/core/ext/filters/client_channel/config_selector.h +16 -20
  78. data/src/core/ext/filters/client_channel/connector.h +1 -1
  79. data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
  80. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  81. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
  82. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
  83. data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
  84. data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
  85. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  87. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
  88. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
  89. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
  90. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
  91. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
  92. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
  93. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
  100. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
  101. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  102. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
  103. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  104. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
  105. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
  107. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
  108. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
  109. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
  110. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
  111. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
  117. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
  118. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
  119. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
  120. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  121. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
  122. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
  123. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
  124. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
  131. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
  132. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
  133. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  134. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  135. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
  136. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
  137. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
  138. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  139. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
  140. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
  141. data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
  142. data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
  143. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  144. data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
  145. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
  146. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
  147. data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
  148. data/src/core/ext/filters/client_channel/subchannel.h +17 -40
  149. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
  150. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  151. data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
  152. data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  156. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  157. data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
  158. data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
  159. data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
  160. data/src/core/ext/filters/http/client_authority_filter.h +18 -18
  161. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
  162. data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
  163. data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
  164. data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
  165. data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
  166. data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
  167. data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
  168. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  169. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  170. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  171. data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
  172. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
  173. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  175. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  177. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  178. data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
  179. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
  180. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
  181. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
  182. data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
  183. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
  184. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
  185. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
  186. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
  187. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
  188. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
  189. data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
  190. data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
  191. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
  192. data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
  193. data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
  194. data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
  195. data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
  196. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
  197. data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
  198. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
  199. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
  200. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
  201. data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
  202. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
  204. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
  205. data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
  206. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
  207. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
  208. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
  209. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
  210. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  211. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
  212. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
  213. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
  214. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
  215. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  216. data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
  217. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  218. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  219. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  220. data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
  221. data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
  222. data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
  223. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
  224. data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
  225. data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
  226. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  227. data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
  228. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
  229. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
  230. data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
  231. data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  236. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  237. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  238. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  239. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
  240. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
  241. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  242. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  243. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  244. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  245. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  246. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  247. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  248. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  249. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  250. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  251. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  252. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  253. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  254. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  255. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  260. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  261. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  262. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  263. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  264. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  265. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  266. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  267. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  268. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  269. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  270. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  271. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  272. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  273. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  274. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  275. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  276. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  277. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  278. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  279. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  280. data/src/core/ext/xds/xds_api.cc +20 -95
  281. data/src/core/ext/xds/xds_api.h +5 -8
  282. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  283. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  284. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  285. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  286. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  287. data/src/core/ext/xds/xds_channel_args.h +1 -1
  288. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  289. data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
  290. data/src/core/ext/xds/xds_client.cc +134 -94
  291. data/src/core/ext/xds/xds_client.h +13 -5
  292. data/src/core/ext/xds/xds_client_grpc.cc +31 -24
  293. data/src/core/ext/xds/xds_client_grpc.h +1 -1
  294. data/src/core/ext/xds/xds_client_stats.cc +17 -17
  295. data/src/core/ext/xds/xds_client_stats.h +18 -18
  296. data/src/core/ext/xds/xds_cluster.cc +359 -203
  297. data/src/core/ext/xds/xds_cluster.h +52 -35
  298. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
  299. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
  300. data/src/core/ext/xds/xds_common_types.cc +209 -141
  301. data/src/core/ext/xds/xds_common_types.h +19 -13
  302. data/src/core/ext/xds/xds_endpoint.cc +221 -130
  303. data/src/core/ext/xds/xds_endpoint.h +4 -7
  304. data/src/core/ext/xds/xds_health_status.cc +80 -0
  305. data/src/core/ext/xds/xds_health_status.h +82 -0
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
  307. data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
  308. data/src/core/ext/xds/xds_http_filters.cc +65 -73
  309. data/src/core/ext/xds/xds_http_filters.h +68 -20
  310. data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
  311. data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
  312. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  313. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  314. data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
  315. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  316. data/src/core/ext/xds/xds_listener.cc +447 -419
  317. data/src/core/ext/xds/xds_listener.h +45 -47
  318. data/src/core/ext/xds/xds_resource_type.h +3 -11
  319. data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
  320. data/src/core/ext/xds/xds_route_config.cc +514 -528
  321. data/src/core/ext/xds/xds_route_config.h +39 -28
  322. data/src/core/ext/xds/xds_routing.cc +2 -1
  323. data/src/core/ext/xds/xds_routing.h +2 -0
  324. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
  325. data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
  326. data/src/core/ext/xds/xds_transport_grpc.h +1 -1
  327. data/src/core/lib/address_utils/parse_address.cc +30 -29
  328. data/src/core/lib/address_utils/parse_address.h +32 -32
  329. data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
  330. data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
  331. data/src/core/lib/avl/avl.h +4 -4
  332. data/src/core/lib/backoff/backoff.cc +17 -17
  333. data/src/core/lib/backoff/backoff.h +18 -18
  334. data/src/core/lib/channel/call_tracer.h +10 -1
  335. data/src/core/lib/channel/channel_args.cc +19 -20
  336. data/src/core/lib/channel/channel_args.h +59 -43
  337. data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
  338. data/src/core/lib/channel/channel_stack.cc +62 -58
  339. data/src/core/lib/channel/channel_stack.h +144 -131
  340. data/src/core/lib/channel/channel_stack_builder.cc +21 -24
  341. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  342. data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
  343. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  344. data/src/core/lib/channel/channel_trace.cc +21 -22
  345. data/src/core/lib/channel/channel_trace.h +19 -19
  346. data/src/core/lib/channel/channelz.cc +18 -19
  347. data/src/core/lib/channel/channelz.h +26 -26
  348. data/src/core/lib/channel/channelz_registry.cc +17 -17
  349. data/src/core/lib/channel/channelz_registry.h +18 -18
  350. data/src/core/lib/channel/connected_channel.cc +732 -63
  351. data/src/core/lib/channel/connected_channel.h +18 -22
  352. data/src/core/lib/channel/context.h +18 -18
  353. data/src/core/lib/channel/promise_based_filter.cc +1137 -150
  354. data/src/core/lib/channel/promise_based_filter.h +374 -88
  355. data/src/core/lib/channel/status_util.cc +35 -17
  356. data/src/core/lib/channel/status_util.h +26 -19
  357. data/src/core/lib/compression/compression.cc +19 -19
  358. data/src/core/lib/compression/compression_internal.cc +41 -48
  359. data/src/core/lib/compression/compression_internal.h +22 -22
  360. data/src/core/lib/compression/message_compress.cc +26 -26
  361. data/src/core/lib/compression/message_compress.h +25 -25
  362. data/src/core/lib/config/core_configuration.h +1 -1
  363. data/src/core/lib/debug/event_log.cc +88 -0
  364. data/src/core/lib/debug/event_log.h +81 -0
  365. data/src/core/lib/debug/histogram_view.cc +69 -0
  366. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  367. data/src/core/lib/debug/stats.cc +39 -136
  368. data/src/core/lib/debug/stats.h +46 -52
  369. data/src/core/lib/debug/stats_data.cc +224 -73
  370. data/src/core/lib/debug/stats_data.h +263 -122
  371. data/src/core/lib/debug/trace.cc +18 -18
  372. data/src/core/lib/debug/trace.h +19 -19
  373. data/src/core/lib/event_engine/common_closures.h +71 -0
  374. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  375. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  376. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  377. data/src/core/lib/event_engine/executor/executor.h +1 -1
  378. data/src/core/lib/event_engine/forkable.h +1 -1
  379. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  380. data/src/core/lib/event_engine/poller.h +10 -4
  381. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
  382. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  383. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
  384. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  385. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  386. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  387. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
  388. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  389. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  390. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  391. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  392. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
  393. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
  394. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
  395. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  396. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  397. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
  398. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
  399. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
  400. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  401. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  402. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  403. data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
  404. data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
  405. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
  406. data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
  407. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
  408. data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
  409. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  410. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  411. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  412. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  413. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  414. data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
  415. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  416. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  417. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  418. data/src/core/lib/event_engine/slice.cc +7 -6
  419. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  420. data/src/core/lib/event_engine/socket_notifier.h +1 -1
  421. data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
  422. data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
  423. data/src/core/lib/event_engine/thread_pool.cc +125 -43
  424. data/src/core/lib/event_engine/thread_pool.h +49 -26
  425. data/src/core/lib/event_engine/time_util.h +1 -1
  426. data/src/core/lib/event_engine/windows/iocp.cc +13 -12
  427. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  428. data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
  429. data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
  430. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  431. data/src/core/lib/experiments/config.cc +1 -1
  432. data/src/core/lib/experiments/experiments.cc +13 -13
  433. data/src/core/lib/experiments/experiments.h +8 -6
  434. data/src/core/lib/gpr/alloc.cc +19 -17
  435. data/src/core/lib/gpr/alloc.h +18 -18
  436. data/src/core/lib/gpr/atm.cc +17 -17
  437. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  438. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  439. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  440. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  441. data/src/core/lib/gpr/log.cc +27 -19
  442. data/src/core/lib/gpr/log_android.cc +22 -20
  443. data/src/core/lib/gpr/log_linux.cc +24 -24
  444. data/src/core/lib/gpr/log_posix.cc +20 -19
  445. data/src/core/lib/gpr/log_windows.cc +25 -24
  446. data/src/core/lib/gpr/spinlock.h +18 -18
  447. data/src/core/lib/gpr/string.cc +25 -24
  448. data/src/core/lib/gpr/string.h +58 -58
  449. data/src/core/lib/gpr/string_posix.cc +24 -24
  450. data/src/core/lib/gpr/string_util_windows.cc +22 -22
  451. data/src/core/lib/gpr/string_windows.cc +24 -24
  452. data/src/core/lib/gpr/sync.cc +25 -25
  453. data/src/core/lib/gpr/sync_abseil.cc +22 -20
  454. data/src/core/lib/gpr/sync_posix.cc +23 -21
  455. data/src/core/lib/gpr/sync_windows.cc +29 -27
  456. data/src/core/lib/gpr/time.cc +23 -21
  457. data/src/core/lib/gpr/time_posix.cc +35 -30
  458. data/src/core/lib/gpr/time_precise.cc +22 -22
  459. data/src/core/lib/gpr/time_precise.h +18 -19
  460. data/src/core/lib/gpr/time_windows.cc +25 -22
  461. data/src/core/lib/gpr/tmpfile.h +22 -22
  462. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  463. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  464. data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
  465. data/src/core/lib/gpr/useful.h +40 -27
  466. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  467. data/src/core/lib/gprpp/atomic_utils.h +18 -18
  468. data/src/core/lib/gprpp/bitset.h +24 -0
  469. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  470. data/src/core/lib/gprpp/crash.h +34 -0
  471. data/src/core/lib/gprpp/debug_location.h +18 -18
  472. data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
  473. data/src/core/lib/gprpp/env.h +20 -20
  474. data/src/core/lib/gprpp/env_linux.cc +21 -21
  475. data/src/core/lib/gprpp/env_posix.cc +18 -18
  476. data/src/core/lib/gprpp/env_windows.cc +18 -18
  477. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  478. data/src/core/lib/gprpp/examine_stack.h +18 -18
  479. data/src/core/lib/gprpp/fork.cc +21 -22
  480. data/src/core/lib/gprpp/fork.h +22 -22
  481. data/src/core/lib/gprpp/global_config.h +18 -18
  482. data/src/core/lib/gprpp/global_config_custom.h +18 -18
  483. data/src/core/lib/gprpp/global_config_env.cc +17 -17
  484. data/src/core/lib/gprpp/global_config_env.h +23 -23
  485. data/src/core/lib/gprpp/global_config_generic.h +18 -18
  486. data/src/core/lib/gprpp/host_port.cc +26 -26
  487. data/src/core/lib/gprpp/host_port.h +29 -28
  488. data/src/core/lib/gprpp/load_file.cc +75 -0
  489. data/src/core/lib/gprpp/load_file.h +33 -0
  490. data/src/core/lib/gprpp/manual_constructor.h +18 -17
  491. data/src/core/lib/gprpp/memory.h +18 -18
  492. data/src/core/lib/gprpp/mpscq.cc +17 -17
  493. data/src/core/lib/gprpp/mpscq.h +18 -18
  494. data/src/core/lib/gprpp/no_destruct.h +1 -0
  495. data/src/core/lib/gprpp/orphanable.h +18 -18
  496. data/src/core/lib/gprpp/per_cpu.h +46 -0
  497. data/src/core/lib/gprpp/ref_counted.h +18 -18
  498. data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
  499. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  500. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  501. data/src/core/lib/gprpp/status_helper.cc +4 -3
  502. data/src/core/lib/gprpp/status_helper.h +1 -3
  503. data/src/core/lib/gprpp/strerror.cc +41 -0
  504. data/src/core/lib/gprpp/strerror.h +29 -0
  505. data/src/core/lib/gprpp/sync.h +20 -20
  506. data/src/core/lib/gprpp/table.h +1 -0
  507. data/src/core/lib/gprpp/thd.h +19 -19
  508. data/src/core/lib/gprpp/thd_posix.cc +30 -31
  509. data/src/core/lib/gprpp/thd_windows.cc +26 -26
  510. data/src/core/lib/gprpp/time.cc +16 -11
  511. data/src/core/lib/gprpp/time.h +13 -3
  512. data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
  513. data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
  514. data/src/core/lib/gprpp/time_util.h +1 -1
  515. data/src/core/lib/gprpp/unique_type_name.h +18 -18
  516. data/src/core/lib/gprpp/validation_errors.h +18 -1
  517. data/src/core/lib/handshaker/proxy_mapper.h +18 -18
  518. data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
  519. data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
  520. data/src/core/lib/http/format_request.cc +18 -18
  521. data/src/core/lib/http/format_request.h +18 -18
  522. data/src/core/lib/http/httpcli.cc +57 -61
  523. data/src/core/lib/http/httpcli.h +26 -26
  524. data/src/core/lib/http/httpcli_security_connector.cc +22 -25
  525. data/src/core/lib/http/parser.cc +76 -87
  526. data/src/core/lib/http/parser.h +32 -32
  527. data/src/core/lib/iomgr/block_annotate.h +21 -21
  528. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  529. data/src/core/lib/iomgr/buffer_list.h +120 -98
  530. data/src/core/lib/iomgr/call_combiner.cc +29 -27
  531. data/src/core/lib/iomgr/call_combiner.h +21 -22
  532. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  533. data/src/core/lib/iomgr/cfstream_handle.h +22 -22
  534. data/src/core/lib/iomgr/closure.h +90 -45
  535. data/src/core/lib/iomgr/combiner.cc +20 -19
  536. data/src/core/lib/iomgr/combiner.h +18 -18
  537. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  538. data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
  539. data/src/core/lib/iomgr/endpoint.cc +17 -17
  540. data/src/core/lib/iomgr/endpoint.h +46 -46
  541. data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
  542. data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
  543. data/src/core/lib/iomgr/endpoint_pair.h +18 -18
  544. data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
  545. data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
  546. data/src/core/lib/iomgr/error.cc +49 -61
  547. data/src/core/lib/iomgr/error.h +42 -173
  548. data/src/core/lib/iomgr/error_cfstream.cc +18 -18
  549. data/src/core/lib/iomgr/error_cfstream.h +19 -19
  550. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  551. data/src/core/lib/iomgr/ev_apple.h +17 -17
  552. data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
  553. data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
  554. data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
  555. data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
  556. data/src/core/lib/iomgr/ev_posix.cc +36 -28
  557. data/src/core/lib/iomgr/ev_posix.h +85 -81
  558. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  559. data/src/core/lib/iomgr/exec_ctx.cc +34 -34
  560. data/src/core/lib/iomgr/exec_ctx.h +141 -141
  561. data/src/core/lib/iomgr/executor.cc +21 -21
  562. data/src/core/lib/iomgr/executor.h +24 -24
  563. data/src/core/lib/iomgr/fork_posix.cc +24 -22
  564. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  565. data/src/core/lib/iomgr/gethostname.h +18 -18
  566. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  567. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  568. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  569. data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
  570. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  571. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  572. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  573. data/src/core/lib/iomgr/internal_errqueue.h +80 -80
  574. data/src/core/lib/iomgr/iocp_windows.cc +22 -21
  575. data/src/core/lib/iomgr/iocp_windows.h +18 -18
  576. data/src/core/lib/iomgr/iomgr.cc +19 -18
  577. data/src/core/lib/iomgr/iomgr.h +32 -32
  578. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  579. data/src/core/lib/iomgr/iomgr_internal.h +25 -25
  580. data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
  581. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
  582. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  583. data/src/core/lib/iomgr/load_file.cc +24 -27
  584. data/src/core/lib/iomgr/load_file.h +20 -20
  585. data/src/core/lib/iomgr/lockfree_event.cc +114 -114
  586. data/src/core/lib/iomgr/lockfree_event.h +19 -19
  587. data/src/core/lib/iomgr/nameser.h +84 -84
  588. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  589. data/src/core/lib/iomgr/polling_entity.h +27 -27
  590. data/src/core/lib/iomgr/pollset.cc +17 -17
  591. data/src/core/lib/iomgr/pollset.h +51 -51
  592. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  593. data/src/core/lib/iomgr/pollset_set.h +22 -22
  594. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  595. data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
  596. data/src/core/lib/iomgr/pollset_windows.cc +30 -29
  597. data/src/core/lib/iomgr/pollset_windows.h +22 -22
  598. data/src/core/lib/iomgr/port.h +29 -29
  599. data/src/core/lib/iomgr/python_util.h +20 -20
  600. data/src/core/lib/iomgr/resolve_address.cc +26 -20
  601. data/src/core/lib/iomgr/resolve_address.h +21 -22
  602. data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
  603. data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
  604. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  605. data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
  606. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  607. data/src/core/lib/iomgr/resolved_address.h +1 -1
  608. data/src/core/lib/iomgr/sockaddr.h +21 -21
  609. data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
  610. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
  611. data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
  612. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  613. data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
  614. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  615. data/src/core/lib/iomgr/socket_mutator.h +37 -37
  616. data/src/core/lib/iomgr/socket_utils.h +24 -24
  617. data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
  618. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  619. data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
  620. data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
  621. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  622. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  623. data/src/core/lib/iomgr/socket_windows.h +56 -56
  624. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  625. data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
  626. data/src/core/lib/iomgr/tcp_client.cc +17 -17
  627. data/src/core/lib/iomgr/tcp_client.h +26 -26
  628. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
  629. data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
  630. data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
  631. data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
  632. data/src/core/lib/iomgr/tcp_posix.cc +223 -237
  633. data/src/core/lib/iomgr/tcp_posix.h +27 -27
  634. data/src/core/lib/iomgr/tcp_server.cc +30 -22
  635. data/src/core/lib/iomgr/tcp_server.h +68 -62
  636. data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
  637. data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
  638. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
  639. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
  640. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  641. data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
  642. data/src/core/lib/iomgr/tcp_windows.cc +109 -93
  643. data/src/core/lib/iomgr/tcp_windows.h +29 -29
  644. data/src/core/lib/iomgr/timer.cc +17 -17
  645. data/src/core/lib/iomgr/timer.h +65 -65
  646. data/src/core/lib/iomgr/timer_generic.cc +115 -122
  647. data/src/core/lib/iomgr/timer_generic.h +19 -19
  648. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  649. data/src/core/lib/iomgr/timer_heap.h +19 -19
  650. data/src/core/lib/iomgr/timer_manager.cc +30 -29
  651. data/src/core/lib/iomgr/timer_manager.h +25 -25
  652. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  653. data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
  654. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  655. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
  656. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  657. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  658. data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
  659. data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
  660. data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
  661. data/src/core/lib/json/json_channel_args.h +42 -0
  662. data/src/core/lib/json/json_object_loader.cc +17 -2
  663. data/src/core/lib/json/json_object_loader.h +37 -1
  664. data/src/core/lib/json/json_reader.cc +28 -28
  665. data/src/core/lib/json/json_util.cc +5 -5
  666. data/src/core/lib/json/json_util.h +4 -4
  667. data/src/core/lib/json/json_writer.cc +56 -56
  668. data/src/core/lib/load_balancing/lb_policy.cc +18 -18
  669. data/src/core/lib/load_balancing/lb_policy.h +7 -4
  670. data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
  671. data/src/core/lib/matchers/matchers.cc +6 -5
  672. data/src/core/lib/matchers/matchers.h +1 -1
  673. data/src/core/lib/promise/activity.cc +16 -2
  674. data/src/core/lib/promise/activity.h +58 -27
  675. data/src/core/lib/promise/arena_promise.h +82 -52
  676. data/src/core/lib/promise/context.h +14 -6
  677. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  678. data/src/core/lib/promise/detail/promise_factory.h +59 -10
  679. data/src/core/lib/promise/detail/status.h +28 -0
  680. data/src/core/lib/promise/detail/switch.h +1455 -0
  681. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
  682. data/src/core/lib/promise/for_each.h +155 -0
  683. data/src/core/lib/promise/latch.h +13 -19
  684. data/src/core/lib/promise/loop.h +7 -5
  685. data/src/core/lib/promise/map.h +1 -0
  686. data/src/core/lib/promise/map_pipe.h +88 -0
  687. data/src/core/lib/promise/pipe.cc +19 -0
  688. data/src/core/lib/promise/pipe.h +505 -0
  689. data/src/core/lib/promise/poll.h +19 -0
  690. data/src/core/lib/promise/seq.h +4 -5
  691. data/src/core/lib/promise/sleep.cc +5 -4
  692. data/src/core/lib/promise/sleep.h +1 -2
  693. data/src/core/lib/promise/try_concurrently.h +342 -0
  694. data/src/core/lib/promise/try_seq.h +11 -13
  695. data/src/core/lib/resolver/resolver.cc +17 -17
  696. data/src/core/lib/resolver/server_address.cc +18 -17
  697. data/src/core/lib/resolver/server_address.h +19 -21
  698. data/src/core/lib/resource_quota/api.cc +0 -1
  699. data/src/core/lib/resource_quota/api.h +1 -1
  700. data/src/core/lib/resource_quota/arena.cc +36 -17
  701. data/src/core/lib/resource_quota/arena.h +107 -18
  702. data/src/core/lib/resource_quota/memory_quota.cc +140 -43
  703. data/src/core/lib/resource_quota/memory_quota.h +85 -23
  704. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  705. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  706. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
  707. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  708. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  709. data/src/core/lib/security/authorization/matchers.cc +25 -22
  710. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  711. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  712. data/src/core/lib/security/context/security_context.cc +22 -23
  713. data/src/core/lib/security/context/security_context.h +40 -30
  714. data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
  715. data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
  716. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  717. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
  718. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  719. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  720. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  721. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
  722. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  723. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
  724. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
  725. data/src/core/lib/security/credentials/call_creds_util.h +1 -1
  726. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  727. data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
  728. data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
  729. data/src/core/lib/security/credentials/credentials.cc +19 -18
  730. data/src/core/lib/security/credentials/credentials.h +34 -33
  731. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  732. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  733. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  734. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  735. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  736. data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
  737. data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
  738. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
  739. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
  740. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
  741. data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
  742. data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
  743. data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
  744. data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
  745. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
  746. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
  747. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
  748. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
  749. data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
  750. data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
  751. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
  752. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
  753. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
  754. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
  755. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
  756. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
  757. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
  758. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  759. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
  760. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  761. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
  762. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
  763. data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
  764. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
  765. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  766. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
  767. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
  768. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
  769. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
  770. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  771. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
  772. data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
  773. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
  774. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
  775. data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
  776. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
  777. data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
  778. data/src/core/lib/security/security_connector/security_connector.cc +17 -17
  779. data/src/core/lib/security/security_connector/security_connector.h +32 -33
  780. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
  781. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
  782. data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
  783. data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
  784. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  785. data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
  786. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
  787. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
  788. data/src/core/lib/security/transport/auth_filters.h +18 -18
  789. data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
  790. data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
  791. data/src/core/lib/security/transport/secure_endpoint.h +22 -22
  792. data/src/core/lib/security/transport/security_handshaker.cc +70 -70
  793. data/src/core/lib/security/transport/security_handshaker.h +19 -19
  794. data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
  795. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  796. data/src/core/lib/security/transport/tsi_error.h +18 -18
  797. data/src/core/lib/security/util/json_util.cc +21 -22
  798. data/src/core/lib/security/util/json_util.h +18 -18
  799. data/src/core/lib/service_config/service_config.h +2 -2
  800. data/src/core/lib/service_config/service_config_call_data.h +7 -1
  801. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  802. data/src/core/lib/service_config/service_config_impl.h +14 -17
  803. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  804. data/src/core/lib/service_config/service_config_parser.h +14 -10
  805. data/src/core/lib/slice/b64.cc +26 -26
  806. data/src/core/lib/slice/b64.h +29 -29
  807. data/src/core/lib/slice/percent_encoding.cc +17 -17
  808. data/src/core/lib/slice/percent_encoding.h +24 -24
  809. data/src/core/lib/slice/slice.cc +44 -38
  810. data/src/core/lib/slice/slice.h +57 -11
  811. data/src/core/lib/slice/slice_buffer.cc +63 -59
  812. data/src/core/lib/slice/slice_buffer.h +27 -2
  813. data/src/core/lib/slice/slice_internal.h +31 -39
  814. data/src/core/lib/slice/slice_refcount.h +34 -19
  815. data/src/core/lib/slice/slice_string_helpers.cc +17 -17
  816. data/src/core/lib/slice/slice_string_helpers.h +19 -19
  817. data/src/core/lib/surface/api_trace.cc +17 -17
  818. data/src/core/lib/surface/api_trace.h +22 -22
  819. data/src/core/lib/surface/byte_buffer.cc +22 -23
  820. data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
  821. data/src/core/lib/surface/call.cc +1521 -335
  822. data/src/core/lib/surface/call.h +86 -39
  823. data/src/core/lib/surface/call_details.cc +20 -21
  824. data/src/core/lib/surface/call_log_batch.cc +18 -18
  825. data/src/core/lib/surface/call_test_only.h +30 -30
  826. data/src/core/lib/surface/call_trace.cc +113 -0
  827. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
  828. data/src/core/lib/surface/channel.cc +62 -67
  829. data/src/core/lib/surface/channel.h +40 -32
  830. data/src/core/lib/surface/channel_init.cc +17 -17
  831. data/src/core/lib/surface/channel_init.h +18 -18
  832. data/src/core/lib/surface/channel_ping.cc +19 -19
  833. data/src/core/lib/surface/channel_stack_type.cc +21 -17
  834. data/src/core/lib/surface/channel_stack_type.h +20 -18
  835. data/src/core/lib/surface/completion_queue.cc +173 -191
  836. data/src/core/lib/surface/completion_queue.h +32 -32
  837. data/src/core/lib/surface/completion_queue_factory.cc +28 -28
  838. data/src/core/lib/surface/completion_queue_factory.h +20 -20
  839. data/src/core/lib/surface/event_string.cc +17 -17
  840. data/src/core/lib/surface/event_string.h +20 -20
  841. data/src/core/lib/surface/init.cc +29 -58
  842. data/src/core/lib/surface/init.h +18 -18
  843. data/src/core/lib/surface/init_internally.cc +1 -0
  844. data/src/core/lib/surface/init_internally.h +9 -0
  845. data/src/core/lib/surface/lame_client.cc +28 -26
  846. data/src/core/lib/surface/lame_client.h +19 -19
  847. data/src/core/lib/surface/metadata_array.cc +17 -18
  848. data/src/core/lib/surface/server.cc +61 -83
  849. data/src/core/lib/surface/server.h +5 -7
  850. data/src/core/lib/surface/validate_metadata.cc +28 -29
  851. data/src/core/lib/surface/validate_metadata.h +18 -18
  852. data/src/core/lib/surface/version.cc +21 -21
  853. data/src/core/lib/transport/bdp_estimator.cc +17 -17
  854. data/src/core/lib/transport/bdp_estimator.h +18 -19
  855. data/src/core/lib/transport/connectivity_state.cc +19 -19
  856. data/src/core/lib/transport/connectivity_state.h +19 -19
  857. data/src/core/lib/transport/error_utils.cc +51 -45
  858. data/src/core/lib/transport/error_utils.h +21 -21
  859. data/src/core/lib/transport/handshaker.cc +49 -46
  860. data/src/core/lib/transport/handshaker.h +43 -38
  861. data/src/core/lib/transport/handshaker_factory.h +44 -18
  862. data/src/core/lib/transport/handshaker_registry.cc +25 -19
  863. data/src/core/lib/transport/handshaker_registry.h +21 -22
  864. data/src/core/lib/transport/http2_errors.h +20 -20
  865. data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
  866. data/src/core/lib/transport/http_connect_handshaker.h +18 -18
  867. data/src/core/lib/transport/metadata_batch.cc +4 -1
  868. data/src/core/lib/transport/metadata_batch.h +46 -20
  869. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  870. data/src/core/lib/transport/parsed_metadata.h +1 -0
  871. data/src/core/lib/transport/pid_controller.cc +20 -20
  872. data/src/core/lib/transport/pid_controller.h +24 -24
  873. data/src/core/lib/transport/status_conversion.cc +22 -22
  874. data/src/core/lib/transport/status_conversion.h +20 -20
  875. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  876. data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
  877. data/src/core/lib/transport/timeout_encoding.cc +22 -22
  878. data/src/core/lib/transport/timeout_encoding.h +18 -18
  879. data/src/core/lib/transport/transport.cc +88 -41
  880. data/src/core/lib/transport/transport.h +193 -195
  881. data/src/core/lib/transport/transport_impl.h +42 -42
  882. data/src/core/lib/transport/transport_op_string.cc +26 -25
  883. data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
  884. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
  885. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  886. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  887. data/src/core/tsi/alts/crypt/gsec.h +334 -334
  888. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  889. data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
  890. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  891. data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
  892. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  893. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
  894. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  895. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
  896. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  897. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  898. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  899. data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
  900. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
  901. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
  902. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  903. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
  904. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
  905. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
  906. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
  907. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  908. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
  909. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  910. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
  911. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  912. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
  913. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  914. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
  915. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
  916. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  917. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
  918. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  919. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
  920. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
  921. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
  922. data/src/core/tsi/fake_transport_security.cc +80 -79
  923. data/src/core/tsi/fake_transport_security.h +30 -30
  924. data/src/core/tsi/local_transport_security.cc +34 -33
  925. data/src/core/tsi/local_transport_security.h +31 -31
  926. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
  927. data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
  928. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
  929. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  930. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
  931. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
  932. data/src/core/tsi/ssl_transport_security.cc +139 -323
  933. data/src/core/tsi/ssl_transport_security.h +201 -200
  934. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  935. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  936. data/src/core/tsi/ssl_types.h +25 -25
  937. data/src/core/tsi/transport_security.cc +26 -26
  938. data/src/core/tsi/transport_security.h +45 -45
  939. data/src/core/tsi/transport_security_grpc.cc +20 -20
  940. data/src/core/tsi/transport_security_grpc.h +39 -39
  941. data/src/core/tsi/transport_security_interface.h +330 -330
  942. data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
  943. data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
  944. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  945. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  946. data/src/ruby/ext/grpc/ext-export.clang +0 -1
  947. data/src/ruby/ext/grpc/ext-export.gcc +1 -2
  948. data/src/ruby/ext/grpc/extconf.rb +47 -2
  949. data/src/ruby/ext/grpc/rb_call.c +1 -0
  950. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  951. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  952. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  953. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  954. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  955. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
  956. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  957. data/src/ruby/lib/grpc/version.rb +1 -1
  958. data/src/ruby/spec/channel_spec.rb +0 -43
  959. data/src/ruby/spec/client_server_spec.rb +20 -8
  960. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  961. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  962. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  963. data/third_party/re2/re2/bitstate.cc +3 -3
  964. data/third_party/re2/re2/dfa.cc +13 -13
  965. data/third_party/re2/re2/nfa.cc +4 -4
  966. data/third_party/re2/re2/onepass.cc +2 -2
  967. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  968. data/third_party/re2/re2/prefilter_tree.h +3 -2
  969. data/third_party/re2/re2/prog.cc +11 -2
  970. data/third_party/re2/re2/prog.h +17 -5
  971. data/third_party/re2/re2/re2.cc +6 -11
  972. data/third_party/re2/re2/re2.h +1 -1
  973. data/third_party/re2/re2/regexp.cc +1 -2
  974. data/third_party/re2/re2/stringpiece.h +10 -7
  975. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  976. data/third_party/re2/re2/unicode_groups.cc +319 -151
  977. data/third_party/re2/re2/walker-inl.h +3 -2
  978. data/third_party/re2/util/mutex.h +4 -4
  979. data/third_party/zlib/compress.c +3 -3
  980. data/third_party/zlib/crc32.c +21 -12
  981. data/third_party/zlib/deflate.c +112 -106
  982. data/third_party/zlib/deflate.h +2 -2
  983. data/third_party/zlib/gzlib.c +1 -1
  984. data/third_party/zlib/gzread.c +3 -5
  985. data/third_party/zlib/gzwrite.c +1 -1
  986. data/third_party/zlib/infback.c +10 -7
  987. data/third_party/zlib/inflate.c +5 -2
  988. data/third_party/zlib/inftrees.c +2 -2
  989. data/third_party/zlib/inftrees.h +1 -1
  990. data/third_party/zlib/trees.c +61 -62
  991. data/third_party/zlib/uncompr.c +2 -2
  992. data/third_party/zlib/zconf.h +16 -3
  993. data/third_party/zlib/zlib.h +10 -10
  994. data/third_party/zlib/zutil.c +9 -7
  995. data/third_party/zlib/zutil.h +1 -0
  996. metadata +146 -40
  997. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  998. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  999. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  1000. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
  1001. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
  1002. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
  1003. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
  1004. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1005. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1006. data/src/core/lib/gpr/tls.h +0 -156
  1007. data/src/core/lib/promise/call_push_pull.h +0 -148
  1008. data/src/core/lib/slice/slice_api.cc +0 -39
  1009. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -16,23 +16,59 @@
16
16
 
17
17
  #include "src/core/lib/channel/promise_based_filter.h"
18
18
 
19
+ #include <algorithm>
19
20
  #include <memory>
20
21
  #include <string>
22
+ #include <vector>
21
23
 
22
24
  #include "absl/base/attributes.h"
23
- #include "absl/memory/memory.h"
25
+ #include "absl/functional/function_ref.h"
26
+ #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/strings/str_join.h"
24
29
  #include "absl/types/variant.h"
25
30
 
26
31
  #include <grpc/status.h>
27
32
 
28
33
  #include "src/core/lib/channel/channel_stack.h"
34
+ #include "src/core/lib/debug/trace.h"
35
+ #include "src/core/lib/gprpp/crash.h"
29
36
  #include "src/core/lib/gprpp/manual_constructor.h"
37
+ #include "src/core/lib/gprpp/status_helper.h"
30
38
  #include "src/core/lib/iomgr/error.h"
31
39
  #include "src/core/lib/slice/slice.h"
32
40
 
41
+ extern grpc_core::TraceFlag grpc_trace_channel;
42
+
33
43
  namespace grpc_core {
34
44
  namespace promise_filter_detail {
35
45
 
46
+ namespace {
47
+ class FakeActivity final : public Activity {
48
+ public:
49
+ void Orphan() override {}
50
+ void ForceImmediateRepoll() override {}
51
+ Waker MakeOwningWaker() override { abort(); }
52
+ Waker MakeNonOwningWaker() override { abort(); }
53
+ void Run(absl::FunctionRef<void()> f) {
54
+ ScopedActivity activity(this);
55
+ f();
56
+ }
57
+ };
58
+
59
+ absl::Status StatusFromMetadata(const ServerMetadata& md) {
60
+ auto status_code = md.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
61
+ if (status_code == GRPC_STATUS_OK) {
62
+ return absl::OkStatus();
63
+ }
64
+ const auto* message = md.get_pointer(GrpcMessageMetadata());
65
+ return grpc_error_set_int(
66
+ absl::Status(static_cast<absl::StatusCode>(status_code),
67
+ message == nullptr ? "" : message->as_string_view()),
68
+ StatusIntProperty::kRpcStatus, status_code);
69
+ }
70
+ } // namespace
71
+
36
72
  ///////////////////////////////////////////////////////////////////////////////
37
73
  // BaseCallData
38
74
 
@@ -43,16 +79,34 @@ BaseCallData::BaseCallData(grpc_call_element* elem,
43
79
  arena_(args->arena),
44
80
  call_combiner_(args->call_combiner),
45
81
  deadline_(args->deadline),
46
- context_(args->context) {
47
- if (flags & kFilterExaminesServerInitialMetadata) {
48
- server_initial_metadata_latch_ = arena_->New<Latch<ServerMetadata*>>();
49
- }
82
+ context_(args->context),
83
+ server_initial_metadata_latch_(
84
+ flags & kFilterExaminesServerInitialMetadata
85
+ ? arena_->New<Latch<ServerMetadata*>>()
86
+ : nullptr),
87
+ send_message_(flags & kFilterExaminesOutboundMessages
88
+ ? arena_->New<SendMessage>(this)
89
+ : nullptr),
90
+ receive_message_(flags & kFilterExaminesInboundMessages
91
+ ? arena_->New<ReceiveMessage>(this)
92
+ : nullptr),
93
+ event_engine_(
94
+ static_cast<ChannelFilter*>(elem->channel_data)
95
+ ->hack_until_per_channel_stack_event_engines_land_get_event_engine()) {
50
96
  }
51
97
 
52
98
  BaseCallData::~BaseCallData() {
53
- if (server_initial_metadata_latch_ != nullptr) {
54
- server_initial_metadata_latch_->~Latch();
55
- }
99
+ FakeActivity().Run([this] {
100
+ if (send_message_ != nullptr) {
101
+ send_message_->~SendMessage();
102
+ }
103
+ if (receive_message_ != nullptr) {
104
+ receive_message_->~ReceiveMessage();
105
+ }
106
+ if (server_initial_metadata_latch_ != nullptr) {
107
+ server_initial_metadata_latch_->~Latch();
108
+ }
109
+ });
56
110
  }
57
111
 
58
112
  // We don't form ActivityPtr's to this type, and consequently don't need
@@ -75,11 +129,17 @@ void BaseCallData::Wakeup() {
75
129
  self->Drop();
76
130
  };
77
131
  auto* closure = GRPC_CLOSURE_CREATE(wakeup, this, nullptr);
78
- GRPC_CALL_COMBINER_START(call_combiner_, closure, GRPC_ERROR_NONE, "wakeup");
132
+ GRPC_CALL_COMBINER_START(call_combiner_, closure, absl::OkStatus(), "wakeup");
79
133
  }
80
134
 
81
135
  void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
82
136
 
137
+ std::string BaseCallData::LogTag() const {
138
+ return absl::StrCat(
139
+ ClientOrServerString(), "[", elem_->filter->name, ":0x",
140
+ absl::Hex(reinterpret_cast<uintptr_t>(elem_), absl::kZeroPad8), "]");
141
+ }
142
+
83
143
  ///////////////////////////////////////////////////////////////////////////////
84
144
  // BaseCallData::CapturedBatch
85
145
 
@@ -159,7 +219,6 @@ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
159
219
  uintptr_t& refcnt = *RefCountField(batch);
160
220
  if (refcnt == 0) {
161
221
  // refcnt==0 ==> cancelled
162
- GRPC_ERROR_UNREF(error);
163
222
  return;
164
223
  }
165
224
  refcnt = 0;
@@ -188,23 +247,576 @@ BaseCallData::Flusher::~Flusher() {
188
247
  auto* batch = static_cast<grpc_transport_stream_op_batch*>(p);
189
248
  BaseCallData* call =
190
249
  static_cast<BaseCallData*>(batch->handler_private.extra_arg);
250
+ if (grpc_trace_channel.enabled()) {
251
+ gpr_log(GPR_INFO, "FLUSHER:forward batch via closure: %s",
252
+ grpc_transport_stream_op_batch_string(batch).c_str());
253
+ }
191
254
  grpc_call_next_op(call->elem(), batch);
192
255
  GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch");
193
256
  };
194
257
  for (size_t i = 1; i < release_.size(); i++) {
195
258
  auto* batch = release_[i];
259
+ if (grpc_trace_channel.enabled()) {
260
+ gpr_log(GPR_INFO, "FLUSHER:queue batch to forward in closure: %s",
261
+ grpc_transport_stream_op_batch_string(release_[i]).c_str());
262
+ }
196
263
  batch->handler_private.extra_arg = call_;
197
264
  GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch,
198
265
  nullptr);
199
266
  GRPC_CALL_STACK_REF(call_->call_stack(), "flusher_batch");
200
- call_closures_.Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
267
+ call_closures_.Add(&batch->handler_private.closure, absl::OkStatus(),
201
268
  "flusher_batch");
202
269
  }
203
270
  call_closures_.RunClosuresWithoutYielding(call_->call_combiner());
271
+ if (grpc_trace_channel.enabled()) {
272
+ gpr_log(GPR_INFO, "FLUSHER:forward batch: %s",
273
+ grpc_transport_stream_op_batch_string(release_[0]).c_str());
274
+ }
204
275
  grpc_call_next_op(call_->elem(), release_[0]);
205
276
  GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
206
277
  }
207
278
 
279
+ ///////////////////////////////////////////////////////////////////////////////
280
+ // BaseCallData::SendMessage
281
+
282
+ const char* BaseCallData::SendMessage::StateString(State state) {
283
+ switch (state) {
284
+ case State::kInitial:
285
+ return "INITIAL";
286
+ case State::kIdle:
287
+ return "IDLE";
288
+ case State::kGotBatchNoPipe:
289
+ return "GOT_BATCH_NO_PIPE";
290
+ case State::kGotBatch:
291
+ return "GOT_BATCH";
292
+ case State::kPushedToPipe:
293
+ return "PUSHED_TO_PIPE";
294
+ case State::kForwardedBatch:
295
+ return "FORWARDED_BATCH";
296
+ case State::kBatchCompleted:
297
+ return "BATCH_COMPLETED";
298
+ case State::kCancelled:
299
+ return "CANCELLED";
300
+ case State::kCancelledButNotYetPolled:
301
+ return "CANCELLED_BUT_NOT_YET_POLLED";
302
+ }
303
+ return "UNKNOWN";
304
+ }
305
+
306
+ void BaseCallData::SendMessage::StartOp(CapturedBatch batch) {
307
+ if (grpc_trace_channel.enabled()) {
308
+ gpr_log(GPR_INFO, "%s SendMessage.StartOp st=%s", base_->LogTag().c_str(),
309
+ StateString(state_));
310
+ }
311
+ switch (state_) {
312
+ case State::kInitial:
313
+ state_ = State::kGotBatchNoPipe;
314
+ break;
315
+ case State::kIdle:
316
+ state_ = State::kGotBatch;
317
+ break;
318
+ case State::kGotBatch:
319
+ case State::kGotBatchNoPipe:
320
+ case State::kForwardedBatch:
321
+ case State::kBatchCompleted:
322
+ case State::kPushedToPipe:
323
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
324
+ case State::kCancelled:
325
+ case State::kCancelledButNotYetPolled:
326
+ return;
327
+ }
328
+ batch_ = batch;
329
+ intercepted_on_complete_ = std::exchange(batch_->on_complete, &on_complete_);
330
+ }
331
+
332
+ void BaseCallData::SendMessage::GotPipe(PipeReceiver<MessageHandle>* receiver) {
333
+ if (grpc_trace_channel.enabled()) {
334
+ gpr_log(GPR_INFO, "%s SendMessage.GotPipe st=%s", base_->LogTag().c_str(),
335
+ StateString(state_));
336
+ }
337
+ GPR_ASSERT(receiver != nullptr);
338
+ switch (state_) {
339
+ case State::kInitial:
340
+ state_ = State::kIdle;
341
+ Activity::current()->ForceImmediateRepoll();
342
+ break;
343
+ case State::kGotBatchNoPipe:
344
+ state_ = State::kGotBatch;
345
+ Activity::current()->ForceImmediateRepoll();
346
+ break;
347
+ case State::kIdle:
348
+ case State::kGotBatch:
349
+ case State::kForwardedBatch:
350
+ case State::kBatchCompleted:
351
+ case State::kPushedToPipe:
352
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
353
+ case State::kCancelled:
354
+ case State::kCancelledButNotYetPolled:
355
+ return;
356
+ }
357
+ receiver_ = receiver;
358
+ }
359
+
360
+ bool BaseCallData::SendMessage::IsIdle() const {
361
+ switch (state_) {
362
+ case State::kInitial:
363
+ case State::kIdle:
364
+ case State::kForwardedBatch:
365
+ case State::kCancelled:
366
+ case State::kCancelledButNotYetPolled:
367
+ return true;
368
+ case State::kGotBatchNoPipe:
369
+ case State::kGotBatch:
370
+ case State::kBatchCompleted:
371
+ case State::kPushedToPipe:
372
+ return false;
373
+ }
374
+ GPR_UNREACHABLE_CODE(return false);
375
+ }
376
+
377
+ void BaseCallData::SendMessage::OnComplete(absl::Status status) {
378
+ Flusher flusher(base_);
379
+ if (grpc_trace_channel.enabled()) {
380
+ gpr_log(GPR_INFO, "%s SendMessage.OnComplete st=%s status=%s",
381
+ base_->LogTag().c_str(), StateString(state_),
382
+ status.ToString().c_str());
383
+ }
384
+ switch (state_) {
385
+ case State::kInitial:
386
+ case State::kIdle:
387
+ case State::kGotBatchNoPipe:
388
+ case State::kPushedToPipe:
389
+ case State::kGotBatch:
390
+ case State::kBatchCompleted:
391
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
392
+ break;
393
+ case State::kCancelled:
394
+ case State::kCancelledButNotYetPolled:
395
+ flusher.AddClosure(intercepted_on_complete_, status,
396
+ "forward after cancel");
397
+ break;
398
+ case State::kForwardedBatch:
399
+ completed_status_ = status;
400
+ state_ = State::kBatchCompleted;
401
+ base_->WakeInsideCombiner(&flusher);
402
+ break;
403
+ }
404
+ }
405
+
406
+ void BaseCallData::SendMessage::Done(const ServerMetadata& metadata) {
407
+ if (grpc_trace_channel.enabled()) {
408
+ gpr_log(GPR_INFO, "%s SendMessage.Done st=%s md=%s",
409
+ base_->LogTag().c_str(), StateString(state_),
410
+ metadata.DebugString().c_str());
411
+ }
412
+ switch (state_) {
413
+ case State::kCancelled:
414
+ case State::kCancelledButNotYetPolled:
415
+ break;
416
+ case State::kInitial:
417
+ case State::kIdle:
418
+ case State::kForwardedBatch:
419
+ state_ = State::kCancelledButNotYetPolled;
420
+ break;
421
+ case State::kGotBatchNoPipe:
422
+ case State::kGotBatch:
423
+ case State::kBatchCompleted:
424
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
425
+ break;
426
+ case State::kPushedToPipe:
427
+ push_.reset();
428
+ next_.reset();
429
+ state_ = State::kCancelledButNotYetPolled;
430
+ break;
431
+ }
432
+ }
433
+
434
+ void BaseCallData::SendMessage::WakeInsideCombiner(Flusher* flusher) {
435
+ if (grpc_trace_channel.enabled()) {
436
+ gpr_log(GPR_INFO, "%s SendMessage.WakeInsideCombiner st=%s%s",
437
+ base_->LogTag().c_str(), StateString(state_),
438
+ state_ == State::kBatchCompleted
439
+ ? absl::StrCat(" status=", completed_status_.ToString()).c_str()
440
+ : "");
441
+ }
442
+ switch (state_) {
443
+ case State::kInitial:
444
+ case State::kIdle:
445
+ case State::kGotBatchNoPipe:
446
+ case State::kForwardedBatch:
447
+ case State::kCancelled:
448
+ break;
449
+ case State::kCancelledButNotYetPolled:
450
+ pipe_.sender.Close();
451
+ state_ = State::kCancelled;
452
+ break;
453
+ case State::kGotBatch: {
454
+ state_ = State::kPushedToPipe;
455
+ auto message = GetContext<Arena>()->MakePooled<Message>();
456
+ message->payload()->Swap(batch_->payload->send_message.send_message);
457
+ message->mutable_flags() = batch_->payload->send_message.flags;
458
+ push_ = pipe_.sender.Push(std::move(message));
459
+ next_ = receiver_->Next();
460
+ }
461
+ ABSL_FALLTHROUGH_INTENDED;
462
+ case State::kPushedToPipe: {
463
+ GPR_ASSERT(push_.has_value());
464
+ auto r_push = (*push_)();
465
+ if (auto* p = absl::get_if<bool>(&r_push)) {
466
+ if (grpc_trace_channel.enabled()) {
467
+ gpr_log(GPR_INFO,
468
+ "%s SendMessage.WakeInsideCombiner push complete, result=%s",
469
+ base_->LogTag().c_str(), *p ? "true" : "false");
470
+ }
471
+ // We haven't pulled through yet, so this certainly shouldn't succeed.
472
+ GPR_ASSERT(!*p);
473
+ state_ = State::kCancelled;
474
+ batch_.CancelWith(absl::CancelledError(), flusher);
475
+ break;
476
+ }
477
+ GPR_ASSERT(next_.has_value());
478
+ auto r_next = (*next_)();
479
+ if (auto* p = absl::get_if<NextResult<MessageHandle>>(&r_next)) {
480
+ if (grpc_trace_channel.enabled()) {
481
+ gpr_log(GPR_INFO,
482
+ "%s SendMessage.WakeInsideCombiner next complete, "
483
+ "result.has_value=%s",
484
+ base_->LogTag().c_str(), p->has_value() ? "true" : "false");
485
+ }
486
+ GPR_ASSERT(p->has_value());
487
+ batch_->payload->send_message.send_message->Swap((**p)->payload());
488
+ batch_->payload->send_message.flags = (**p)->flags();
489
+ state_ = State::kForwardedBatch;
490
+ batch_.ResumeWith(flusher);
491
+ next_result_ = std::move(*p);
492
+ next_.reset();
493
+ }
494
+ } break;
495
+ case State::kBatchCompleted:
496
+ next_result_.reset();
497
+ // We've cleared out the NextResult on the pipe from promise to us, but
498
+ // there's also the pipe from us to the promise (so that the promise can
499
+ // intercept the sent messages). The push promise here is pushing into the
500
+ // latter pipe, and so we need to keep polling it until it's done, which
501
+ // depending on what happens inside the promise may take some time.
502
+ if (absl::holds_alternative<Pending>((*push_)())) break;
503
+ if (completed_status_.ok()) {
504
+ state_ = State::kIdle;
505
+ Activity::current()->ForceImmediateRepoll();
506
+ } else {
507
+ state_ = State::kCancelled;
508
+ }
509
+ push_.reset();
510
+ flusher->AddClosure(intercepted_on_complete_, completed_status_,
511
+ "batch_completed");
512
+ break;
513
+ }
514
+ }
515
+
516
+ ///////////////////////////////////////////////////////////////////////////////
517
+ // BaseCallData::ReceiveMessage
518
+
519
+ const char* BaseCallData::ReceiveMessage::StateString(State state) {
520
+ switch (state) {
521
+ case State::kInitial:
522
+ return "INITIAL";
523
+ case State::kIdle:
524
+ return "IDLE";
525
+ case State::kForwardedBatchNoPipe:
526
+ return "FORWARDED_BATCH_NO_PIPE";
527
+ case State::kForwardedBatch:
528
+ return "FORWARDED_BATCH";
529
+ case State::kBatchCompletedNoPipe:
530
+ return "BATCH_COMPLETED_NO_PIPE";
531
+ case State::kBatchCompleted:
532
+ return "BATCH_COMPLETED";
533
+ case State::kPushedToPipe:
534
+ return "PUSHED_TO_PIPE";
535
+ case State::kPulledFromPipe:
536
+ return "PULLED_FROM_PIPE";
537
+ case State::kCancelled:
538
+ return "CANCELLED";
539
+ case State::kCancelledWhilstForwarding:
540
+ return "CANCELLED_WHILST_FORWARDING";
541
+ case State::kBatchCompletedButCancelled:
542
+ return "BATCH_COMPLETED_BUT_CANCELLED";
543
+ case State::kCancelledWhilstIdle:
544
+ return "CANCELLED_WHILST_IDLE";
545
+ case State::kCompletedWhilePulledFromPipe:
546
+ return "COMPLETED_WHILE_PULLED_FROM_PIPE";
547
+ case State::kCompletedWhilePushedToPipe:
548
+ return "COMPLETED_WHILE_PUSHED_TO_PIPE";
549
+ }
550
+ return "UNKNOWN";
551
+ }
552
+
553
+ void BaseCallData::ReceiveMessage::StartOp(CapturedBatch& batch) {
554
+ if (grpc_trace_channel.enabled()) {
555
+ gpr_log(GPR_INFO, "%s ReceiveMessage.StartOp st=%s",
556
+ base_->LogTag().c_str(), StateString(state_));
557
+ }
558
+ switch (state_) {
559
+ case State::kInitial:
560
+ state_ = State::kForwardedBatchNoPipe;
561
+ break;
562
+ case State::kIdle:
563
+ state_ = State::kForwardedBatch;
564
+ break;
565
+ case State::kCancelledWhilstForwarding:
566
+ case State::kBatchCompletedButCancelled:
567
+ case State::kForwardedBatch:
568
+ case State::kForwardedBatchNoPipe:
569
+ case State::kBatchCompleted:
570
+ case State::kBatchCompletedNoPipe:
571
+ case State::kPushedToPipe:
572
+ case State::kPulledFromPipe:
573
+ case State::kCompletedWhilePulledFromPipe:
574
+ case State::kCompletedWhilePushedToPipe:
575
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
576
+ case State::kCancelledWhilstIdle:
577
+ case State::kCancelled:
578
+ return;
579
+ }
580
+ intercepted_slice_buffer_ = batch->payload->recv_message.recv_message;
581
+ intercepted_flags_ = batch->payload->recv_message.flags;
582
+ if (intercepted_flags_ == nullptr) {
583
+ intercepted_flags_ = &scratch_flags_;
584
+ *intercepted_flags_ = 0;
585
+ }
586
+ intercepted_on_complete_ = std::exchange(
587
+ batch->payload->recv_message.recv_message_ready, &on_complete_);
588
+ }
589
+
590
+ void BaseCallData::ReceiveMessage::GotPipe(PipeSender<MessageHandle>* sender) {
591
+ if (grpc_trace_channel.enabled()) {
592
+ gpr_log(GPR_INFO, "%s ReceiveMessage.GotPipe st=%s",
593
+ base_->LogTag().c_str(), StateString(state_));
594
+ }
595
+ switch (state_) {
596
+ case State::kInitial:
597
+ state_ = State::kIdle;
598
+ break;
599
+ case State::kForwardedBatchNoPipe:
600
+ state_ = State::kForwardedBatch;
601
+ break;
602
+ case State::kBatchCompletedNoPipe:
603
+ state_ = State::kBatchCompleted;
604
+ Activity::current()->ForceImmediateRepoll();
605
+ break;
606
+ case State::kIdle:
607
+ case State::kForwardedBatch:
608
+ case State::kBatchCompleted:
609
+ case State::kPushedToPipe:
610
+ case State::kPulledFromPipe:
611
+ case State::kCompletedWhilePulledFromPipe:
612
+ case State::kCompletedWhilePushedToPipe:
613
+ case State::kCancelledWhilstForwarding:
614
+ case State::kCancelledWhilstIdle:
615
+ case State::kBatchCompletedButCancelled:
616
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
617
+ case State::kCancelled:
618
+ return;
619
+ }
620
+ sender_ = sender;
621
+ }
622
+
623
+ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
624
+ if (grpc_trace_channel.enabled()) {
625
+ gpr_log(GPR_INFO, "%s ReceiveMessage.OnComplete st=%s status=%s",
626
+ base_->LogTag().c_str(), StateString(state_),
627
+ status.ToString().c_str());
628
+ }
629
+ switch (state_) {
630
+ case State::kInitial:
631
+ case State::kIdle:
632
+ case State::kPushedToPipe:
633
+ case State::kPulledFromPipe:
634
+ case State::kBatchCompleted:
635
+ case State::kBatchCompletedNoPipe:
636
+ case State::kCancelled:
637
+ case State::kBatchCompletedButCancelled:
638
+ case State::kCancelledWhilstIdle:
639
+ case State::kCompletedWhilePulledFromPipe:
640
+ case State::kCompletedWhilePushedToPipe:
641
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
642
+ case State::kForwardedBatchNoPipe:
643
+ state_ = State::kBatchCompletedNoPipe;
644
+ return;
645
+ case State::kForwardedBatch:
646
+ state_ = State::kBatchCompleted;
647
+ break;
648
+ case State::kCancelledWhilstForwarding:
649
+ state_ = State::kBatchCompletedButCancelled;
650
+ break;
651
+ }
652
+ completed_status_ = status;
653
+ Flusher flusher(base_);
654
+ ScopedContext ctx(base_);
655
+ base_->WakeInsideCombiner(&flusher);
656
+ }
657
+
658
+ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
659
+ Flusher* flusher) {
660
+ if (grpc_trace_channel.enabled()) {
661
+ gpr_log(GPR_INFO, "%s ReceiveMessage.Done st=%s md=%s",
662
+ base_->LogTag().c_str(), StateString(state_),
663
+ metadata.DebugString().c_str());
664
+ }
665
+ switch (state_) {
666
+ case State::kInitial:
667
+ state_ = State::kCancelled;
668
+ break;
669
+ case State::kIdle:
670
+ state_ = State::kCancelledWhilstIdle;
671
+ break;
672
+ case State::kForwardedBatch:
673
+ case State::kForwardedBatchNoPipe:
674
+ state_ = State::kCancelledWhilstForwarding;
675
+ break;
676
+ case State::kCompletedWhilePulledFromPipe:
677
+ case State::kCompletedWhilePushedToPipe:
678
+ case State::kPulledFromPipe:
679
+ case State::kPushedToPipe: {
680
+ auto status_code =
681
+ metadata.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
682
+ if (status_code == GRPC_STATUS_OK) {
683
+ if (state_ == State::kCompletedWhilePulledFromPipe ||
684
+ state_ == State::kPulledFromPipe) {
685
+ state_ = State::kCompletedWhilePulledFromPipe;
686
+ } else {
687
+ state_ = State::kCompletedWhilePushedToPipe;
688
+ }
689
+ } else {
690
+ push_.reset();
691
+ next_.reset();
692
+ flusher->AddClosure(intercepted_on_complete_,
693
+ StatusFromMetadata(metadata), "recv_message_done");
694
+ state_ = State::kCancelled;
695
+ }
696
+ } break;
697
+ case State::kBatchCompleted:
698
+ case State::kBatchCompletedNoPipe:
699
+ case State::kBatchCompletedButCancelled:
700
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
701
+ case State::kCancelledWhilstIdle:
702
+ case State::kCancelledWhilstForwarding:
703
+ case State::kCancelled:
704
+ break;
705
+ }
706
+ }
707
+
708
+ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher) {
709
+ if (grpc_trace_channel.enabled()) {
710
+ gpr_log(GPR_INFO,
711
+ "%s ReceiveMessage.WakeInsideCombiner st=%s push?=%s next?=%s",
712
+ base_->LogTag().c_str(), StateString(state_),
713
+ push_.has_value() ? "yes" : "no", next_.has_value() ? "yes" : "no");
714
+ }
715
+ switch (state_) {
716
+ case State::kInitial:
717
+ case State::kIdle:
718
+ case State::kForwardedBatchNoPipe:
719
+ case State::kForwardedBatch:
720
+ case State::kCancelled:
721
+ case State::kCancelledWhilstForwarding:
722
+ case State::kBatchCompletedNoPipe:
723
+ break;
724
+ case State::kCancelledWhilstIdle:
725
+ sender_->Close();
726
+ state_ = State::kCancelled;
727
+ break;
728
+ case State::kBatchCompletedButCancelled:
729
+ sender_->Close();
730
+ state_ = State::kCancelled;
731
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
732
+ completed_status_, "recv_message");
733
+ break;
734
+ case State::kBatchCompleted:
735
+ if (completed_status_.ok() && intercepted_slice_buffer_->has_value()) {
736
+ state_ = State::kPushedToPipe;
737
+ auto message = GetContext<Arena>()->MakePooled<Message>();
738
+ message->payload()->Swap(&**intercepted_slice_buffer_);
739
+ message->mutable_flags() = *intercepted_flags_;
740
+ push_ = sender_->Push(std::move(message));
741
+ next_ = pipe_.receiver.Next();
742
+ } else {
743
+ sender_->Close();
744
+ state_ = State::kCancelled;
745
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
746
+ completed_status_, "recv_message");
747
+ break;
748
+ }
749
+ GPR_ASSERT(state_ == State::kPushedToPipe);
750
+ ABSL_FALLTHROUGH_INTENDED;
751
+ case State::kCompletedWhilePushedToPipe:
752
+ case State::kPushedToPipe: {
753
+ GPR_ASSERT(push_.has_value());
754
+ auto r_push = (*push_)();
755
+ if (auto* p = absl::get_if<bool>(&r_push)) {
756
+ if (grpc_trace_channel.enabled()) {
757
+ gpr_log(GPR_INFO,
758
+ "%s ReceiveMessage.WakeInsideCombiner push complete: %s",
759
+ base_->LogTag().c_str(), *p ? "true" : "false");
760
+ }
761
+ // We haven't pulled through yet, so this certainly shouldn't succeed.
762
+ GPR_ASSERT(!*p);
763
+ state_ = State::kCancelled;
764
+ break;
765
+ }
766
+ GPR_ASSERT(next_.has_value());
767
+ auto r_next = (*next_)();
768
+ if (auto* p = absl::get_if<NextResult<MessageHandle>>(&r_next)) {
769
+ if (grpc_trace_channel.enabled()) {
770
+ gpr_log(GPR_INFO,
771
+ "%s ReceiveMessage.WakeInsideCombiner next complete: %s",
772
+ base_->LogTag().c_str(),
773
+ p->has_value() ? "got message" : "end of stream");
774
+ }
775
+ next_.reset();
776
+ if (p->has_value()) {
777
+ *intercepted_slice_buffer_ = std::move(*(**p)->payload());
778
+ *intercepted_flags_ = (**p)->flags();
779
+ if (state_ == State::kCompletedWhilePushedToPipe) {
780
+ state_ = State::kCompletedWhilePulledFromPipe;
781
+ } else {
782
+ state_ = State::kPulledFromPipe;
783
+ }
784
+ } else {
785
+ *intercepted_slice_buffer_ = absl::nullopt;
786
+ *intercepted_flags_ = 0;
787
+ state_ = State::kCancelled;
788
+ }
789
+ }
790
+ }
791
+ if (state_ != State::kPulledFromPipe &&
792
+ state_ != State::kCompletedWhilePulledFromPipe) {
793
+ break;
794
+ }
795
+ ABSL_FALLTHROUGH_INTENDED;
796
+ case State::kCompletedWhilePulledFromPipe:
797
+ case State::kPulledFromPipe: {
798
+ GPR_ASSERT(push_.has_value());
799
+ if (!absl::holds_alternative<Pending>((*push_)())) {
800
+ if (grpc_trace_channel.enabled()) {
801
+ gpr_log(GPR_INFO,
802
+ "%s ReceiveMessage.WakeInsideCombiner push complete",
803
+ base_->LogTag().c_str());
804
+ }
805
+ if (state_ == State::kCompletedWhilePulledFromPipe) {
806
+ sender_->Close();
807
+ state_ = State::kCancelled;
808
+ } else {
809
+ state_ = State::kIdle;
810
+ }
811
+ push_.reset();
812
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
813
+ absl::OkStatus(), "recv_message");
814
+ }
815
+ break;
816
+ }
817
+ }
818
+ }
819
+
208
820
  ///////////////////////////////////////////////////////////////////////////////
209
821
  // ClientCallData
210
822
 
@@ -228,6 +840,8 @@ struct ClientCallData::RecvInitialMetadata final {
228
840
  kCompleteAndSetLatch,
229
841
  // Called the original callback
230
842
  kResponded,
843
+ // Called the original callback with an error: still need to set the latch
844
+ kRespondedButNeedToSetLatch,
231
845
  };
232
846
 
233
847
  State state = kInitial;
@@ -235,6 +849,32 @@ struct ClientCallData::RecvInitialMetadata final {
235
849
  grpc_closure on_ready;
236
850
  grpc_metadata_batch* metadata = nullptr;
237
851
  Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
852
+
853
+ static const char* StateString(State state) {
854
+ switch (state) {
855
+ case kInitial:
856
+ return "INITIAL";
857
+ case kGotLatch:
858
+ return "GOT_LATCH";
859
+ case kRespondedToTrailingMetadataPriorToHook:
860
+ return "RESPONDED_TO_TRAILING_METADATA_PRIOR_TO_HOOK";
861
+ case kHookedWaitingForLatch:
862
+ return "HOOKED_WAITING_FOR_LATCH";
863
+ case kHookedAndGotLatch:
864
+ return "HOOKED_AND_GOT_LATCH";
865
+ case kCompleteWaitingForLatch:
866
+ return "COMPLETE_WAITING_FOR_LATCH";
867
+ case kCompleteAndGotLatch:
868
+ return "COMPLETE_AND_GOT_LATCH";
869
+ case kCompleteAndSetLatch:
870
+ return "COMPLETE_AND_SET_LATCH";
871
+ case kResponded:
872
+ return "RESPONDED";
873
+ case kRespondedButNeedToSetLatch:
874
+ return "RESPONDED_BUT_NEED_TO_SET_LATCH";
875
+ }
876
+ return "UNKNOWN";
877
+ }
238
878
  };
239
879
 
240
880
  class ClientCallData::PollContext {
@@ -252,8 +892,18 @@ class ClientCallData::PollContext {
252
892
  PollContext& operator=(const PollContext&) = delete;
253
893
 
254
894
  void Run() {
895
+ if (grpc_trace_channel.enabled()) {
896
+ gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run %s",
897
+ self_->LogTag().c_str(), self_->DebugString().c_str());
898
+ }
255
899
  GPR_ASSERT(have_scoped_activity_);
256
900
  repoll_ = false;
901
+ if (self_->send_message() != nullptr) {
902
+ self_->send_message()->WakeInsideCombiner(flusher_);
903
+ }
904
+ if (self_->receive_message() != nullptr) {
905
+ self_->receive_message()->WakeInsideCombiner(flusher_);
906
+ }
257
907
  if (self_->server_initial_metadata_latch() != nullptr) {
258
908
  switch (self_->recv_initial_metadata_->state) {
259
909
  case RecvInitialMetadata::kInitial:
@@ -264,6 +914,12 @@ class ClientCallData::PollContext {
264
914
  case RecvInitialMetadata::kResponded:
265
915
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
266
916
  break;
917
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
918
+ self_->recv_initial_metadata_->server_initial_metadata_publisher->Set(
919
+ nullptr);
920
+ self_->recv_initial_metadata_->state =
921
+ RecvInitialMetadata::kResponded;
922
+ break;
267
923
  case RecvInitialMetadata::kCompleteAndGotLatch:
268
924
  self_->recv_initial_metadata_->state =
269
925
  RecvInitialMetadata::kCompleteAndSetLatch;
@@ -283,7 +939,7 @@ class ClientCallData::PollContext {
283
939
  flusher_->AddClosure(
284
940
  std::exchange(self_->recv_initial_metadata_->original_on_ready,
285
941
  nullptr),
286
- GRPC_ERROR_NONE,
942
+ absl::OkStatus(),
287
943
  "wake_inside_combiner:recv_initial_metadata_ready");
288
944
  }
289
945
  } break;
@@ -298,20 +954,30 @@ class ClientCallData::PollContext {
298
954
  case SendInitialState::kForwarded: {
299
955
  // Poll the promise once since we're waiting for it.
300
956
  Poll<ServerMetadataHandle> poll = self_->promise_();
957
+ if (grpc_trace_channel.enabled()) {
958
+ gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run: poll=%s",
959
+ self_->LogTag().c_str(),
960
+ PollToString(poll, [](const ServerMetadataHandle& h) {
961
+ return h->DebugString();
962
+ }).c_str());
963
+ }
301
964
  if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
302
- auto* md = UnwrapMetadata(std::move(*r));
303
- bool destroy_md = true;
965
+ auto md = std::move(*r);
966
+ if (self_->send_message() != nullptr) {
967
+ self_->send_message()->Done(*md);
968
+ }
969
+ if (self_->receive_message() != nullptr) {
970
+ self_->receive_message()->Done(*md, flusher_);
971
+ }
304
972
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
305
- if (self_->recv_trailing_metadata_ != md) {
973
+ if (self_->recv_trailing_metadata_ != md.get()) {
306
974
  *self_->recv_trailing_metadata_ = std::move(*md);
307
- } else {
308
- destroy_md = false;
309
975
  }
310
976
  self_->recv_trailing_state_ = RecvTrailingState::kResponded;
311
977
  flusher_->AddClosure(
312
978
  std::exchange(self_->original_recv_trailing_metadata_ready_,
313
979
  nullptr),
314
- GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:1");
980
+ absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:1");
315
981
  if (self_->recv_initial_metadata_ != nullptr) {
316
982
  switch (self_->recv_initial_metadata_->state) {
317
983
  case RecvInitialMetadata::kInitial:
@@ -321,7 +987,11 @@ class ClientCallData::PollContext {
321
987
  break;
322
988
  case RecvInitialMetadata::
323
989
  kRespondedToTrailingMetadataPriorToHook:
324
- abort(); // not reachable
990
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
991
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
992
+ RecvInitialMetadata::StateString(
993
+ self_->recv_initial_metadata_
994
+ ->state))); // not reachable
325
995
  break;
326
996
  case RecvInitialMetadata::kHookedWaitingForLatch:
327
997
  case RecvInitialMetadata::kHookedAndGotLatch:
@@ -336,24 +1006,13 @@ class ClientCallData::PollContext {
336
1006
  std::exchange(
337
1007
  self_->recv_initial_metadata_->original_on_ready,
338
1008
  nullptr),
339
- GRPC_ERROR_CANCELLED,
1009
+ absl::CancelledError(),
340
1010
  "wake_inside_combiner:recv_initial_metadata_ready");
341
1011
  }
342
1012
  }
343
1013
  } else {
344
- GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) !=
345
- GRPC_STATUS_OK);
346
- grpc_error_handle error = grpc_error_set_int(
347
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
348
- "early return from promise based filter"),
349
- GRPC_ERROR_INT_GRPC_STATUS,
350
- *md->get_pointer(GrpcStatusMetadata()));
351
- if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
352
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
353
- message->as_string_view());
354
- }
355
- GRPC_ERROR_UNREF(self_->cancelled_error_);
356
- self_->cancelled_error_ = GRPC_ERROR_REF(error);
1014
+ self_->cancelled_error_ = StatusFromMetadata(*md);
1015
+ GPR_ASSERT(!self_->cancelled_error_.ok());
357
1016
  if (self_->recv_initial_metadata_ != nullptr) {
358
1017
  switch (self_->recv_initial_metadata_->state) {
359
1018
  case RecvInitialMetadata::kInitial:
@@ -367,7 +1026,11 @@ class ClientCallData::PollContext {
367
1026
  break;
368
1027
  case RecvInitialMetadata::
369
1028
  kRespondedToTrailingMetadataPriorToHook:
370
- abort(); // not reachable
1029
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1030
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
1031
+ RecvInitialMetadata::StateString(
1032
+ self_->recv_initial_metadata_
1033
+ ->state))); // not reachable
371
1034
  break;
372
1035
  case RecvInitialMetadata::kCompleteWaitingForLatch:
373
1036
  case RecvInitialMetadata::kCompleteAndGotLatch:
@@ -378,18 +1041,19 @@ class ClientCallData::PollContext {
378
1041
  std::exchange(
379
1042
  self_->recv_initial_metadata_->original_on_ready,
380
1043
  nullptr),
381
- GRPC_ERROR_REF(error),
1044
+ self_->cancelled_error_,
382
1045
  "wake_inside_combiner:recv_initial_metadata_ready");
383
1046
  }
384
1047
  }
385
1048
  if (self_->send_initial_state_ == SendInitialState::kQueued) {
386
1049
  self_->send_initial_state_ = SendInitialState::kCancelled;
387
- self_->send_initial_metadata_batch_.CancelWith(error, flusher_);
1050
+ self_->send_initial_metadata_batch_.CancelWith(
1051
+ self_->cancelled_error_, flusher_);
388
1052
  } else {
389
1053
  GPR_ASSERT(
390
1054
  self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
391
1055
  self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
392
- self_->call_combiner()->Cancel(GRPC_ERROR_REF(error));
1056
+ self_->call_combiner()->Cancel(self_->cancelled_error_);
393
1057
  CapturedBatch b(grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
394
1058
  [](void* p, grpc_error_handle) {
395
1059
  GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
@@ -397,17 +1061,15 @@ class ClientCallData::PollContext {
397
1061
  },
398
1062
  self_->call_combiner(), nullptr)));
399
1063
  b->cancel_stream = true;
400
- b->payload->cancel_stream.cancel_error = error;
1064
+ b->payload->cancel_stream.cancel_error = self_->cancelled_error_;
401
1065
  b.ResumeWith(flusher_);
402
1066
  }
1067
+ self_->cancelling_metadata_ = std::move(md);
403
1068
  self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
404
1069
  }
405
- if (destroy_md) {
406
- md->~grpc_metadata_batch();
407
- }
1070
+ self_->promise_ = ArenaPromise<ServerMetadataHandle>();
408
1071
  scoped_activity_.Destroy();
409
1072
  have_scoped_activity_ = false;
410
- self_->promise_ = ArenaPromise<ServerMetadataHandle>();
411
1073
  }
412
1074
  } break;
413
1075
  case SendInitialState::kInitial:
@@ -420,7 +1082,7 @@ class ClientCallData::PollContext {
420
1082
  flusher_->AddClosure(
421
1083
  std::exchange(self_->original_recv_trailing_metadata_ready_,
422
1084
  nullptr),
423
- GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:2");
1085
+ absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:2");
424
1086
  }
425
1087
  break;
426
1088
  }
@@ -445,12 +1107,12 @@ class ClientCallData::PollContext {
445
1107
  };
446
1108
  // Unique ptr --> release to suppress clang-tidy warnings about allocating
447
1109
  // in a destructor.
448
- auto* p = absl::make_unique<NextPoll>().release();
1110
+ auto* p = std::make_unique<NextPoll>().release();
449
1111
  p->call_stack = self_->call_stack();
450
1112
  p->call_data = self_;
451
1113
  GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
452
1114
  GRPC_CLOSURE_INIT(p, run, p, nullptr);
453
- flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
1115
+ flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
454
1116
  }
455
1117
  }
456
1118
 
@@ -482,7 +1144,6 @@ ClientCallData::ClientCallData(grpc_call_element* elem,
482
1144
 
483
1145
  ClientCallData::~ClientCallData() {
484
1146
  GPR_ASSERT(poll_ctx_ == nullptr);
485
- GRPC_ERROR_UNREF(cancelled_error_);
486
1147
  if (recv_initial_metadata_ != nullptr) {
487
1148
  recv_initial_metadata_->~RecvInitialMetadata();
488
1149
  }
@@ -494,6 +1155,58 @@ void ClientCallData::ForceImmediateRepoll() {
494
1155
  poll_ctx_->Repoll();
495
1156
  }
496
1157
 
1158
+ const char* ClientCallData::StateString(SendInitialState state) {
1159
+ switch (state) {
1160
+ case SendInitialState::kInitial:
1161
+ return "INITIAL";
1162
+ case SendInitialState::kQueued:
1163
+ return "QUEUED";
1164
+ case SendInitialState::kForwarded:
1165
+ return "FORWARDED";
1166
+ case SendInitialState::kCancelled:
1167
+ return "CANCELLED";
1168
+ }
1169
+ return "UNKNOWN";
1170
+ }
1171
+
1172
+ const char* ClientCallData::StateString(RecvTrailingState state) {
1173
+ switch (state) {
1174
+ case RecvTrailingState::kInitial:
1175
+ return "INITIAL";
1176
+ case RecvTrailingState::kQueued:
1177
+ return "QUEUED";
1178
+ case RecvTrailingState::kComplete:
1179
+ return "COMPLETE";
1180
+ case RecvTrailingState::kForwarded:
1181
+ return "FORWARDED";
1182
+ case RecvTrailingState::kCancelled:
1183
+ return "CANCELLED";
1184
+ case RecvTrailingState::kResponded:
1185
+ return "RESPONDED";
1186
+ }
1187
+ return "UNKNOWN";
1188
+ }
1189
+
1190
+ std::string ClientCallData::DebugString() const {
1191
+ std::vector<absl::string_view> captured;
1192
+ if (send_initial_metadata_batch_.is_captured()) {
1193
+ captured.push_back("send_initial_metadata");
1194
+ }
1195
+ if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
1196
+ captured.push_back("send_message");
1197
+ }
1198
+ return absl::StrCat(
1199
+ "has_promise=", promise_.has_value() ? "true" : "false",
1200
+ " sent_initial_state=", StateString(send_initial_state_),
1201
+ " recv_trailing_state=", StateString(recv_trailing_state_), " captured={",
1202
+ absl::StrJoin(captured, ","), "}",
1203
+ server_initial_metadata_latch() == nullptr
1204
+ ? ""
1205
+ : absl::StrCat(" recv_initial_metadata=",
1206
+ RecvInitialMetadata::StateString(
1207
+ recv_initial_metadata_->state)));
1208
+ }
1209
+
497
1210
  // Handle one grpc_transport_stream_op_batch
498
1211
  void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
499
1212
  // Fake out the activity based context.
@@ -501,6 +1214,11 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
501
1214
  CapturedBatch batch(b);
502
1215
  Flusher flusher(this);
503
1216
 
1217
+ if (grpc_trace_channel.enabled()) {
1218
+ gpr_log(GPR_INFO, "%s StartBatch %s", LogTag().c_str(),
1219
+ DebugString().c_str());
1220
+ }
1221
+
504
1222
  // If this is a cancel stream, cancel anything we have pending and propagate
505
1223
  // the cancellation.
506
1224
  if (batch->cancel_stream) {
@@ -508,9 +1226,10 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
508
1226
  !batch->send_trailing_metadata && !batch->send_message &&
509
1227
  !batch->recv_initial_metadata && !batch->recv_message &&
510
1228
  !batch->recv_trailing_metadata);
511
- Cancel(batch->payload->cancel_stream.cancel_error);
1229
+ PollContext poll_ctx(this, &flusher);
1230
+ Cancel(batch->payload->cancel_stream.cancel_error, &flusher);
1231
+ poll_ctx.Run();
512
1232
  if (is_last()) {
513
- GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
514
1233
  batch.CompleteWith(&flusher);
515
1234
  } else {
516
1235
  batch.ResumeWith(&flusher);
@@ -537,7 +1256,11 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
537
1256
  case RecvInitialMetadata::kCompleteAndGotLatch:
538
1257
  case RecvInitialMetadata::kCompleteAndSetLatch:
539
1258
  case RecvInitialMetadata::kResponded:
540
- abort(); // unreachable
1259
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1260
+ Crash(absl::StrFormat(
1261
+ "ILLEGAL STATE: %s",
1262
+ RecvInitialMetadata::StateString(
1263
+ recv_initial_metadata_->state))); // unreachable
541
1264
  }
542
1265
  if (hook) {
543
1266
  auto cb = [](void* ptr, grpc_error_handle error) {
@@ -554,13 +1277,23 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
554
1277
  }
555
1278
  }
556
1279
 
1280
+ bool wake = false;
1281
+ if (send_message() != nullptr && batch->send_message) {
1282
+ send_message()->StartOp(batch);
1283
+ wake = true;
1284
+ }
1285
+ if (receive_message() != nullptr && batch->recv_message) {
1286
+ receive_message()->StartOp(batch);
1287
+ wake = true;
1288
+ }
1289
+
557
1290
  // send_initial_metadata: seeing this triggers the start of the promise part
558
1291
  // of this filter.
559
1292
  if (batch->send_initial_metadata) {
560
1293
  // If we're already cancelled, just terminate the batch.
561
1294
  if (send_initial_state_ == SendInitialState::kCancelled ||
562
1295
  recv_trailing_state_ == RecvTrailingState::kCancelled) {
563
- batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1296
+ batch.CancelWith(cancelled_error_, &flusher);
564
1297
  } else {
565
1298
  // Otherwise, we should not have seen a send_initial_metadata op yet.
566
1299
  GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
@@ -575,35 +1308,43 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
575
1308
  send_initial_metadata_batch_ = batch;
576
1309
  // And kick start the promise.
577
1310
  StartPromise(&flusher);
1311
+ wake = false;
578
1312
  }
579
1313
  } else if (batch->recv_trailing_metadata) {
580
1314
  // recv_trailing_metadata *without* send_initial_metadata: hook it so we
581
1315
  // can respond to it, and push it down.
582
1316
  if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
583
- batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1317
+ batch.CancelWith(cancelled_error_, &flusher);
584
1318
  } else {
585
1319
  GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
586
1320
  recv_trailing_state_ = RecvTrailingState::kForwarded;
587
1321
  HookRecvTrailingMetadata(batch);
588
1322
  }
589
- } else if (!GRPC_ERROR_IS_NONE(cancelled_error_)) {
590
- batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1323
+ } else if (!cancelled_error_.ok()) {
1324
+ batch.CancelWith(cancelled_error_, &flusher);
1325
+ }
1326
+
1327
+ if (wake) {
1328
+ PollContext(this, &flusher).Run();
591
1329
  }
592
1330
 
593
1331
  if (batch.is_captured()) {
594
1332
  if (!is_last()) {
595
1333
  batch.ResumeWith(&flusher);
596
1334
  } else {
597
- batch.CancelWith(GRPC_ERROR_CANCELLED, &flusher);
1335
+ batch.CancelWith(absl::CancelledError(), &flusher);
598
1336
  }
599
1337
  }
600
1338
  }
601
1339
 
602
1340
  // Handle cancellation.
603
- void ClientCallData::Cancel(grpc_error_handle error) {
1341
+ void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1342
+ if (grpc_trace_channel.enabled()) {
1343
+ gpr_log(GPR_INFO, "%s Cancel error=%s", LogTag().c_str(),
1344
+ error.ToString().c_str());
1345
+ }
604
1346
  // Track the latest reason for cancellation.
605
- GRPC_ERROR_UNREF(cancelled_error_);
606
- cancelled_error_ = GRPC_ERROR_REF(error);
1347
+ cancelled_error_ = error;
607
1348
  // Stop running the promise.
608
1349
  promise_ = ArenaPromise<ServerMetadataHandle>();
609
1350
  // If we have an op queued, fail that op.
@@ -613,27 +1354,7 @@ void ClientCallData::Cancel(grpc_error_handle error) {
613
1354
  if (recv_trailing_state_ == RecvTrailingState::kQueued) {
614
1355
  recv_trailing_state_ = RecvTrailingState::kCancelled;
615
1356
  }
616
- struct FailBatch : public grpc_closure {
617
- CapturedBatch batch;
618
- ClientCallData* call;
619
- };
620
- auto fail = [](void* p, grpc_error_handle error) {
621
- auto* f = static_cast<FailBatch*>(p);
622
- {
623
- Flusher flusher(f->call);
624
- f->batch.CancelWith(GRPC_ERROR_REF(error), &flusher);
625
- GRPC_CALL_STACK_UNREF(f->call->call_stack(), "cancel pending batch");
626
- }
627
- delete f;
628
- };
629
- auto* b = new FailBatch();
630
- GRPC_CLOSURE_INIT(b, fail, b, nullptr);
631
- b->batch = std::move(send_initial_metadata_batch_);
632
- b->call = this;
633
- GRPC_CALL_STACK_REF(call_stack(), "cancel pending batch");
634
- GRPC_CALL_COMBINER_START(call_combiner(), b,
635
- GRPC_ERROR_REF(cancelled_error_),
636
- "cancel pending batch");
1357
+ send_initial_metadata_batch_.CancelWith(error, flusher);
637
1358
  } else {
638
1359
  send_initial_state_ = SendInitialState::kCancelled;
639
1360
  }
@@ -646,7 +1367,7 @@ void ClientCallData::Cancel(grpc_error_handle error) {
646
1367
  GRPC_CALL_COMBINER_START(
647
1368
  call_combiner(),
648
1369
  std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
649
- GRPC_ERROR_REF(error), "propagate cancellation");
1370
+ error, "propagate cancellation");
650
1371
  break;
651
1372
  case RecvInitialMetadata::kInitial:
652
1373
  case RecvInitialMetadata::kGotLatch:
@@ -655,8 +1376,19 @@ void ClientCallData::Cancel(grpc_error_handle error) {
655
1376
  case RecvInitialMetadata::kHookedAndGotLatch:
656
1377
  case RecvInitialMetadata::kResponded:
657
1378
  break;
1379
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1380
+ Crash(absl::StrFormat(
1381
+ "ILLEGAL STATE: %s",
1382
+ RecvInitialMetadata::StateString(recv_initial_metadata_->state)));
1383
+ break;
658
1384
  }
659
1385
  }
1386
+ if (send_message() != nullptr) {
1387
+ send_message()->Done(*ServerMetadataFromStatus(error));
1388
+ }
1389
+ if (receive_message() != nullptr) {
1390
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
1391
+ }
660
1392
  }
661
1393
 
662
1394
  // Begin running the promise - which will ultimately take some initial
@@ -670,7 +1402,8 @@ void ClientCallData::StartPromise(Flusher* flusher) {
670
1402
  promise_ = filter->MakeCallPromise(
671
1403
  CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
672
1404
  ->send_initial_metadata.send_initial_metadata),
673
- server_initial_metadata_latch()},
1405
+ server_initial_metadata_latch(), outgoing_messages_pipe(),
1406
+ incoming_messages_pipe()},
674
1407
  [this](CallArgs call_args) {
675
1408
  return MakeNextPromise(std::move(call_args));
676
1409
  });
@@ -678,36 +1411,66 @@ void ClientCallData::StartPromise(Flusher* flusher) {
678
1411
  }
679
1412
 
680
1413
  void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
681
- ScopedContext context(this);
682
- switch (recv_initial_metadata_->state) {
683
- case RecvInitialMetadata::kHookedWaitingForLatch:
684
- recv_initial_metadata_->state =
685
- RecvInitialMetadata::kCompleteWaitingForLatch;
686
- break;
687
- case RecvInitialMetadata::kHookedAndGotLatch:
688
- recv_initial_metadata_->state = RecvInitialMetadata::kCompleteAndGotLatch;
689
- break;
690
- case RecvInitialMetadata::kInitial:
691
- case RecvInitialMetadata::kGotLatch:
692
- case RecvInitialMetadata::kCompleteWaitingForLatch:
693
- case RecvInitialMetadata::kCompleteAndGotLatch:
694
- case RecvInitialMetadata::kCompleteAndSetLatch:
695
- case RecvInitialMetadata::kResponded:
696
- case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
697
- abort(); // unreachable
1414
+ if (grpc_trace_channel.enabled()) {
1415
+ gpr_log(GPR_INFO, "%s ClientCallData.RecvInitialMetadataReady %s",
1416
+ LogTag().c_str(), DebugString().c_str());
698
1417
  }
1418
+ ScopedContext context(this);
699
1419
  Flusher flusher(this);
700
- if (!GRPC_ERROR_IS_NONE(error)) {
701
- recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
1420
+ if (!error.ok()) {
1421
+ switch (recv_initial_metadata_->state) {
1422
+ case RecvInitialMetadata::kHookedWaitingForLatch:
1423
+ recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
1424
+ break;
1425
+ case RecvInitialMetadata::kHookedAndGotLatch:
1426
+ recv_initial_metadata_->state =
1427
+ RecvInitialMetadata::kRespondedButNeedToSetLatch;
1428
+ break;
1429
+ case RecvInitialMetadata::kInitial:
1430
+ case RecvInitialMetadata::kGotLatch:
1431
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
1432
+ case RecvInitialMetadata::kCompleteAndGotLatch:
1433
+ case RecvInitialMetadata::kCompleteAndSetLatch:
1434
+ case RecvInitialMetadata::kResponded:
1435
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
1436
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1437
+ Crash(absl::StrFormat(
1438
+ "ILLEGAL STATE: %s",
1439
+ RecvInitialMetadata::StateString(
1440
+ recv_initial_metadata_->state))); // unreachable
1441
+ }
702
1442
  flusher.AddClosure(
703
1443
  std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
704
- GRPC_ERROR_REF(error), "propagate cancellation");
1444
+ error, "propagate cancellation");
705
1445
  } else if (send_initial_state_ == SendInitialState::kCancelled ||
706
1446
  recv_trailing_state_ == RecvTrailingState::kResponded) {
707
1447
  recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
708
1448
  flusher.AddClosure(
709
1449
  std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
710
- GRPC_ERROR_REF(cancelled_error_), "propagate cancellation");
1450
+ cancelled_error_, "propagate cancellation");
1451
+ } else {
1452
+ switch (recv_initial_metadata_->state) {
1453
+ case RecvInitialMetadata::kHookedWaitingForLatch:
1454
+ recv_initial_metadata_->state =
1455
+ RecvInitialMetadata::kCompleteWaitingForLatch;
1456
+ break;
1457
+ case RecvInitialMetadata::kHookedAndGotLatch:
1458
+ recv_initial_metadata_->state =
1459
+ RecvInitialMetadata::kCompleteAndGotLatch;
1460
+ break;
1461
+ case RecvInitialMetadata::kInitial:
1462
+ case RecvInitialMetadata::kGotLatch:
1463
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
1464
+ case RecvInitialMetadata::kCompleteAndGotLatch:
1465
+ case RecvInitialMetadata::kCompleteAndSetLatch:
1466
+ case RecvInitialMetadata::kResponded:
1467
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
1468
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1469
+ Crash(absl::StrFormat(
1470
+ "ILLEGAL STATE: %s",
1471
+ RecvInitialMetadata::StateString(
1472
+ recv_initial_metadata_->state))); // unreachable
1473
+ }
711
1474
  }
712
1475
  WakeInsideCombiner(&flusher);
713
1476
  }
@@ -730,6 +1493,10 @@ void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) {
730
1493
  // - return a wrapper around PollTrailingMetadata as the promise.
731
1494
  ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
732
1495
  CallArgs call_args) {
1496
+ if (grpc_trace_channel.enabled()) {
1497
+ gpr_log(GPR_INFO, "%s ClientCallData.MakeNextPromise %s", LogTag().c_str(),
1498
+ DebugString().c_str());
1499
+ }
733
1500
  GPR_ASSERT(poll_ctx_ != nullptr);
734
1501
  GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
735
1502
  send_initial_metadata_batch_->payload->send_initial_metadata
@@ -762,11 +1529,25 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
762
1529
  case RecvInitialMetadata::kCompleteAndSetLatch:
763
1530
  case RecvInitialMetadata::kResponded:
764
1531
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
765
- abort(); // unreachable
1532
+ case RecvInitialMetadata::kRespondedButNeedToSetLatch:
1533
+ Crash(absl::StrFormat(
1534
+ "ILLEGAL STATE: %s",
1535
+ RecvInitialMetadata::StateString(
1536
+ recv_initial_metadata_->state))); // unreachable
766
1537
  }
767
1538
  } else {
768
1539
  GPR_ASSERT(call_args.server_initial_metadata == nullptr);
769
1540
  }
1541
+ if (send_message() != nullptr) {
1542
+ send_message()->GotPipe(call_args.outgoing_messages);
1543
+ } else {
1544
+ GPR_ASSERT(call_args.outgoing_messages == nullptr);
1545
+ }
1546
+ if (receive_message() != nullptr) {
1547
+ receive_message()->GotPipe(call_args.incoming_messages);
1548
+ } else {
1549
+ GPR_ASSERT(call_args.incoming_messages == nullptr);
1550
+ }
770
1551
  return ArenaPromise<ServerMetadataHandle>(
771
1552
  [this]() { return PollTrailingMetadata(); });
772
1553
  }
@@ -776,6 +1557,10 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
776
1557
  // All polls: await receiving the trailing metadata, then return it to the
777
1558
  // application.
778
1559
  Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
1560
+ if (grpc_trace_channel.enabled()) {
1561
+ gpr_log(GPR_INFO, "%s ClientCallData.PollTrailingMetadata %s",
1562
+ LogTag().c_str(), DebugString().c_str());
1563
+ }
779
1564
  GPR_ASSERT(poll_ctx_ != nullptr);
780
1565
  if (send_initial_state_ == SendInitialState::kQueued) {
781
1566
  // First poll: pass the send_initial_metadata op down the stack.
@@ -810,7 +1595,8 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
810
1595
  case RecvTrailingState::kResponded:
811
1596
  // We've already responded to the caller: we can't do anything and we
812
1597
  // should never reach here.
813
- abort();
1598
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
1599
+ StateString(recv_trailing_state_)));
814
1600
  }
815
1601
  GPR_UNREACHABLE_CODE(return Pending{});
816
1602
  }
@@ -822,24 +1608,40 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
822
1608
 
823
1609
  void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
824
1610
  Flusher flusher(this);
1611
+ if (grpc_trace_channel.enabled()) {
1612
+ gpr_log(GPR_INFO,
1613
+ "%s ClientCallData.RecvTrailingMetadataReady "
1614
+ "recv_trailing_state=%s error=%s md=%s",
1615
+ LogTag().c_str(), StateString(recv_trailing_state_),
1616
+ error.ToString().c_str(),
1617
+ recv_trailing_metadata_->DebugString().c_str());
1618
+ }
825
1619
  // If we were cancelled prior to receiving this callback, we should simply
826
1620
  // forward the callback up with the same error.
827
1621
  if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
1622
+ if (cancelling_metadata_.get() != nullptr) {
1623
+ *recv_trailing_metadata_ = std::move(*cancelling_metadata_);
1624
+ }
828
1625
  if (grpc_closure* call_closure =
829
1626
  std::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
830
- flusher.AddClosure(call_closure, GRPC_ERROR_REF(error),
831
- "propagate failure");
1627
+ flusher.AddClosure(call_closure, error, "propagate failure");
832
1628
  }
833
1629
  return;
834
1630
  }
835
1631
  // If there was an error, we'll put that into the trailing metadata and
836
1632
  // proceed as if there was not.
837
- if (!GRPC_ERROR_IS_NONE(error)) {
1633
+ if (!error.ok()) {
838
1634
  SetStatusFromError(recv_trailing_metadata_, error);
839
1635
  }
840
1636
  // Record that we've got the callback.
841
1637
  GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kForwarded);
842
1638
  recv_trailing_state_ = RecvTrailingState::kComplete;
1639
+ if (receive_message() != nullptr) {
1640
+ receive_message()->Done(*recv_trailing_metadata_, &flusher);
1641
+ }
1642
+ if (send_message() != nullptr) {
1643
+ send_message()->Done(*recv_trailing_metadata_);
1644
+ }
843
1645
  // Repoll the promise.
844
1646
  ScopedContext context(this);
845
1647
  WakeInsideCombiner(&flusher);
@@ -855,7 +1657,7 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
855
1657
  metadata->Set(GrpcStatusMetadata(), status_code);
856
1658
  metadata->Set(GrpcMessageMetadata(), Slice::FromCopiedString(status_details));
857
1659
  metadata->GetOrCreatePointer(GrpcStatusContext())
858
- ->emplace_back(grpc_error_std_string(error));
1660
+ ->emplace_back(StatusToString(error));
859
1661
  }
860
1662
 
861
1663
  // Wakeup and poll the promise if appropriate.
@@ -885,6 +1687,26 @@ struct ServerCallData::SendInitialMetadata {
885
1687
  State state = kInitial;
886
1688
  CapturedBatch batch;
887
1689
  Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
1690
+
1691
+ static const char* StateString(State state) {
1692
+ switch (state) {
1693
+ case kInitial:
1694
+ return "INITIAL";
1695
+ case kGotLatch:
1696
+ return "GOT_LATCH";
1697
+ case kQueuedWaitingForLatch:
1698
+ return "QUEUED_WAITING_FOR_LATCH";
1699
+ case kQueuedAndGotLatch:
1700
+ return "QUEUED_AND_GOT_LATCH";
1701
+ case kQueuedAndSetLatch:
1702
+ return "QUEUED_AND_SET_LATCH";
1703
+ case kForwarded:
1704
+ return "FORWARDED";
1705
+ case kCancelled:
1706
+ return "CANCELLED";
1707
+ }
1708
+ return "UNKNOWN";
1709
+ }
888
1710
  };
889
1711
 
890
1712
  class ServerCallData::PollContext {
@@ -917,12 +1739,12 @@ class ServerCallData::PollContext {
917
1739
  GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
918
1740
  delete next_poll;
919
1741
  };
920
- auto* p = absl::make_unique<NextPoll>().release();
1742
+ auto* p = std::make_unique<NextPoll>().release();
921
1743
  p->call_stack = self_->call_stack();
922
1744
  p->call_data = self_;
923
1745
  GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
924
1746
  GRPC_CLOSURE_INIT(p, run, p, nullptr);
925
- flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
1747
+ flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
926
1748
  }
927
1749
  }
928
1750
 
@@ -937,6 +1759,36 @@ class ServerCallData::PollContext {
937
1759
  bool have_scoped_activity_;
938
1760
  };
939
1761
 
1762
+ const char* ServerCallData::StateString(RecvInitialState state) {
1763
+ switch (state) {
1764
+ case RecvInitialState::kInitial:
1765
+ return "INITIAL";
1766
+ case RecvInitialState::kForwarded:
1767
+ return "FORWARDED";
1768
+ case RecvInitialState::kComplete:
1769
+ return "COMPLETE";
1770
+ case RecvInitialState::kResponded:
1771
+ return "RESPONDED";
1772
+ }
1773
+ return "UNKNOWN";
1774
+ }
1775
+
1776
+ const char* ServerCallData::StateString(SendTrailingState state) {
1777
+ switch (state) {
1778
+ case SendTrailingState::kInitial:
1779
+ return "INITIAL";
1780
+ case SendTrailingState::kForwarded:
1781
+ return "FORWARDED";
1782
+ case SendTrailingState::kQueuedBehindSendMessage:
1783
+ return "QUEUED_BEHIND_SEND_MESSAGE";
1784
+ case SendTrailingState::kQueued:
1785
+ return "QUEUED";
1786
+ case SendTrailingState::kCancelled:
1787
+ return "CANCELLED";
1788
+ }
1789
+ return "UNKNOWN";
1790
+ }
1791
+
940
1792
  ServerCallData::ServerCallData(grpc_call_element* elem,
941
1793
  const grpc_call_element_args* args,
942
1794
  uint8_t flags)
@@ -947,11 +1799,17 @@ ServerCallData::ServerCallData(grpc_call_element* elem,
947
1799
  GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
948
1800
  RecvInitialMetadataReadyCallback, this,
949
1801
  grpc_schedule_on_exec_ctx);
1802
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
1803
+ RecvTrailingMetadataReadyCallback, this,
1804
+ grpc_schedule_on_exec_ctx);
950
1805
  }
951
1806
 
952
1807
  ServerCallData::~ServerCallData() {
1808
+ if (grpc_trace_channel.enabled()) {
1809
+ gpr_log(GPR_INFO, "%s ~ServerCallData %s", LogTag().c_str(),
1810
+ DebugString().c_str());
1811
+ }
953
1812
  GPR_ASSERT(poll_ctx_ == nullptr);
954
- GRPC_ERROR_UNREF(cancelled_error_);
955
1813
  }
956
1814
 
957
1815
  // Activity implementation.
@@ -968,6 +1826,11 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
968
1826
  Flusher flusher(this);
969
1827
  bool wake = false;
970
1828
 
1829
+ if (grpc_trace_channel.enabled()) {
1830
+ gpr_log(GPR_INFO, "%s StartBatch: %s", LogTag().c_str(),
1831
+ DebugString().c_str());
1832
+ }
1833
+
971
1834
  // If this is a cancel stream, cancel anything we have pending and
972
1835
  // propagate the cancellation.
973
1836
  if (batch->cancel_stream) {
@@ -975,10 +1838,9 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
975
1838
  !batch->send_trailing_metadata && !batch->send_message &&
976
1839
  !batch->recv_initial_metadata && !batch->recv_message &&
977
1840
  !batch->recv_trailing_metadata);
978
- Cancel(GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error),
979
- &flusher);
1841
+ PollContext poll_ctx(this, &flusher);
1842
+ Completed(batch->payload->cancel_stream.cancel_error, &flusher);
980
1843
  if (is_last()) {
981
- GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
982
1844
  batch.CompleteWith(&flusher);
983
1845
  } else {
984
1846
  batch.ResumeWith(&flusher);
@@ -1004,6 +1866,16 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
1004
1866
  recv_initial_state_ = RecvInitialState::kForwarded;
1005
1867
  }
1006
1868
 
1869
+ // Hook recv_trailing_metadata so we can see cancellation from the client.
1870
+ if (batch->recv_trailing_metadata) {
1871
+ recv_trailing_metadata_ =
1872
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
1873
+ original_recv_trailing_metadata_ready_ =
1874
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
1875
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1876
+ &recv_trailing_metadata_ready_;
1877
+ }
1878
+
1007
1879
  // send_initial_metadata
1008
1880
  if (send_initial_metadata_ != nullptr && batch->send_initial_metadata) {
1009
1881
  switch (send_initial_metadata_->state) {
@@ -1015,32 +1887,61 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
1015
1887
  send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
1016
1888
  break;
1017
1889
  case SendInitialMetadata::kCancelled:
1018
- batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1890
+ batch.CancelWith(
1891
+ cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
1892
+ &flusher);
1019
1893
  break;
1020
1894
  case SendInitialMetadata::kQueuedAndGotLatch:
1021
1895
  case SendInitialMetadata::kQueuedWaitingForLatch:
1022
1896
  case SendInitialMetadata::kQueuedAndSetLatch:
1023
1897
  case SendInitialMetadata::kForwarded:
1024
- abort(); // not reachable
1898
+ Crash(absl::StrFormat(
1899
+ "ILLEGAL STATE: %s",
1900
+ SendInitialMetadata::StateString(
1901
+ send_initial_metadata_->state))); // not reachable
1025
1902
  }
1026
1903
  send_initial_metadata_->batch = batch;
1027
1904
  wake = true;
1028
1905
  }
1029
1906
 
1907
+ if (send_message() != nullptr && batch.is_captured() && batch->send_message) {
1908
+ send_message()->StartOp(batch);
1909
+ wake = true;
1910
+ }
1911
+ if (receive_message() != nullptr && batch.is_captured() &&
1912
+ batch->recv_message) {
1913
+ receive_message()->StartOp(batch);
1914
+ wake = true;
1915
+ }
1916
+
1030
1917
  // send_trailing_metadata
1031
1918
  if (batch.is_captured() && batch->send_trailing_metadata) {
1032
1919
  switch (send_trailing_state_) {
1033
1920
  case SendTrailingState::kInitial:
1034
1921
  send_trailing_metadata_batch_ = batch;
1035
- send_trailing_state_ = SendTrailingState::kQueued;
1036
- wake = true;
1922
+ if (receive_message() != nullptr) {
1923
+ receive_message()->Done(
1924
+ *batch->payload->send_trailing_metadata.send_trailing_metadata,
1925
+ &flusher);
1926
+ }
1927
+ if (send_message() != nullptr && !send_message()->IsIdle()) {
1928
+ send_trailing_state_ = SendTrailingState::kQueuedBehindSendMessage;
1929
+ } else {
1930
+ send_trailing_state_ = SendTrailingState::kQueued;
1931
+ wake = true;
1932
+ }
1037
1933
  break;
1038
1934
  case SendTrailingState::kQueued:
1935
+ case SendTrailingState::kQueuedBehindSendMessage:
1039
1936
  case SendTrailingState::kForwarded:
1040
- abort(); // unreachable
1937
+ Crash(
1938
+ absl::StrFormat("ILLEGAL STATE: %s",
1939
+ StateString(send_trailing_state_))); // unreachable
1041
1940
  break;
1042
1941
  case SendTrailingState::kCancelled:
1043
- batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
1942
+ batch.CancelWith(
1943
+ cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
1944
+ &flusher);
1044
1945
  break;
1045
1946
  }
1046
1947
  }
@@ -1050,15 +1951,14 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
1050
1951
  }
1051
1952
 
1052
1953
  // Handle cancellation.
1053
- void ServerCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1954
+ void ServerCallData::Completed(grpc_error_handle error, Flusher* flusher) {
1054
1955
  // Track the latest reason for cancellation.
1055
- GRPC_ERROR_UNREF(cancelled_error_);
1056
1956
  cancelled_error_ = error;
1057
1957
  // Stop running the promise.
1058
1958
  promise_ = ArenaPromise<ServerMetadataHandle>();
1059
1959
  if (send_trailing_state_ == SendTrailingState::kQueued) {
1060
1960
  send_trailing_state_ = SendTrailingState::kCancelled;
1061
- send_trailing_metadata_batch_.CancelWith(GRPC_ERROR_REF(error), flusher);
1961
+ send_trailing_metadata_batch_.CancelWith(error, flusher);
1062
1962
  } else {
1063
1963
  send_trailing_state_ = SendTrailingState::kCancelled;
1064
1964
  }
@@ -1072,16 +1972,21 @@ void ServerCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1072
1972
  case SendInitialMetadata::kQueuedWaitingForLatch:
1073
1973
  case SendInitialMetadata::kQueuedAndGotLatch:
1074
1974
  case SendInitialMetadata::kQueuedAndSetLatch:
1075
- send_initial_metadata_->batch.CancelWith(GRPC_ERROR_REF(error),
1076
- flusher);
1975
+ send_initial_metadata_->batch.CancelWith(error, flusher);
1077
1976
  break;
1078
1977
  }
1079
1978
  send_initial_metadata_->state = SendInitialMetadata::kCancelled;
1080
1979
  }
1081
1980
  if (auto* closure =
1082
1981
  std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
1083
- flusher->AddClosure(closure, GRPC_ERROR_REF(error),
1084
- "original_recv_initial_metadata");
1982
+ flusher->AddClosure(closure, error, "original_recv_initial_metadata");
1983
+ }
1984
+ ScopedContext ctx(this);
1985
+ if (send_message() != nullptr) {
1986
+ send_message()->Done(*ServerMetadataFromStatus(error));
1987
+ }
1988
+ if (receive_message() != nullptr) {
1989
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
1085
1990
  }
1086
1991
  }
1087
1992
 
@@ -1109,7 +2014,10 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
1109
2014
  case SendInitialMetadata::kQueuedAndGotLatch:
1110
2015
  case SendInitialMetadata::kQueuedAndSetLatch:
1111
2016
  case SendInitialMetadata::kForwarded:
1112
- abort(); // not reachable
2017
+ Crash(absl::StrFormat(
2018
+ "ILLEGAL STATE: %s",
2019
+ SendInitialMetadata::StateString(
2020
+ send_initial_metadata_->state))); // not reachable
1113
2021
  break;
1114
2022
  case SendInitialMetadata::kQueuedWaitingForLatch:
1115
2023
  send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
@@ -1120,6 +2028,16 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
1120
2028
  } else {
1121
2029
  GPR_ASSERT(call_args.server_initial_metadata == nullptr);
1122
2030
  }
2031
+ if (send_message() != nullptr) {
2032
+ send_message()->GotPipe(call_args.outgoing_messages);
2033
+ } else {
2034
+ GPR_ASSERT(call_args.outgoing_messages == nullptr);
2035
+ }
2036
+ if (receive_message() != nullptr) {
2037
+ receive_message()->GotPipe(call_args.incoming_messages);
2038
+ } else {
2039
+ GPR_ASSERT(call_args.incoming_messages == nullptr);
2040
+ }
1123
2041
  return ArenaPromise<ServerMetadataHandle>(
1124
2042
  [this]() { return PollTrailingMetadata(); });
1125
2043
  }
@@ -1130,12 +2048,14 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
1130
2048
  Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
1131
2049
  switch (send_trailing_state_) {
1132
2050
  case SendTrailingState::kInitial:
2051
+ case SendTrailingState::kQueuedBehindSendMessage:
1133
2052
  return Pending{};
1134
2053
  case SendTrailingState::kQueued:
1135
2054
  return WrapMetadata(send_trailing_metadata_batch_->payload
1136
2055
  ->send_trailing_metadata.send_trailing_metadata);
1137
2056
  case SendTrailingState::kForwarded:
1138
- abort(); // unreachable
2057
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
2058
+ StateString(send_trailing_state_))); // unreachable
1139
2059
  case SendTrailingState::kCancelled:
1140
2060
  // We could translate cancelled_error to metadata and return it... BUT
1141
2061
  // we're not gonna be running much longer and the results going to be
@@ -1145,20 +2065,43 @@ Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
1145
2065
  GPR_UNREACHABLE_CODE(return Pending{});
1146
2066
  }
1147
2067
 
2068
+ void ServerCallData::RecvTrailingMetadataReadyCallback(
2069
+ void* arg, grpc_error_handle error) {
2070
+ static_cast<ServerCallData*>(arg)->RecvTrailingMetadataReady(
2071
+ std::move(error));
2072
+ }
2073
+
2074
+ void ServerCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
2075
+ if (grpc_trace_channel.enabled()) {
2076
+ gpr_log(GPR_INFO, "%s: RecvTrailingMetadataReady error=%s md=%s",
2077
+ LogTag().c_str(), error.ToString().c_str(),
2078
+ recv_trailing_metadata_->DebugString().c_str());
2079
+ }
2080
+ Flusher flusher(this);
2081
+ PollContext poll_ctx(this, &flusher);
2082
+ Completed(error, &flusher);
2083
+ flusher.AddClosure(original_recv_trailing_metadata_ready_, std::move(error),
2084
+ "continue recv trailing");
2085
+ }
2086
+
1148
2087
  void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
1149
2088
  grpc_error_handle error) {
1150
- static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(error);
2089
+ static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(std::move(error));
1151
2090
  }
1152
2091
 
1153
2092
  void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
1154
2093
  Flusher flusher(this);
2094
+ if (grpc_trace_channel.enabled()) {
2095
+ gpr_log(GPR_INFO, "%s: RecvInitialMetadataReady %s", LogTag().c_str(),
2096
+ error.ToString().c_str());
2097
+ }
1155
2098
  GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded);
1156
2099
  // If there was an error we just propagate that through
1157
- if (!GRPC_ERROR_IS_NONE(error)) {
2100
+ if (!error.ok()) {
1158
2101
  recv_initial_state_ = RecvInitialState::kResponded;
1159
2102
  flusher.AddClosure(
1160
- std::exchange(original_recv_initial_metadata_ready_, nullptr),
1161
- GRPC_ERROR_REF(error), "propagate error");
2103
+ std::exchange(original_recv_initial_metadata_ready_, nullptr), error,
2104
+ "propagate error");
1162
2105
  return;
1163
2106
  }
1164
2107
  // Record that we've got the callback.
@@ -1168,24 +2111,52 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
1168
2111
  ScopedContext context(this);
1169
2112
  // Construct the promise.
1170
2113
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
1171
- promise_ =
1172
- filter->MakeCallPromise(CallArgs{WrapMetadata(recv_initial_metadata_),
1173
- server_initial_metadata_latch()},
1174
- [this](CallArgs call_args) {
1175
- return MakeNextPromise(std::move(call_args));
1176
- });
2114
+ FakeActivity().Run([this, filter] {
2115
+ promise_ = filter->MakeCallPromise(
2116
+ CallArgs{WrapMetadata(recv_initial_metadata_),
2117
+ server_initial_metadata_latch(), outgoing_messages_pipe(),
2118
+ incoming_messages_pipe()},
2119
+ [this](CallArgs call_args) {
2120
+ return MakeNextPromise(std::move(call_args));
2121
+ });
2122
+ });
1177
2123
  // Poll once.
1178
2124
  WakeInsideCombiner(&flusher);
1179
2125
  if (auto* closure =
1180
2126
  std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
1181
- flusher.AddClosure(closure, GRPC_ERROR_NONE,
2127
+ flusher.AddClosure(closure, absl::OkStatus(),
1182
2128
  "original_recv_initial_metadata");
1183
2129
  }
1184
2130
  }
1185
2131
 
2132
+ std::string ServerCallData::DebugString() const {
2133
+ std::vector<absl::string_view> captured;
2134
+ if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
2135
+ captured.push_back("send_message");
2136
+ }
2137
+ if (send_trailing_metadata_batch_.is_captured()) {
2138
+ captured.push_back("send_trailing_metadata");
2139
+ }
2140
+ return absl::StrCat(
2141
+ "have_promise=", promise_.has_value() ? "true" : "false",
2142
+ " recv_initial_state=", StateString(recv_initial_state_),
2143
+ " send_trailing_state=", StateString(send_trailing_state_), " captured={",
2144
+ absl::StrJoin(captured, ","), "}",
2145
+ send_initial_metadata_ == nullptr
2146
+ ? ""
2147
+ : absl::StrCat(
2148
+ " send_initial_metadata=",
2149
+ SendInitialMetadata::StateString(send_initial_metadata_->state))
2150
+ .c_str());
2151
+ }
2152
+
1186
2153
  // Wakeup and poll the promise if appropriate.
1187
2154
  void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
1188
2155
  PollContext poll_ctx(this, flusher);
2156
+ if (grpc_trace_channel.enabled()) {
2157
+ gpr_log(GPR_INFO, "%s: WakeInsideCombiner %s", LogTag().c_str(),
2158
+ DebugString().c_str());
2159
+ }
1189
2160
  if (send_initial_metadata_ != nullptr &&
1190
2161
  send_initial_metadata_->state ==
1191
2162
  SendInitialMetadata::kQueuedAndGotLatch) {
@@ -1195,9 +2166,25 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
1195
2166
  .send_initial_metadata);
1196
2167
  }
1197
2168
  poll_ctx.ClearRepoll();
2169
+ if (send_message() != nullptr) {
2170
+ send_message()->WakeInsideCombiner(flusher);
2171
+ if (send_trailing_state_ == SendTrailingState::kQueuedBehindSendMessage &&
2172
+ send_message()->IsIdle()) {
2173
+ send_trailing_state_ = SendTrailingState::kQueued;
2174
+ }
2175
+ }
2176
+ if (receive_message() != nullptr) {
2177
+ receive_message()->WakeInsideCombiner(flusher);
2178
+ }
1198
2179
  if (promise_.has_value()) {
1199
2180
  Poll<ServerMetadataHandle> poll;
1200
2181
  poll = promise_();
2182
+ if (grpc_trace_channel.enabled()) {
2183
+ gpr_log(GPR_INFO, "%s: WakeInsideCombiner poll=%s", LogTag().c_str(),
2184
+ PollToString(poll, [](const ServerMetadataHandle& h) {
2185
+ return h->DebugString();
2186
+ }).c_str());
2187
+ }
1201
2188
  if (send_initial_metadata_ != nullptr &&
1202
2189
  send_initial_metadata_->state ==
1203
2190
  SendInitialMetadata::kQueuedAndSetLatch) {
@@ -1217,7 +2204,14 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
1217
2204
  promise_ = ArenaPromise<ServerMetadataHandle>();
1218
2205
  auto* md = UnwrapMetadata(std::move(*r));
1219
2206
  bool destroy_md = true;
2207
+ if (send_message() != nullptr) {
2208
+ send_message()->Done(*md);
2209
+ }
2210
+ if (receive_message() != nullptr) {
2211
+ receive_message()->Done(*md, flusher);
2212
+ }
1220
2213
  switch (send_trailing_state_) {
2214
+ case SendTrailingState::kQueuedBehindSendMessage:
1221
2215
  case SendTrailingState::kQueued: {
1222
2216
  if (send_trailing_metadata_batch_->payload->send_trailing_metadata
1223
2217
  .send_trailing_metadata != md) {
@@ -1230,20 +2224,13 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
1230
2224
  send_trailing_state_ = SendTrailingState::kForwarded;
1231
2225
  } break;
1232
2226
  case SendTrailingState::kForwarded:
1233
- abort(); // unreachable
2227
+ Crash(absl::StrFormat(
2228
+ "ILLEGAL STATE: %s",
2229
+ StateString(send_trailing_state_))); // unreachable
1234
2230
  break;
1235
2231
  case SendTrailingState::kInitial: {
1236
2232
  GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK);
1237
- grpc_error_handle error =
1238
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1239
- "early return from promise based filter"),
1240
- GRPC_ERROR_INT_GRPC_STATUS,
1241
- *md->get_pointer(GrpcStatusMetadata()));
1242
- if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
1243
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
1244
- message->as_string_view());
1245
- }
1246
- Cancel(error, flusher);
2233
+ Completed(StatusFromMetadata(*md), flusher);
1247
2234
  } break;
1248
2235
  case SendTrailingState::kCancelled:
1249
2236
  // Nothing to do.